diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2014-07-31 17:57:42 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2014-08-05 08:53:46 -0400 |
commit | e9f274b2a1bd4ecc569b823b1e7942e9bf92593e (patch) | |
tree | 422d49dd22cf493548ec04fb253d8258cda01d22 | |
parent | 72a9987edcedb89db988079a03c9b9c65b6ec9ac (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.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 35 |
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); |
307 | int radeon_atom_get_voltage_evv(struct radeon_device *rdev, | ||
308 | u16 virtual_voltage_id, | ||
309 | u16 *voltage); | ||
307 | int radeon_atom_round_to_true_voltage(struct radeon_device *rdev, | 310 | int 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 | ||
3239 | union 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 | |||
3244 | int 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 | |||
3239 | int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev, | 3274 | int 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) |