drm/amd: Don't allow s0ix on APUs older than Raven
authorMario Limonciello <mario.limonciello@amd.com>
Mon, 13 Feb 2023 21:10:30 +0000 (15:10 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 23 Feb 2023 22:35:58 +0000 (17:35 -0500)
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: cf488dcd0ab7 ("drm/amd: Allow s0ix without BIOS support")
Suggested-by: Alexander Deucher <Alexander.Deucher@amd.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c

index 458362e..d4196fc 100644 (file)
@@ -1073,6 +1073,9 @@ bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev)
            (pm_suspend_target_state != PM_SUSPEND_TO_IDLE))
                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
         * risky to do any special firmware-related preparations for entering
index 86fbb41..bfb7ed2 100644 (file)
@@ -2414,8 +2414,10 @@ static int amdgpu_pmops_suspend(struct device *dev)
 
        if (amdgpu_acpi_is_s0ix_active(adev))
                adev->in_s0ix = true;
-       else
+       else if (amdgpu_acpi_is_s3_active(adev))
                adev->in_s3 = true;
+       if (!adev->in_s0ix && !adev->in_s3)
+               return 0;
        return amdgpu_device_suspend(drm_dev, true);
 }
 
@@ -2436,6 +2438,9 @@ static int amdgpu_pmops_resume(struct device *dev)
        struct amdgpu_device *adev = drm_to_adev(drm_dev);
        int r;
 
+       if (!adev->in_s0ix && !adev->in_s3)
+               return 0;
+
        /* Avoids registers access if device is physically gone */
        if (!pci_device_is_present(adev->pdev))
                adev->no_hw_access = true;