Skip to content

Commit 1d617c0

Browse files
Lijo Lazaralexdeucher
authored andcommitted
drm/amdgpu: During s0ix don't wait to signal GFXOFF
In the rare event when GFX IP suspend coincides with a s0ix entry, don't schedule a delayed work, instead signal PMFW immediately to allow GFXOFF entry. GFXOFF is a prerequisite for s0ix entry. PMFW needs to be signaled about GFXOFF status before amd-pmc module passes OS HINT to PMFW telling that everything is ready for a safe s0ix entry. Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1712 Signed-off-by: Lijo Lazar <[email protected]> Reviewed-by: Alex Deucher <[email protected]> Reviewed-by: Mario Limonciello <[email protected]> Signed-off-by: Alex Deucher <[email protected]> Cc: [email protected]
1 parent d08ce8c commit 1d617c0

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
/* delay 0.1 second to enable gfx off feature */
3232
#define GFX_OFF_DELAY_ENABLE msecs_to_jiffies(100)
3333

34+
#define GFX_OFF_NO_DELAY 0
35+
3436
/*
3537
* GPU GFX IP block helpers function.
3638
*/
@@ -558,6 +560,8 @@ int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev)
558560

559561
void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable)
560562
{
563+
unsigned long delay = GFX_OFF_DELAY_ENABLE;
564+
561565
if (!(adev->pm.pp_feature & PP_GFXOFF_MASK))
562566
return;
563567

@@ -573,8 +577,14 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable)
573577

574578
adev->gfx.gfx_off_req_count--;
575579

576-
if (adev->gfx.gfx_off_req_count == 0 && !adev->gfx.gfx_off_state)
577-
schedule_delayed_work(&adev->gfx.gfx_off_delay_work, GFX_OFF_DELAY_ENABLE);
580+
if (adev->gfx.gfx_off_req_count == 0 &&
581+
!adev->gfx.gfx_off_state) {
582+
/* If going to s2idle, no need to wait */
583+
if (adev->in_s0ix)
584+
delay = GFX_OFF_NO_DELAY;
585+
schedule_delayed_work(&adev->gfx.gfx_off_delay_work,
586+
delay);
587+
}
578588
} else {
579589
if (adev->gfx.gfx_off_req_count == 0) {
580590
cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);

0 commit comments

Comments
 (0)