Re: Bug#622993: every 10s I get "[drm:drm_edid_block_valid] *ERROR* EDID checksum is invalid ..."

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



(Sorry if I'm spawning a very old thread here).

After all this time I have been patching my kernels to workaround [0][1]

[0] <https://bugs.debian.org/cgi-bin/bugreport.cgi?bugb4549>
[1] <https://bugs.freedesktop.org/show_bug.cgi?id7040>

Some time ago I found [2] and today I finally solved the problem.

[2] <http://www.blaicher.com/2012/06/howto-fixing-a-broken-edid-eeprom-with-a-bus-pirate-v4/>

Some stuff I learned: the kernel does ignores checksums mismatches by 8... in
the positive side! My mismatch was exactly -1, ie, 255.

I have been modifying the original patch to workaround this since 2011. I'm
attaching my last patch in case someone else needs it. It does adds a kernel
parameter to ignore edid mismatches.

Kinds regards, Lisandro.


--
Theory and practice sometimes clash. And when that happens, theory loses.
Every single time.
  Linus Benedict Torvalds.

Lisandro Damián Nicanor Pérez Meyer
http://perezmeyer.com.ar/
http://perezmeyer.blogspot.com/
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 830f750..773c5d0 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1018,6 +1018,9 @@ bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid)
 		}
 	}

+	if (!drm_edid_strict)
+        return 1;
+
 	for (i = 0; i < EDID_LENGTH; i++)
 		csum += raw_edid[i];
 	if (csum) {
@@ -2021,7 +2024,7 @@ do_inferred_modes(struct detailed_timing *timing, void *c)
 	closure->modes += drm_dmt_modes_for_range(closure->connector,
 						  closure->edid,
 						  timing);
-
+
 	if (!version_greater(closure->edid, 1, 1))
 		return; /* GTF not defined yet */

@@ -2258,7 +2261,7 @@ do_cvt_mode(struct detailed_timing *timing, void *c)

 static int
 add_cvt_modes(struct drm_connector *connector, struct edid *edid)
-{
+{
 	struct detailed_mode_closure closure = {
 		connector, edid, 0, 0, 0
 	};
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
index 39d8645..487a6ef 100644
--- a/drivers/gpu/drm/drm_stub.c
+++ b/drivers/gpu/drm/drm_stub.c
@@ -49,6 +49,9 @@ EXPORT_SYMBOL(drm_vblank_offdelay);
 unsigned int drm_timestamp_precision = 20;  /* Default to 20 usecs. */
 EXPORT_SYMBOL(drm_timestamp_precision);

+int drm_edid_strict = 1;   /* 0 to disable strict edid conformance */
+EXPORT_SYMBOL(drm_edid_strict);
+
 /*
  * Default to use monotonic timestamps for wait-for-vblank and page-flip
  * complete events.
@@ -63,12 +66,14 @@ MODULE_PARM_DESC(rnodes, "Enable experimental render nodes API");
 MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs]");
 MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]");
 MODULE_PARM_DESC(timestamp_monotonic, "Use monotonic timestamps");
+MODULE_PARM_DESC(edid_strict, "Strict EDID checks (0 = disable)");

 module_param_named(debug, drm_debug, int, 0600);
 module_param_named(rnodes, drm_rnodes, int, 0600);
 module_param_named(vblankoffdelay, drm_vblank_offdelay, int, 0600);
 module_param_named(timestamp_precision_usec, drm_timestamp_precision, int, 0600);
 module_param_named(timestamp_monotonic, drm_timestamp_monotonic, int, 0600);
+module_param_named(edid_strict, drm_edid_strict, int, 0600);

 struct idr drm_minors_idr;

diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index b46fb45..b86d239 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1462,6 +1462,7 @@ extern unsigned int drm_rnodes;
 extern unsigned int drm_vblank_offdelay;
 extern unsigned int drm_timestamp_precision;
 extern unsigned int drm_timestamp_monotonic;
+extern int drm_edid_strict;

 extern struct class *drm_class;
 extern struct dentry *drm_debugfs_root;

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/dri-devel

[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux