diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2011-07-29 15:42:37 -0400 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2011-07-29 18:19:04 -0400 |
commit | 291427f5fdadec6e4be2924172e83588880e1539 (patch) | |
tree | ece070f9e711333be25d89fcd776ec2dba82a9ee /drivers | |
parent | 070d329ae52e2fde341771d753a5b728145881f4 (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')
-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 */ |