Commit 862b89c0 authored by Adam Jackson's avatar Adam Jackson Committed by Dave Airlie
Browse files

drm/edid: Fix up partially corrupted headers

We'll still fail the block if it fails the EDID checksum though.

See also: http://bugzilla.redhat.com/534120



Signed-off-by: default avatarAdam Jackson <ajax@redhat.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 47ee4ccf
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -123,16 +123,21 @@ static const u8 edid_header[] = {
 */
static bool edid_is_valid(struct edid *edid)
{
	int i;
	int i, score = 0;
	u8 csum = 0;
	u8 *raw_edid = (u8 *)edid;

	if (memcmp(edid->header, edid_header, sizeof(edid_header)))
		goto bad;
	if (edid->version != 1) {
		DRM_ERROR("EDID has major version %d, instead of 1\n", edid->version);
	for (i = 0; i < sizeof(edid_header); i++)
		if (raw_edid[i] == edid_header[i])
			score++;

	if (score == 8) ;
	else if (score >= 6) {
		DRM_DEBUG("Fixing EDID header, your hardware may be failing\n");
		memcpy(raw_edid, edid_header, sizeof(edid_header));
	} else
		goto bad;
	}

	for (i = 0; i < EDID_LENGTH; i++)
		csum += raw_edid[i];
	if (csum) {
@@ -140,6 +145,11 @@ static bool edid_is_valid(struct edid *edid)
		goto bad;
	}

	if (edid->version != 1) {
		DRM_ERROR("EDID has major version %d, instead of 1\n", edid->version);
		goto bad;
	}

	if (edid->revision > 4)
		DRM_DEBUG("EDID minor > 4, assuming backward compatibility\n");