|
@@ -2113,6 +2113,18 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc)
|
|
|
FDI_FE_ERRC_ENABLE);
|
|
|
}
|
|
|
|
|
|
+static void cpt_phase_pointer_enable(struct drm_device *dev, int pipe)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ u32 flags = I915_READ(SOUTH_CHICKEN1);
|
|
|
+
|
|
|
+ flags |= FDI_PHASE_SYNC_OVR(pipe);
|
|
|
+ I915_WRITE(SOUTH_CHICKEN1, flags); /* once to unlock... */
|
|
|
+ flags |= FDI_PHASE_SYNC_EN(pipe);
|
|
|
+ I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to enable */
|
|
|
+ POSTING_READ(SOUTH_CHICKEN1);
|
|
|
+}
|
|
|
+
|
|
|
/* The FDI link training functions for ILK/Ibexpeak. */
|
|
|
static void ironlake_fdi_link_train(struct drm_crtc *crtc)
|
|
|
{
|
|
@@ -2263,6 +2275,9 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
|
|
|
POSTING_READ(reg);
|
|
|
udelay(150);
|
|
|
|
|
|
+ if (HAS_PCH_CPT(dev))
|
|
|
+ cpt_phase_pointer_enable(dev, pipe);
|
|
|
+
|
|
|
for (i = 0; i < 4; i++ ) {
|
|
|
reg = FDI_TX_CTL(pipe);
|
|
|
temp = I915_READ(reg);
|
|
@@ -2379,6 +2394,9 @@ static void ivb_manual_fdi_link_train(struct drm_crtc *crtc)
|
|
|
POSTING_READ(reg);
|
|
|
udelay(150);
|
|
|
|
|
|
+ if (HAS_PCH_CPT(dev))
|
|
|
+ cpt_phase_pointer_enable(dev, pipe);
|
|
|
+
|
|
|
for (i = 0; i < 4; i++ ) {
|
|
|
reg = FDI_TX_CTL(pipe);
|
|
|
temp = I915_READ(reg);
|
|
@@ -2488,6 +2506,17 @@ static void ironlake_fdi_pll_enable(struct drm_crtc *crtc)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void cpt_phase_pointer_disable(struct drm_device *dev, int pipe)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ u32 flags = I915_READ(SOUTH_CHICKEN1);
|
|
|
+
|
|
|
+ flags &= ~(FDI_PHASE_SYNC_EN(pipe));
|
|
|
+ I915_WRITE(SOUTH_CHICKEN1, flags); /* once to disable... */
|
|
|
+ flags &= ~(FDI_PHASE_SYNC_OVR(pipe));
|
|
|
+ I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to lock */
|
|
|
+ POSTING_READ(SOUTH_CHICKEN1);
|
|
|
+}
|
|
|
static void ironlake_fdi_disable(struct drm_crtc *crtc)
|
|
|
{
|
|
|
struct drm_device *dev = crtc->dev;
|
|
@@ -2517,6 +2546,8 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc)
|
|
|
I915_WRITE(FDI_RX_CHICKEN(pipe),
|
|
|
I915_READ(FDI_RX_CHICKEN(pipe) &
|
|
|
~FDI_RX_PHASE_SYNC_POINTER_EN));
|
|
|
+ } else if (HAS_PCH_CPT(dev)) {
|
|
|
+ cpt_phase_pointer_disable(dev, pipe);
|
|
|
}
|
|
|
|
|
|
/* still set train pattern 1 */
|