SDMA CSA address is static while the driver is loaded so lets store it in the SDMA instance allowing us to simplify and inline the amdgpu_sdma_get_csa_mc_addr() helper.
Signed-off-by: Tvrtko Ursulin <[email protected]> Cc: Timur Kristóf <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 26 +++++++------------ drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h | 10 ++++++- .../gpu/drm/amd/amdgpu/amdgpu_sdma_types.h | 2 ++ 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c index d2fee2480154..cb0c52aadb79 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c @@ -42,6 +42,7 @@ int __printf(4, 5) amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, unsigned int instance, const char *fmt, ...) { + struct amdgpu_sdma_instance *sdma; va_list args; ring->ring_obj = NULL; @@ -50,27 +51,20 @@ amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, vsnprintf(ring->name, sizeof(ring->name), fmt, args); va_end(args); + /* NB: ring->me is valid before amdgpu_ring_init. */ + sdma = amdgpu_sdma_get_instance_from_ring(ring); + if (amdgpu_sriov_vf(adev) || !adev->gfx.mcbp) + sdma->csa_addr = 0; + else + sdma->csa_addr = amdgpu_csa_vaddr(adev) + + AMDGPU_CSA_SDMA_OFFSET + + ring->me * AMDGPU_CSA_SDMA_SIZE; + return amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq, AMDGPU_SDMA_IRQ_INSTANCE0 + instance, AMDGPU_RING_PRIO_DEFAULT, NULL); } -uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring, - unsigned int vmid) -{ - struct amdgpu_device *adev = ring->adev; - - /* don't enable OS preemption on SDMA under SRIOV */ - if (amdgpu_sriov_vf(adev) || vmid == 0 || !adev->gfx.mcbp) - return 0; - - if (ring->me > 31) - return 0; - - return amdgpu_csa_vaddr(adev) + AMDGPU_CSA_SDMA_OFFSET + - ring->me * AMDGPU_CSA_SDMA_SIZE; -} - int amdgpu_sdma_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *ras_block) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h index 60f7faace0d0..93595520bc13 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h @@ -55,7 +55,15 @@ amdgpu_sdma_get_instance_from_ring(struct amdgpu_ring *ring) return &ring->adev->sdma.instance[ring->me]; } -uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring, unsigned vmid); +static inline uint64_t +amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring, unsigned vmid) +{ + if (vmid == 0) + return 0; + else + return amdgpu_sdma_get_instance_from_ring(ring)->csa_addr; +} + int amdgpu_sdma_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *ras_block); int amdgpu_sdma_process_ras_data_cb(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h index d6e7a703c2e0..61be3d593d18 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h @@ -73,6 +73,8 @@ struct amdgpu_sdma_instance { uint32_t xcc_id; }; + uint64_t csa_addr; + struct amdgpu_bo *sdma_fw_obj; uint64_t sdma_fw_gpu_addr; uint32_t *sdma_fw_ptr; -- 2.55.0
