With dGPUs that support BACO or BOCO we want them to go into those states when the system goes to s2idle. Detect that the system will be targeting this state and force the call into runtime suspend. If the runtime suspend call fails for any reason, then fallback to standard suspend flow. Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> --- v1->v2: * New patch drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 3 +-- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c index 711f2a1bf525..7c3c6380135a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c @@ -1073,8 +1073,7 @@ bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) */ bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) { - if (!(adev->flags & AMD_IS_APU) || - (pm_suspend_target_state != PM_SUSPEND_TO_IDLE)) + if (pm_suspend_target_state != PM_SUSPEND_TO_IDLE) return false; if (adev->asic_type < CHIP_RAVEN) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 750984517192..acc032c4c250 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -2415,8 +2415,18 @@ static int amdgpu_pmops_suspend(struct device *dev) struct drm_device *drm_dev = dev_get_drvdata(dev); struct amdgpu_device *adev = drm_to_adev(drm_dev); - if (amdgpu_acpi_is_s0ix_active(adev)) + if (amdgpu_acpi_is_s0ix_active(adev)) { + /* try to explicitly enter runtime suspend for s2idle on BACO/BOCO */ + if (dev_pm_test_driver_flags(drm_dev->dev, DPM_FLAG_SMART_SUSPEND)) { + int ret; + + ret = pm_runtime_suspend(dev); + if (!ret) + return 0; + DRM_WARN("failed to enter runtime suspend, running system suspend: %d\n", ret); + } adev->in_s0ix = true; + } else if (amdgpu_acpi_is_s3_active(adev)) adev->in_s3 = true; if (!adev->in_s0ix && !adev->in_s3) -- 2.34.1