Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: switch to common helper func for psp cmd submission

Drop all the IP specific cmd_submit callback function
and use the common helper instead

Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: John Clements <john.clements@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Hawking Zhang and committed by
Alex Deucher
5bdd0b72 cc65176e

+1 -231
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
··· 158 158 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); 159 159 160 160 index = atomic_inc_return(&psp->fence_value); 161 - ret = psp_cmd_submit(psp, psp->cmd_buf_mc_addr, fence_mc_addr, index); 161 + ret = psp_ring_cmd_submit(psp, psp->cmd_buf_mc_addr, fence_mc_addr, index); 162 162 if (ret) { 163 163 atomic_dec(&psp->fence_value); 164 164 mutex_unlock(&psp->mutex);
-5
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
··· 94 94 enum psp_ring_type ring_type); 95 95 int (*ring_destroy)(struct psp_context *psp, 96 96 enum psp_ring_type ring_type); 97 - int (*cmd_submit)(struct psp_context *psp, 98 - uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 99 - int index); 100 97 bool (*compare_sram_data)(struct psp_context *psp, 101 98 struct amdgpu_firmware_info *ucode, 102 99 enum AMDGPU_UCODE_ID ucode_type); ··· 299 302 #define psp_ring_create(psp, type) (psp)->funcs->ring_create((psp), (type)) 300 303 #define psp_ring_stop(psp, type) (psp)->funcs->ring_stop((psp), (type)) 301 304 #define psp_ring_destroy(psp, type) ((psp)->funcs->ring_destroy((psp), (type))) 302 - #define psp_cmd_submit(psp, cmd_mc, fence_mc, index) \ 303 - (psp)->funcs->cmd_submit((psp), (cmd_mc), (fence_mc), (index)) 304 305 #define psp_compare_sram_data(psp, ucode, type) \ 305 306 (psp)->funcs->compare_sram_data((psp), (ucode), (type)) 306 307 #define psp_init_microcode(psp) \
-49
drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
··· 230 230 return ret; 231 231 } 232 232 233 - static int psp_v10_0_cmd_submit(struct psp_context *psp, 234 - uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 235 - int index) 236 - { 237 - unsigned int psp_write_ptr_reg = 0; 238 - struct psp_gfx_rb_frame * write_frame = psp->km_ring.ring_mem; 239 - struct psp_ring *ring = &psp->km_ring; 240 - struct psp_gfx_rb_frame *ring_buffer_start = ring->ring_mem; 241 - struct psp_gfx_rb_frame *ring_buffer_end = ring_buffer_start + 242 - ring->ring_size / sizeof(struct psp_gfx_rb_frame) - 1; 243 - struct amdgpu_device *adev = psp->adev; 244 - uint32_t ring_size_dw = ring->ring_size / 4; 245 - uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4; 246 - 247 - /* KM (GPCOM) prepare write pointer */ 248 - psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); 249 - 250 - /* Update KM RB frame pointer to new frame */ 251 - if ((psp_write_ptr_reg % ring_size_dw) == 0) 252 - write_frame = ring_buffer_start; 253 - else 254 - write_frame = ring_buffer_start + (psp_write_ptr_reg / rb_frame_size_dw); 255 - /* Check invalid write_frame ptr address */ 256 - if ((write_frame < ring_buffer_start) || (ring_buffer_end < write_frame)) { 257 - DRM_ERROR("ring_buffer_start = %p; ring_buffer_end = %p; write_frame = %p\n", 258 - ring_buffer_start, ring_buffer_end, write_frame); 259 - DRM_ERROR("write_frame is pointing to address out of bounds\n"); 260 - return -EINVAL; 261 - } 262 - 263 - /* Initialize KM RB frame */ 264 - memset(write_frame, 0, sizeof(struct psp_gfx_rb_frame)); 265 - 266 - /* Update KM RB frame */ 267 - write_frame->cmd_buf_addr_hi = upper_32_bits(cmd_buf_mc_addr); 268 - write_frame->cmd_buf_addr_lo = lower_32_bits(cmd_buf_mc_addr); 269 - write_frame->fence_addr_hi = upper_32_bits(fence_mc_addr); 270 - write_frame->fence_addr_lo = lower_32_bits(fence_mc_addr); 271 - write_frame->fence_value = index; 272 - amdgpu_asic_flush_hdp(adev, NULL); 273 - 274 - /* Update the write Pointer in DWORDs */ 275 - psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw; 276 - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, psp_write_ptr_reg); 277 - 278 - return 0; 279 - } 280 - 281 233 static int 282 234 psp_v10_0_sram_map(struct amdgpu_device *adev, 283 235 unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, ··· 379 427 .ring_create = psp_v10_0_ring_create, 380 428 .ring_stop = psp_v10_0_ring_stop, 381 429 .ring_destroy = psp_v10_0_ring_destroy, 382 - .cmd_submit = psp_v10_0_cmd_submit, 383 430 .compare_sram_data = psp_v10_0_compare_sram_data, 384 431 .mode1_reset = psp_v10_0_mode1_reset, 385 432 .ring_get_wptr = psp_v10_0_ring_get_wptr,
-58
drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
··· 519 519 return ret; 520 520 } 521 521 522 - static int psp_v11_0_cmd_submit(struct psp_context *psp, 523 - uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 524 - int index) 525 - { 526 - unsigned int psp_write_ptr_reg = 0; 527 - struct psp_gfx_rb_frame *write_frame = psp->km_ring.ring_mem; 528 - struct psp_ring *ring = &psp->km_ring; 529 - struct psp_gfx_rb_frame *ring_buffer_start = ring->ring_mem; 530 - struct psp_gfx_rb_frame *ring_buffer_end = ring_buffer_start + 531 - ring->ring_size / sizeof(struct psp_gfx_rb_frame) - 1; 532 - struct amdgpu_device *adev = psp->adev; 533 - uint32_t ring_size_dw = ring->ring_size / 4; 534 - uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4; 535 - 536 - /* KM (GPCOM) prepare write pointer */ 537 - if (psp_v11_0_support_vmr_ring(psp)) 538 - psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102); 539 - else 540 - psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); 541 - 542 - /* Update KM RB frame pointer to new frame */ 543 - /* write_frame ptr increments by size of rb_frame in bytes */ 544 - /* psp_write_ptr_reg increments by size of rb_frame in DWORDs */ 545 - if ((psp_write_ptr_reg % ring_size_dw) == 0) 546 - write_frame = ring_buffer_start; 547 - else 548 - write_frame = ring_buffer_start + (psp_write_ptr_reg / rb_frame_size_dw); 549 - /* Check invalid write_frame ptr address */ 550 - if ((write_frame < ring_buffer_start) || (ring_buffer_end < write_frame)) { 551 - DRM_ERROR("ring_buffer_start = %p; ring_buffer_end = %p; write_frame = %p\n", 552 - ring_buffer_start, ring_buffer_end, write_frame); 553 - DRM_ERROR("write_frame is pointing to address out of bounds\n"); 554 - return -EINVAL; 555 - } 556 - 557 - /* Initialize KM RB frame */ 558 - memset(write_frame, 0, sizeof(struct psp_gfx_rb_frame)); 559 - 560 - /* Update KM RB frame */ 561 - write_frame->cmd_buf_addr_hi = upper_32_bits(cmd_buf_mc_addr); 562 - write_frame->cmd_buf_addr_lo = lower_32_bits(cmd_buf_mc_addr); 563 - write_frame->fence_addr_hi = upper_32_bits(fence_mc_addr); 564 - write_frame->fence_addr_lo = lower_32_bits(fence_mc_addr); 565 - write_frame->fence_value = index; 566 - amdgpu_asic_flush_hdp(adev, NULL); 567 - 568 - /* Update the write Pointer in DWORDs */ 569 - psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw; 570 - if (psp_v11_0_support_vmr_ring(psp)) { 571 - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_write_ptr_reg); 572 - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD); 573 - } else 574 - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, psp_write_ptr_reg); 575 - 576 - return 0; 577 - } 578 - 579 522 static int 580 523 psp_v11_0_sram_map(struct amdgpu_device *adev, 581 524 unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, ··· 1044 1101 .ring_create = psp_v11_0_ring_create, 1045 1102 .ring_stop = psp_v11_0_ring_stop, 1046 1103 .ring_destroy = psp_v11_0_ring_destroy, 1047 - .cmd_submit = psp_v11_0_cmd_submit, 1048 1104 .compare_sram_data = psp_v11_0_compare_sram_data, 1049 1105 .mode1_reset = psp_v11_0_mode1_reset, 1050 1106 .xgmi_get_topology_info = psp_v11_0_xgmi_get_topology_info,
-58
drivers/gpu/drm/amd/amdgpu/psp_v12_0.c
··· 334 334 return ret; 335 335 } 336 336 337 - static int psp_v12_0_cmd_submit(struct psp_context *psp, 338 - uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 339 - int index) 340 - { 341 - unsigned int psp_write_ptr_reg = 0; 342 - struct psp_gfx_rb_frame *write_frame = psp->km_ring.ring_mem; 343 - struct psp_ring *ring = &psp->km_ring; 344 - struct psp_gfx_rb_frame *ring_buffer_start = ring->ring_mem; 345 - struct psp_gfx_rb_frame *ring_buffer_end = ring_buffer_start + 346 - ring->ring_size / sizeof(struct psp_gfx_rb_frame) - 1; 347 - struct amdgpu_device *adev = psp->adev; 348 - uint32_t ring_size_dw = ring->ring_size / 4; 349 - uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4; 350 - 351 - /* KM (GPCOM) prepare write pointer */ 352 - if (psp_v12_0_support_vmr_ring(psp)) 353 - psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102); 354 - else 355 - psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); 356 - 357 - /* Update KM RB frame pointer to new frame */ 358 - /* write_frame ptr increments by size of rb_frame in bytes */ 359 - /* psp_write_ptr_reg increments by size of rb_frame in DWORDs */ 360 - if ((psp_write_ptr_reg % ring_size_dw) == 0) 361 - write_frame = ring_buffer_start; 362 - else 363 - write_frame = ring_buffer_start + (psp_write_ptr_reg / rb_frame_size_dw); 364 - /* Check invalid write_frame ptr address */ 365 - if ((write_frame < ring_buffer_start) || (ring_buffer_end < write_frame)) { 366 - DRM_ERROR("ring_buffer_start = %p; ring_buffer_end = %p; write_frame = %p\n", 367 - ring_buffer_start, ring_buffer_end, write_frame); 368 - DRM_ERROR("write_frame is pointing to address out of bounds\n"); 369 - return -EINVAL; 370 - } 371 - 372 - /* Initialize KM RB frame */ 373 - memset(write_frame, 0, sizeof(struct psp_gfx_rb_frame)); 374 - 375 - /* Update KM RB frame */ 376 - write_frame->cmd_buf_addr_hi = upper_32_bits(cmd_buf_mc_addr); 377 - write_frame->cmd_buf_addr_lo = lower_32_bits(cmd_buf_mc_addr); 378 - write_frame->fence_addr_hi = upper_32_bits(fence_mc_addr); 379 - write_frame->fence_addr_lo = lower_32_bits(fence_mc_addr); 380 - write_frame->fence_value = index; 381 - amdgpu_asic_flush_hdp(adev, NULL); 382 - 383 - /* Update the write Pointer in DWORDs */ 384 - psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw; 385 - if (psp_v12_0_support_vmr_ring(psp)) { 386 - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_write_ptr_reg); 387 - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD); 388 - } else 389 - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, psp_write_ptr_reg); 390 - 391 - return 0; 392 - } 393 - 394 337 static int 395 338 psp_v12_0_sram_map(struct amdgpu_device *adev, 396 339 unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, ··· 522 579 .ring_create = psp_v12_0_ring_create, 523 580 .ring_stop = psp_v12_0_ring_stop, 524 581 .ring_destroy = psp_v12_0_ring_destroy, 525 - .cmd_submit = psp_v12_0_cmd_submit, 526 582 .compare_sram_data = psp_v12_0_compare_sram_data, 527 583 .mode1_reset = psp_v12_0_mode1_reset, 528 584 .ring_get_wptr = psp_v12_0_ring_get_wptr,
-60
drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
··· 410 410 return ret; 411 411 } 412 412 413 - static int psp_v3_1_cmd_submit(struct psp_context *psp, 414 - uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 415 - int index) 416 - { 417 - unsigned int psp_write_ptr_reg = 0; 418 - struct psp_gfx_rb_frame * write_frame = psp->km_ring.ring_mem; 419 - struct psp_ring *ring = &psp->km_ring; 420 - struct psp_gfx_rb_frame *ring_buffer_start = ring->ring_mem; 421 - struct psp_gfx_rb_frame *ring_buffer_end = ring_buffer_start + 422 - ring->ring_size / sizeof(struct psp_gfx_rb_frame) - 1; 423 - struct amdgpu_device *adev = psp->adev; 424 - uint32_t ring_size_dw = ring->ring_size / 4; 425 - uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4; 426 - 427 - /* KM (GPCOM) prepare write pointer */ 428 - if (psp_v3_1_support_vmr_ring(psp)) 429 - psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102); 430 - else 431 - psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); 432 - 433 - /* Update KM RB frame pointer to new frame */ 434 - /* write_frame ptr increments by size of rb_frame in bytes */ 435 - /* psp_write_ptr_reg increments by size of rb_frame in DWORDs */ 436 - if ((psp_write_ptr_reg % ring_size_dw) == 0) 437 - write_frame = ring_buffer_start; 438 - else 439 - write_frame = ring_buffer_start + (psp_write_ptr_reg / rb_frame_size_dw); 440 - /* Check invalid write_frame ptr address */ 441 - if ((write_frame < ring_buffer_start) || (ring_buffer_end < write_frame)) { 442 - DRM_ERROR("ring_buffer_start = %p; ring_buffer_end = %p; write_frame = %p\n", 443 - ring_buffer_start, ring_buffer_end, write_frame); 444 - DRM_ERROR("write_frame is pointing to address out of bounds\n"); 445 - return -EINVAL; 446 - } 447 - 448 - /* Initialize KM RB frame */ 449 - memset(write_frame, 0, sizeof(struct psp_gfx_rb_frame)); 450 - 451 - /* Update KM RB frame */ 452 - write_frame->cmd_buf_addr_hi = upper_32_bits(cmd_buf_mc_addr); 453 - write_frame->cmd_buf_addr_lo = lower_32_bits(cmd_buf_mc_addr); 454 - write_frame->fence_addr_hi = upper_32_bits(fence_mc_addr); 455 - write_frame->fence_addr_lo = lower_32_bits(fence_mc_addr); 456 - write_frame->fence_value = index; 457 - amdgpu_asic_flush_hdp(adev, NULL); 458 - 459 - /* Update the write Pointer in DWORDs */ 460 - psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw; 461 - if (psp_v3_1_support_vmr_ring(psp)) { 462 - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_write_ptr_reg); 463 - /* send interrupt to PSP for SRIOV ring write pointer update */ 464 - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, 465 - GFX_CTRL_CMD_ID_CONSUME_CMD); 466 - } else 467 - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, psp_write_ptr_reg); 468 - 469 - return 0; 470 - } 471 - 472 413 static int 473 414 psp_v3_1_sram_map(struct amdgpu_device *adev, 474 415 unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, ··· 616 675 .ring_create = psp_v3_1_ring_create, 617 676 .ring_stop = psp_v3_1_ring_stop, 618 677 .ring_destroy = psp_v3_1_ring_destroy, 619 - .cmd_submit = psp_v3_1_cmd_submit, 620 678 .compare_sram_data = psp_v3_1_compare_sram_data, 621 679 .smu_reload_quirk = psp_v3_1_smu_reload_quirk, 622 680 .mode1_reset = psp_v3_1_mode1_reset,