mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
Revert "drm/amd: Stop evicting resources on APUs in suspend"
[ Upstream commit d0ce1aaa8531a4a4707711cab5721374751c51b0 ] 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> (cherry picked from commit ce8f7d95899c2869b47ea6ce0b3e5bf304b2fff4) Cc: stable@vger.kernel.org Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a2419fa7fe
commit
ced7c789e3
@@ -1409,11 +1409,9 @@ static inline int amdgpu_acpi_smart_shift_update(struct drm_device *dev,
|
|||||||
#if defined(CONFIG_ACPI) && defined(CONFIG_SUSPEND)
|
#if defined(CONFIG_ACPI) && defined(CONFIG_SUSPEND)
|
||||||
bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev);
|
bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev);
|
||||||
bool amdgpu_acpi_is_s0ix_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
|
#else
|
||||||
static inline bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) { return false; }
|
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 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
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_DRM_AMD_DC)
|
#if defined(CONFIG_DRM_AMD_DC)
|
||||||
|
|||||||
@@ -1118,22 +1118,4 @@ bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev)
|
|||||||
#endif /* CONFIG_AMD_PMC */
|
#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 */
|
#endif /* CONFIG_SUSPEND */
|
||||||
|
|||||||
@@ -4241,15 +4241,13 @@ int amdgpu_device_prepare(struct drm_device *dev)
|
|||||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||||
int i, r;
|
int i, r;
|
||||||
|
|
||||||
amdgpu_choose_low_power_state(adev);
|
|
||||||
|
|
||||||
if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
|
if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Evict the majority of BOs before starting suspend sequence */
|
/* Evict the majority of BOs before starting suspend sequence */
|
||||||
r = amdgpu_device_evict_resources(adev);
|
r = amdgpu_device_evict_resources(adev);
|
||||||
if (r)
|
if (r)
|
||||||
goto unprepare;
|
return r;
|
||||||
|
|
||||||
flush_delayed_work(&adev->gfx.gfx_off_delay_work);
|
flush_delayed_work(&adev->gfx.gfx_off_delay_work);
|
||||||
|
|
||||||
@@ -4260,15 +4258,10 @@ int amdgpu_device_prepare(struct drm_device *dev)
|
|||||||
continue;
|
continue;
|
||||||
r = adev->ip_blocks[i].version->funcs->prepare_suspend((void *)adev);
|
r = adev->ip_blocks[i].version->funcs->prepare_suspend((void *)adev);
|
||||||
if (r)
|
if (r)
|
||||||
goto unprepare;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
unprepare:
|
|
||||||
adev->in_s0ix = adev->in_s3 = adev->in_s4 = false;
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user