[PATCH 43/95] drm/amdgpu: UALink use LSDMA to send remote interrupt command
Alex Deucher <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
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