aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@virtuousgeek.org>2010-10-07 19:01:11 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2010-10-08 04:24:19 -0400
commit5c5313c8db9bfb549e080fc4cb0a4c3c2aa7a73d (patch)
treef3eace6c215f3fdf4e774b6fcdd073ad081dec3d /drivers
parent1d85036278f1b3eb3b7c5db805e5c4c847d1415d (diff)
drm/i915: fix CPU vs PCH eDP confusion
FDI training needs to done and idle for PCH eDP and before we turn the pipes on, and various eDP checks need to account for PCH attached eDP. Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c67
1 files changed, 32 insertions, 35 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 0ef52db4685f..4c44e1663a95 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -932,10 +932,6 @@ intel_find_pll_ironlake_dp(const intel_limit_t *limit, struct drm_crtc *crtc,
932 struct drm_device *dev = crtc->dev; 932 struct drm_device *dev = crtc->dev;
933 intel_clock_t clock; 933 intel_clock_t clock;
934 934
935 /* return directly when it is eDP */
936 if (HAS_eDP)
937 return true;
938
939 if (target < 200000) { 935 if (target < 200000) {
940 clock.n = 1; 936 clock.n = 1;
941 clock.p1 = 2; 937 clock.p1 = 2;
@@ -1763,6 +1759,28 @@ static void ironlake_fdi_link_train(struct drm_crtc *crtc)
1763 DRM_ERROR("FDI train 2 fail!\n"); 1759 DRM_ERROR("FDI train 2 fail!\n");
1764 1760
1765 DRM_DEBUG_KMS("FDI train done\n"); 1761 DRM_DEBUG_KMS("FDI train done\n");
1762
1763 /* enable normal train */
1764 reg = FDI_TX_CTL(pipe);
1765 temp = I915_READ(reg);
1766 temp &= ~FDI_LINK_TRAIN_NONE;
1767 temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
1768 I915_WRITE(reg, temp);
1769
1770 reg = FDI_RX_CTL(pipe);
1771 temp = I915_READ(reg);
1772 if (HAS_PCH_CPT(dev)) {
1773 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
1774 temp |= FDI_LINK_TRAIN_NORMAL_CPT;
1775 } else {
1776 temp &= ~FDI_LINK_TRAIN_NONE;
1777 temp |= FDI_LINK_TRAIN_NONE;
1778 }
1779 I915_WRITE(reg, temp | FDI_RX_ENHANCE_FRAME_ENABLE);
1780
1781 /* wait one idle pattern time */
1782 POSTING_READ(reg);
1783 udelay(1000);
1766} 1784}
1767 1785
1768static const int const snb_b_fdi_train_param [] = { 1786static const int const snb_b_fdi_train_param [] = {
@@ -2065,28 +2083,6 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
2065 I915_WRITE(TRANS_VBLANK(pipe), I915_READ(VBLANK(pipe))); 2083 I915_WRITE(TRANS_VBLANK(pipe), I915_READ(VBLANK(pipe)));
2066 I915_WRITE(TRANS_VSYNC(pipe), I915_READ(VSYNC(pipe))); 2084 I915_WRITE(TRANS_VSYNC(pipe), I915_READ(VSYNC(pipe)));
2067 2085
2068 /* enable normal train */
2069 reg = FDI_TX_CTL(pipe);
2070 temp = I915_READ(reg);
2071 temp &= ~FDI_LINK_TRAIN_NONE;
2072 temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
2073 I915_WRITE(reg, temp);
2074
2075 reg = FDI_RX_CTL(pipe);
2076 temp = I915_READ(reg);
2077 if (HAS_PCH_CPT(dev)) {
2078 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2079 temp |= FDI_LINK_TRAIN_NORMAL_CPT;
2080 } else {
2081 temp &= ~FDI_LINK_TRAIN_NONE;
2082 temp |= FDI_LINK_TRAIN_NONE;
2083 }
2084 I915_WRITE(reg, temp | FDI_RX_ENHANCE_FRAME_ENABLE);
2085
2086 /* wait one idle pattern time */
2087 POSTING_READ(reg);
2088 udelay(100);
2089
2090 /* For PCH DP, enable TRANS_DP_CTL */ 2086 /* For PCH DP, enable TRANS_DP_CTL */
2091 if (HAS_PCH_CPT(dev) && 2087 if (HAS_PCH_CPT(dev) &&
2092 intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) { 2088 intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) {
@@ -3683,16 +3679,16 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3683 /* FDI link */ 3679 /* FDI link */
3684 if (HAS_PCH_SPLIT(dev)) { 3680 if (HAS_PCH_SPLIT(dev)) {
3685 int lane = 0, link_bw, bpp; 3681 int lane = 0, link_bw, bpp;
3686 /* eDP doesn't require FDI link, so just set DP M/N 3682 /* CPU eDP doesn't require FDI link, so just set DP M/N
3687 according to current link config */ 3683 according to current link config */
3688 if (has_edp_encoder) { 3684 if (has_edp_encoder && !intel_encoder_is_pch_edp(&encoder->base)) {
3689 target_clock = mode->clock; 3685 target_clock = mode->clock;
3690 intel_edp_link_config(has_edp_encoder, 3686 intel_edp_link_config(has_edp_encoder,
3691 &lane, &link_bw); 3687 &lane, &link_bw);
3692 } else { 3688 } else {
3693 /* DP over FDI requires target mode clock 3689 /* [e]DP over FDI requires target mode clock
3694 instead of link clock */ 3690 instead of link clock */
3695 if (is_dp) 3691 if (is_dp || intel_encoder_is_pch_edp(&has_edp_encoder->base))
3696 target_clock = mode->clock; 3692 target_clock = mode->clock;
3697 else 3693 else
3698 target_clock = adjusted_mode->clock; 3694 target_clock = adjusted_mode->clock;
@@ -3932,7 +3928,8 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3932 dpll_reg = DPLL(pipe); 3928 dpll_reg = DPLL(pipe);
3933 } 3929 }
3934 3930
3935 if (!has_edp_encoder) { 3931 /* PCH eDP needs FDI, but CPU eDP does not */
3932 if (!has_edp_encoder || intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
3936 I915_WRITE(fp_reg, fp); 3933 I915_WRITE(fp_reg, fp);
3937 I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE); 3934 I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE);
3938 3935
@@ -4009,9 +4006,9 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
4009 } 4006 }
4010 } 4007 }
4011 4008
4012 if (is_dp) 4009 if (is_dp || intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
4013 intel_dp_set_m_n(crtc, mode, adjusted_mode); 4010 intel_dp_set_m_n(crtc, mode, adjusted_mode);
4014 else if (HAS_PCH_SPLIT(dev)) { 4011 } else if (HAS_PCH_SPLIT(dev)) {
4015 /* For non-DP output, clear any trans DP clock recovery setting.*/ 4012 /* For non-DP output, clear any trans DP clock recovery setting.*/
4016 if (pipe == 0) { 4013 if (pipe == 0) {
4017 I915_WRITE(TRANSA_DATA_M1, 0); 4014 I915_WRITE(TRANSA_DATA_M1, 0);
@@ -4026,7 +4023,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
4026 } 4023 }
4027 } 4024 }
4028 4025
4029 if (!has_edp_encoder) { 4026 if (!has_edp_encoder || intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
4030 I915_WRITE(fp_reg, fp); 4027 I915_WRITE(fp_reg, fp);
4031 I915_WRITE(dpll_reg, dpll); 4028 I915_WRITE(dpll_reg, dpll);
4032 4029
@@ -4120,7 +4117,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
4120 I915_WRITE(PIPE_LINK_M1(pipe), m_n.link_m); 4117 I915_WRITE(PIPE_LINK_M1(pipe), m_n.link_m);
4121 I915_WRITE(PIPE_LINK_N1(pipe), m_n.link_n); 4118 I915_WRITE(PIPE_LINK_N1(pipe), m_n.link_n);
4122 4119
4123 if (has_edp_encoder) { 4120 if (has_edp_encoder && !intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
4124 ironlake_set_pll_edp(crtc, adjusted_mode->clock); 4121 ironlake_set_pll_edp(crtc, adjusted_mode->clock);
4125 } else { 4122 } else {
4126 /* enable FDI RX PLL too */ 4123 /* enable FDI RX PLL too */