]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
UBUNTU: SAUCE: drm/i915: Disable writing of TMDS_OE on Lenovo ThinkPad X1 series
authorAaron Ma <aaron.ma@canonical.com>
Sat, 16 Dec 2017 09:00:55 +0000 (17:00 +0800)
committerSeth Forshee <seth.forshee@canonical.com>
Mon, 29 Jan 2018 13:45:08 +0000 (07:45 -0600)
BugLink: https://bugs.launchpad.net/bugs/1738523
There is a hw design on Lenovo ThinkPad X1 yoga/carbon:
Intel GEN9 display -> AlpineRidge -> PS8407 -> HDMI output

When switch mode on this HDMI output, it failed to writing on
I2C device 0x40/0x50. Then sometimes the HDMI output is disabled.

From Parade's support, tmds_oe is enabled by default, and keep it
enabled to fix this issue.

Add a workaround to bypass this TMDS_OE writing on identified
laptop models.

Signed-off-by: Aaron Ma <aaron.ma@canonical.com>
Acked-By: Wen-chien Jesse Sung <jesse.sung@canonical.com>
Acked-By: AceLan Kao <acelan.kao@canonical.com>
[ saf: Fix trivial conflict with 4.15 ]
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
Conflicts:
drivers/gpu/drm/i915/intel_bios.c

drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/intel_bios.c
drivers/gpu/drm/i915/intel_hdmi.c

index e143004e66d59396796b16b36ffdcec122629058..3eb899bbb7aa0bf017dcc8b6d11b4d3115a0f46b 100644 (file)
@@ -2745,6 +2745,9 @@ struct drm_i915_private {
 
        bool ipc_enabled;
 
+       /* Hack to bypass TMDS_OE write on DP->HDMI dongle */
+       bool bypass_tmds_oe;
+
        /* Used to save the pipe-to-encoder mapping for audio */
        struct intel_encoder *av_enc_map[I915_MAX_PIPES];
 
index fd23023df7c1ea045c0ebf14c1092192ef2ab3d3..1fa3ebbf2dced5364328e4363c924b0f1d902e43 100644 (file)
@@ -29,6 +29,7 @@
 #include <drm/drmP.h>
 #include <drm/i915_drm.h>
 #include "i915_drv.h"
+#include <linux/dmi.h>
 
 #define _INTEL_BIOS_PRIVATE
 #include "intel_vbt_defs.h"
@@ -1488,6 +1489,22 @@ static const struct vbt_header *find_vbt(void __iomem *bios, size_t size)
        return NULL;
 }
 
+#define DRM_DMI_PRODUCT_VERSION 0x6
+
+static void parse_product_info(struct drm_i915_private *dev_priv)
+{
+       const char *product_ver = dmi_get_system_info(DRM_DMI_PRODUCT_VERSION);
+       if (!product_ver)
+               return;
+
+       if (!strncmp(product_ver, "ThinkPad X1", 11)) {
+               DRM_DEBUG_KMS("dmi: %s, Bypassing TMDS_OE write\n", product_ver);
+               dev_priv->bypass_tmds_oe = true;
+       }
+
+       return;
+}
+
 /**
  * intel_bios_init - find VBT and initialize settings from the BIOS
  * @dev_priv: i915 device instance
@@ -1546,6 +1563,8 @@ void intel_bios_init(struct drm_i915_private *dev_priv)
        parse_sdvo_device_mapping(dev_priv, bdb->version);
        parse_ddi_ports(dev_priv, bdb->version);
 
+       parse_product_info(dev_priv);
+
 out:
        if (!vbt) {
                DRM_INFO("Failed to find VBIOS tables (VBT)\n");
index 4dea833f9d1b78c17239eeade593a72c88fbc166..6badabbd01bccc6869835b574b60438d06d0b68d 100644 (file)
@@ -867,6 +867,11 @@ void intel_dp_dual_mode_set_tmds_output(struct intel_hdmi *hdmi, bool enable)
        if (hdmi->dp_dual_mode.type < DRM_DP_DUAL_MODE_TYPE2_DVI)
                return;
 
+       if (dev_priv->bypass_tmds_oe) {
+               DRM_DEBUG_KMS("Bypassing TMDS_OE setting\n");
+               return;
+       }
+
        DRM_DEBUG_KMS("%s DP dual mode adaptor TMDS output\n",
                      enable ? "Enabling" : "Disabling");