aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@virtuousgeek.org>2011-07-29 15:42:37 -0400
committerKeith Packard <keithp@keithp.com>2011-07-29 18:19:04 -0400
commit291427f5fdadec6e4be2924172e83588880e1539 (patch)
treeece070f9e711333be25d89fcd776ec2dba82a9ee /drivers/gpu
parent070d329ae52e2fde341771d753a5b728145881f4 (diff)
drm/i915: apply phase pointer override on SNB+ too
These bits moved around on SNB and above. v2: again with the git send-email fail v3: add macros for getting per-pipe override & enable bits v4: enable phase sync pointer on SNB and IVB configs as well Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h5
-rw-r--r--drivers/gpu/drm/i915/intel_display.c31
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
2116static 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. */
2117static void ironlake_fdi_link_train(struct drm_crtc *crtc) 2129static 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
2509static 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}
2491static void ironlake_fdi_disable(struct drm_crtc *crtc) 2520static 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 */