diff options
Diffstat (limited to 'drivers/gpu/drm/drm_edid.c')
| -rw-r--r-- | drivers/gpu/drm/drm_edid.c | 15 | 
1 files changed, 12 insertions, 3 deletions
| diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 6325877c5fd6..ea9a79bc9583 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -1834,11 +1834,20 @@ static void connector_bad_edid(struct drm_connector *connector,  			       u8 *edid, int num_blocks)  {  	int i; -	u8 num_of_ext = edid[0x7e]; +	u8 last_block; + +	/* +	 * 0x7e in the EDID is the number of extension blocks. The EDID +	 * is 1 (base block) + num_ext_blocks big. That means we can think +	 * of 0x7e in the EDID of the _index_ of the last block in the +	 * combined chunk of memory. +	 */ +	last_block = edid[0x7e];  	/* Calculate real checksum for the last edid extension block data */ -	connector->real_edid_checksum = -		drm_edid_block_checksum(edid + num_of_ext * EDID_LENGTH); +	if (last_block < num_blocks) +		connector->real_edid_checksum = +			drm_edid_block_checksum(edid + last_block * EDID_LENGTH);  	if (connector->bad_edid_counter++ && !drm_debug_enabled(DRM_UT_KMS))  		return; | 
