--- linux-4.14.33.orig/drivers/gpu/drm/i915/intel_bios.c 2017-11-12 19:46:13.000000000 +0100 +++ linux-4.14.33/drivers/gpu/drm/i915/intel_bios.c 2018-04-11 15:08:21.073058586 +0200 @@ -1110,6 +1110,28 @@ } } +static const u8 cnp_ddc_pin_map[] = { + [0] = 0, /* N/A */ + [DDC_BUS_DDI_B] = GMBUS_PIN_1_BXT, + [DDC_BUS_DDI_C] = GMBUS_PIN_2_BXT, + [DDC_BUS_DDI_D] = GMBUS_PIN_4_CNP, /* sic */ + [DDC_BUS_DDI_F] = GMBUS_PIN_3_BXT, /* sic */ +}; + +static u8 map_ddc_pin(struct drm_i915_private *dev_priv, u8 vbt_pin) +{ + if (HAS_PCH_CNP(dev_priv)) { + if (vbt_pin < ARRAY_SIZE(cnp_ddc_pin_map)) { + return cnp_ddc_pin_map[vbt_pin]; + } else { + DRM_DEBUG_KMS("Ignoring alternate pin: VBT claims DDC pin %d, which is not valid for this platform\n", vbt_pin); + return 0; + } + } + + return vbt_pin; +} + static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, const struct bdb_header *bdb) { @@ -1155,7 +1177,6 @@ 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; @@ -1195,18 +1216,15 @@ DRM_DEBUG_KMS("Port %c is internal DP\n", port_name(port)); if (is_dvi) { - info->alternate_ddc_pin = ddc_pin; - - /* - * All VBTs that we got so far for B Stepping has this - * information wrong for Port D. So, let's just ignore for now. - */ - if (IS_CNL_REVID(dev_priv, CNL_REVID_B0, CNL_REVID_B0) && - port == PORT_D) { - info->alternate_ddc_pin = 0; + ddc_pin = map_ddc_pin(dev_priv, 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, " + "reverting to defaults\n", + port_name(port), ddc_pin); } - - sanitize_ddc_pin(dev_priv, port); } if (is_dp) { --- linux-4.14.33.orig/drivers/gpu/drm/i915/intel_vbt_defs.h 2017-11-12 19:46:13.000000000 +0100 +++ linux-4.14.33/drivers/gpu/drm/i915/intel_vbt_defs.h 2018-04-11 15:18:03.342920432 +0200 @@ -230,6 +230,14 @@ #define DEVICE_PORT_DVOB 0x01 #define DEVICE_PORT_DVOC 0x02 +/* DDC Bus DDI Type 155+ */ +enum vbt_gmbus_ddi { + DDC_BUS_DDI_B = 0x1, + DDC_BUS_DDI_C, + DDC_BUS_DDI_D, + DDC_BUS_DDI_F, +}; + /* * We used to keep this struct but without any version control. We should avoid * using it in the future, but it should be safe to keep using it in the old