RE: [PATCH v2] drm/amdgpu: Reset dGPU if suspend got aborted

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[Public]

> -----Original Message-----
> From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Lijo
> Lazar
> Sent: Thursday, March 28, 2024 12:20 AM
> To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx
> Cc: Zhang, Hawking <Hawking.Zhang@xxxxxxx>; Deucher, Alexander
> <Alexander.Deucher@xxxxxxx>; Wang, Yang(Kevin)
> <KevinYang.Wang@xxxxxxx>
> Subject: [PATCH v2] drm/amdgpu: Reset dGPU if suspend got aborted
>
> For SOC21 ASICs, there is an issue in re-enabling PM features if a suspend got
> aborted. In such cases, reset the device during resume phase. This is a
> workaround till a proper solution is finalized.
>
> Signed-off-by: Lijo Lazar <lijo.lazar@xxxxxxx>

Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx>

> ---
> v2: Read TOS status only if required (Kevin).
>     Refine log message.
>
>  drivers/gpu/drm/amd/amdgpu/soc21.c | 25
> +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/soc21.c
> b/drivers/gpu/drm/amd/amdgpu/soc21.c
> index 8526282f4da1..abe319b0f063 100644
> --- a/drivers/gpu/drm/amd/amdgpu/soc21.c
> +++ b/drivers/gpu/drm/amd/amdgpu/soc21.c
> @@ -867,10 +867,35 @@ static int soc21_common_suspend(void *handle)
>       return soc21_common_hw_fini(adev);
>  }
>
> +static bool soc21_need_reset_on_resume(struct amdgpu_device *adev) {
> +     u32 sol_reg1, sol_reg2;
> +
> +     /* Will reset for the following suspend abort cases.
> +      * 1) Only reset dGPU side.
> +      * 2) S3 suspend got aborted and TOS is active.
> +      */
> +     if (!(adev->flags & AMD_IS_APU) && adev->in_s3 &&
> +         !adev->suspend_complete) {
> +             sol_reg1 = RREG32_SOC15(MP0, 0,
> regMP0_SMN_C2PMSG_81);
> +             msleep(100);
> +             sol_reg2 = RREG32_SOC15(MP0, 0,
> regMP0_SMN_C2PMSG_81);
> +
> +             return (sol_reg1 != sol_reg2);
> +     }
> +
> +     return false;
> +}
> +
>  static int soc21_common_resume(void *handle)  {
>       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>
> +     if (soc21_need_reset_on_resume(adev)) {
> +             dev_info(adev->dev, "S3 suspend aborted, resetting...");
> +             soc21_asic_reset(adev);
> +     }
> +
>       return soc21_common_hw_init(adev);
>  }
>
> --
> 2.25.1





[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux