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

drm/amd: Add concept of running prepare_suspend() sequence for IP blocks

If any IP blocks allocate memory during their hw_fini() sequence
this can cause the suspend to fail under memory pressure.  Introduce
a new phase that IP blocks can use to allocate memory before suspend
starts so that it can potentially be evicted into swap instead.
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 5095d541
...@@ -4348,7 +4348,7 @@ static int amdgpu_device_evict_resources(struct amdgpu_device *adev) ...@@ -4348,7 +4348,7 @@ static int amdgpu_device_evict_resources(struct amdgpu_device *adev)
int amdgpu_device_prepare(struct drm_device *dev) 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 r; int i, r;
if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
return 0; return 0;
...@@ -4358,6 +4358,16 @@ int amdgpu_device_prepare(struct drm_device *dev) ...@@ -4358,6 +4358,16 @@ int amdgpu_device_prepare(struct drm_device *dev)
if (r) if (r)
return r; return r;
for (i = 0; i < adev->num_ip_blocks; i++) {
if (!adev->ip_blocks[i].status.valid)
continue;
if (!adev->ip_blocks[i].version->funcs->prepare_suspend)
continue;
r = adev->ip_blocks[i].version->funcs->prepare_suspend((void *)adev);
if (r)
return r;
}
return 0; return 0;
} }
......
...@@ -299,6 +299,7 @@ struct amd_ip_funcs { ...@@ -299,6 +299,7 @@ struct amd_ip_funcs {
int (*hw_init)(void *handle); int (*hw_init)(void *handle);
int (*hw_fini)(void *handle); int (*hw_fini)(void *handle);
void (*late_fini)(void *handle); void (*late_fini)(void *handle);
int (*prepare_suspend)(void *handle);
int (*suspend)(void *handle); int (*suspend)(void *handle);
int (*resume)(void *handle); int (*resume)(void *handle);
bool (*is_idle)(void *handle); bool (*is_idle)(void *handle);
......
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