diff options
| author | Alex Deucher <alexdeucher@gmail.com> | 2011-01-06 21:19:15 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2011-01-06 23:11:22 -0500 |
| commit | f82b3ddc5fac044a28ab841bfd4ae48e2e43a21b (patch) | |
| tree | dd435132ebe52bf55f68234b689e73c3f7a32547 /drivers | |
| parent | 881dd74ea731067f8fc81608e3a8914fdd66bc6d (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')
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 31 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 25 |
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 9fbabaa6ee4..b3e5e754900 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 | ||
| 678 | static 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 | */ | ||
| 682 | static 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 e4f7e3e82a5..11573d085e6 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 | ||
| 1091 | bool radeon_atom_get_clock_info(struct drm_device *dev) | 1092 | bool 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 | } |
