Commit 706e5082 authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher

drm/amd/powerplay: correct navi10 vcn powergate

vcn dpm on is a prerequisite for vcn power gate control.
Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Reviewed-by: default avatarKenneth Feng <kenneth.feng@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 4abc1765
...@@ -409,6 +409,8 @@ int smu_get_power_num_states(struct smu_context *smu, ...@@ -409,6 +409,8 @@ int smu_get_power_num_states(struct smu_context *smu,
int smu_common_read_sensor(struct smu_context *smu, enum amd_pp_sensors sensor, int smu_common_read_sensor(struct smu_context *smu, enum amd_pp_sensors sensor,
void *data, uint32_t *size) void *data, uint32_t *size)
{ {
struct smu_power_context *smu_power = &smu->smu_power;
struct smu_power_gate *power_gate = &smu_power->power_gate;
int ret = 0; int ret = 0;
switch (sensor) { switch (sensor) {
...@@ -433,7 +435,7 @@ int smu_common_read_sensor(struct smu_context *smu, enum amd_pp_sensors sensor, ...@@ -433,7 +435,7 @@ int smu_common_read_sensor(struct smu_context *smu, enum amd_pp_sensors sensor,
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_VCN_POWER_STATE: case AMDGPU_PP_SENSOR_VCN_POWER_STATE:
*(uint32_t *)data = smu_feature_is_enabled(smu, SMU_FEATURE_VCN_PG_BIT) ? 1 : 0; *(uint32_t *)data = power_gate->vcn_gated ? 0 : 1;
*size = 4; *size = 4;
break; break;
default: default:
......
...@@ -277,6 +277,7 @@ struct smu_dpm_context { ...@@ -277,6 +277,7 @@ struct smu_dpm_context {
struct smu_power_gate { struct smu_power_gate {
bool uvd_gated; bool uvd_gated;
bool vce_gated; bool vce_gated;
bool vcn_gated;
}; };
struct smu_power_context { struct smu_power_context {
......
...@@ -619,19 +619,26 @@ static int navi10_set_default_dpm_table(struct smu_context *smu) ...@@ -619,19 +619,26 @@ static int navi10_set_default_dpm_table(struct smu_context *smu)
static int navi10_dpm_set_uvd_enable(struct smu_context *smu, bool enable) static int navi10_dpm_set_uvd_enable(struct smu_context *smu, bool enable)
{ {
struct smu_power_context *smu_power = &smu->smu_power;
struct smu_power_gate *power_gate = &smu_power->power_gate;
int ret = 0; int ret = 0;
if (enable) { if (enable) {
/* vcn dpm on is a prerequisite for vcn power gate messages */
if (smu_feature_is_enabled(smu, SMU_FEATURE_VCN_PG_BIT)) {
ret = smu_send_smc_msg_with_param(smu, SMU_MSG_PowerUpVcn, 1); ret = smu_send_smc_msg_with_param(smu, SMU_MSG_PowerUpVcn, 1);
if (ret) if (ret)
return ret; return ret;
}
power_gate->vcn_gated = false;
} else { } else {
if (smu_feature_is_enabled(smu, SMU_FEATURE_VCN_PG_BIT)) {
ret = smu_send_smc_msg(smu, SMU_MSG_PowerDownVcn); ret = smu_send_smc_msg(smu, SMU_MSG_PowerDownVcn);
if (ret) if (ret)
return ret; return ret;
} }
power_gate->vcn_gated = true;
ret = smu_feature_set_enabled(smu, SMU_FEATURE_VCN_PG_BIT, enable); }
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment