Commit f89ec8a4 authored by Adam Jackson's avatar Adam Jackson Committed by Dave Airlie

drm/edid: Try harder to fix up base EDID blocks

Requiring the first byte of the EDID base block header to be 0 means we
don't fix up as many transfer errors as we could.  Instead have the
callers specify whether it's meant to be block 0 or not, and
conditionally run header fixup based on that.

Bugzilla: https://bugzilla.redhat.com/812890Signed-off-by: default avatarAdam Jackson <ajax@redhat.com>
Reviewed-by: default avatarAlex Deucher <alexdeucher@gmail.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 1b23170a
...@@ -149,13 +149,13 @@ EXPORT_SYMBOL(drm_edid_header_is_valid); ...@@ -149,13 +149,13 @@ EXPORT_SYMBOL(drm_edid_header_is_valid);
* Sanity check the EDID block (base or extension). Return 0 if the block * Sanity check the EDID block (base or extension). Return 0 if the block
* doesn't check out, or 1 if it's valid. * doesn't check out, or 1 if it's valid.
*/ */
bool drm_edid_block_valid(u8 *raw_edid) bool drm_edid_block_valid(u8 *raw_edid, int block)
{ {
int i; int i;
u8 csum = 0; u8 csum = 0;
struct edid *edid = (struct edid *)raw_edid; struct edid *edid = (struct edid *)raw_edid;
if (raw_edid[0] == 0x00) { if (block == 0) {
int score = drm_edid_header_is_valid(raw_edid); int score = drm_edid_header_is_valid(raw_edid);
if (score == 8) ; if (score == 8) ;
else if (score >= 6) { else if (score >= 6) {
...@@ -219,7 +219,7 @@ bool drm_edid_is_valid(struct edid *edid) ...@@ -219,7 +219,7 @@ bool drm_edid_is_valid(struct edid *edid)
return false; return false;
for (i = 0; i <= edid->extensions; i++) for (i = 0; i <= edid->extensions; i++)
if (!drm_edid_block_valid(raw + i * EDID_LENGTH)) if (!drm_edid_block_valid(raw + i * EDID_LENGTH, i))
return false; return false;
return true; return true;
...@@ -299,7 +299,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) ...@@ -299,7 +299,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (drm_do_probe_ddc_edid(adapter, block, 0, EDID_LENGTH)) if (drm_do_probe_ddc_edid(adapter, block, 0, EDID_LENGTH))
goto out; goto out;
if (drm_edid_block_valid(block)) if (drm_edid_block_valid(block, 0))
break; break;
if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) { if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) {
connector->null_edid_counter++; connector->null_edid_counter++;
...@@ -324,7 +324,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) ...@@ -324,7 +324,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
block + (valid_extensions + 1) * EDID_LENGTH, block + (valid_extensions + 1) * EDID_LENGTH,
j, EDID_LENGTH)) j, EDID_LENGTH))
goto out; goto out;
if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH)) { if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH, j)) {
valid_extensions++; valid_extensions++;
break; break;
} }
......
...@@ -1012,7 +1012,7 @@ extern int drm_add_modes_noedid(struct drm_connector *connector, ...@@ -1012,7 +1012,7 @@ extern int drm_add_modes_noedid(struct drm_connector *connector,
int hdisplay, int vdisplay); int hdisplay, int vdisplay);
extern int drm_edid_header_is_valid(const u8 *raw_edid); extern int drm_edid_header_is_valid(const u8 *raw_edid);
extern bool drm_edid_block_valid(u8 *raw_edid); extern bool drm_edid_block_valid(u8 *raw_edid, int block);
extern bool drm_edid_is_valid(struct edid *edid); extern bool drm_edid_is_valid(struct edid *edid);
struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
int hsize, int vsize, int fresh, int hsize, int vsize, int fresh,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment