aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2011-01-06 21:19:15 -0500
committerDave Airlie <airlied@redhat.com>2011-01-06 23:11:22 -0500
commitf82b3ddc5fac044a28ab841bfd4ae48e2e43a21b (patch)
treedd435132ebe52bf55f68234b689e73c3f7a32547 /drivers/gpu/drm/radeon
parent881dd74ea731067f8fc81608e3a8914fdd66bc6d (diff)
drm/radeon/kms: DCE5 atom SetPixelClock updates
Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon')
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c31
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c25
2 files changed, 47 insertions, 9 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index 9fbabaa6ee44..b3e5e7549008 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -673,9 +673,14 @@ union set_pixel_clock {
673 PIXEL_CLOCK_PARAMETERS_V2 v2; 673 PIXEL_CLOCK_PARAMETERS_V2 v2;
674 PIXEL_CLOCK_PARAMETERS_V3 v3; 674 PIXEL_CLOCK_PARAMETERS_V3 v3;
675 PIXEL_CLOCK_PARAMETERS_V5 v5; 675 PIXEL_CLOCK_PARAMETERS_V5 v5;
676 PIXEL_CLOCK_PARAMETERS_V6 v6;
676}; 677};
677 678
678static void atombios_crtc_set_dcpll(struct drm_crtc *crtc) 679/* on DCE5, make sure the voltage is high enough to support the
680 * required disp clk.
681 */
682static void atombios_crtc_set_dcpll(struct drm_crtc *crtc,
683 u32 dispclk)
679{ 684{
680 struct drm_device *dev = crtc->dev; 685 struct drm_device *dev = crtc->dev;
681 struct radeon_device *rdev = dev->dev_private; 686 struct radeon_device *rdev = dev->dev_private;
@@ -698,9 +703,16 @@ static void atombios_crtc_set_dcpll(struct drm_crtc *crtc)
698 * SetPixelClock provides the dividers 703 * SetPixelClock provides the dividers
699 */ 704 */
700 args.v5.ucCRTC = ATOM_CRTC_INVALID; 705 args.v5.ucCRTC = ATOM_CRTC_INVALID;
701 args.v5.usPixelClock = rdev->clock.default_dispclk; 706 args.v5.usPixelClock = dispclk;
702 args.v5.ucPpll = ATOM_DCPLL; 707 args.v5.ucPpll = ATOM_DCPLL;
703 break; 708 break;
709 case 6:
710 /* if the default dcpll clock is specified,
711 * SetPixelClock provides the dividers
712 */
713 args.v6.ulDispEngClkFreq = dispclk;
714 args.v6.ucPpll = ATOM_DCPLL;
715 break;
704 default: 716 default:
705 DRM_ERROR("Unknown table version %d %d\n", frev, crev); 717 DRM_ERROR("Unknown table version %d %d\n", frev, crev);
706 return; 718 return;
@@ -784,6 +796,18 @@ static void atombios_crtc_program_pll(struct drm_crtc *crtc,
784 args.v5.ucEncoderMode = encoder_mode; 796 args.v5.ucEncoderMode = encoder_mode;
785 args.v5.ucPpll = pll_id; 797 args.v5.ucPpll = pll_id;
786 break; 798 break;
799 case 6:
800 args.v6.ulCrtcPclkFreq.ucCRTC = crtc_id;
801 args.v6.ulCrtcPclkFreq.ulPixelClock = cpu_to_le32(clock / 10);
802 args.v6.ucRefDiv = ref_div;
803 args.v6.usFbDiv = cpu_to_le16(fb_div);
804 args.v6.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000);
805 args.v6.ucPostDiv = post_div;
806 args.v6.ucMiscInfo = 0; /* HDMI depth, etc. */
807 args.v6.ucTransmitterID = encoder_id;
808 args.v6.ucEncoderMode = encoder_mode;
809 args.v6.ucPpll = pll_id;
810 break;
787 default: 811 default:
788 DRM_ERROR("Unknown table version %d %d\n", frev, crev); 812 DRM_ERROR("Unknown table version %d %d\n", frev, crev);
789 return; 813 return;
@@ -1377,7 +1401,8 @@ int atombios_crtc_mode_set(struct drm_crtc *crtc,
1377 rdev->clock.default_dispclk); 1401 rdev->clock.default_dispclk);
1378 if (ss_enabled) 1402 if (ss_enabled)
1379 atombios_crtc_program_ss(crtc, ATOM_DISABLE, ATOM_DCPLL, &ss); 1403 atombios_crtc_program_ss(crtc, ATOM_DISABLE, ATOM_DCPLL, &ss);
1380 atombios_crtc_set_dcpll(crtc); 1404 /* XXX: DCE5, make sure voltage, dispclk is high enough */
1405 atombios_crtc_set_dcpll(crtc, rdev->clock.default_dispclk);
1381 if (ss_enabled) 1406 if (ss_enabled)
1382 atombios_crtc_program_ss(crtc, ATOM_ENABLE, ATOM_DCPLL, &ss); 1407 atombios_crtc_program_ss(crtc, ATOM_ENABLE, ATOM_DCPLL, &ss);
1383 } 1408 }
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index e4f7e3e82a50..11573d085e61 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -1086,6 +1086,7 @@ union firmware_info {
1086 ATOM_FIRMWARE_INFO_V1_3 info_13; 1086 ATOM_FIRMWARE_INFO_V1_3 info_13;
1087 ATOM_FIRMWARE_INFO_V1_4 info_14; 1087 ATOM_FIRMWARE_INFO_V1_4 info_14;
1088 ATOM_FIRMWARE_INFO_V2_1 info_21; 1088 ATOM_FIRMWARE_INFO_V2_1 info_21;
1089 ATOM_FIRMWARE_INFO_V2_2 info_22;
1089}; 1090};
1090 1091
1091bool radeon_atom_get_clock_info(struct drm_device *dev) 1092bool radeon_atom_get_clock_info(struct drm_device *dev)
@@ -1160,8 +1161,12 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
1160 *p2pll = *p1pll; 1161 *p2pll = *p1pll;
1161 1162
1162 /* system clock */ 1163 /* system clock */
1163 spll->reference_freq = 1164 if (ASIC_IS_DCE4(rdev))
1164 le16_to_cpu(firmware_info->info.usReferenceClock); 1165 spll->reference_freq =
1166 le16_to_cpu(firmware_info->info_21.usCoreReferenceClock);
1167 else
1168 spll->reference_freq =
1169 le16_to_cpu(firmware_info->info.usReferenceClock);
1165 spll->reference_div = 0; 1170 spll->reference_div = 0;
1166 1171
1167 spll->pll_out_min = 1172 spll->pll_out_min =
@@ -1183,8 +1188,12 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
1183 le16_to_cpu(firmware_info->info.usMaxEngineClockPLL_Input); 1188 le16_to_cpu(firmware_info->info.usMaxEngineClockPLL_Input);
1184 1189
1185 /* memory clock */ 1190 /* memory clock */
1186 mpll->reference_freq = 1191 if (ASIC_IS_DCE4(rdev))
1187 le16_to_cpu(firmware_info->info.usReferenceClock); 1192 mpll->reference_freq =
1193 le16_to_cpu(firmware_info->info_21.usMemoryReferenceClock);
1194 else
1195 mpll->reference_freq =
1196 le16_to_cpu(firmware_info->info.usReferenceClock);
1188 mpll->reference_div = 0; 1197 mpll->reference_div = 0;
1189 1198
1190 mpll->pll_out_min = 1199 mpll->pll_out_min =
@@ -1213,8 +1222,12 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
1213 if (ASIC_IS_DCE4(rdev)) { 1222 if (ASIC_IS_DCE4(rdev)) {
1214 rdev->clock.default_dispclk = 1223 rdev->clock.default_dispclk =
1215 le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq); 1224 le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq);
1216 if (rdev->clock.default_dispclk == 0) 1225 if (rdev->clock.default_dispclk == 0) {
1217 rdev->clock.default_dispclk = 60000; /* 600 Mhz */ 1226 if (ASIC_IS_DCE5(rdev))
1227 rdev->clock.default_dispclk = 54000; /* 540 Mhz */
1228 else
1229 rdev->clock.default_dispclk = 60000; /* 600 Mhz */
1230 }
1218 rdev->clock.dp_extclk = 1231 rdev->clock.dp_extclk =
1219 le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq); 1232 le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq);
1220 } 1233 }