aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2012-12-01 09:04:26 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-12-10 05:14:29 -0500
commit68d18ad7fbc16288aa230ec0ffb4416fd4363c87 (patch)
tree24d670effc303e0f849480cdd872aeaabcfbae4a
parentdde86e2db54545ef981b64805097a7b4c3156d6e (diff)
drm/i915: set the LPT FDI RX polarity reversal bit when needed
If we fail to set the bit when needed we get some nice FDI link training failures (AKA "black screen on VGA output"). While we don't really know how to properly choose whether we need to set the bit or not (VBT?), just read the initial value set by the BIOS and store it for later usage. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h1
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c8
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c2
4 files changed, 13 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 65213bc2f3c6..557843dd4b2e 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -915,6 +915,8 @@ typedef struct drm_i915_private {
915 bool hw_contexts_disabled; 915 bool hw_contexts_disabled;
916 uint32_t hw_context_size; 916 uint32_t hw_context_size;
917 917
918 bool fdi_rx_polarity_reversed;
919
918 struct i915_suspend_saved_registers regfile; 920 struct i915_suspend_saved_registers regfile;
919 921
920 /* Old dri1 support infrastructure, beware the dragons ya fools entering 922 /* Old dri1 support infrastructure, beware the dragons ya fools entering
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index acf768d0a5d1..3f75cfaf1c3f 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -3917,6 +3917,7 @@
3917#define FDI_FS_ERRC_ENABLE (1<<27) 3917#define FDI_FS_ERRC_ENABLE (1<<27)
3918#define FDI_FE_ERRC_ENABLE (1<<26) 3918#define FDI_FE_ERRC_ENABLE (1<<26)
3919#define FDI_DP_PORT_WIDTH_X8 (7<<19) 3919#define FDI_DP_PORT_WIDTH_X8 (7<<19)
3920#define FDI_RX_POLARITY_REVERSED_LPT (1<<16)
3920#define FDI_8BPC (0<<16) 3921#define FDI_8BPC (0<<16)
3921#define FDI_10BPC (1<<16) 3922#define FDI_10BPC (1<<16)
3922#define FDI_6BPC (2<<16) 3923#define FDI_6BPC (2<<16)
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index 3084d018c740..fe20bf7e8d24 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -798,4 +798,12 @@ void intel_crt_init(struct drm_device *dev)
798 crt->force_hotplug_required = 0; 798 crt->force_hotplug_required = 0;
799 799
800 dev_priv->hotplug_supported_mask |= CRT_HOTPLUG_INT_STATUS; 800 dev_priv->hotplug_supported_mask |= CRT_HOTPLUG_INT_STATUS;
801
802 /*
803 * TODO: find a proper way to discover whether we need to set the
804 * polarity reversal bit or not, instead of relying on the BIOS.
805 */
806 if (HAS_PCH_LPT(dev))
807 dev_priv->fdi_rx_polarity_reversed =
808 !!(I915_READ(_FDI_RXA_CTL) & FDI_RX_POLARITY_REVERSED_LPT);
801} 809}
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 3264cb4564b0..4bad0f724019 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -180,6 +180,8 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
180 /* Enable the PCH Receiver FDI PLL */ 180 /* Enable the PCH Receiver FDI PLL */
181 rx_ctl_val = FDI_RX_PLL_ENABLE | FDI_RX_ENHANCE_FRAME_ENABLE | 181 rx_ctl_val = FDI_RX_PLL_ENABLE | FDI_RX_ENHANCE_FRAME_ENABLE |
182 ((intel_crtc->fdi_lanes - 1) << 19); 182 ((intel_crtc->fdi_lanes - 1) << 19);
183 if (dev_priv->fdi_rx_polarity_reversed)
184 rx_ctl_val |= FDI_RX_POLARITY_REVERSED_LPT;
183 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val); 185 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
184 POSTING_READ(_FDI_RXA_CTL); 186 POSTING_READ(_FDI_RXA_CTL);
185 udelay(220); 187 udelay(220);