aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-11-21 05:44:23 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-11-21 11:47:12 -0500
commit776ca7cf5bcc6892ad5bd781279744a654a8ed23 (patch)
tree1bc963141496b84abcefdcb966961608842dfe6d /drivers/gpu/drm/i915
parentb3bf076697a68a8577f4a5f7407de0bb2b3b56ac (diff)
drm/i915: Apply the IBX transcoder A w/a for HDMI to SDVO as well
As the SDVO/HDMI registers are multiplex, it is safe to assume that the w/a required for HDMI on IbexPoint, namely that the SDVO register cannot both be disabled and have selected transcoder B, is also required for SDVO. At least the modeset state checker detects that the transcoder selection is left in the undefined state, and so it appears sensible to apply the w/a: [ 1814.480052] WARNING: at drivers/gpu/drm/i915/intel_display.c:1487 assert_pch_hdmi_disabled+0xad/0xb5() [ 1814.480053] Hardware name: Libretto W100 [ 1814.480054] IBX PCH hdmi port still using transcoder B Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=57066 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index aea64425b1a2..7ad7e4e29e72 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -1228,6 +1228,30 @@ static void intel_disable_sdvo(struct intel_encoder *encoder)
1228 1228
1229 temp = I915_READ(intel_sdvo->sdvo_reg); 1229 temp = I915_READ(intel_sdvo->sdvo_reg);
1230 if ((temp & SDVO_ENABLE) != 0) { 1230 if ((temp & SDVO_ENABLE) != 0) {
1231 /* HW workaround for IBX, we need to move the port to
1232 * transcoder A before disabling it. */
1233 if (HAS_PCH_IBX(encoder->base.dev)) {
1234 struct drm_crtc *crtc = encoder->base.crtc;
1235 int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
1236
1237 if (temp & SDVO_PIPE_B_SELECT) {
1238 temp &= ~SDVO_PIPE_B_SELECT;
1239 I915_WRITE(intel_sdvo->sdvo_reg, temp);
1240 POSTING_READ(intel_sdvo->sdvo_reg);
1241
1242 /* Again we need to write this twice. */
1243 I915_WRITE(intel_sdvo->sdvo_reg, temp);
1244 POSTING_READ(intel_sdvo->sdvo_reg);
1245
1246 /* Transcoder selection bits only update
1247 * effectively on vblank. */
1248 if (crtc)
1249 intel_wait_for_vblank(encoder->base.dev, pipe);
1250 else
1251 msleep(50);
1252 }
1253 }
1254
1231 intel_sdvo_write_sdvox(intel_sdvo, temp & ~SDVO_ENABLE); 1255 intel_sdvo_write_sdvox(intel_sdvo, temp & ~SDVO_ENABLE);
1232 } 1256 }
1233} 1257}
@@ -1244,8 +1268,20 @@ static void intel_enable_sdvo(struct intel_encoder *encoder)
1244 u8 status; 1268 u8 status;
1245 1269
1246 temp = I915_READ(intel_sdvo->sdvo_reg); 1270 temp = I915_READ(intel_sdvo->sdvo_reg);
1247 if ((temp & SDVO_ENABLE) == 0) 1271 if ((temp & SDVO_ENABLE) == 0) {
1272 /* HW workaround for IBX, we need to move the port
1273 * to transcoder A before disabling it. */
1274 if (HAS_PCH_IBX(dev)) {
1275 struct drm_crtc *crtc = encoder->base.crtc;
1276 int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
1277
1278 /* Restore the transcoder select bit. */
1279 if (pipe == PIPE_B)
1280 temp |= SDVO_PIPE_B_SELECT;
1281 }
1282
1248 intel_sdvo_write_sdvox(intel_sdvo, temp | SDVO_ENABLE); 1283 intel_sdvo_write_sdvox(intel_sdvo, temp | SDVO_ENABLE);
1284 }
1249 for (i = 0; i < 2; i++) 1285 for (i = 0; i < 2; i++)
1250 intel_wait_for_vblank(dev, intel_crtc->pipe); 1286 intel_wait_for_vblank(dev, intel_crtc->pipe);
1251 1287