]> git.hungrycats.org Git - linux/commitdiff
drm/amdgpu/mes_v12_0: use mes schedule pipe for legacy queues on unified MES
authorJesse Zhang <Jesse.Zhang@amd.com>
Mon, 30 Mar 2026 01:33:27 +0000 (09:33 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 17 Jun 2026 19:51:33 +0000 (15:51 -0400)
when suspend_all_gangs is issued to pipe0 MES during system suspend or runtime PM, pipe0 can only suspend and resume queues it has tracked.
KCQs registered with a non-zero pipe slot may not be correctly handled, leaving them in an inconsistent state after resume.

v3: fix the schedule pipe issue
v4: use schedule pipe for KQ resets

Reviewed-by: Michael Chen <michael.chen@amd.com>
Suggested-by: Michael Chen <michael.chen@amd.com>
Suggested-by: Alex Deucher <alexander.deucher@amd.com>
Suggested-by: Shaoyun Liu <shaoyun.liu@amd.com>
Signed-off-by: Jesse Zhang <jesse.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/mes_v12_0.c

index 08b10b9da7a5b1e0c102d134a17804aa09f328be..3d4728b74274dd565552193600d71ee68e98e7f5 100644 (file)
@@ -528,10 +528,15 @@ static int mes_v12_0_map_legacy_queue(struct amdgpu_mes *mes,
                convert_to_mes_queue_type(input->queue_type);
        mes_add_queue_pkt.map_legacy_kq = 1;
 
-       if (mes->adev->enable_uni_mes)
-               pipe = AMDGPU_MES_KIQ_PIPE;
-       else
+       if (mes->adev->enable_uni_mes) {
+               /* Keep scheduler queue on KIQ pipe; map all other kernel queues on sched pipe. */
+               if (input->queue_type == AMDGPU_RING_TYPE_MES)
+                       pipe = AMDGPU_MES_KIQ_PIPE;
+               else
+                       pipe = AMDGPU_MES_SCHED_PIPE;
+       } else {
                pipe = AMDGPU_MES_SCHED_PIPE;
+       }
 
        return mes_v12_0_submit_pkt_and_poll_completion(mes, pipe,
                        &mes_add_queue_pkt, sizeof(mes_add_queue_pkt),
@@ -567,10 +572,15 @@ static int mes_v12_0_unmap_legacy_queue(struct amdgpu_mes *mes,
                        convert_to_mes_queue_type(input->queue_type);
        }
 
-       if (mes->adev->enable_uni_mes)
-               pipe = AMDGPU_MES_KIQ_PIPE;
-       else
+       if (mes->adev->enable_uni_mes) {
+               /* Keep scheduler queue on KIQ pipe; unmap all other kernel queues on sched pipe. */
+               if (input->queue_type == AMDGPU_RING_TYPE_MES)
+                       pipe = AMDGPU_MES_KIQ_PIPE;
+               else
+                       pipe = AMDGPU_MES_SCHED_PIPE;
+       } else {
                pipe = AMDGPU_MES_SCHED_PIPE;
+       }
 
        return mes_v12_0_submit_pkt_and_poll_completion(mes, pipe,
                        &mes_remove_queue_pkt, sizeof(mes_remove_queue_pkt),
@@ -913,10 +923,7 @@ static int mes_v12_0_reset_hw_queue(struct amdgpu_mes *mes,
                mes_reset_queue_pkt.doorbell_offset = input->doorbell_offset;
        }
 
-       if (input->is_kq)
-               pipe = AMDGPU_MES_KIQ_PIPE;
-       else
-               pipe = AMDGPU_MES_SCHED_PIPE;
+       pipe = AMDGPU_MES_SCHED_PIPE;
 
        return mes_v12_0_submit_pkt_and_poll_completion(mes, pipe,
                        &mes_reset_queue_pkt, sizeof(mes_reset_queue_pkt),