From: Philip Yang <[email protected]>

Add a use_lsdma flag to amdgpu_ualink_remote and set it during SDMA
entity initialization. When use_lsdma is set, use amdgpu_lsdma_copy_mem()
instead of SDMA IBs to write the remote command ring data, wptr and
doorbell to their respective NPA GART addresses.

This provides an alternative low-latency path for sending UALink remote
interrupt commands via LSDMA, avoiding SDMA ring/IB overhead for these
small NPA writes.

v2: fix 32 bit build (Alex)

Signed-off-by: Philip Yang <[email protected]>
Reviewed-by: Felix Kuehling <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
index 2d2b1b1145cd4..d424c71905ff2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
@@ -1400,6 +1400,9 @@ struct amdgpu_ualink_remote {
 
        /* remote GPUs ring buffer, read, write pointer local copy and gart 
mapping */
        struct amdgpu_ualink_peer       peer[AMDGPU_UALINK_ACCEL_MAX];
+
+       /* use lsdma write to NPA address for remote interrupt */
+       bool                           use_lsdma;
 };
 
 static inline struct amdgpu_ualink_remote *to_remote(struct amdgpu_device 
*adev)
@@ -2073,6 +2076,8 @@ static int amdgpu_ualink_sdma_entities_init(struct 
amdgpu_device *adev)
                i++;
        }
 
+       remote->use_lsdma = true;
+
        dev_dbg(adev->dev, "exit\n");
        return 0;
 
@@ -2656,6 +2661,20 @@ static int amdgpu_ualink_send_command(struct 
amdgpu_device *adev,
        dev_dbg(adev->dev, "dxs_port 0x%x, doorbell_npa_gart 0x%llx -> 
0x%llx\n",
                peer->dxs_port, ring->doorbell_npa_gart, doorbell_npa_gart);
 
+       dev_dbg(adev->dev, "use %s\n", remote->use_lsdma ? "lsdma" : "sdma");
+
+       if (remote->use_lsdma) {
+               div_u64_rem(ring->wptr, ring->rb_size, &rem);
+               r = amdgpu_lsdma_copy_mem(adev, src,
+                                         ring->rb_npa_gart + rem * 64,
+                                         64);
+               r = amdgpu_lsdma_copy_mem(adev, src + 64, ring->wptr_npa_gart, 
8);
+
+               r = amdgpu_lsdma_copy_mem(adev, src + 72, doorbell_npa_gart, 4);
+               amdgpu_job_free(job);
+               goto out_wait_complete;
+        }
+
        sdma_ring = &adev->sdma.instance[0].ring;
 
        /*
@@ -2693,6 +2712,7 @@ static int amdgpu_ualink_send_command(struct 
amdgpu_device *adev,
                return r;
        }
 
+out_wait_complete:
        /*
         * poll remote completion writeback data
         */
-- 
2.55.0

Reply via email to