171d7cf
diff -up linux-2.6.35.x86_64/drivers/gpu/drm/drm_edid.c.da linux-2.6.35.x86_64/drivers/gpu/drm/drm_edid.c
171d7cf
--- linux-2.6.35.x86_64/drivers/gpu/drm/drm_edid.c.da	2010-08-01 18:11:14.000000000 -0400
171d7cf
+++ linux-2.6.35.x86_64/drivers/gpu/drm/drm_edid.c	2010-11-11 20:46:10.000000000 -0500
171d7cf
@@ -229,7 +229,7 @@ drm_do_probe_ddc_edid(struct i2c_adapter
171d7cf
 			.addr	= DDC_ADDR,
171d7cf
 			.flags	= I2C_M_RD,
171d7cf
 			.len	= len,
171d7cf
-			.buf	= buf + start,
171d7cf
+			.buf	= buf,
171d7cf
 		}
171d7cf
 	};
171d7cf
 
171d7cf
@@ -242,7 +242,7 @@ drm_do_probe_ddc_edid(struct i2c_adapter
171d7cf
 static u8 *
171d7cf
 drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
171d7cf
 {
171d7cf
-	int i, j = 0;
171d7cf
+	int i, j = 0, valid_extensions = 0;
171d7cf
 	u8 *block, *new;
171d7cf
 
171d7cf
 	if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL)
171d7cf
@@ -269,14 +269,28 @@ drm_do_get_edid(struct drm_connector *co
171d7cf
 
171d7cf
 	for (j = 1; j <= block[0x7e]; j++) {
171d7cf
 		for (i = 0; i < 4; i++) {
171d7cf
-			if (drm_do_probe_ddc_edid(adapter, block, j,
171d7cf
-						  EDID_LENGTH))
171d7cf
+			if (drm_do_probe_ddc_edid(adapter,
171d7cf
+				  block + (valid_extensions + 1) * EDID_LENGTH,
171d7cf
+				  j, EDID_LENGTH))
171d7cf
 				goto out;
171d7cf
-			if (drm_edid_block_valid(block + j * EDID_LENGTH))
171d7cf
+			if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH)) {
171d7cf
+				valid_extensions++;
171d7cf
 				break;
171d7cf
+			}
171d7cf
 		}
171d7cf
 		if (i == 4)
171d7cf
-			goto carp;
d5b83e3
+			printk(KERN_WARNING
171d7cf
+			 "%s: Ignoring invalid EDID block %d.\n",
171d7cf
+			 drm_get_connector_name(connector), j);
171d7cf
+	}
171d7cf
+
171d7cf
+	if (valid_extensions != block[0x7e]) {
171d7cf
+		block[EDID_LENGTH-1] += block[0x7e] - valid_extensions;
171d7cf
+		block[0x7e] = valid_extensions;
171d7cf
+		new = krealloc(block, (valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL);
171d7cf
+		if (!new)
171d7cf
+			goto out;
171d7cf
+		block = new;
171d7cf
 	}
171d7cf
 
171d7cf
 	return block;