]> git.karo-electronics.de Git - linux-beck.git/commitdiff
drm/i915: set the LPT FDI RX polarity reversal bit when needed
authorPaulo Zanoni <paulo.r.zanoni@intel.com>
Sat, 1 Dec 2012 14:04:26 +0000 (12:04 -0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 10 Dec 2012 10:14:29 +0000 (11:14 +0100)
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>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_crt.c
drivers/gpu/drm/i915/intel_ddi.c

index 65213bc2f3c615789d90483e9fdc8d659d098f91..557843dd4b2eeedcf1225999b40917a7011fb20a 100644 (file)
@@ -915,6 +915,8 @@ typedef struct drm_i915_private {
        bool hw_contexts_disabled;
        uint32_t hw_context_size;
 
+       bool fdi_rx_polarity_reversed;
+
        struct i915_suspend_saved_registers regfile;
 
        /* Old dri1 support infrastructure, beware the dragons ya fools entering
index acf768d0a5d12382df1f549dce9863439b0e2806..3f75cfaf1c3f2df48e9955e95445fb8b4ab78f62 100644 (file)
 #define  FDI_FS_ERRC_ENABLE            (1<<27)
 #define  FDI_FE_ERRC_ENABLE            (1<<26)
 #define  FDI_DP_PORT_WIDTH_X8           (7<<19)
+#define  FDI_RX_POLARITY_REVERSED_LPT  (1<<16)
 #define  FDI_8BPC                       (0<<16)
 #define  FDI_10BPC                      (1<<16)
 #define  FDI_6BPC                       (2<<16)
index 3084d018c740e14594564c0022ef5c7671a51bf9..fe20bf7e8d24fc1f2dcc361527ffc35fb1820794 100644 (file)
@@ -798,4 +798,12 @@ void intel_crt_init(struct drm_device *dev)
        crt->force_hotplug_required = 0;
 
        dev_priv->hotplug_supported_mask |= CRT_HOTPLUG_INT_STATUS;
+
+       /*
+        * TODO: find a proper way to discover whether we need to set the
+        * polarity reversal bit or not, instead of relying on the BIOS.
+        */
+       if (HAS_PCH_LPT(dev))
+               dev_priv->fdi_rx_polarity_reversed =
+                    !!(I915_READ(_FDI_RXA_CTL) & FDI_RX_POLARITY_REVERSED_LPT);
 }
index 3264cb4564b00aac5653fe4d5d7b94a6f5e175f8..4bad0f724019561c1895517d81adf1067ef617b7 100644 (file)
@@ -180,6 +180,8 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
        /* Enable the PCH Receiver FDI PLL */
        rx_ctl_val = FDI_RX_PLL_ENABLE | FDI_RX_ENHANCE_FRAME_ENABLE |
                     ((intel_crtc->fdi_lanes - 1) << 19);
+       if (dev_priv->fdi_rx_polarity_reversed)
+               rx_ctl_val |= FDI_RX_POLARITY_REVERSED_LPT;
        I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
        POSTING_READ(_FDI_RXA_CTL);
        udelay(220);