aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_atombios.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_atombios.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c49
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
1109union 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
1117static 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
1109bool radeon_atom_get_clock_info(struct drm_device *dev) 1134bool 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
1273union 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
1281bool radeon_atombios_sideport_present(struct radeon_device *rdev) 1304bool 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;