Skip to content

Commit a7b7d9e

Browse files
superm1alexdeucher
authored andcommitted
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 4b31b92 ("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 10cb67e ("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. Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Tim Huang <tim.huang@amd.com> Reviewed-by: Lijo Lazar <lijo.lazar@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
1 parent f1740b1 commit a7b7d9e

File tree

2 files changed

+2
-8
lines changed

2 files changed

+2
-8
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4394,6 +4394,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
43944394
drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, true);
43954395

43964396
cancel_delayed_work_sync(&adev->delayed_init_work);
4397+
flush_delayed_work(&adev->gfx.gfx_off_delay_work);
43974398

43984399
amdgpu_ras_suspend(adev);
43994400

drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -692,15 +692,8 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable)
692692

693693
if (adev->gfx.gfx_off_req_count == 0 &&
694694
!adev->gfx.gfx_off_state) {
695-
/* If going to s2idle, no need to wait */
696-
if (adev->in_s0ix) {
697-
if (!amdgpu_dpm_set_powergating_by_smu(adev,
698-
AMD_IP_BLOCK_TYPE_GFX, true))
699-
adev->gfx.gfx_off_state = true;
700-
} else {
701-
schedule_delayed_work(&adev->gfx.gfx_off_delay_work,
695+
schedule_delayed_work(&adev->gfx.gfx_off_delay_work,
702696
delay);
703-
}
704697
}
705698
} else {
706699
if (adev->gfx.gfx_off_req_count == 0) {

0 commit comments

Comments
 (0)