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

2024-03-27 Thread Wang, Yang(Kevin)
[AMD Official Use Only - General]

Reviewed-by: Yang Wang 

Best Regards,
Kevin

-Original Message-
From: amd-gfx  On Behalf Of Lijo Lazar
Sent: Thursday, March 28, 2024 12:20 PM
To: amd-gfx@lists.freedesktop.org
Cc: Zhang, Hawking ; Deucher, Alexander 
; Wang, Yang(Kevin) 
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 
---
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



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

2024-03-27 Thread Deucher, Alexander
[Public]

> -Original Message-
> From: amd-gfx  On Behalf Of Lijo
> Lazar
> Sent: Thursday, March 28, 2024 12:20 AM
> To: amd-gfx@lists.freedesktop.org
> Cc: Zhang, Hawking ; Deucher, Alexander
> ; Wang, Yang(Kevin)
> 
> 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 

Reviewed-by: Alex Deucher 

> ---
> 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