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 <lijo.lazar@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Mario Limonciello <mario.limonciell@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -31,6 +31,8 @@
|
|||||||
/* delay 0.1 second to enable gfx off feature */
|
/* delay 0.1 second to enable gfx off feature */
|
||||||
#define GFX_OFF_DELAY_ENABLE msecs_to_jiffies(100)
|
#define GFX_OFF_DELAY_ENABLE msecs_to_jiffies(100)
|
||||||
|
|
||||||
|
#define GFX_OFF_NO_DELAY 0
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPU GFX IP block helpers function.
|
* GPU GFX IP block helpers function.
|
||||||
*/
|
*/
|
||||||
@@ -558,6 +560,8 @@ int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev)
|
|||||||
|
|
||||||
void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable)
|
void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable)
|
||||||
{
|
{
|
||||||
|
unsigned long delay = GFX_OFF_DELAY_ENABLE;
|
||||||
|
|
||||||
if (!(adev->pm.pp_feature & PP_GFXOFF_MASK))
|
if (!(adev->pm.pp_feature & PP_GFXOFF_MASK))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -573,8 +577,14 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable)
|
|||||||
|
|
||||||
adev->gfx.gfx_off_req_count--;
|
adev->gfx.gfx_off_req_count--;
|
||||||
|
|
||||||
if (adev->gfx.gfx_off_req_count == 0 && !adev->gfx.gfx_off_state)
|
if (adev->gfx.gfx_off_req_count == 0 &&
|
||||||
schedule_delayed_work(&adev->gfx.gfx_off_delay_work, GFX_OFF_DELAY_ENABLE);
|
!adev->gfx.gfx_off_state) {
|
||||||
|
/* If going to s2idle, no need to wait */
|
||||||
|
if (adev->in_s0ix)
|
||||||
|
delay = GFX_OFF_NO_DELAY;
|
||||||
|
schedule_delayed_work(&adev->gfx.gfx_off_delay_work,
|
||||||
|
delay);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (adev->gfx.gfx_off_req_count == 0) {
|
if (adev->gfx.gfx_off_req_count == 0) {
|
||||||
cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);
|
cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);
|
||||||
|
|||||||
Reference in New Issue
Block a user