Require a strict (me,pipe,queue) match in the gfx case.
The EOP IRQ case me_id=0 (gfx) consumed the interrupt for the kernel
gfx_ring[] based on pipe_id alone. MES splits gfx HQDs per (me,pipe):
KGQ owns queue=0, userq gfx owns queue>=1 (see amdgpu_mes_get_hqd_mask).

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

diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
index cb4d84c5f52b..d9b1fc29e9d8 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
@@ -4858,10 +4858,17 @@ static int gfx_v12_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