aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/atombios_crtc.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-07-26 13:38:52 -0400
committerAlex Deucher <alexander.deucher@amd.com>2012-08-13 10:50:50 -0400
commit6c0ae2ab85fc4a95cae82047a7db1f688a7737ab (patch)
tree44dfa02a721ea76ec19a4ef8f6ef06f48a7bcbd1 /drivers/gpu/drm/radeon/atombios_crtc.c
parent3838f46e363d5a07e61d0352bf11d534dc61f921 (diff)
drm/radeon: properly handle crtc powergating
Need to make sure the crtc is gated on before modesetting. Explicitly gate the crtc on in prepare() and set a flag so that the dpms functions don't gate it off during mode set. Noticed by sylware on IRC. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/gpu/drm/radeon/atombios_crtc.c')
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index 9e6f76fec527..dc279ebf7afb 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -259,7 +259,7 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode)
259 /* adjust pm to dpms changes BEFORE enabling crtcs */ 259 /* adjust pm to dpms changes BEFORE enabling crtcs */
260 radeon_pm_compute_clocks(rdev); 260 radeon_pm_compute_clocks(rdev);
261 /* disable crtc pair power gating before programming */ 261 /* disable crtc pair power gating before programming */
262 if (ASIC_IS_DCE6(rdev)) 262 if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set)
263 atombios_powergate_crtc(crtc, ATOM_DISABLE); 263 atombios_powergate_crtc(crtc, ATOM_DISABLE);
264 atombios_enable_crtc(crtc, ATOM_ENABLE); 264 atombios_enable_crtc(crtc, ATOM_ENABLE);
265 if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev)) 265 if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev))
@@ -279,7 +279,7 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode)
279 atombios_enable_crtc(crtc, ATOM_DISABLE); 279 atombios_enable_crtc(crtc, ATOM_DISABLE);
280 radeon_crtc->enabled = false; 280 radeon_crtc->enabled = false;
281 /* power gating is per-pair */ 281 /* power gating is per-pair */
282 if (ASIC_IS_DCE6(rdev)) { 282 if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) {
283 struct drm_crtc *other_crtc; 283 struct drm_crtc *other_crtc;
284 struct radeon_crtc *other_radeon_crtc; 284 struct radeon_crtc *other_radeon_crtc;
285 list_for_each_entry(other_crtc, &rdev->ddev->mode_config.crtc_list, head) { 285 list_for_each_entry(other_crtc, &rdev->ddev->mode_config.crtc_list, head) {
@@ -1635,18 +1635,28 @@ static bool atombios_crtc_mode_fixup(struct drm_crtc *crtc,
1635static void atombios_crtc_prepare(struct drm_crtc *crtc) 1635static void atombios_crtc_prepare(struct drm_crtc *crtc)
1636{ 1636{
1637 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 1637 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1638 struct drm_device *dev = crtc->dev;
1639 struct radeon_device *rdev = dev->dev_private;
1638 1640
1641 radeon_crtc->in_mode_set = true;
1639 /* pick pll */ 1642 /* pick pll */
1640 radeon_crtc->pll_id = radeon_atom_pick_pll(crtc); 1643 radeon_crtc->pll_id = radeon_atom_pick_pll(crtc);
1641 1644
1645 /* disable crtc pair power gating before programming */
1646 if (ASIC_IS_DCE6(rdev))
1647 atombios_powergate_crtc(crtc, ATOM_DISABLE);
1648
1642 atombios_lock_crtc(crtc, ATOM_ENABLE); 1649 atombios_lock_crtc(crtc, ATOM_ENABLE);
1643 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); 1650 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1644} 1651}
1645 1652
1646static void atombios_crtc_commit(struct drm_crtc *crtc) 1653static void atombios_crtc_commit(struct drm_crtc *crtc)
1647{ 1654{
1655 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1656
1648 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_ON); 1657 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
1649 atombios_lock_crtc(crtc, ATOM_DISABLE); 1658 atombios_lock_crtc(crtc, ATOM_DISABLE);
1659 radeon_crtc->in_mode_set = false;
1650} 1660}
1651 1661
1652static void atombios_crtc_disable(struct drm_crtc *crtc) 1662static void atombios_crtc_disable(struct drm_crtc *crtc)