| From 7733fc633060f49699fe1317211f8846dd195994 Mon Sep 17 00:00:00 2001 |
| From: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Date: Thu, 12 Sep 2013 17:07:55 -0300 |
| Subject: drm/i915: check the DDC and AUX bits of the VBT on DDI machines |
| |
| Our code currently assumes that port X will use the DP AUX channel X |
| and the DDC pin X. The VBT should tell us how things are mapped, so |
| add some WARNs in case we discover our assumptions are wrong (or in |
| case the VBT is just wrong, which is also perfectly possible). |
| |
| Why would someone wire port B to AUX C and DDC D? |
| |
| v2: Rebase |
| v3: Convert WARNs to DRM_DEBUG_KMS |
| |
| Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com> (v1) |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 6bf19e7c548d465efa719838754ec3b63ef078d4) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/intel_bios.c | 27 +++++++++++++++++++++++++++ |
| 1 file changed, 27 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c |
| index 2f434297246e..12e4fd18076d 100644 |
| --- a/drivers/gpu/drm/i915/intel_bios.c |
| +++ b/drivers/gpu/drm/i915/intel_bios.c |
| @@ -590,6 +590,8 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, |
| struct ddi_vbt_port_info *info = &dev_priv->vbt.ddi_port_info[port]; |
| uint8_t hdmi_level_shift; |
| int i, j; |
| + bool is_dvi, is_dp; |
| + uint8_t aux_channel; |
| /* Each DDI port can have more than one value on the "DVO Port" field, |
| * so look for all the possible values for each port and abort if more |
| * than one is found. */ |
| @@ -622,6 +624,31 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, |
| if (!child) |
| return; |
| |
| + aux_channel = child->raw[25]; |
| + |
| + is_dvi = child->common.device_type & (1 << 4); |
| + is_dp = child->common.device_type & (1 << 2); |
| + |
| + if (is_dvi) { |
| + if (child->common.ddc_pin == 0x05 && port != PORT_B) |
| + DRM_DEBUG_KMS("Unexpected DDC pin for port B\n"); |
| + if (child->common.ddc_pin == 0x04 && port != PORT_C) |
| + DRM_DEBUG_KMS("Unexpected DDC pin for port C\n"); |
| + if (child->common.ddc_pin == 0x06 && port != PORT_D) |
| + DRM_DEBUG_KMS("Unexpected DDC pin for port D\n"); |
| + } |
| + |
| + if (is_dp) { |
| + if (aux_channel == 0x40 && port != PORT_A) |
| + DRM_DEBUG_KMS("Unexpected AUX channel for port A\n"); |
| + if (aux_channel == 0x10 && port != PORT_B) |
| + DRM_DEBUG_KMS("Unexpected AUX channel for port B\n"); |
| + if (aux_channel == 0x20 && port != PORT_C) |
| + DRM_DEBUG_KMS("Unexpected AUX channel for port C\n"); |
| + if (aux_channel == 0x30 && port != PORT_D) |
| + DRM_DEBUG_KMS("Unexpected AUX channel for port D\n"); |
| + } |
| + |
| if (bdb->version >= 158) { |
| /* The VBT HDMI level shift values match the table we have. */ |
| hdmi_level_shift = child->raw[7] & 0xF; |
| -- |
| 1.8.5.rc3 |
| |