Commit ca475186 authored by Mario Limonciello's avatar Mario Limonciello Committed by Alex Deucher

drm/amd: Don't allow s0ix on APUs older than Raven

APUs before Raven didn't support s0ix.  As we just relieved some
of the safety checks for s0ix to improve power consumption on
APUs that support it but that are missing BIOS support a new
blind spot was introduced that a user could "try" to run s0ix.

Plug this hole so that if users try to run s0ix on anything older
than Raven it will just skip suspend of the GPU.

Fixes: cf488dcd ("drm/amd: Allow s0ix without BIOS support")
Suggested-by: default avatarAlexander Deucher <Alexander.Deucher@amd.com>
Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent f9c35f4f
...@@ -1073,6 +1073,9 @@ bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) ...@@ -1073,6 +1073,9 @@ bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev)
(pm_suspend_target_state != PM_SUSPEND_TO_IDLE)) (pm_suspend_target_state != PM_SUSPEND_TO_IDLE))
return false; return false;
if (adev->asic_type < CHIP_RAVEN)
return false;
/* /*
* If ACPI_FADT_LOW_POWER_S0 is not set in the FADT, it is generally * If ACPI_FADT_LOW_POWER_S0 is not set in the FADT, it is generally
* risky to do any special firmware-related preparations for entering * risky to do any special firmware-related preparations for entering
......
...@@ -2414,8 +2414,10 @@ static int amdgpu_pmops_suspend(struct device *dev) ...@@ -2414,8 +2414,10 @@ static int amdgpu_pmops_suspend(struct device *dev)
if (amdgpu_acpi_is_s0ix_active(adev)) if (amdgpu_acpi_is_s0ix_active(adev))
adev->in_s0ix = true; adev->in_s0ix = true;
else else if (amdgpu_acpi_is_s3_active(adev))
adev->in_s3 = true; adev->in_s3 = true;
if (!adev->in_s0ix && !adev->in_s3)
return 0;
return amdgpu_device_suspend(drm_dev, true); return amdgpu_device_suspend(drm_dev, true);
} }
...@@ -2436,6 +2438,9 @@ static int amdgpu_pmops_resume(struct device *dev) ...@@ -2436,6 +2438,9 @@ static int amdgpu_pmops_resume(struct device *dev)
struct amdgpu_device *adev = drm_to_adev(drm_dev); struct amdgpu_device *adev = drm_to_adev(drm_dev);
int r; int r;
if (!adev->in_s0ix && !adev->in_s3)
return 0;
/* Avoids registers access if device is physically gone */ /* Avoids registers access if device is physically gone */
if (!pci_device_is_present(adev->pdev)) if (!pci_device_is_present(adev->pdev))
adev->no_hw_access = true; adev->no_hw_access = true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment