Commit c9729177 authored by Dave Airlie's avatar Dave Airlie

drm/edid: move displayid validation to it's own function.

We need to use this for validating modeline additions.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 3a4a2ea3
...@@ -3901,6 +3901,29 @@ static void drm_add_display_info(struct edid *edid, ...@@ -3901,6 +3901,29 @@ static void drm_add_display_info(struct edid *edid,
info->color_formats |= DRM_COLOR_FORMAT_YCRCB422; info->color_formats |= DRM_COLOR_FORMAT_YCRCB422;
} }
static int validate_displayid(u8 *displayid, int length, int idx)
{
int i;
u8 csum = 0;
struct displayid_hdr *base;
base = (struct displayid_hdr *)&displayid[idx];
DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
base->rev, base->bytes, base->prod_id, base->ext_count);
if (base->bytes + 5 > length - idx)
return -EINVAL;
for (i = idx; i <= base->bytes + 5; i++) {
csum += displayid[i];
}
if (csum) {
DRM_ERROR("DisplayID checksum invalid, remainder is %d\n", csum);
return -EINVAL;
}
return 0;
}
/** /**
* drm_add_edid_modes - add modes from EDID data, if available * drm_add_edid_modes - add modes from EDID data, if available
* @connector: connector we're probing * @connector: connector we're probing
...@@ -4212,30 +4235,15 @@ static int drm_parse_display_id(struct drm_connector *connector, ...@@ -4212,30 +4235,15 @@ static int drm_parse_display_id(struct drm_connector *connector,
{ {
/* if this is an EDID extension the first byte will be 0x70 */ /* if this is an EDID extension the first byte will be 0x70 */
int idx = 0; int idx = 0;
struct displayid_hdr *base;
struct displayid_block *block; struct displayid_block *block;
u8 csum = 0;
int i;
int ret; int ret;
if (is_edid_extension) if (is_edid_extension)
idx = 1; idx = 1;
base = (struct displayid_hdr *)&displayid[idx]; ret = validate_displayid(displayid, length, idx);
if (ret)
DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n", return ret;
base->rev, base->bytes, base->prod_id, base->ext_count);
if (base->bytes + 5 > length - idx)
return -EINVAL;
for (i = idx; i <= base->bytes + 5; i++) {
csum += displayid[i];
}
if (csum) {
DRM_ERROR("DisplayID checksum invalid, remainder is %d\n", csum);
return -EINVAL;
}
idx += sizeof(struct displayid_hdr); idx += sizeof(struct displayid_hdr);
while (block = (struct displayid_block *)&displayid[idx], while (block = (struct displayid_block *)&displayid[idx],
......
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