| From 92adb69511d679c79dfc5fc88b61fc5a04bed3b7 Mon Sep 17 00:00:00 2001 |
| From: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Date: Thu, 12 Sep 2013 17:10:11 -0300 |
| Subject: drm/i915: add some assertions about VBT DDI port types |
| |
| Our code makes a lot of assumptions regarding what each DDI port |
| actually supports, and the VBT should tell us what is really happening |
| in the hardware. So parse the information provided by the VBT and |
| check if any of our assumptions is wrong. |
| |
| Our driver also has a history of not really trusting the VBT, so a |
| WARN here could mean that: |
| a) our coding assumptions are wrong |
| b) the VBT is wrong |
| c) we're incorrectly parsing the VBT |
| d) the checks are wrong |
| |
| But I really hope we won't ever trigger any of those WARNs. |
| |
| v2: Don't check the redundant "Capabilities" field from byte 24 since |
| it doesn't seem to be used. |
| v3: Rebase |
| v4: Replace WARN with DRM_DEBUG_KMS |
| |
| Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com> (v2) |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 554d6af50a40125c28e4e1035527a684d2607266) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/intel_bios.c | 24 +++++++++++++++++++++++- |
| 1 file changed, 23 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c |
| index 12e4fd18076d..7ce1c3c2f0f1 100644 |
| --- a/drivers/gpu/drm/i915/intel_bios.c |
| +++ b/drivers/gpu/drm/i915/intel_bios.c |
| @@ -590,7 +590,7 @@ 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; |
| + bool is_dvi, is_hdmi, is_dp, is_edp, is_crt; |
| 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 |
| @@ -628,6 +628,28 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, |
| |
| is_dvi = child->common.device_type & (1 << 4); |
| is_dp = child->common.device_type & (1 << 2); |
| + is_crt = child->common.device_type & (1 << 0); |
| + is_hdmi = is_dvi && (child->common.device_type & (1 << 11)) == 0; |
| + is_edp = is_dp && (child->common.device_type & (1 << 12)); |
| + |
| + DRM_DEBUG_KMS("Port %c VBT info: DP:%d HDMI:%d DVI:%d EDP:%d CRT:%d\n", |
| + port_name(port), is_dp, is_hdmi, is_dvi, is_edp, is_crt); |
| + |
| + if (is_edp && is_dvi) |
| + DRM_DEBUG_KMS("Internal DP port %c is TMDS compatible\n", |
| + port_name(port)); |
| + if (is_crt && port != PORT_E) |
| + DRM_DEBUG_KMS("Port %c is analog\n", port_name(port)); |
| + if (is_crt && (is_dvi || is_dp)) |
| + DRM_DEBUG_KMS("Analog port %c is also DP or TMDS compatible\n", |
| + port_name(port)); |
| + if (is_dvi && (port == PORT_A || port == PORT_E)) |
| + DRM_DEBUG_KMS("Port %c is TMDS compabile\n", port_name(port)); |
| + if (!is_dvi && !is_dp && !is_crt) |
| + DRM_DEBUG_KMS("Port %c is not DP/TMDS/CRT compatible\n", |
| + port_name(port)); |
| + if (is_edp && (port == PORT_B || port == PORT_C || port == PORT_E)) |
| + DRM_DEBUG_KMS("Port %c is internal DP\n", port_name(port)); |
| |
| if (is_dvi) { |
| if (child->common.ddc_pin == 0x05 && port != PORT_B) |
| -- |
| 1.8.5.rc3 |
| |