Commit 86a3c691 authored by Guchun Chen's avatar Guchun Chen Committed by Alex Deucher
Browse files

drm/amd/pm/smu11: poll BACO status after RPM BACO exits



After executing BACO exit, driver needs to poll the status
to ensure FW has completed BACO exit sequence to prevent
timing issue.

v2: use usleep_range to replace msleep to fix checkpatch.pl warnings

Signed-off-by: default avatarGuchun Chen <guchun.chen@amd.com>
Reviewed-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Reviewed-by: default avatarEvan Quan <evan.quan@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 6dca7efe
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -79,6 +79,17 @@ MODULE_FIRMWARE("amdgpu/beige_goby_smc.bin");
#define mmTHM_BACO_CNTL_ARCT			0xA7
#define mmTHM_BACO_CNTL_ARCT_BASE_IDX		0

static void smu_v11_0_poll_baco_exit(struct smu_context *smu)
{
	struct amdgpu_device *adev = smu->adev;
	uint32_t data, loop = 0;

	do {
		usleep_range(1000, 1100);
		data = RREG32_SOC15(THM, 0, mmTHM_BACO_CNTL);
	} while ((data & 0x100) && (++loop < 100));
}

int smu_v11_0_init_microcode(struct smu_context *smu)
{
	struct amdgpu_device *adev = smu->adev;
@@ -1689,7 +1700,18 @@ int smu_v11_0_baco_enter(struct smu_context *smu)

int smu_v11_0_baco_exit(struct smu_context *smu)
{
	return smu_v11_0_baco_set_state(smu, SMU_BACO_STATE_EXIT);
	int ret;

	ret = smu_v11_0_baco_set_state(smu, SMU_BACO_STATE_EXIT);
	if (!ret) {
		/*
		 * Poll BACO exit status to ensure FW has completed
		 * BACO exit process to avoid timing issues.
		 */
		smu_v11_0_poll_baco_exit(smu);
	}

	return ret;
}

int smu_v11_0_mode1_reset(struct smu_context *smu)