Commit c50fe289 authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amdgpu/swsmu: always force a state reprogram on init

Always reprogram the hardware state on init.  This ensures
the PMFW state is explicitly programmed and we are not relying
on the default PMFW state.

Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3131


Reviewed-by: default avatarKenneth Feng <kenneth.feng@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e45a3933
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -2225,7 +2225,8 @@ static int smu_bump_power_profile_mode(struct smu_context *smu,

static int smu_adjust_power_state_dynamic(struct smu_context *smu,
					  enum amd_dpm_forced_level level,
				   bool skip_display_settings)
					  bool skip_display_settings,
					  bool force_update)
{
	int ret = 0;
	int index = 0;
@@ -2254,7 +2255,7 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu,
		}
	}

	if (smu_dpm_ctx->dpm_level != level) {
	if (force_update || smu_dpm_ctx->dpm_level != level) {
		ret = smu_asic_set_performance_level(smu, level);
		if (ret) {
			dev_err(smu->adev->dev, "Failed to set performance level!");
@@ -2270,7 +2271,7 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu,
		index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0;
		workload[0] = smu->workload_setting[index];

		if (smu->power_profile_mode != workload[0])
		if (force_update || smu->power_profile_mode != workload[0])
			smu_bump_power_profile_mode(smu, workload, 0);
	}

@@ -2291,11 +2292,13 @@ static int smu_handle_task(struct smu_context *smu,
		ret = smu_pre_display_config_changed(smu);
		if (ret)
			return ret;
		ret = smu_adjust_power_state_dynamic(smu, level, false);
		ret = smu_adjust_power_state_dynamic(smu, level, false, false);
		break;
	case AMD_PP_TASK_COMPLETE_INIT:
		ret = smu_adjust_power_state_dynamic(smu, level, true, true);
		break;
	case AMD_PP_TASK_READJUST_POWER_STATE:
		ret = smu_adjust_power_state_dynamic(smu, level, true);
		ret = smu_adjust_power_state_dynamic(smu, level, true, false);
		break;
	default:
		break;