From b73a4958728f05e340f77fd3bd5117040be7055a Mon Sep 17 00:00:00 2001 From: Tvrtko Ursulin Date: Mon, 14 Sep 2026 15:54:24 +0100 Subject: [PATCH] drm/amdgpu: Cache the SDMA CSA address MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. Reviewed-by: Alex Deucher Reviewed-by: Timur Kristóf Signed-off-by: Tvrtko Ursulin Cc: Timur Kristóf Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 32 +++++++++---------- drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h | 10 +++++- .../gpu/drm/amd/amdgpu/amdgpu_sdma_types.h | 2 ++ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c index aa3428ed7aa6..87ecbd429f95 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c @@ -42,7 +42,9 @@ 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; + int r; ring->ring_obj = NULL; @@ -50,25 +52,21 @@ amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, vsnprintf(ring->name, sizeof(ring->name), fmt, args); va_end(args); - return amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq, - AMDGPU_SDMA_IRQ_INSTANCE0 + instance, - AMDGPU_RING_PRIO_DEFAULT, NULL); -} + r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq, + AMDGPU_SDMA_IRQ_INSTANCE0 + instance, + AMDGPU_RING_PRIO_DEFAULT, NULL); + if (r) + return r; -uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring, - unsigned int vmid) -{ - struct amdgpu_device *adev = ring->adev; + 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; - /* 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; + return r; } int amdgpu_sdma_ras_late_init(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h index ed08d521b363..51dc52757f48 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h @@ -57,7 +57,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 bb0aa0c20314..1360db74d8b7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h @@ -75,6 +75,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;