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.

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 | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
index 8ea34411f4227..5cb80f01871e5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
@@ -1354,6 +1354,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)
@@ -2027,6 +2030,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;
 
@@ -2609,6 +2614,19 @@ 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) {
+               r = amdgpu_lsdma_copy_mem(adev, src,
+                                         ring->rb_npa_gart + (ring->wptr % 
ring->rb_size) * 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;
 
        /*
@@ -2645,6 +2663,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