aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2014-07-31 17:57:42 -0400
committerAlex Deucher <alexander.deucher@amd.com>2014-08-05 08:53:46 -0400
commite9f274b2a1bd4ecc569b823b1e7942e9bf92593e (patch)
tree422d49dd22cf493548ec04fb253d8258cda01d22
parent72a9987edcedb89db988079a03c9b9c65b6ec9ac (diff)
drm/radeon/atom: add new voltage fetch function for hawaii
Some hawaii boards use a different method for fetching the voltage information from the vbios. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
-rw-r--r--drivers/gpu/drm/radeon/radeon.h3
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c35
2 files changed, 38 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 29731584b6ae..b3f0f0d92087 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -304,6 +304,9 @@ int radeon_atom_get_leakage_vddc_based_on_leakage_params(struct radeon_device *r
304 u16 *vddc, u16 *vddci, 304 u16 *vddc, u16 *vddci,
305 u16 virtual_voltage_id, 305 u16 virtual_voltage_id,
306 u16 vbios_voltage_id); 306 u16 vbios_voltage_id);
307int radeon_atom_get_voltage_evv(struct radeon_device *rdev,
308 u16 virtual_voltage_id,
309 u16 *voltage);
307int radeon_atom_round_to_true_voltage(struct radeon_device *rdev, 310int radeon_atom_round_to_true_voltage(struct radeon_device *rdev,
308 u8 voltage_type, 311 u8 voltage_type,
309 u16 nominal_voltage, 312 u16 nominal_voltage,
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index 2bbf016025dc..92b2d8dd4735 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -3236,6 +3236,41 @@ int radeon_atom_get_leakage_vddc_based_on_leakage_params(struct radeon_device *r
3236 return 0; 3236 return 0;
3237} 3237}
3238 3238
3239union get_voltage_info {
3240 struct _GET_VOLTAGE_INFO_INPUT_PARAMETER_V1_2 in;
3241 struct _GET_EVV_VOLTAGE_INFO_OUTPUT_PARAMETER_V1_2 evv_out;
3242};
3243
3244int radeon_atom_get_voltage_evv(struct radeon_device *rdev,
3245 u16 virtual_voltage_id,
3246 u16 *voltage)
3247{
3248 int index = GetIndexIntoMasterTable(COMMAND, GetVoltageInfo);
3249 u32 entry_id;
3250 u32 count = rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count;
3251 union get_voltage_info args;
3252
3253 for (entry_id = 0; entry_id < count; entry_id++) {
3254 if (rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[entry_id].v ==
3255 virtual_voltage_id)
3256 break;
3257 }
3258
3259 if (entry_id >= count)
3260 return -EINVAL;
3261
3262 args.in.ucVoltageType = VOLTAGE_TYPE_VDDC;
3263 args.in.ucVoltageMode = ATOM_GET_VOLTAGE_EVV_VOLTAGE;
3264 args.in.ulSCLKFreq =
3265 cpu_to_le32(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[entry_id].clk);
3266
3267 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
3268
3269 *voltage = le16_to_cpu(args.evv_out.usVoltageLevel);
3270
3271 return 0;
3272}
3273
3239int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev, 3274int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev,
3240 u16 voltage_level, u8 voltage_type, 3275 u16 voltage_level, u8 voltage_type,
3241 u32 *gpio_value, u32 *gpio_mask) 3276 u32 *gpio_value, u32 *gpio_mask)