Skip to content

Commit b887011

Browse files
Evan Quanalexdeucher
authored andcommitted
drm/amd/powerplay: correct navi10 vcn powergate
vcn dpm on is a prerequisite for vcn power gate control. Signed-off-by: Evan Quan <[email protected]> Reviewed-by: Kenneth Feng <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 8ecd998 commit b887011

File tree

3 files changed

+19
-9
lines changed

3 files changed

+19
-9
lines changed

drivers/gpu/drm/amd/powerplay/amdgpu_smu.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,8 @@ int smu_get_power_num_states(struct smu_context *smu,
315315
int smu_common_read_sensor(struct smu_context *smu, enum amd_pp_sensors sensor,
316316
void *data, uint32_t *size)
317317
{
318+
struct smu_power_context *smu_power = &smu->smu_power;
319+
struct smu_power_gate *power_gate = &smu_power->power_gate;
318320
int ret = 0;
319321

320322
switch (sensor) {
@@ -339,7 +341,7 @@ int smu_common_read_sensor(struct smu_context *smu, enum amd_pp_sensors sensor,
339341
*size = 4;
340342
break;
341343
case AMDGPU_PP_SENSOR_VCN_POWER_STATE:
342-
*(uint32_t *)data = smu_feature_is_enabled(smu, SMU_FEATURE_VCN_PG_BIT) ? 1 : 0;
344+
*(uint32_t *)data = power_gate->vcn_gated ? 0 : 1;
343345
*size = 4;
344346
break;
345347
default:

drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ struct smu_dpm_context {
451451
struct smu_power_gate {
452452
bool uvd_gated;
453453
bool vce_gated;
454+
bool vcn_gated;
454455
};
455456

456457
struct smu_power_context {

drivers/gpu/drm/amd/powerplay/navi10_ppt.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -605,20 +605,27 @@ static int navi10_set_default_dpm_table(struct smu_context *smu)
605605

606606
static int navi10_dpm_set_uvd_enable(struct smu_context *smu, bool enable)
607607
{
608+
struct smu_power_context *smu_power = &smu->smu_power;
609+
struct smu_power_gate *power_gate = &smu_power->power_gate;
608610
int ret = 0;
609611

610612
if (enable) {
611-
ret = smu_send_smc_msg_with_param(smu, SMU_MSG_PowerUpVcn, 1);
612-
if (ret)
613-
return ret;
613+
/* vcn dpm on is a prerequisite for vcn power gate messages */
614+
if (smu_feature_is_enabled(smu, SMU_FEATURE_VCN_PG_BIT)) {
615+
ret = smu_send_smc_msg_with_param(smu, SMU_MSG_PowerUpVcn, 1);
616+
if (ret)
617+
return ret;
618+
}
619+
power_gate->vcn_gated = false;
614620
} else {
615-
ret = smu_send_smc_msg(smu, SMU_MSG_PowerDownVcn);
616-
if (ret)
617-
return ret;
621+
if (smu_feature_is_enabled(smu, SMU_FEATURE_VCN_PG_BIT)) {
622+
ret = smu_send_smc_msg(smu, SMU_MSG_PowerDownVcn);
623+
if (ret)
624+
return ret;
625+
}
626+
power_gate->vcn_gated = true;
618627
}
619628

620-
ret = smu_feature_set_enabled(smu, SMU_FEATURE_VCN_PG_BIT, enable);
621-
622629
return ret;
623630
}
624631

0 commit comments

Comments
 (0)