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

Reply via email to