128,6 → 128,23 |
}; |
|
/* |
* Sanity check the header of the base EDID block. Return 8 if the header |
* is perfect, down to 0 if it's totally wrong. |
*/ |
int drm_edid_header_is_valid(const u8 *raw_edid) |
{ |
int i, score = 0; |
|
for (i = 0; i < sizeof(edid_header); i++) |
if (raw_edid[i] == edid_header[i]) |
score++; |
|
return score; |
} |
EXPORT_SYMBOL(drm_edid_header_is_valid); |
|
|
/* |
* Sanity check the EDID block (base or extension). Return 0 if the block |
* doesn't check out, or 1 if it's valid. |
*/ |
139,12 → 156,7 |
struct edid *edid = (struct edid *)raw_edid; |
|
if (raw_edid[0] == 0x00) { |
int score = 0; |
|
for (i = 0; i < sizeof(edid_header); i++) |
if (raw_edid[i] == edid_header[i]) |
score++; |
|
int score = drm_edid_header_is_valid(raw_edid); |
if (score == 8) ; |
else if (score >= 6) { |
DRM_DEBUG("Fixing EDID header, your hardware may be failing\n"); |
186,7 → 198,6 |
if (raw_edid) { |
printk(KERN_ERR "Raw EDID:\n"); |
// print_hex_dump_bytes(KERN_ERR, DUMP_PREFIX_NONE, raw_edid, EDID_LENGTH); |
printk(KERN_ERR "\n"); |
} |
return 0; |
} |
1449,6 → 1460,8 |
static void drm_add_display_info(struct edid *edid, |
struct drm_display_info *info) |
{ |
u8 *edid_ext; |
|
info->width_mm = edid->width_cm * 10; |
info->height_mm = edid->height_cm * 10; |
|
1493,6 → 1506,13 |
info->color_formats = DRM_COLOR_FORMAT_YCRCB444; |
if (info->color_formats & DRM_EDID_FEATURE_RGB_YCRCB422) |
info->color_formats = DRM_COLOR_FORMAT_YCRCB422; |
|
/* Get data from CEA blocks if present */ |
edid_ext = drm_find_cea_extension(edid); |
if (!edid_ext) |
return; |
|
info->cea_rev = edid_ext[1]; |
} |
|
/** |