[v6 09/13] drm/amd/amdgpu: Implement MES suspend/resume gang functionality for v12
Alex Deucher
alexdeucher at gmail.com
Mon Aug 4 17:19:14 UTC 2025
On Mon, Aug 4, 2025 at 4:48 AM Jesse.Zhang <Jesse.Zhang at amd.com> wrote:
>
> This commit implements the actual MES (Micro Engine Scheduler) suspend
> and resume gang operations for version 12 hardware. Previously these
> functions were just stubs returning success.
>
> Signed-off-by: Jesse Zhang <Jesse.Zhang at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/mes_v12_0.c | 44 ++++++++++++++++++++++++--
> 1 file changed, 42 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c b/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c
> index 579720695e9e..9c86dfdef1bb 100644
> --- a/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c
> @@ -569,13 +569,53 @@ static int mes_v12_0_unmap_legacy_queue(struct amdgpu_mes *mes,
> static int mes_v12_0_suspend_gang(struct amdgpu_mes *mes,
> struct mes_suspend_gang_input *input)
> {
> - return 0;
> + union MESAPI__SUSPEND mes_suspend_gang_pkt;
> + int pipe;
> +
> + memset(&mes_suspend_gang_pkt, 0, sizeof(mes_suspend_gang_pkt));
> +
> + mes_suspend_gang_pkt.header.type = MES_API_TYPE_SCHEDULER;
> + mes_suspend_gang_pkt.header.opcode = MES_SCH_API_SUSPEND;
> + mes_suspend_gang_pkt.header.dwsize = API_FRAME_SIZE_IN_DWORDS;
> +
> + mes_suspend_gang_pkt.suspend_all_gangs = input->suspend_all_gangs;
> + mes_suspend_gang_pkt.gang_context_addr = input->gang_context_addr;
> + mes_suspend_gang_pkt.suspend_fence_addr = input->suspend_fence_addr;
> + mes_suspend_gang_pkt.suspend_fence_value = input->suspend_fence_value;
> +
> + if (mes->adev->enable_uni_mes)
> + pipe = AMDGPU_MES_KIQ_PIPE;
> + else
> + pipe = AMDGPU_MES_SCHED_PIPE;
I think this should probably be AMDGPU_MES_SCHED_PIPE always.
> +
> + return mes_v12_0_submit_pkt_and_poll_completion(mes, pipe,
> + &mes_suspend_gang_pkt, sizeof(mes_suspend_gang_pkt),
> + offsetof(union MESAPI__SUSPEND, api_status));
> }
>
> static int mes_v12_0_resume_gang(struct amdgpu_mes *mes,
> struct mes_resume_gang_input *input)
> {
> - return 0;
> + union MESAPI__RESUME mes_resume_gang_pkt;
> + int pipe;
> +
> + memset(&mes_resume_gang_pkt, 0, sizeof(mes_resume_gang_pkt));
> +
> + mes_resume_gang_pkt.header.type = MES_API_TYPE_SCHEDULER;
> + mes_resume_gang_pkt.header.opcode = MES_SCH_API_RESUME;
> + mes_resume_gang_pkt.header.dwsize = API_FRAME_SIZE_IN_DWORDS;
> +
> + mes_resume_gang_pkt.resume_all_gangs = input->resume_all_gangs;
> + mes_resume_gang_pkt.gang_context_addr = input->gang_context_addr;
> +
> + if (mes->adev->enable_uni_mes)
> + pipe = AMDGPU_MES_KIQ_PIPE;
> + else
> + pipe = AMDGPU_MES_SCHED_PIPE;
I think this should probably be AMDGPU_MES_SCHED_PIPE always.
> +
> + return mes_v12_0_submit_pkt_and_poll_completion(mes, pipe,
> + &mes_resume_gang_pkt, sizeof(mes_resume_gang_pkt),
> + offsetof(union MESAPI__RESUME, api_status));
> }
>
> static int mes_v12_0_query_sched_status(struct amdgpu_mes *mes, int pipe)
> --
> 2.49.0
>
More information about the amd-gfx
mailing list