aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-09-13 12:43:41 -0400
committerAlex Deucher <alexander.deucher@amd.com>2012-09-20 13:10:44 -0400
commit9642ac0e645198b62f99279704e829a286f58d96 (patch)
tree624a677257dec358b89fcf8197cb0f2e4935c6b1 /drivers/gpu/drm/radeon
parent5df3196bac972138fa62ea17ed036161ae710062 (diff)
drm/radeon: make non-DP PPLL sharing more robust
Compare the adjusted clock as well as the crtc mode clock. This handles cases where the driver adjusts the clock for specific special cases. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon')
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index 53a3b29d2d9d..721f80e9568d 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -1547,29 +1547,28 @@ static int radeon_get_shared_nondp_ppll(struct drm_crtc *crtc)
1547{ 1547{
1548 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 1548 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1549 struct drm_device *dev = crtc->dev; 1549 struct drm_device *dev = crtc->dev;
1550 struct radeon_encoder *radeon_encoder =
1551 to_radeon_encoder(radeon_crtc->encoder);
1552 struct drm_encoder *test_encoder; 1550 struct drm_encoder *test_encoder;
1551 struct drm_crtc *test_crtc;
1553 struct radeon_crtc *test_radeon_crtc; 1552 struct radeon_crtc *test_radeon_crtc;
1554 struct radeon_encoder *test_radeon_encoder; 1553 struct radeon_encoder *test_radeon_encoder;
1555 u32 target_clock, test_clock; 1554 u32 adjusted_clock, test_adjusted_clock;
1556 1555
1557 if (radeon_encoder->native_mode.clock) 1556 adjusted_clock = radeon_crtc->adjusted_clock;
1558 target_clock = radeon_encoder->native_mode.clock; 1557
1559 else 1558 if (adjusted_clock == 0)
1560 target_clock = crtc->mode.clock; 1559 return ATOM_PPLL_INVALID;
1561 1560
1562 list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) { 1561 list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) {
1563 if (test_encoder->crtc && (test_encoder->crtc != crtc)) { 1562 if (test_encoder->crtc && (test_encoder->crtc != crtc)) {
1564 if (!ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_encoder))) { 1563 if (!ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_encoder))) {
1565 test_radeon_encoder = to_radeon_encoder(test_encoder); 1564 test_radeon_encoder = to_radeon_encoder(test_encoder);
1566 test_radeon_crtc = to_radeon_crtc(test_encoder->crtc); 1565 test_crtc = test_encoder->crtc;
1566 test_radeon_crtc = to_radeon_crtc(test_crtc);
1567 /* for non-DP check the clock */ 1567 /* for non-DP check the clock */
1568 if (test_radeon_encoder->native_mode.clock) 1568 test_adjusted_clock = test_radeon_crtc->adjusted_clock;
1569 test_clock = test_radeon_encoder->native_mode.clock; 1569 if ((crtc->mode.clock == test_crtc->mode.clock) &&
1570 else 1570 (adjusted_clock == test_adjusted_clock) &&
1571 test_clock = test_encoder->crtc->mode.clock; 1571 (radeon_crtc->ss_enabled == test_radeon_crtc->ss_enabled) &&
1572 if ((target_clock == test_clock) &&
1573 (test_radeon_crtc->pll_id != ATOM_PPLL_INVALID)) 1572 (test_radeon_crtc->pll_id != ATOM_PPLL_INVALID))
1574 return test_radeon_crtc->pll_id; 1573 return test_radeon_crtc->pll_id;
1575 } 1574 }
@@ -1873,6 +1872,7 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
1873 } 1872 }
1874done: 1873done:
1875 radeon_crtc->pll_id = ATOM_PPLL_INVALID; 1874 radeon_crtc->pll_id = ATOM_PPLL_INVALID;
1875 radeon_crtc->adjusted_clock = 0;
1876 radeon_crtc->encoder = NULL; 1876 radeon_crtc->encoder = NULL;
1877} 1877}
1878 1878
@@ -1923,6 +1923,7 @@ void radeon_atombios_init_crtc(struct drm_device *dev,
1923 radeon_crtc->crtc_offset = 0; 1923 radeon_crtc->crtc_offset = 0;
1924 } 1924 }
1925 radeon_crtc->pll_id = ATOM_PPLL_INVALID; 1925 radeon_crtc->pll_id = ATOM_PPLL_INVALID;
1926 radeon_crtc->adjusted_clock = 0;
1926 radeon_crtc->encoder = NULL; 1927 radeon_crtc->encoder = NULL;
1927 drm_crtc_helper_add(&radeon_crtc->base, &atombios_helper_funcs); 1928 drm_crtc_helper_add(&radeon_crtc->base, &atombios_helper_funcs);
1928} 1929}