#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"
return;
aux_channel = child->common.aux_channel;
- ddc_pin = child->common.ddc_pin;
is_dvi = child->common.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING;
is_dp = child->common.device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT;
is_hdmi = is_dvi && (child->common.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0;
is_edp = is_dp && (child->common.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR);
+ if (port == PORT_A && is_dvi) {
+ DRM_DEBUG_KMS("VBT claims port A supports DVI%s, ignoring\n",
+ is_hdmi ? "/HDMI" : "");
+ is_dvi = false;
+ is_hdmi = false;
+ }
+
info->supports_dvi = is_dvi;
info->supports_hdmi = is_hdmi;
info->supports_dp = is_dp;
DRM_DEBUG_KMS("Port %c is internal DP\n", port_name(port));
if (is_dvi) {
- info->alternate_ddc_pin = ddc_pin;
-
- sanitize_ddc_pin(dev_priv, port);
+ ddc_pin = child->common.ddc_pin;
+ if (intel_gmbus_is_valid_pin(dev_priv, ddc_pin)) {
+ info->alternate_ddc_pin = ddc_pin;
+ sanitize_ddc_pin(dev_priv, port);
+ } else {
+ DRM_DEBUG_KMS("Port %c has invalid DDC pin %d, "
+ "sticking to defaults\n",
+ port_name(port), ddc_pin);
+ }
}
if (is_dp) {
{
enum port port;
- if (!HAS_DDI(dev_priv))
+ if (!HAS_DDI(dev_priv) && !IS_CHERRYVIEW(dev_priv))
return;
if (!dev_priv->vbt.child_dev_num)
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
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) {