mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 10:04:04 +02:00
drm/amd: Add support for a complete pmops action
complete() callbacks are supposed to handle reversing anything that occurred during prepare() callbacks. They'll be called on every power state transition, and will also be called if the sequence is failed (such as an aborted suspend). Add support for IP blocks to support this action. Reviewed-by: Alex Hung <alex.hung@amd.com> Link: https://lore.kernel.org/r/20250602014432.3538345-2-superm1@kernel.org Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
dd3999b658
commit
64c3e4a868
|
|
@ -1620,6 +1620,7 @@ void amdgpu_driver_release_kms(struct drm_device *dev);
|
|||
|
||||
int amdgpu_device_ip_suspend(struct amdgpu_device *adev);
|
||||
int amdgpu_device_prepare(struct drm_device *dev);
|
||||
void amdgpu_device_complete(struct drm_device *dev);
|
||||
int amdgpu_device_suspend(struct drm_device *dev, bool fbcon);
|
||||
int amdgpu_device_resume(struct drm_device *dev, bool fbcon);
|
||||
u32 amdgpu_get_vblank_counter_kms(struct drm_crtc *crtc);
|
||||
|
|
|
|||
|
|
@ -5040,6 +5040,28 @@ int amdgpu_device_prepare(struct drm_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_device_complete - complete power state transition
|
||||
*
|
||||
* @dev: drm dev pointer
|
||||
*
|
||||
* Undo the changes from amdgpu_device_prepare. This will be
|
||||
* called on all resume transitions, including those that failed.
|
||||
*/
|
||||
void amdgpu_device_complete(struct drm_device *dev)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < adev->num_ip_blocks; i++) {
|
||||
if (!adev->ip_blocks[i].status.valid)
|
||||
continue;
|
||||
if (!adev->ip_blocks[i].version->funcs->complete)
|
||||
continue;
|
||||
adev->ip_blocks[i].version->funcs->complete(&adev->ip_blocks[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_device_suspend - initiate device suspend
|
||||
*
|
||||
|
|
|
|||
|
|
@ -2576,7 +2576,7 @@ static int amdgpu_pmops_prepare(struct device *dev)
|
|||
|
||||
static void amdgpu_pmops_complete(struct device *dev)
|
||||
{
|
||||
/* nothing to do */
|
||||
amdgpu_device_complete(dev_get_drvdata(dev));
|
||||
}
|
||||
|
||||
static int amdgpu_pmops_suspend(struct device *dev)
|
||||
|
|
|
|||
|
|
@ -427,6 +427,7 @@ struct amd_ip_funcs {
|
|||
int (*prepare_suspend)(struct amdgpu_ip_block *ip_block);
|
||||
int (*suspend)(struct amdgpu_ip_block *ip_block);
|
||||
int (*resume)(struct amdgpu_ip_block *ip_block);
|
||||
void (*complete)(struct amdgpu_ip_block *ip_block);
|
||||
bool (*is_idle)(struct amdgpu_ip_block *ip_block);
|
||||
int (*wait_for_idle)(struct amdgpu_ip_block *ip_block);
|
||||
bool (*check_soft_reset)(struct amdgpu_ip_block *ip_block);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user