aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/ni_dpm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/ni_dpm.c')
-rw-r--r--drivers/gpu/drm/radeon/ni_dpm.c38
1 files changed, 14 insertions, 24 deletions
diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c
index 559cf24d51af..f7b625c9e0e9 100644
--- a/drivers/gpu/drm/radeon/ni_dpm.c
+++ b/drivers/gpu/drm/radeon/ni_dpm.c
@@ -769,7 +769,8 @@ bool ni_dpm_vblank_too_short(struct radeon_device *rdev)
769{ 769{
770 struct rv7xx_power_info *pi = rv770_get_pi(rdev); 770 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
771 u32 vblank_time = r600_dpm_get_vblank_time(rdev); 771 u32 vblank_time = r600_dpm_get_vblank_time(rdev);
772 u32 switch_limit = pi->mem_gddr5 ? 450 : 300; 772 /* we never hit the non-gddr5 limit so disable it */
773 u32 switch_limit = pi->mem_gddr5 ? 450 : 0;
773 774
774 if (vblank_time < switch_limit) 775 if (vblank_time < switch_limit)
775 return true; 776 return true;
@@ -1054,10 +1055,6 @@ static int ni_restrict_performance_levels_before_switch(struct radeon_device *rd
1054int ni_dpm_force_performance_level(struct radeon_device *rdev, 1055int ni_dpm_force_performance_level(struct radeon_device *rdev,
1055 enum radeon_dpm_forced_level level) 1056 enum radeon_dpm_forced_level level)
1056{ 1057{
1057 struct radeon_ps *rps = rdev->pm.dpm.current_ps;
1058 struct ni_ps *ps = ni_get_ps(rps);
1059 u32 levels;
1060
1061 if (level == RADEON_DPM_FORCED_LEVEL_HIGH) { 1058 if (level == RADEON_DPM_FORCED_LEVEL_HIGH) {
1062 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK) 1059 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK)
1063 return -EINVAL; 1060 return -EINVAL;
@@ -1068,8 +1065,7 @@ int ni_dpm_force_performance_level(struct radeon_device *rdev,
1068 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) 1065 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
1069 return -EINVAL; 1066 return -EINVAL;
1070 1067
1071 levels = ps->performance_level_count - 1; 1068 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 1) != PPSMC_Result_OK)
1072 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK)
1073 return -EINVAL; 1069 return -EINVAL;
1074 } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) { 1070 } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) {
1075 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) 1071 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
@@ -4042,6 +4038,7 @@ static int ni_parse_power_table(struct radeon_device *rdev)
4042 (power_state->v1.ucNonClockStateIndex * 4038 (power_state->v1.ucNonClockStateIndex *
4043 power_info->pplib.ucNonClockSize)); 4039 power_info->pplib.ucNonClockSize));
4044 if (power_info->pplib.ucStateEntrySize - 1) { 4040 if (power_info->pplib.ucStateEntrySize - 1) {
4041 u8 *idx;
4045 ps = kzalloc(sizeof(struct ni_ps), GFP_KERNEL); 4042 ps = kzalloc(sizeof(struct ni_ps), GFP_KERNEL);
4046 if (ps == NULL) { 4043 if (ps == NULL) {
4047 kfree(rdev->pm.dpm.ps); 4044 kfree(rdev->pm.dpm.ps);
@@ -4051,12 +4048,12 @@ static int ni_parse_power_table(struct radeon_device *rdev)
4051 ni_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i], 4048 ni_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i],
4052 non_clock_info, 4049 non_clock_info,
4053 power_info->pplib.ucNonClockSize); 4050 power_info->pplib.ucNonClockSize);
4051 idx = (u8 *)&power_state->v1.ucClockStateIndices[0];
4054 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) { 4052 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
4055 clock_info = (union pplib_clock_info *) 4053 clock_info = (union pplib_clock_info *)
4056 (mode_info->atom_context->bios + data_offset + 4054 (mode_info->atom_context->bios + data_offset +
4057 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) + 4055 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
4058 (power_state->v1.ucClockStateIndices[j] * 4056 (idx[j] * power_info->pplib.ucClockInfoSize));
4059 power_info->pplib.ucClockInfoSize));
4060 ni_parse_pplib_clock_info(rdev, 4057 ni_parse_pplib_clock_info(rdev,
4061 &rdev->pm.dpm.ps[i], j, 4058 &rdev->pm.dpm.ps[i], j,
4062 clock_info); 4059 clock_info);
@@ -4072,9 +4069,6 @@ int ni_dpm_init(struct radeon_device *rdev)
4072 struct rv7xx_power_info *pi; 4069 struct rv7xx_power_info *pi;
4073 struct evergreen_power_info *eg_pi; 4070 struct evergreen_power_info *eg_pi;
4074 struct ni_power_info *ni_pi; 4071 struct ni_power_info *ni_pi;
4075 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
4076 u16 data_offset, size;
4077 u8 frev, crev;
4078 struct atom_clock_dividers dividers; 4072 struct atom_clock_dividers dividers;
4079 int ret; 4073 int ret;
4080 4074
@@ -4167,16 +4161,7 @@ int ni_dpm_init(struct radeon_device *rdev)
4167 eg_pi->vddci_control = 4161 eg_pi->vddci_control =
4168 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0); 4162 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
4169 4163
4170 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 4164 rv770_get_engine_memory_ss(rdev);
4171 &frev, &crev, &data_offset)) {
4172 pi->sclk_ss = true;
4173 pi->mclk_ss = true;
4174 pi->dynamic_ss = true;
4175 } else {
4176 pi->sclk_ss = false;
4177 pi->mclk_ss = false;
4178 pi->dynamic_ss = true;
4179 }
4180 4165
4181 pi->asi = RV770_ASI_DFLT; 4166 pi->asi = RV770_ASI_DFLT;
4182 pi->pasi = CYPRESS_HASI_DFLT; 4167 pi->pasi = CYPRESS_HASI_DFLT;
@@ -4193,8 +4178,7 @@ int ni_dpm_init(struct radeon_device *rdev)
4193 4178
4194 pi->dynamic_pcie_gen2 = true; 4179 pi->dynamic_pcie_gen2 = true;
4195 4180
4196 if (pi->gfx_clock_gating && 4181 if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
4197 (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE))
4198 pi->thermal_protection = true; 4182 pi->thermal_protection = true;
4199 else 4183 else
4200 pi->thermal_protection = false; 4184 pi->thermal_protection = false;
@@ -4288,6 +4272,12 @@ int ni_dpm_init(struct radeon_device *rdev)
4288 4272
4289 ni_pi->use_power_boost_limit = true; 4273 ni_pi->use_power_boost_limit = true;
4290 4274
4275 /* make sure dc limits are valid */
4276 if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
4277 (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
4278 rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
4279 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
4280
4291 return 0; 4281 return 0;
4292} 4282}
4293 4283