diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 |
3 files changed, 32 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index ed5d4f4d702e..ad3a0187d306 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -2971,6 +2971,24 @@ static void ironlake_pch_enable(struct drm_crtc *crtc) | |||
2971 | intel_enable_transcoder(dev_priv, pipe); | 2971 | intel_enable_transcoder(dev_priv, pipe); |
2972 | } | 2972 | } |
2973 | 2973 | ||
2974 | void intel_cpt_verify_modeset(struct drm_device *dev, int pipe) | ||
2975 | { | ||
2976 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2977 | int dslreg = PIPEDSL(pipe), tc2reg = TRANS_CHICKEN2(pipe); | ||
2978 | u32 temp; | ||
2979 | |||
2980 | temp = I915_READ(dslreg); | ||
2981 | udelay(500); | ||
2982 | if (wait_for(I915_READ(dslreg) != temp, 5)) { | ||
2983 | /* Without this, mode sets may fail silently on FDI */ | ||
2984 | I915_WRITE(tc2reg, TRANS_AUTOTRAIN_GEN_STALL_DIS); | ||
2985 | udelay(250); | ||
2986 | I915_WRITE(tc2reg, 0); | ||
2987 | if (wait_for(I915_READ(dslreg) != temp, 5)) | ||
2988 | DRM_ERROR("mode set failed: pipe %d stuck\n", pipe); | ||
2989 | } | ||
2990 | } | ||
2991 | |||
2974 | static void ironlake_crtc_enable(struct drm_crtc *crtc) | 2992 | static void ironlake_crtc_enable(struct drm_crtc *crtc) |
2975 | { | 2993 | { |
2976 | struct drm_device *dev = crtc->dev; | 2994 | struct drm_device *dev = crtc->dev; |
@@ -3340,8 +3358,15 @@ void intel_encoder_prepare(struct drm_encoder *encoder) | |||
3340 | void intel_encoder_commit(struct drm_encoder *encoder) | 3358 | void intel_encoder_commit(struct drm_encoder *encoder) |
3341 | { | 3359 | { |
3342 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; | 3360 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; |
3361 | struct drm_device *dev = encoder->dev; | ||
3362 | struct intel_encoder *intel_encoder = to_intel_encoder(encoder); | ||
3363 | struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc); | ||
3364 | |||
3343 | /* lvds has its own version of commit see intel_lvds_commit */ | 3365 | /* lvds has its own version of commit see intel_lvds_commit */ |
3344 | encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON); | 3366 | encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON); |
3367 | |||
3368 | if (HAS_PCH_CPT(dev)) | ||
3369 | intel_cpt_verify_modeset(dev, intel_crtc->pipe); | ||
3345 | } | 3370 | } |
3346 | 3371 | ||
3347 | void intel_encoder_destroy(struct drm_encoder *encoder) | 3372 | void intel_encoder_destroy(struct drm_encoder *encoder) |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 3009d2aaaa3a..74c835272292 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -1191,6 +1191,8 @@ static void intel_dp_prepare(struct drm_encoder *encoder) | |||
1191 | static void intel_dp_commit(struct drm_encoder *encoder) | 1191 | static void intel_dp_commit(struct drm_encoder *encoder) |
1192 | { | 1192 | { |
1193 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); | 1193 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); |
1194 | struct drm_device *dev = encoder->dev; | ||
1195 | struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc); | ||
1194 | 1196 | ||
1195 | ironlake_edp_panel_vdd_on(intel_dp); | 1197 | ironlake_edp_panel_vdd_on(intel_dp); |
1196 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON); | 1198 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON); |
@@ -1202,6 +1204,9 @@ static void intel_dp_commit(struct drm_encoder *encoder) | |||
1202 | ironlake_edp_backlight_on(intel_dp); | 1204 | ironlake_edp_backlight_on(intel_dp); |
1203 | 1205 | ||
1204 | intel_dp->dpms_mode = DRM_MODE_DPMS_ON; | 1206 | intel_dp->dpms_mode = DRM_MODE_DPMS_ON; |
1207 | |||
1208 | if (HAS_PCH_CPT(dev)) | ||
1209 | intel_cpt_verify_modeset(dev, intel_crtc->pipe); | ||
1205 | } | 1210 | } |
1206 | 1211 | ||
1207 | static void | 1212 | static void |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 5829854ecbf6..51b1d752940b 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -382,4 +382,6 @@ extern void intel_fb_restore_mode(struct drm_device *dev); | |||
382 | extern void intel_init_clock_gating(struct drm_device *dev); | 382 | extern void intel_init_clock_gating(struct drm_device *dev); |
383 | extern void intel_write_eld(struct drm_encoder *encoder, | 383 | extern void intel_write_eld(struct drm_encoder *encoder, |
384 | struct drm_display_mode *mode); | 384 | struct drm_display_mode *mode); |
385 | extern void intel_cpt_verify_modeset(struct drm_device *dev, int pipe); | ||
386 | |||
385 | #endif /* __INTEL_DRV_H__ */ | 387 | #endif /* __INTEL_DRV_H__ */ |