Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 63f22d0e authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/radeon/dpm: fix and enable reclocking on SI



The SMC interface changed compared to Cayman and
previous asics.  Set the enabled levels properly
and enable reclocking by default when dpm is enabled.

Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent d05f7e70
Loading
Loading
Loading
Loading
+4 −10
Original line number Original line Diff line number Diff line
@@ -3238,10 +3238,10 @@ int si_dpm_force_performance_level(struct radeon_device *rdev,
{
{
	struct radeon_ps *rps = rdev->pm.dpm.current_ps;
	struct radeon_ps *rps = rdev->pm.dpm.current_ps;
	struct ni_ps *ps = ni_get_ps(rps);
	struct ni_ps *ps = ni_get_ps(rps);
	u32 levels;
	u32 levels = ps->performance_level_count;


	if (level == RADEON_DPM_FORCED_LEVEL_HIGH) {
	if (level == RADEON_DPM_FORCED_LEVEL_HIGH) {
		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK)
		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK)
			return -EINVAL;
			return -EINVAL;


		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 1) != PPSMC_Result_OK)
		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 1) != PPSMC_Result_OK)
@@ -3250,14 +3250,13 @@ int si_dpm_force_performance_level(struct radeon_device *rdev,
		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
			return -EINVAL;
			return -EINVAL;


		levels = ps->performance_level_count - 1;
		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 1) != PPSMC_Result_OK)
		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK)
			return -EINVAL;
			return -EINVAL;
	} else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) {
	} else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) {
		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
			return -EINVAL;
			return -EINVAL;


		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK)
		if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK)
			return -EINVAL;
			return -EINVAL;
	}
	}


@@ -6017,16 +6016,11 @@ int si_dpm_set_power_state(struct radeon_device *rdev)
		return ret;
		return ret;
	}
	}


#if 0
	/* XXX */
	ret = si_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO);
	ret = si_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO);
	if (ret) {
	if (ret) {
		DRM_ERROR("si_dpm_force_performance_level failed\n");
		DRM_ERROR("si_dpm_force_performance_level failed\n");
		return ret;
		return ret;
	}
	}
#else
	rdev->pm.dpm.forced_level = RADEON_DPM_FORCED_LEVEL_AUTO;
#endif


	return 0;
	return 0;
}
}