diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/soc15.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/soc15.c | 22 | 
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index 15033efec2ba..c64c01e2944a 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c @@ -1298,10 +1298,32 @@ static int soc15_common_suspend(void *handle)  	return soc15_common_hw_fini(adev);  } +static bool soc15_need_reset_on_resume(struct amdgpu_device *adev) +{ +	u32 sol_reg; + +	sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81); + +	/* Will reset for the following suspend abort cases. +	 * 1) Only reset limit on APU side, dGPU hasn't checked yet. +	 * 2) S3 suspend abort and TOS already launched. +	 */ +	if (adev->flags & AMD_IS_APU && adev->in_s3 && +			!adev->suspend_complete && +			sol_reg) +		return true; + +	return false; +} +  static int soc15_common_resume(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	if (soc15_need_reset_on_resume(adev)) { +		dev_info(adev->dev, "S3 suspend abort case, let's reset ASIC.\n"); +		soc15_asic_reset(adev); +	}  	return soc15_common_hw_init(adev);  }  | 
