|
@@ -2971,6 +2971,24 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
|
|
|
intel_enable_transcoder(dev_priv, pipe);
|
|
|
}
|
|
|
|
|
|
+void intel_cpt_verify_modeset(struct drm_device *dev, int pipe)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ int dslreg = PIPEDSL(pipe), tc2reg = TRANS_CHICKEN2(pipe);
|
|
|
+ u32 temp;
|
|
|
+
|
|
|
+ temp = I915_READ(dslreg);
|
|
|
+ udelay(500);
|
|
|
+ if (wait_for(I915_READ(dslreg) != temp, 5)) {
|
|
|
+ /* Without this, mode sets may fail silently on FDI */
|
|
|
+ I915_WRITE(tc2reg, TRANS_AUTOTRAIN_GEN_STALL_DIS);
|
|
|
+ udelay(250);
|
|
|
+ I915_WRITE(tc2reg, 0);
|
|
|
+ if (wait_for(I915_READ(dslreg) != temp, 5))
|
|
|
+ DRM_ERROR("mode set failed: pipe %d stuck\n", pipe);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
|
|
{
|
|
|
struct drm_device *dev = crtc->dev;
|
|
@@ -3340,8 +3358,15 @@ void intel_encoder_prepare(struct drm_encoder *encoder)
|
|
|
void intel_encoder_commit(struct drm_encoder *encoder)
|
|
|
{
|
|
|
struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
|
|
|
+ struct drm_device *dev = encoder->dev;
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
|
|
|
+ struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
|
|
|
+
|
|
|
/* lvds has its own version of commit see intel_lvds_commit */
|
|
|
encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
|
|
|
+
|
|
|
+ if (HAS_PCH_CPT(dev))
|
|
|
+ intel_cpt_verify_modeset(dev, intel_crtc->pipe);
|
|
|
}
|
|
|
|
|
|
void intel_encoder_destroy(struct drm_encoder *encoder)
|