diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2012-09-13 12:43:41 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2012-09-20 13:10:44 -0400 |
commit | 9642ac0e645198b62f99279704e829a286f58d96 (patch) | |
tree | 624a677257dec358b89fcf8197cb0f2e4935c6b1 /drivers/gpu/drm/radeon | |
parent | 5df3196bac972138fa62ea17ed036161ae710062 (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.c | 27 |
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 | } |
1874 | done: | 1873 | done: |
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 | } |