* [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* 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
* [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