Re: [PATCH 2/3] drm/i915: add some assertions about VBT DDI port types

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Reviewed-by: Rodrigo Vivi <rodrigo.vivi@xxxxxxxxx>

On Wed, Aug 28, 2013 at 12:45 PM, Paulo Zanoni <przanoni@xxxxxxxxx> wrote:
> From: Paulo Zanoni <paulo.r.zanoni@xxxxxxxxx>
>
> 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@xxxxxxxxx>
> ---
>  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@xxxxxxxxxxxxxxxxxxxxx
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux