aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@virtuousgeek.org>2011-10-11 13:43:02 -0400
committerKeith Packard <keithp@keithp.com>2011-10-21 02:21:56 -0400
commitd4270e57efe9e2536798c59e1ed2fd0a1e5cdfcf (patch)
tree7f274fbd8a757d08947c8633a79b9ad4c6f85cae
parentd64311ab4bd8d1c1e984ce3f0e772266dde95380 (diff)
drm/i915: export a CPT mode set verification function
At the point where we check, we can't do much about the failure, but it can aid debugging. Note that the auto-train override bit will be reset as part of normal mode setting with this patch if a pipe ever does get stuck, but that's consistent with the workaround for CPT provided by the hardware team. This patch helped catch the fact that the pipe wasn't running in the !composite sync FDI case on my IVB SDV, so has already shown to be useful. Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> Tested-By: Eugeni Dodonov <eugeni.dodonov@intel.com> Reviewed-By: Eugeni Dodonov <eugeni.dodonov@intel.com> Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c25
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c5
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
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
2974void 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
2974static void ironlake_crtc_enable(struct drm_crtc *crtc) 2992static 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)
3340void intel_encoder_commit(struct drm_encoder *encoder) 3358void 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
3347void intel_encoder_destroy(struct drm_encoder *encoder) 3372void 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)
1191static void intel_dp_commit(struct drm_encoder *encoder) 1191static 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
1207static void 1212static 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);
382extern void intel_init_clock_gating(struct drm_device *dev); 382extern void intel_init_clock_gating(struct drm_device *dev);
383extern void intel_write_eld(struct drm_encoder *encoder, 383extern void intel_write_eld(struct drm_encoder *encoder,
384 struct drm_display_mode *mode); 384 struct drm_display_mode *mode);
385extern void intel_cpt_verify_modeset(struct drm_device *dev, int pipe);
386
385#endif /* __INTEL_DRV_H__ */ 387#endif /* __INTEL_DRV_H__ */