On Tue, May 17, 2022 at 1:00 PM Mario Limonciello <mario.limonciello@xxxxxxx> wrote: > > 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 > Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > v1->v2: > * Add missing stub function for non CONFIG_ACPI case > > 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(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index 3c20c2eadf4e..76df583663c7 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -1378,9 +1378,11 @@ static inline int amdgpu_acpi_smart_shift_update(struct drm_device *dev, > > #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 > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c > index 0e12315fa0cb..98ac53ee6bb5 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c > @@ -1045,6 +1045,20 @@ bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev) > (pm_suspend_target_state == PM_SUSPEND_MEM); > } > > +/** > + * 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 > * > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > index 16871baee784..a84766c13ac5 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > @@ -2315,7 +2315,7 @@ static int amdgpu_pmops_suspend_noirq(struct device *dev) > 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; > -- > 2.25.1 >