[Intel-gfx] [PATCH 2/3] drm/i915: add some assertions about VBT DDI port types
Rodrigo Vivi
rodrigo.vivi at gmail.com
Tue Sep 3 17:03:21 CEST 2013
Reviewed-by: Rodrigo Vivi <rodrigo.vivi at gmail.com>
On Wed, Aug 28, 2013 at 12:45 PM, Paulo Zanoni <przanoni at gmail.com> wrote:
> From: Paulo Zanoni <paulo.r.zanoni at intel.com>
>
> 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.
>
> Signed-off-by: Paulo Zanoni <paulo.r.zanoni at intel.com>
> ---
> drivers/gpu/drm/i915/intel_bios.c | 20 +++++++++++++++++++-
> 1 file changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
> index a6700ab..4003dbf 100644
> --- a/drivers/gpu/drm/i915/intel_bios.c
> +++ b/drivers/gpu/drm/i915/intel_bios.c
> @@ -575,7 +575,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;
> int dvo_ports[][2] = {
> {0, 10}, {1, 7}, {2, 8}, {3, 9}, {6, /* Unused */ 0},
> @@ -604,6 +604,24 @@ 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);
> +
> + WARN(is_edp && is_dvi, "Internal DP port %c is TMDS compatible\n",
> + port_name(port));
> + WARN(is_crt && port != PORT_E, "Port %c is analog\n", port_name(port));
> + WARN(is_crt && (is_dvi || is_dp),
> + "Analog port %c is also DP or TMDS compatible\n", port_name(port));
> + WARN(is_dvi && (port == PORT_A || port == PORT_E),
> + "Port %c is TMDS compabile\n", port_name(port));
> + WARN(!is_dvi && !is_dp && !is_crt,
> + "Port %c is not DP/TMDS/CRT compatible\n", port_name(port));
> + WARN(is_edp && (port == PORT_B || port == PORT_C || port == PORT_E),
> + "Port %c is internal DP\n", port_name(port));
>
> if (is_dvi) {
> WARN(child->common.ddc_pin == 0x05 && port != PORT_B,
> --
> 1.8.1.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
More information about the Intel-gfx
mailing list