diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 31 |
2 files changed, 36 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 30d8aae9ac4c..a7f7a347c700 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -3091,6 +3091,11 @@ | |||
| 3091 | #define TRANS_CHICKEN2(pipe) _PIPE(pipe, _TRANSA_CHICKEN2, _TRANSB_CHICKEN2) | 3091 | #define TRANS_CHICKEN2(pipe) _PIPE(pipe, _TRANSA_CHICKEN2, _TRANSB_CHICKEN2) |
| 3092 | #define TRANS_AUTOTRAIN_GEN_STALL_DIS (1<<31) | 3092 | #define TRANS_AUTOTRAIN_GEN_STALL_DIS (1<<31) |
| 3093 | 3093 | ||
| 3094 | #define SOUTH_CHICKEN1 0xc2000 | ||
| 3095 | #define FDIA_PHASE_SYNC_SHIFT_OVR 19 | ||
| 3096 | #define FDIA_PHASE_SYNC_SHIFT_EN 18 | ||
| 3097 | #define FDI_PHASE_SYNC_OVR(pipe) (1<<(FDIA_PHASE_SYNC_SHIFT_OVR - ((pipe) * 2))) | ||
| 3098 | #define FDI_PHASE_SYNC_EN(pipe) (1<<(FDIA_PHASE_SYNC_SHIFT_EN - ((pipe) * 2))) | ||
| 3094 | #define SOUTH_CHICKEN2 0xc2004 | 3099 | #define SOUTH_CHICKEN2 0xc2004 |
| 3095 | #define DPLS_EDP_PPS_FIX_DIS (1<<0) | 3100 | #define DPLS_EDP_PPS_FIX_DIS (1<<0) |
| 3096 | 3101 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 3d2900cbf431..53164606918f 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -2113,6 +2113,18 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc) | |||
| 2113 | FDI_FE_ERRC_ENABLE); | 2113 | FDI_FE_ERRC_ENABLE); |
| 2114 | } | 2114 | } |
| 2115 | 2115 | ||
| 2116 | static void cpt_phase_pointer_enable(struct drm_device *dev, int pipe) | ||
| 2117 | { | ||
| 2118 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 2119 | u32 flags = I915_READ(SOUTH_CHICKEN1); | ||
| 2120 | |||
| 2121 | flags |= FDI_PHASE_SYNC_OVR(pipe); | ||
| 2122 | I915_WRITE(SOUTH_CHICKEN1, flags); /* once to unlock... */ | ||
| 2123 | flags |= FDI_PHASE_SYNC_EN(pipe); | ||
| 2124 | I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to enable */ | ||
| 2125 | POSTING_READ(SOUTH_CHICKEN1); | ||
| 2126 | } | ||
| 2127 | |||
| 2116 | /* The FDI link training functions for ILK/Ibexpeak. */ | 2128 | /* The FDI link training functions for ILK/Ibexpeak. */ |
| 2117 | static void ironlake_fdi_link_train(struct drm_crtc *crtc) | 2129 | static void ironlake_fdi_link_train(struct drm_crtc *crtc) |
| 2118 | { | 2130 | { |
| @@ -2263,6 +2275,9 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc) | |||
| 2263 | POSTING_READ(reg); | 2275 | POSTING_READ(reg); |
| 2264 | udelay(150); | 2276 | udelay(150); |
| 2265 | 2277 | ||
| 2278 | if (HAS_PCH_CPT(dev)) | ||
| 2279 | cpt_phase_pointer_enable(dev, pipe); | ||
| 2280 | |||
| 2266 | for (i = 0; i < 4; i++ ) { | 2281 | for (i = 0; i < 4; i++ ) { |
| 2267 | reg = FDI_TX_CTL(pipe); | 2282 | reg = FDI_TX_CTL(pipe); |
| 2268 | temp = I915_READ(reg); | 2283 | temp = I915_READ(reg); |
| @@ -2379,6 +2394,9 @@ static void ivb_manual_fdi_link_train(struct drm_crtc *crtc) | |||
| 2379 | POSTING_READ(reg); | 2394 | POSTING_READ(reg); |
| 2380 | udelay(150); | 2395 | udelay(150); |
| 2381 | 2396 | ||
| 2397 | if (HAS_PCH_CPT(dev)) | ||
| 2398 | cpt_phase_pointer_enable(dev, pipe); | ||
| 2399 | |||
| 2382 | for (i = 0; i < 4; i++ ) { | 2400 | for (i = 0; i < 4; i++ ) { |
| 2383 | reg = FDI_TX_CTL(pipe); | 2401 | reg = FDI_TX_CTL(pipe); |
| 2384 | temp = I915_READ(reg); | 2402 | temp = I915_READ(reg); |
| @@ -2488,6 +2506,17 @@ static void ironlake_fdi_pll_enable(struct drm_crtc *crtc) | |||
| 2488 | } | 2506 | } |
| 2489 | } | 2507 | } |
| 2490 | 2508 | ||
| 2509 | static void cpt_phase_pointer_disable(struct drm_device *dev, int pipe) | ||
| 2510 | { | ||
| 2511 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 2512 | u32 flags = I915_READ(SOUTH_CHICKEN1); | ||
| 2513 | |||
| 2514 | flags &= ~(FDI_PHASE_SYNC_EN(pipe)); | ||
| 2515 | I915_WRITE(SOUTH_CHICKEN1, flags); /* once to disable... */ | ||
| 2516 | flags &= ~(FDI_PHASE_SYNC_OVR(pipe)); | ||
| 2517 | I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to lock */ | ||
| 2518 | POSTING_READ(SOUTH_CHICKEN1); | ||
| 2519 | } | ||
| 2491 | static void ironlake_fdi_disable(struct drm_crtc *crtc) | 2520 | static void ironlake_fdi_disable(struct drm_crtc *crtc) |
| 2492 | { | 2521 | { |
| 2493 | struct drm_device *dev = crtc->dev; | 2522 | struct drm_device *dev = crtc->dev; |
| @@ -2517,6 +2546,8 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc) | |||
| 2517 | I915_WRITE(FDI_RX_CHICKEN(pipe), | 2546 | I915_WRITE(FDI_RX_CHICKEN(pipe), |
| 2518 | I915_READ(FDI_RX_CHICKEN(pipe) & | 2547 | I915_READ(FDI_RX_CHICKEN(pipe) & |
| 2519 | ~FDI_RX_PHASE_SYNC_POINTER_EN)); | 2548 | ~FDI_RX_PHASE_SYNC_POINTER_EN)); |
| 2549 | } else if (HAS_PCH_CPT(dev)) { | ||
| 2550 | cpt_phase_pointer_disable(dev, pipe); | ||
| 2520 | } | 2551 | } |
| 2521 | 2552 | ||
| 2522 | /* still set train pattern 1 */ | 2553 | /* still set train pattern 1 */ |
