From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paulo Zanoni Subject: [PATCH 1/3] drm/i915: check the DDC and AUX bits of the VBT on DDI machines Date: Wed, 28 Aug 2013 12:45:05 -0300 Message-ID: <1377704707-3190-2-git-send-email-przanoni@gmail.com> References: <1377704707-3190-1-git-send-email-przanoni@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail-ye0-f171.google.com (mail-ye0-f171.google.com [209.85.213.171]) by gabe.freedesktop.org (Postfix) with ESMTP id 44E49E7B53 for ; Wed, 28 Aug 2013 08:45:22 -0700 (PDT) Received: by mail-ye0-f171.google.com with SMTP id m3so1640238yen.30 for ; Wed, 28 Aug 2013 08:45:21 -0700 (PDT) In-Reply-To: <1377704707-3190-1-git-send-email-przanoni@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org To: intel-gfx@lists.freedesktop.org Cc: Paulo Zanoni List-Id: intel-gfx@lists.freedesktop.org From: Paulo Zanoni 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? Signed-off-by: Paulo Zanoni --- 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 79bb651..a6700ab 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c @@ -575,6 +575,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; int dvo_ports[][2] = { {0, 10}, {1, 7}, {2, 8}, {3, 9}, {6, /* Unused */ 0}, }; @@ -598,6 +600,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) { + WARN(child->common.ddc_pin == 0x05 && port != PORT_B, + "Unexpected DDC pin for port B\n"); + WARN(child->common.ddc_pin == 0x04 && port != PORT_C, + "Unexpected DDC pin for port C\n"); + WARN(child->common.ddc_pin == 0x06 && port != PORT_D, + "Unexpected DDC pin for port D\n"); + } + + if (is_dp) { + WARN(aux_channel == 0x40 && port != PORT_A, + "Unexpected AUX channel for port A\n"); + WARN(aux_channel == 0x10 && port != PORT_B, + "Unexpected AUX channel for port B\n"); + WARN(aux_channel == 0x20 && port != PORT_C, + "Unexpected AUX channel for port C\n"); + WARN(aux_channel == 0x30 && port != PORT_D, + "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.1.2