Commit f7f28f26 authored by Tim Huang's avatar Tim Huang Committed by Alex Deucher
Browse files

drm/amd/pm: re-enable the gfx imu when smu resume



If the gfx imu is poweroff when suspend, then
it need to be re-enabled when resume.

Signed-off-by: default avatarTim Huang <tim.huang@amd.com>
Reviewed-by: default avatarYifan Zhang <yifan1.zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent d2cdc014
Loading
Loading
Loading
Loading
+28 −12
Original line number Diff line number Diff line
@@ -162,10 +162,15 @@ int smu_get_dpm_freq_range(struct smu_context *smu,

int smu_set_gfx_power_up_by_imu(struct smu_context *smu)
{
	if (!smu->ppt_funcs || !smu->ppt_funcs->set_gfx_power_up_by_imu)
		return -EOPNOTSUPP;
	int ret = 0;
	struct amdgpu_device *adev = smu->adev;

	return smu->ppt_funcs->set_gfx_power_up_by_imu(smu);
	if (smu->ppt_funcs->set_gfx_power_up_by_imu) {
		ret = smu->ppt_funcs->set_gfx_power_up_by_imu(smu);
		if (ret)
			dev_err(adev->dev, "Failed to enable gfx imu!\n");
	}
	return ret;
}

static u32 smu_get_mclk(void *handle, bool low)
@@ -196,6 +201,19 @@ static u32 smu_get_sclk(void *handle, bool low)
	return clk_freq * 100;
}

static int smu_set_gfx_imu_enable(struct smu_context *smu)
{
	struct amdgpu_device *adev = smu->adev;

	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
		return 0;

	if (amdgpu_in_reset(smu->adev) || adev->in_s0ix)
		return 0;

	return smu_set_gfx_power_up_by_imu(smu);
}

static int smu_dpm_set_vcn_enable(struct smu_context *smu,
				  bool enable)
{
@@ -1396,15 +1414,9 @@ static int smu_hw_init(void *handle)
	}

	if (smu->is_apu) {
		if ((smu->ppt_funcs->set_gfx_power_up_by_imu) &&
				likely(adev->firmware.load_type == AMDGPU_FW_LOAD_PSP)) {
			ret = smu->ppt_funcs->set_gfx_power_up_by_imu(smu);
			if (ret) {
				dev_err(adev->dev, "Failed to Enable gfx imu!\n");
		ret = smu_set_gfx_imu_enable(smu);
		if (ret)
			return ret;
			}
		}

		smu_dpm_set_vcn_enable(smu, true);
		smu_dpm_set_jpeg_enable(smu, true);
		smu_set_gfx_cgpg(smu, true);
@@ -1681,6 +1693,10 @@ static int smu_resume(void *handle)
		return ret;
	}

	ret = smu_set_gfx_imu_enable(smu);
	if (ret)
		return ret;

	smu_set_gfx_cgpg(smu, true);

	smu->disable_uclk_switch = 0;