On Mon, 14 Dec 2015, ville.syrj...@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrj...@linux.intel.com>
>
> My 85x has VBT version 108 which has a child dev size of 27 bytes.
> Let's allow that without printing an error.
>
> We still want to reject the actual parsin since for that we need
> the child device size to be at least 33 bytes. So we should still
> check for that, but let's make it print a debug message only instead
> of an error.
>
> While at it, toss in a BUILD_BUG_ON() to verify our struct
> old_child_dev_config is in fact 33 bytes.
>
> Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>

This is scary stuff, but

Reviewed-by: Jani Nikula <jani.nik...@intel.com>

as far as the code goes. I don't have the history books to check this
against.

> ---
>  drivers/gpu/drm/i915/intel_bios.c | 19 +++++++++++--------
>  1 file changed, 11 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_bios.c 
> b/drivers/gpu/drm/i915/intel_bios.c
> index 070470fe9a91..770b825dabc0 100644
> --- a/drivers/gpu/drm/i915/intel_bios.c
> +++ b/drivers/gpu/drm/i915/intel_bios.c
> @@ -1089,7 +1089,10 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
>               DRM_DEBUG_KMS("No general definition block is found, no devices 
> defined.\n");
>               return;
>       }
> -     if (bdb->version < 195) {
> +     if (bdb->version < 109) {
> +             expected_size = 27;
> +     } else if (bdb->version < 195) {
> +             BUILD_BUG_ON(sizeof(struct old_child_dev_config) != 33);
>               expected_size = sizeof(struct old_child_dev_config);
>       } else if (bdb->version == 195) {
>               expected_size = 37;
> @@ -1102,18 +1105,18 @@ parse_device_mapping(struct drm_i915_private 
> *dev_priv,
>                                bdb->version, expected_size);
>       }
>  
> -     /* The legacy sized child device config is the minimum we need. */
> -     if (p_defs->child_dev_size < sizeof(struct old_child_dev_config)) {
> -             DRM_ERROR("Child device config size %u is too small.\n",
> -                       p_defs->child_dev_size);
> -             return;
> -     }
> -
>       /* Flag an error for unexpected size, but continue anyway. */
>       if (p_defs->child_dev_size != expected_size)
>               DRM_ERROR("Unexpected child device config size %u (expected %u 
> for VBT version %u)\n",
>                         p_defs->child_dev_size, expected_size, bdb->version);
>  
> +     /* The legacy sized child device config is the minimum we need. */
> +     if (p_defs->child_dev_size < sizeof(struct old_child_dev_config)) {
> +             DRM_DEBUG_KMS("Child device config size %u is too small.\n",
> +                           p_defs->child_dev_size);
> +             return;
> +     }
> +
>       /* get the block size of general definitions */
>       block_size = get_blocksize(p_defs);
>       /* get the number of child device */

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to