[Intel-gfx] [PATCH for v4.2] Revert "drm/i915: Allow parsing of variable size child device entries from VBT"

Ville Syrjälä ville.syrjala at linux.intel.com
Tue Aug 18 04:15:47 PDT 2015


On Tue, Aug 18, 2015 at 12:33:36PM +0300, Jani Nikula wrote:
> This reverts
> 
> commit 047fe6e6db9161e69271f56daaafdaf2add023b1
> Author: David Weinehall <david.weinehall at linux.intel.com>
> Date:   Tue Aug 4 16:55:52 2015 +0300
> 
>     drm/i915: Allow parsing of variable size child device entries from VBT
> 
> That commit is not valid for v4.2, however it will be valid for v4.3. It
> was simply queued too early.
> 
> The referenced regressing commit is just fine until the size of struct
> common_child_dev_config changes, and that won't happen until
> v4.3. Indeed, the expected size checks here rely on the increased size
> of the struct, breaking new platforms.
> 
> Fixes: 047fe6e6db91 ("drm/i915: Allow parsing of variable size child device entries from VBT")
> Cc: Daniel Vetter <daniel at ffwll.ch>
> Cc: David Weinehall <david.weinehall at linux.intel.com>
> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>

Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

> 
> ---
> 
> There was another patch from David increasing the size of the struct
> [1], but that then regresses sdvo mapping parsing. It's the simplest to
> just revert and fix this up properly for v4.3.
> 
> [1] http://mid.gmane.org/20150813131415.GO6150@boom
> ---
>  drivers/gpu/drm/i915/intel_bios.c | 27 ++++-----------------------
>  1 file changed, 4 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
> index 3dcd59e694db..198fc3c3291b 100644
> --- a/drivers/gpu/drm/i915/intel_bios.c
> +++ b/drivers/gpu/drm/i915/intel_bios.c
> @@ -1075,34 +1075,15 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
>  	const union child_device_config *p_child;
>  	union child_device_config *child_dev_ptr;
>  	int i, child_device_num, count;
> -	u8 expected_size;
> -	u16 block_size;
> +	u16	block_size;
>  
>  	p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS);
>  	if (!p_defs) {
>  		DRM_DEBUG_KMS("No general definition block is found, no devices defined.\n");
>  		return;
>  	}
> -	if (bdb->version < 195) {
> -		expected_size = 33;
> -	} else if (bdb->version == 195) {
> -		expected_size = 37;
> -	} else if (bdb->version <= 197) {
> -		expected_size = 38;
> -	} else {
> -		expected_size = 38;
> -		DRM_DEBUG_DRIVER("Expected child_device_config size for BDB version %u not known; assuming %u\n",
> -				 expected_size, bdb->version);
> -	}
> -
> -	if (expected_size > sizeof(*p_child)) {
> -		DRM_ERROR("child_device_config cannot fit in p_child\n");
> -		return;
> -	}
> -
> -	if (p_defs->child_dev_size != expected_size) {
> -		DRM_ERROR("Size mismatch; child_device_config size=%u (expected %u); bdb->version: %u\n",
> -			  p_defs->child_dev_size, expected_size, bdb->version);
> +	if (p_defs->child_dev_size < sizeof(*p_child)) {
> +		DRM_ERROR("General definiton block child device size is too small.\n");
>  		return;
>  	}
>  	/* get the block size of general definitions */
> @@ -1149,7 +1130,7 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
>  
>  		child_dev_ptr = dev_priv->vbt.child_dev + count;
>  		count++;
> -		memcpy(child_dev_ptr, p_child, p_defs->child_dev_size);
> +		memcpy(child_dev_ptr, p_child, sizeof(*p_child));
>  	}
>  	return;
>  }
> -- 
> 2.1.4

-- 
Ville Syrjälä
Intel OTC


More information about the Intel-gfx mailing list