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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Jun 2023 07:26:21 +0000 (09:26 +0200)
commit ca47518663973083c513cd6b2801dcda0bfaaa99 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c

index a78e80f9f65cdbae24061eb77652e4dfa222dae7..e32bd990800ded82836e16176ad8cdf73b5d6e61 100644 (file)
@@ -1083,6 +1083,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 871f481f84328ad8706c243e5838e1cd267b0f7a..88a9ece7f4647c820acdf99e958050f190e4b4e0 100644 (file)
@@ -2402,8 +2402,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);
 }
 
@@ -2424,6 +2426,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;