Revert "drm/amd: Stop evicting resources on APUs in suspend"
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 1 May 2025 17:00:16 +0000 (13:00 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 7 May 2025 21:42:30 +0000 (17:42 -0400)
This reverts commit 3a9626c816db901def438dc2513622e281186d39.

This breaks S4 because we end up setting the s3/s0ix flags
even when we are entering s4 since prepare is used by both
flows.  The causes both the S3/s0ix and s4 flags to be set
which breaks several checks in the driver which assume they
are mutually exclusive.

Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3634
Cc: Mario Limonciello <mario.limonciello@amd.com>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

index de57ab032cc70169f6c6e223aa173c2931f28f40..f59ba0960a776ab60f5c3be218923011dc20e078 100644 (file)
@@ -1707,11 +1707,9 @@ static inline void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_cap
 #if defined(CONFIG_ACPI) && defined(CONFIG_SUSPEND)
 bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev);
 bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev);
-void amdgpu_choose_low_power_state(struct amdgpu_device *adev);
 #else
 static inline bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) { return false; }
 static inline bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev) { return false; }
-static inline void amdgpu_choose_low_power_state(struct amdgpu_device *adev) { }
 #endif
 
 void amdgpu_register_gpu_instance(struct amdgpu_device *adev);
index b7f8f2ff143dd1e0206894b019d69eebae049efb..707e131f89d237610d63585467abc778a08b472b 100644 (file)
@@ -1533,22 +1533,4 @@ bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev)
 #endif /* CONFIG_AMD_PMC */
 }
 
-/**
- * amdgpu_choose_low_power_state
- *
- * @adev: amdgpu_device_pointer
- *
- * Choose the target low power state for the GPU
- */
-void amdgpu_choose_low_power_state(struct amdgpu_device *adev)
-{
-       if (adev->in_runpm)
-               return;
-
-       if (amdgpu_acpi_is_s0ix_active(adev))
-               adev->in_s0ix = true;
-       else if (amdgpu_acpi_is_s3_active(adev))
-               adev->in_s3 = true;
-}
-
 #endif /* CONFIG_SUSPEND */
index 8330e30f0cafee26528d054fa93ae43580069523..ccc6217761bf15455fcb006522c5229119f2b217 100644 (file)
@@ -5018,15 +5018,13 @@ int amdgpu_device_prepare(struct drm_device *dev)
        struct amdgpu_device *adev = drm_to_adev(dev);
        int i, r;
 
-       amdgpu_choose_low_power_state(adev);
-
        if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
                return 0;
 
        /* Evict the majority of BOs before starting suspend sequence */
        r = amdgpu_device_evict_resources(adev);
        if (r)
-               goto unprepare;
+               return r;
 
        flush_delayed_work(&adev->gfx.gfx_off_delay_work);
 
@@ -5037,15 +5035,10 @@ int amdgpu_device_prepare(struct drm_device *dev)
                        continue;
                r = adev->ip_blocks[i].version->funcs->prepare_suspend(&adev->ip_blocks[i]);
                if (r)
-                       goto unprepare;
+                       return r;
        }
 
        return 0;
-
-unprepare:
-       adev->in_s0ix = adev->in_s3 = adev->in_s4 = false;
-
-       return r;
 }
 
 /**