diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/ni_dpm.c')
-rw-r--r-- | drivers/gpu/drm/radeon/ni_dpm.c | 38 |
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 | |||
1054 | int ni_dpm_force_performance_level(struct radeon_device *rdev, | 1055 | int 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 | ||