98 lines
3.5 KiB
Diff
98 lines
3.5 KiB
Diff
From 7aac5b711ff4c64bad5a6027cf6d38f1bbd53efe Mon Sep 17 00:00:00 2001
|
|
From: Dave Airlie <airlied@redhat.com>
|
|
Date: Tue, 20 Apr 2010 18:30:37 +1000
|
|
Subject: [PATCH] drm/radeon/kms: further spread spectrum fixes
|
|
|
|
Adjust modeset ordering to fix spread spectrum.
|
|
The spread spectrum command table relies on the
|
|
crtc routing to already be set in order to work
|
|
properly on some asics.
|
|
|
|
Should fix fdo bug 25741.
|
|
|
|
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
Conflicts:
|
|
|
|
drivers/gpu/drm/radeon/atombios_crtc.c
|
|
---
|
|
drivers/gpu/drm/radeon/atombios_crtc.c | 5 +++++
|
|
drivers/gpu/drm/radeon/radeon_encoders.c | 25 +++++++++++++++----------
|
|
2 files changed, 20 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
|
|
index c076eac..e70b575 100644
|
|
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
|
|
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
|
|
@@ -1115,6 +1115,11 @@ static bool atombios_crtc_mode_fixup(struct drm_crtc *crtc,
|
|
|
|
static void atombios_crtc_prepare(struct drm_crtc *crtc)
|
|
{
|
|
+ struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
|
+
|
|
+ /* pick pll */
|
|
+ radeon_crtc->pll_id = radeon_atom_pick_pll(crtc);
|
|
+
|
|
atombios_lock_crtc(crtc, ATOM_ENABLE);
|
|
atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
|
|
}
|
|
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c
|
|
index cac9e06..ff28ad8 100644
|
|
--- a/drivers/gpu/drm/radeon/radeon_encoders.c
|
|
+++ b/drivers/gpu/drm/radeon/radeon_encoders.c
|
|
@@ -1207,6 +1207,9 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder)
|
|
}
|
|
|
|
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
|
+
|
|
+ /* update scratch regs with new routing */
|
|
+ radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
|
|
}
|
|
|
|
static void
|
|
@@ -1317,19 +1320,9 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
|
|
struct drm_device *dev = encoder->dev;
|
|
struct radeon_device *rdev = dev->dev_private;
|
|
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
|
- struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
|
|
|
|
- if (radeon_encoder->active_device &
|
|
- (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) {
|
|
- struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
|
- if (dig)
|
|
- dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder);
|
|
- }
|
|
radeon_encoder->pixel_clock = adjusted_mode->clock;
|
|
|
|
- radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
|
|
- atombios_set_encoder_crtc_source(encoder);
|
|
-
|
|
if (ASIC_IS_AVIVO(rdev)) {
|
|
if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT))
|
|
atombios_yuv_setup(encoder, true);
|
|
@@ -1483,8 +1476,20 @@ radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connec
|
|
|
|
static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
|
|
{
|
|
+ struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
|
+
|
|
+ if (radeon_encoder->active_device &
|
|
+ (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) {
|
|
+ struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
|
+ if (dig)
|
|
+ dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder);
|
|
+ }
|
|
+
|
|
radeon_atom_output_lock(encoder, true);
|
|
radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
|
|
+
|
|
+ /* this is needed for the pll/ss setup to work correctly in some cases */
|
|
+ atombios_set_encoder_crtc_source(encoder);
|
|
}
|
|
|
|
static void radeon_atom_encoder_commit(struct drm_encoder *encoder)
|
|
--
|
|
1.6.5.2
|
|
|