[PATCH 1/1] UBUNTU: SAUCE: drm/i915: Disable writing of TMDS_OE on Lenovo ThinkPad X1 series
Aaron Ma
aaron.ma at canonical.com
Sat Dec 16 09:00:55 UTC 2017
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 at canonical.com>
---
drivers/gpu/drm/i915/i915_drv.h | 3 +++
drivers/gpu/drm/i915/intel_bios.c | 18 ++++++++++++++++++
drivers/gpu/drm/i915/intel_hdmi.c | 5 +++++
3 files changed, 26 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 0d3848b4f000..46bc91ad6719 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2576,6 +2576,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];
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index f814359c86c9..0be1d38feaec 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -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"
@@ -1481,6 +1482,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
@@ -1537,6 +1554,7 @@ void intel_bios_init(struct drm_i915_private *dev_priv)
parse_mipi_config(dev_priv, bdb);
parse_mipi_sequence(dev_priv, bdb);
parse_ddi_ports(dev_priv, bdb);
+ parse_product_info(dev_priv);
out:
if (!vbt) {
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index ec0779a52d53..01837b9f7d76 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -851,6 +851,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");
--
2.13.6
More information about the kernel-team
mailing list