[AMD Official Use Only - General] GFX PG is a pre-requisite for gfxoff IIRC. We shouldn't disable it on s2idle I think.
Alex ________________________________ From: amd-gfx <amd-gfx-boun...@lists.freedesktop.org> on behalf of Mario Limonciello <mario.limoncie...@amd.com> Sent: Friday, May 19, 2023 12:24 AM To: Quan, Evan <evan.q...@amd.com>; amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org> Cc: Tsao, Anson <anson.t...@amd.com>; Martinez, Juan <juan.marti...@amd.com>; Gong, Richard <richard.g...@amd.com>; Huang, Tim <tim.hu...@amd.com> Subject: Re: [PATCH v4] drm/amd: Flush any delayed gfxoff on suspend entry Yeah; that seems like a reasonable way to accomplish the same result. I'll experiment with this. On 5/18/23 22:33, Quan, Evan wrote: > [AMD Official Use Only - General] > > If I understand correctly, similar job is already performed in > "amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);" > Maybe you just need to undo the "skip PG for GFX on S0ix"? > > /* skip PG for GFX, SDMA on S0ix */ > if (adev->in_s0ix && > (adev->ip_blocks[i].version->type == > AMD_IP_BLOCK_TYPE_GFX || > adev->ip_blocks[i].version->type == > AMD_IP_BLOCK_TYPE_SDMA)) > continue; > > Evan >> -----Original Message----- >> From: amd-gfx <amd-gfx-boun...@lists.freedesktop.org> On Behalf Of Mario >> Limonciello >> Sent: Friday, May 19, 2023 12:53 AM >> To: amd-gfx@lists.freedesktop.org >> Cc: Tsao, Anson <anson.t...@amd.com>; Huang, Tim >> <tim.hu...@amd.com>; Martinez, Juan <juan.marti...@amd.com>; >> Limonciello, Mario <mario.limoncie...@amd.com>; Gong, Richard >> <richard.g...@amd.com> >> Subject: [PATCH v4] drm/amd: Flush any delayed gfxoff on suspend entry >> >> DCN 3.1.4 is reported to hang on s2idle entry if graphics activity >> is happening during entry. This is because GFXOFF was scheduled as >> delayed but RLC gets disabled in s2idle entry sequence which will >> hang GFX IP if not already in GFXOFF. >> >> To help this problem, flush any delayed work for GFXOFF early in >> s2idle entry sequence to ensure that it's off when RLC is changed. >> >> commit 3964b0c2e843 ("drm/amdgpu: complete gfxoff allow signal during >> suspend without delay") modified power gating flow so that if called >> in s0ix that it ensured that GFXOFF wasn't put in work queue but >> instead processed immediately. >> >> This is dead code due to commit 5d70a549d00d ("drm/amdgpu: skip >> CG/PG for gfx during S0ix") because GFXOFF will now not be explicitly >> called as part of the suspend entry code. Remove that dead code. >> >> Cc: sta...@vger.kernel.org # 6.1+ >> Suggested-by: Tim Huang <tim.hu...@amd.com> >> Signed-off-by: Mario Limonciello <mario.limoncie...@amd.com> >> --- >> v3->v4: >> * Drop patches 2-4 >> --- >> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 + >> drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 9 +-------- >> 2 files changed, 2 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> index a9d9bbe8586b..059139f1f973 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> @@ -4316,6 +4316,7 @@ int amdgpu_device_suspend(struct drm_device >> *dev, bool fbcon) >> drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)- >>> fb_helper, true); >> >> cancel_delayed_work_sync(&adev->delayed_init_work); >> + flush_delayed_work(&adev->gfx.gfx_off_delay_work); >> >> amdgpu_ras_suspend(adev); >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c >> index f2d0b1d55d77..b1190eb0e9c7 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c >> @@ -692,15 +692,8 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device >> *adev, bool enable) >> >> if (adev->gfx.gfx_off_req_count == 0 && >> !adev->gfx.gfx_off_state) { >> - /* If going to s2idle, no need to wait */ >> - if (adev->in_s0ix) { >> - if >> (!amdgpu_dpm_set_powergating_by_smu(adev, >> - AMD_IP_BLOCK_TYPE_GFX, >> true)) >> - adev->gfx.gfx_off_state = true; >> - } else { >> - schedule_delayed_work(&adev- >>> gfx.gfx_off_delay_work, >> + schedule_delayed_work(&adev- >>> gfx.gfx_off_delay_work, >> delay); >> - } >> } >> } else { >> if (adev->gfx.gfx_off_req_count == 0) { >> -- >> 2.34.1 >