aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_edid.c
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2012-04-16 10:40:08 -0400
committerDave Airlie <airlied@redhat.com>2012-04-27 03:24:51 -0400
commitf89ec8a456dde7f18a13de77b4d79e6b05ca7c84 (patch)
tree1e1dfc24d6ac62d1c974f4440711b2205e888bba /drivers/gpu/drm/drm_edid.c
parent1b23170a8e14ef62ad1daa957aa528212a8d0aef (diff)
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/812890 Signed-off-by: Adam Jackson <ajax@redhat.com> Reviewed-by: Alex Deucher <alexdeucher@gmail.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/drm_edid.c')
-rw-r--r--drivers/gpu/drm/drm_edid.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index c6366e90041..f425379e5aa 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -149,13 +149,13 @@ EXPORT_SYMBOL(drm_edid_header_is_valid);
149 * Sanity check the EDID block (base or extension). Return 0 if the block 149 * Sanity check the EDID block (base or extension). Return 0 if the block
150 * doesn't check out, or 1 if it's valid. 150 * doesn't check out, or 1 if it's valid.
151 */ 151 */
152bool drm_edid_block_valid(u8 *raw_edid) 152bool drm_edid_block_valid(u8 *raw_edid, int block)
153{ 153{
154 int i; 154 int i;
155 u8 csum = 0; 155 u8 csum = 0;
156 struct edid *edid = (struct edid *)raw_edid; 156 struct edid *edid = (struct edid *)raw_edid;
157 157
158 if (raw_edid[0] == 0x00) { 158 if (block == 0) {
159 int score = drm_edid_header_is_valid(raw_edid); 159 int score = drm_edid_header_is_valid(raw_edid);
160 if (score == 8) ; 160 if (score == 8) ;
161 else if (score >= 6) { 161 else if (score >= 6) {
@@ -219,7 +219,7 @@ bool drm_edid_is_valid(struct edid *edid)
219 return false; 219 return false;
220 220
221 for (i = 0; i <= edid->extensions; i++) 221 for (i = 0; i <= edid->extensions; i++)
222 if (!drm_edid_block_valid(raw + i * EDID_LENGTH)) 222 if (!drm_edid_block_valid(raw + i * EDID_LENGTH, i))
223 return false; 223 return false;
224 224
225 return true; 225 return true;
@@ -299,7 +299,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
299 for (i = 0; i < 4; i++) { 299 for (i = 0; i < 4; i++) {
300 if (drm_do_probe_ddc_edid(adapter, block, 0, EDID_LENGTH)) 300 if (drm_do_probe_ddc_edid(adapter, block, 0, EDID_LENGTH))
301 goto out; 301 goto out;
302 if (drm_edid_block_valid(block)) 302 if (drm_edid_block_valid(block, 0))
303 break; 303 break;
304 if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) { 304 if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) {
305 connector->null_edid_counter++; 305 connector->null_edid_counter++;
@@ -324,7 +324,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
324 block + (valid_extensions + 1) * EDID_LENGTH, 324 block + (valid_extensions + 1) * EDID_LENGTH,
325 j, EDID_LENGTH)) 325 j, EDID_LENGTH))
326 goto out; 326 goto out;
327 if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH)) { 327 if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH, j)) {
328 valid_extensions++; 328 valid_extensions++;
329 break; 329 break;
330 } 330 }