| From 7123d39dc24dcd21ff23d75f46f926b15269b9da Mon Sep 17 00:00:00 2001 |
| From: Mario Limonciello <mario.limonciello@amd.com> |
| Date: Tue, 17 May 2022 12:00:37 -0500 |
| Subject: drm/amd: Don't reset dGPUs if the system is going to s2idle |
| |
| From: Mario Limonciello <mario.limonciello@amd.com> |
| |
| commit 7123d39dc24dcd21ff23d75f46f926b15269b9da upstream. |
| |
| An A+A configuration on ASUS ROG Strix G513QY proves that the ASIC |
| reset for handling aborted suspend can't work with s2idle. |
| |
| This functionality was introduced in commit daf8de0874ab5b ("drm/amdgpu: |
| always reset the asic in suspend (v2)"). A few other commits have |
| gone on top of the ASIC reset, but this still doesn't work on the A+A |
| configuration in s2idle. |
| |
| Avoid doing the reset on dGPUs specifically when using s2idle. |
| |
| Fixes: daf8de0874ab5b ("drm/amdgpu: always reset the asic in suspend (v2)") |
| Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2008 |
| Reviewed-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++ |
| drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 14 ++++++++++++++ |
| drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 +- |
| 3 files changed, 17 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h |
| @@ -1422,9 +1422,11 @@ static inline int amdgpu_acpi_smart_shif |
| |
| #if defined(CONFIG_ACPI) && defined(CONFIG_SUSPEND) |
| bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev); |
| +bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev); |
| bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev); |
| #else |
| static inline bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) { return false; } |
| +static inline bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) { return false; } |
| static inline bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev) { return false; } |
| #endif |
| |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c |
| @@ -1046,6 +1046,20 @@ bool amdgpu_acpi_is_s3_active(struct amd |
| } |
| |
| /** |
| + * amdgpu_acpi_should_gpu_reset |
| + * |
| + * @adev: amdgpu_device_pointer |
| + * |
| + * returns true if should reset GPU, false if not |
| + */ |
| +bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) |
| +{ |
| + if (adev->flags & AMD_IS_APU) |
| + return false; |
| + return pm_suspend_target_state != PM_SUSPEND_TO_IDLE; |
| +} |
| + |
| +/** |
| * amdgpu_acpi_is_s0ix_active |
| * |
| * @adev: amdgpu_device_pointer |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
| @@ -2289,7 +2289,7 @@ static int amdgpu_pmops_suspend_noirq(st |
| struct drm_device *drm_dev = dev_get_drvdata(dev); |
| struct amdgpu_device *adev = drm_to_adev(drm_dev); |
| |
| - if (!adev->in_s0ix) |
| + if (amdgpu_acpi_should_gpu_reset(adev)) |
| return amdgpu_asic_reset(adev); |
| |
| return 0; |