On 10/22/25 8:50 PM, Mario Limonciello wrote:
> From: "Mario Limonciello (AMD)" <[email protected]>
> 
> [Why]
> On a normal hibernate sequence amdgpu will skip the thaw step due to
> commit 530694f54dd5e ("drm/amdgpu: do not resume device in thaw for
> normal hibernation").
> 
> If the hibernate sequence has been aborted however after this thawed
> step runs the PM core will think the device is suspended and will skip
> the restore() sequence for amdgpu.  This leads to accessing the device
> while in a low power state and will freeze the system.
> 
> [How]
> Set `dev->power.is_frozen` to indicate to the PM core that an error
> code will be returned for thaw() callback because driver managed the
> frozen state.  If the restore() callback is called by the PM core the
> driver will resume the device.
> 
> Cc: Muhammad Usama Anjum <[email protected]>
> Signed-off-by: Mario Limonciello (AMD) <[email protected]>
Tested on APU:
Tested-by: Muhammad Usama Anjum <[email protected]>

I don't have AMD DGPU for its testing.

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 10 ++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |  2 +-
>  2 files changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 3d032c4e2dce..693347eb6861 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -5247,6 +5247,11 @@ int amdgpu_device_suspend(struct drm_device *dev, bool 
> notify_clients)
>       if (r)
>               return r;
>  
> +#ifdef CONFIG_HIBERNATE_CALLBACKS
> +     if (adev->in_s4)
> +             dev->dev->power.is_frozen = 1;
> +#endif
> +
>       return 0;
>  }
>  
> @@ -5385,6 +5390,11 @@ int amdgpu_device_resume(struct drm_device *dev, bool 
> notify_clients)
>       if (amdgpu_acpi_smart_shift_update(adev, AMDGPU_SS_DEV_D0))
>               dev_warn(adev->dev, "smart shift update failed\n");
>  
> +#ifdef CONFIG_HIBERNATE_CALLBACKS
> +     if (adev->in_s4)
> +             dev->dev->power.is_frozen = 0;
> +#endif
> +
>       return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index 61268aa82df4..d40af069f24d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -2681,7 +2681,7 @@ static int amdgpu_pmops_thaw(struct device *dev)
>  
>       /* do not resume device if it's normal hibernation */
>       if (!pm_hibernate_is_recovering() && !pm_hibernation_mode_is_suspend())
> -             return 0;
> +             return -EBUSY;
>  
>       return amdgpu_device_resume(drm_dev, true);
>  }


-- 
---
Thanks,
Usama

Reply via email to