diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_atombios.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 08fc1b5effa8..de9a2ffcf5f7 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -1106,6 +1106,31 @@ union firmware_info { | |||
| 1106 | ATOM_FIRMWARE_INFO_V2_2 info_22; | 1106 | ATOM_FIRMWARE_INFO_V2_2 info_22; |
| 1107 | }; | 1107 | }; |
| 1108 | 1108 | ||
| 1109 | union igp_info { | ||
| 1110 | struct _ATOM_INTEGRATED_SYSTEM_INFO info; | ||
| 1111 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2; | ||
| 1112 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6; | ||
| 1113 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7; | ||
| 1114 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_8 info_8; | ||
| 1115 | }; | ||
| 1116 | |||
| 1117 | static void radeon_atombios_get_dentist_vco_freq(struct radeon_device *rdev) | ||
| 1118 | { | ||
| 1119 | struct radeon_mode_info *mode_info = &rdev->mode_info; | ||
| 1120 | int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); | ||
| 1121 | union igp_info *igp_info; | ||
| 1122 | u8 frev, crev; | ||
| 1123 | u16 data_offset; | ||
| 1124 | |||
| 1125 | if (atom_parse_data_header(mode_info->atom_context, index, NULL, | ||
| 1126 | &frev, &crev, &data_offset)) { | ||
| 1127 | igp_info = (union igp_info *)(mode_info->atom_context->bios + | ||
| 1128 | data_offset); | ||
| 1129 | rdev->clock.vco_freq = | ||
| 1130 | le32_to_cpu(igp_info->info_6.ulDentistVCOFreq); | ||
| 1131 | } | ||
| 1132 | } | ||
| 1133 | |||
| 1109 | bool radeon_atom_get_clock_info(struct drm_device *dev) | 1134 | bool radeon_atom_get_clock_info(struct drm_device *dev) |
| 1110 | { | 1135 | { |
| 1111 | struct radeon_device *rdev = dev->dev_private; | 1136 | struct radeon_device *rdev = dev->dev_private; |
| @@ -1257,12 +1282,18 @@ bool radeon_atom_get_clock_info(struct drm_device *dev) | |||
| 1257 | rdev->mode_info.firmware_flags = | 1282 | rdev->mode_info.firmware_flags = |
| 1258 | le16_to_cpu(firmware_info->info.usFirmwareCapability.susAccess); | 1283 | le16_to_cpu(firmware_info->info.usFirmwareCapability.susAccess); |
| 1259 | 1284 | ||
| 1260 | if (ASIC_IS_DCE8(rdev)) { | 1285 | if (ASIC_IS_DCE8(rdev)) |
| 1261 | rdev->clock.gpupll_outputfreq = | 1286 | rdev->clock.vco_freq = |
| 1262 | le32_to_cpu(firmware_info->info_22.ulGPUPLL_OutputFreq); | 1287 | le32_to_cpu(firmware_info->info_22.ulGPUPLL_OutputFreq); |
| 1263 | if (rdev->clock.gpupll_outputfreq == 0) | 1288 | else if (ASIC_IS_DCE5(rdev)) |
| 1264 | rdev->clock.gpupll_outputfreq = 360000; /* 3.6 GHz */ | 1289 | rdev->clock.vco_freq = rdev->clock.current_dispclk; |
| 1265 | } | 1290 | else if (ASIC_IS_DCE41(rdev)) |
| 1291 | radeon_atombios_get_dentist_vco_freq(rdev); | ||
| 1292 | else | ||
| 1293 | rdev->clock.vco_freq = rdev->clock.current_dispclk; | ||
| 1294 | |||
| 1295 | if (rdev->clock.vco_freq == 0) | ||
| 1296 | rdev->clock.vco_freq = 360000; /* 3.6 GHz */ | ||
| 1266 | 1297 | ||
| 1267 | return true; | 1298 | return true; |
| 1268 | } | 1299 | } |
| @@ -1270,14 +1301,6 @@ bool radeon_atom_get_clock_info(struct drm_device *dev) | |||
| 1270 | return false; | 1301 | return false; |
| 1271 | } | 1302 | } |
| 1272 | 1303 | ||
| 1273 | union igp_info { | ||
| 1274 | struct _ATOM_INTEGRATED_SYSTEM_INFO info; | ||
| 1275 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2; | ||
| 1276 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6; | ||
| 1277 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7; | ||
| 1278 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_8 info_8; | ||
| 1279 | }; | ||
| 1280 | |||
| 1281 | bool radeon_atombios_sideport_present(struct radeon_device *rdev) | 1304 | bool radeon_atombios_sideport_present(struct radeon_device *rdev) |
| 1282 | { | 1305 | { |
| 1283 | struct radeon_mode_info *mode_info = &rdev->mode_info; | 1306 | struct radeon_mode_info *mode_info = &rdev->mode_info; |
