Commit 8b2be55f authored by Lijo Lazar's avatar Lijo Lazar Committed by Alex Deucher
Browse files

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: default avatarLijo Lazar <lijo.lazar@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarYang Wang <kevinyang.wang@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
parent 0f1bbcc2
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -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);
}