dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/6] drm/edid: move drm_edid_is_zero to top, make edid argument const
       [not found] <1417373866-15440-1-git-send-email-stefan.bruens@rwth-aachen.de>
@ 2014-11-30 18:57 ` Stefan Brüns
  2014-11-30 18:57 ` [PATCH 2/6] drm/edid: shorten log output in case of all zeroes edid block Stefan Brüns
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Stefan Brüns @ 2014-11-30 18:57 UTC (permalink / raw)
  To: dri-devel; +Cc: stefan.bruens

drm_edid_is_zero will be used by drm_edid_block valid, move it up.
raw_edid argument can be const.

Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
---
 drivers/gpu/drm/drm_edid.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 1a77a49..0743d87 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1014,6 +1014,14 @@ module_param_named(edid_fixup, edid_fixup, int, 0400);
 MODULE_PARM_DESC(edid_fixup,
 		 "Minimum number of valid EDID header bytes (0-8, default 6)");
 
+static bool drm_edid_is_zero(const u8 *in_edid, int length)
+{
+	if (memchr_inv(in_edid, 0, length))
+		return false;
+
+	return true;
+}
+
 /**
  * drm_edid_block_valid - Sanity check the EDID block (base or extension)
  * @raw_edid: pointer to raw EDID block
@@ -1176,14 +1184,6 @@ drm_do_probe_ddc_edid(void *data, u8 *buf, unsigned int block, size_t len)
 	return ret == xfers ? 0 : -1;
 }
 
-static bool drm_edid_is_zero(u8 *in_edid, int length)
-{
-	if (memchr_inv(in_edid, 0, length))
-		return false;
-
-	return true;
-}
-
 /**
  * drm_do_get_edid - get EDID data using a custom EDID block read function
  * @connector: connector we're probing
-- 
2.1.2

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

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/6] drm/edid: shorten log output in case of all zeroes edid block
       [not found] <1417373866-15440-1-git-send-email-stefan.bruens@rwth-aachen.de>
  2014-11-30 18:57 ` [PATCH 1/6] drm/edid: move drm_edid_is_zero to top, make edid argument const Stefan Brüns
@ 2014-11-30 18:57 ` Stefan Brüns
  2014-11-30 18:57 ` [PATCH 3/6] drm/edid: new drm_edid_block_checksum helper function V3 Stefan Brüns
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Stefan Brüns @ 2014-11-30 18:57 UTC (permalink / raw)
  To: dri-devel; +Cc: stefan.bruens

There is no need to dump the whole EDID block in case it contains no
information. Just print a single line stating the block is empty instead
of 8 lines containing only zeroes.

Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 0743d87..162a943 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1088,9 +1088,13 @@ bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid)
 
 bad:
 	if (print_bad_edid) {
-		printk(KERN_ERR "Raw EDID:\n");
-		print_hex_dump(KERN_ERR, " \t", DUMP_PREFIX_NONE, 16, 1,
+		if (drm_edid_is_zero(raw_edid, EDID_LENGTH)) {
+			printk(KERN_ERR "EDID block is all zeroes\n");
+		} else {
+			printk(KERN_ERR "Raw EDID:\n");
+			print_hex_dump(KERN_ERR, " \t", DUMP_PREFIX_NONE, 16, 1,
 			       raw_edid, EDID_LENGTH, false);
+		}
 	}
 	return false;
 }
-- 
2.1.2

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

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/6] drm/edid: new drm_edid_block_checksum helper function V3
       [not found] <1417373866-15440-1-git-send-email-stefan.bruens@rwth-aachen.de>
  2014-11-30 18:57 ` [PATCH 1/6] drm/edid: move drm_edid_is_zero to top, make edid argument const Stefan Brüns
  2014-11-30 18:57 ` [PATCH 2/6] drm/edid: shorten log output in case of all zeroes edid block Stefan Brüns
@ 2014-11-30 18:57 ` Stefan Brüns
  2014-12-01 16:21   ` Daniel Vetter
  2014-11-30 18:57 ` [PATCH 4/6] drm/edid: calculate address of current extension block only once Stefan Brüns
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 7+ messages in thread
From: Stefan Brüns @ 2014-11-30 18:57 UTC (permalink / raw)
  To: dri-devel; +Cc: stefan.bruens

The function will also be used by a later patch, so factor it out.

V2: make raw_edid const, define/declare before first use
V3: fix erroneuos removal of csum variable

Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 162a943..1cbaf29 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1014,6 +1014,16 @@ module_param_named(edid_fixup, edid_fixup, int, 0400);
 MODULE_PARM_DESC(edid_fixup,
 		 "Minimum number of valid EDID header bytes (0-8, default 6)");
 
+static int drm_edid_block_checksum(const u8 *raw_edid)
+{
+	int i;
+	u8 csum = 0;
+	for (i = 0; i < EDID_LENGTH; i++)
+		csum += raw_edid[i];
+
+	return csum;
+}
+
 static bool drm_edid_is_zero(const u8 *in_edid, int length)
 {
 	if (memchr_inv(in_edid, 0, length))
@@ -1035,8 +1045,7 @@ static bool drm_edid_is_zero(const u8 *in_edid, int length)
  */
 bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid)
 {
-	int i;
-	u8 csum = 0;
+	u8 csum;
 	struct edid *edid = (struct edid *)raw_edid;
 
 	if (WARN_ON(!raw_edid))
@@ -1056,8 +1065,7 @@ bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid)
 		}
 	}
 
-	for (i = 0; i < EDID_LENGTH; i++)
-		csum += raw_edid[i];
+	csum = drm_edid_block_checksum(raw_edid);
 	if (csum) {
 		if (print_bad_edid) {
 			DRM_ERROR("EDID checksum is invalid, remainder is %d\n", csum);
-- 
2.1.2

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

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/6] drm/edid: calculate address of current extension block only once
       [not found] <1417373866-15440-1-git-send-email-stefan.bruens@rwth-aachen.de>
                   ` (2 preceding siblings ...)
  2014-11-30 18:57 ` [PATCH 3/6] drm/edid: new drm_edid_block_checksum helper function V3 Stefan Brüns
@ 2014-11-30 18:57 ` Stefan Brüns
  2014-11-30 18:57 ` [PATCH 5/6] drm/edid: add drm_edid_dump helper function Stefan Brüns
  2014-11-30 18:57 ` [PATCH 6/6] drm/edid: Tighten checksum conditions for CEA blocks Stefan Brüns
  5 siblings, 0 replies; 7+ messages in thread
From: Stefan Brüns @ 2014-11-30 18:57 UTC (permalink / raw)
  To: dri-devel; +Cc: stefan.bruens

Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 1cbaf29..d68f56d 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1248,12 +1248,11 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
 	block = new;
 
 	for (j = 1; j <= block[0x7e]; j++) {
+		u8 *ext_block = block + (valid_extensions + 1) * EDID_LENGTH;
 		for (i = 0; i < 4; i++) {
-			if (get_edid_block(data,
-				  block + (valid_extensions + 1) * EDID_LENGTH,
-				  j, EDID_LENGTH))
+			if (get_edid_block(data, ext_block, j, EDID_LENGTH))
 				goto out;
-			if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH, j, print_bad_edid)) {
+			if (drm_edid_block_valid(ext_block, j, print_bad_edid)) {
 				valid_extensions++;
 				break;
 			}
-- 
2.1.2

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

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 5/6] drm/edid: add drm_edid_dump helper function
       [not found] <1417373866-15440-1-git-send-email-stefan.bruens@rwth-aachen.de>
                   ` (3 preceding siblings ...)
  2014-11-30 18:57 ` [PATCH 4/6] drm/edid: calculate address of current extension block only once Stefan Brüns
@ 2014-11-30 18:57 ` Stefan Brüns
  2014-11-30 18:57 ` [PATCH 6/6] drm/edid: Tighten checksum conditions for CEA blocks Stefan Brüns
  5 siblings, 0 replies; 7+ messages in thread
From: Stefan Brüns @ 2014-11-30 18:57 UTC (permalink / raw)
  To: dri-devel; +Cc: stefan.bruens

This function will also be used by drm_edid_block_valid after the
next patch in the series.

Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
---
 drivers/gpu/drm/drm_edid.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index d68f56d..31988ca 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1032,6 +1032,17 @@ static bool drm_edid_is_zero(const u8 *in_edid, int length)
 	return true;
 }
 
+static void drm_dump_edid(const u8 *raw_edid)
+{
+	if (drm_edid_is_zero(raw_edid, EDID_LENGTH)) {
+		printk(KERN_ERR "EDID block is all zeroes\n");
+	} else {
+		printk(KERN_ERR "Raw EDID:\n");
+		print_hex_dump(KERN_ERR, " \t", DUMP_PREFIX_NONE, 16, 1,
+		       raw_edid, EDID_LENGTH, false);
+	}
+}
+
 /**
  * drm_edid_block_valid - Sanity check the EDID block (base or extension)
  * @raw_edid: pointer to raw EDID block
@@ -1095,15 +1106,9 @@ bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid)
 	return true;
 
 bad:
-	if (print_bad_edid) {
-		if (drm_edid_is_zero(raw_edid, EDID_LENGTH)) {
-			printk(KERN_ERR "EDID block is all zeroes\n");
-		} else {
-			printk(KERN_ERR "Raw EDID:\n");
-			print_hex_dump(KERN_ERR, " \t", DUMP_PREFIX_NONE, 16, 1,
-			       raw_edid, EDID_LENGTH, false);
-		}
-	}
+	if (print_bad_edid)
+		drm_dump_edid(raw_edid);
+
 	return false;
 }
 EXPORT_SYMBOL(drm_edid_block_valid);
-- 
2.1.2

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

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 6/6] drm/edid: Tighten checksum conditions for CEA blocks
       [not found] <1417373866-15440-1-git-send-email-stefan.bruens@rwth-aachen.de>
                   ` (4 preceding siblings ...)
  2014-11-30 18:57 ` [PATCH 5/6] drm/edid: add drm_edid_dump helper function Stefan Brüns
@ 2014-11-30 18:57 ` Stefan Brüns
  5 siblings, 0 replies; 7+ messages in thread
From: Stefan Brüns @ 2014-11-30 18:57 UTC (permalink / raw)
  To: dri-devel; +Cc: stefan.bruens

Checksumming was disabled for CEA blocks by

commit 4a638b4e38234233f5c7e6705662fbc0b58d80c2
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue May 25 16:33:09 2010 -0400

    drm/edid: Allow non-fatal checksum errors in CEA blocks

If only the checksum is wrong, reading twice should result in identical
data, whereas a bad transfer will most likely corrupt different bytes.
Comparing checksums is not sufficient, as there is a considerable chance
of two bad transfers having the same checksum.

Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
---
 drivers/gpu/drm/drm_edid.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 31988ca..0b20fc9 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1224,6 +1224,7 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
 {
 	int i, j = 0, valid_extensions = 0;
 	u8 *block, *new;
+	u8 *saved_block = NULL;
 	bool print_bad_edid = !connector->bad_edid_counter || (drm_debug & DRM_UT_KMS);
 
 	if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL)
@@ -1254,13 +1255,30 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
 
 	for (j = 1; j <= block[0x7e]; j++) {
 		u8 *ext_block = block + (valid_extensions + 1) * EDID_LENGTH;
+		u8 csum, last_csum = 0;
 		for (i = 0; i < 4; i++) {
 			if (get_edid_block(data, ext_block, j, EDID_LENGTH))
 				goto out;
-			if (drm_edid_block_valid(ext_block, j, print_bad_edid)) {
+			csum = drm_edid_block_checksum(ext_block);
+			if (!csum) {
 				valid_extensions++;
 				break;
+			} else if (ext_block[0] == CEA_EXT) {
+			/*
+			 * Some switches mangle CEA contents without fixing the checksum.
+			 * Accept CEA blocks when two reads return identical data.
+			 */
+				if (saved_block && csum == last_csum &&
+				    !memcmp(ext_block, saved_block, EDID_LENGTH)) {
+					valid_extensions++;
+					break;
+				}
+				kfree(saved_block);
+				saved_block = kmemdup(ext_block, EDID_LENGTH, GFP_KERNEL);
+				last_csum = csum;
 			}
+			if (print_bad_edid)
+				drm_dump_edid(ext_block);
 		}
 
 		if (i == 4 && print_bad_edid) {
@@ -1270,6 +1288,9 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
 
 			connector->bad_edid_counter++;
 		}
+
+		kfree(saved_block);
+		saved_block = NULL;
 	}
 
 	if (valid_extensions != block[0x7e]) {
@@ -1291,6 +1312,7 @@ carp:
 	connector->bad_edid_counter++;
 
 out:
+	kfree(saved_block);
 	kfree(block);
 	return NULL;
 }
-- 
2.1.2

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

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 3/6] drm/edid: new drm_edid_block_checksum helper function V3
  2014-11-30 18:57 ` [PATCH 3/6] drm/edid: new drm_edid_block_checksum helper function V3 Stefan Brüns
@ 2014-12-01 16:21   ` Daniel Vetter
  0 siblings, 0 replies; 7+ messages in thread
From: Daniel Vetter @ 2014-12-01 16:21 UTC (permalink / raw)
  To: Stefan Brüns; +Cc: dri-devel

On Sun, Nov 30, 2014 at 07:57:43PM +0100, Stefan Brüns wrote:
> The function will also be used by a later patch, so factor it out.
> 
> V2: make raw_edid const, define/declare before first use
> V3: fix erroneuos removal of csum variable
> 
> Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
> Reviewed-by: Jani Nikula <jani.nikula@intel.com>

Ok, merged the first three patches from this series to my drm patch pile
branch. I'll send a pull for that to Dave for 3.19 I think, but might miss
for 3.20.

Thanks, Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-12-01 16:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1417373866-15440-1-git-send-email-stefan.bruens@rwth-aachen.de>
2014-11-30 18:57 ` [PATCH 1/6] drm/edid: move drm_edid_is_zero to top, make edid argument const Stefan Brüns
2014-11-30 18:57 ` [PATCH 2/6] drm/edid: shorten log output in case of all zeroes edid block Stefan Brüns
2014-11-30 18:57 ` [PATCH 3/6] drm/edid: new drm_edid_block_checksum helper function V3 Stefan Brüns
2014-12-01 16:21   ` Daniel Vetter
2014-11-30 18:57 ` [PATCH 4/6] drm/edid: calculate address of current extension block only once Stefan Brüns
2014-11-30 18:57 ` [PATCH 5/6] drm/edid: add drm_edid_dump helper function Stefan Brüns
2014-11-30 18:57 ` [PATCH 6/6] drm/edid: Tighten checksum conditions for CEA blocks Stefan Brüns

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox