| From e3c00d87845ab375f90fa6e10a5e72a3a5778cd3 Mon Sep 17 00:00:00 2001 |
| From: Lucas Stach <dev@lynxeye.de> |
| Date: Thu, 5 May 2016 10:16:44 -0400 |
| Subject: drm/radeon: fix PLL sharing on DCE6.1 (v2) |
| |
| From: Lucas Stach <dev@lynxeye.de> |
| |
| commit e3c00d87845ab375f90fa6e10a5e72a3a5778cd3 upstream. |
| |
| On DCE6.1 PPLL2 is exclusively available to UNIPHYA, so it should not |
| be taken into consideration when looking for an already enabled PLL |
| to be shared with other outputs. |
| |
| This fixes the broken VGA port (TRAVIS DP->VGA bridge) on my Richland |
| based laptop, where the internal display is connected to UNIPHYA through |
| a TRAVIS DP->LVDS bridge. |
| |
| Bug: |
| https://bugs.freedesktop.org/show_bug.cgi?id=78987 |
| |
| v2: agd: add check in radeon_get_shared_nondp_ppll as well, drop |
| extra parameter. |
| |
| Signed-off-by: Lucas Stach <dev@lynxeye.de> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/radeon/atombios_crtc.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| --- a/drivers/gpu/drm/radeon/atombios_crtc.c |
| +++ b/drivers/gpu/drm/radeon/atombios_crtc.c |
| @@ -1600,6 +1600,7 @@ static u32 radeon_get_pll_use_mask(struc |
| static int radeon_get_shared_dp_ppll(struct drm_crtc *crtc) |
| { |
| struct drm_device *dev = crtc->dev; |
| + struct radeon_device *rdev = dev->dev_private; |
| struct drm_crtc *test_crtc; |
| struct radeon_crtc *test_radeon_crtc; |
| |
| @@ -1609,6 +1610,10 @@ static int radeon_get_shared_dp_ppll(str |
| test_radeon_crtc = to_radeon_crtc(test_crtc); |
| if (test_radeon_crtc->encoder && |
| ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_radeon_crtc->encoder))) { |
| + /* PPLL2 is exclusive to UNIPHYA on DCE61 */ |
| + if (ASIC_IS_DCE61(rdev) && !ASIC_IS_DCE8(rdev) && |
| + test_radeon_crtc->pll_id == ATOM_PPLL2) |
| + continue; |
| /* for DP use the same PLL for all */ |
| if (test_radeon_crtc->pll_id != ATOM_PPLL_INVALID) |
| return test_radeon_crtc->pll_id; |
| @@ -1630,6 +1635,7 @@ static int radeon_get_shared_nondp_ppll( |
| { |
| struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
| struct drm_device *dev = crtc->dev; |
| + struct radeon_device *rdev = dev->dev_private; |
| struct drm_crtc *test_crtc; |
| struct radeon_crtc *test_radeon_crtc; |
| u32 adjusted_clock, test_adjusted_clock; |
| @@ -1645,6 +1651,10 @@ static int radeon_get_shared_nondp_ppll( |
| test_radeon_crtc = to_radeon_crtc(test_crtc); |
| if (test_radeon_crtc->encoder && |
| !ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_radeon_crtc->encoder))) { |
| + /* PPLL2 is exclusive to UNIPHYA on DCE61 */ |
| + if (ASIC_IS_DCE61(rdev) && !ASIC_IS_DCE8(rdev) && |
| + test_radeon_crtc->pll_id == ATOM_PPLL2) |
| + continue; |
| /* check if we are already driving this connector with another crtc */ |
| if (test_radeon_crtc->connector == radeon_crtc->connector) { |
| /* if we are, return that pll */ |