diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2011-05-20 04:34:17 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-05-20 06:02:22 -0400 |
commit | 86a94defe2b88380c28547d7053633b26a397d42 (patch) | |
tree | 5f18745f77235b364f85c8b74804957b285cca4e /drivers | |
parent | 8e8e523d865490e95ed7c9d2e173c02648d6be90 (diff) |
drm/radeon/kms: fix up DP clock programming on DCE4/5
In DP mode, the DP ref clock can come from PPLL, DCPLL, or ext clock,
depending on the asic. The crtc virtual pixel clock is derived from
the DP ref clock.
- DCE4: PPLL or ext clock
- DCE5: DCPLL or ext clock
Setting ATOM_PPLL_INVALID will cause SetPixelClock to skip
PPLL/DCPLL programming and only program the DP DTO for the
crtc virtual pixel clock.
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 | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_encoders.c | 11 |
2 files changed, 18 insertions, 5 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index ff0d1cad1012..9770afff4d4c 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -1443,11 +1443,19 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | |||
1443 | uint32_t pll_in_use = 0; | 1443 | uint32_t pll_in_use = 0; |
1444 | 1444 | ||
1445 | if (ASIC_IS_DCE4(rdev)) { | 1445 | if (ASIC_IS_DCE4(rdev)) { |
1446 | /* if crtc is driving DP and we have an ext clock, use that */ | ||
1447 | list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) { | 1446 | list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) { |
1448 | if (test_encoder->crtc && (test_encoder->crtc == crtc)) { | 1447 | if (test_encoder->crtc && (test_encoder->crtc == crtc)) { |
1448 | /* in DP mode, the DP ref clock can come from PPLL, DCPLL, or ext clock, | ||
1449 | * depending on the asic: | ||
1450 | * DCE4: PPLL or ext clock | ||
1451 | * DCE5: DCPLL or ext clock | ||
1452 | * | ||
1453 | * Setting ATOM_PPLL_INVALID will cause SetPixelClock to skip | ||
1454 | * PPLL/DCPLL programming and only program the DP DTO for the | ||
1455 | * crtc virtual pixel clock. | ||
1456 | */ | ||
1449 | if (atombios_get_encoder_mode(test_encoder) == ATOM_ENCODER_MODE_DP) { | 1457 | if (atombios_get_encoder_mode(test_encoder) == ATOM_ENCODER_MODE_DP) { |
1450 | if (rdev->clock.dp_extclk) | 1458 | if (ASIC_IS_DCE5(rdev) || rdev->clock.dp_extclk) |
1451 | return ATOM_PPLL_INVALID; | 1459 | return ATOM_PPLL_INVALID; |
1452 | } | 1460 | } |
1453 | } | 1461 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 6c6793e6e3a5..4d66e249e1c1 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
@@ -988,11 +988,16 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
988 | } | 988 | } |
989 | 989 | ||
990 | if (ASIC_IS_DCE5(rdev)) { | 990 | if (ASIC_IS_DCE5(rdev)) { |
991 | if (is_dp && rdev->clock.dp_extclk) | 991 | /* On DCE5 DCPLL usually generates the DP ref clock */ |
992 | args.v4.acConfig.ucRefClkSource = 3; /* external src */ | 992 | if (is_dp) { |
993 | else | 993 | if (rdev->clock.dp_extclk) |
994 | args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_EXTCLK; | ||
995 | else | ||
996 | args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_DCPLL; | ||
997 | } else | ||
994 | args.v4.acConfig.ucRefClkSource = pll_id; | 998 | args.v4.acConfig.ucRefClkSource = pll_id; |
995 | } else { | 999 | } else { |
1000 | /* On DCE4, if there is an external clock, it generates the DP ref clock */ | ||
996 | if (is_dp && rdev->clock.dp_extclk) | 1001 | if (is_dp && rdev->clock.dp_extclk) |
997 | args.v3.acConfig.ucRefClkSource = 2; /* external src */ | 1002 | args.v3.acConfig.ucRefClkSource = 2; /* external src */ |
998 | else | 1003 | else |