Require a strict (me,pipe,queue) match in the gfx case, then userq gfx
EOPs fall through to amdgpu_userq_process_fence_irq().

Signed-off-by: Jesse Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
index c49a31a3789c..208f9ffed60a 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
@@ -6530,10 +6530,17 @@ static int gfx_v11_0_eop_irq(struct amdgpu_device *adev,
 
                switch (me_id) {
                case 0:
-                       if (pipe_id == 0)
-                               amdgpu_fence_process(&adev->gfx.gfx_ring[0]);
-                       else
-                               amdgpu_fence_process(&adev->gfx.gfx_ring[1]);
+                       /*
+                        * MES splits gfx HQDs per (me,pipe): KGQ owns queue=0,
+                        * userq gfx owns queue>=1 (see 
amdgpu_mes_get_hqd_mask).
+                        */
+                       for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
+                               ring = &adev->gfx.gfx_ring[i];
+                               if ((ring->me == me_id) &&
+                                   (ring->pipe == pipe_id) &&
+                                   (ring->queue == queue_id))
+                                       amdgpu_fence_process(ring);
+                       }
                        break;
                case 1:
                case 2:
-- 
2.49.0

Reply via email to