diff options
author | Dave Airlie <airlied@redhat.com> | 2016-05-03 15:38:37 +1000 |
---|---|---|
committer | Abhinav Kumar <abhinavk@codeaurora.org> | 2017-04-06 20:33:24 -0700 |
commit | 9695df13df85f42d2cdea1c493bfe656f9b28ccf (patch) | |
tree | d60c2c879dca6369945062acb6aa580f9895e78a /drivers/gpu | |
parent | accb2a52def229c26ee41a40ee19a45a599f9034 (diff) |
drm/edid: move displayid validation to it's own function.
We need to use this for validating modeline additions.
Change-Id: I55fe5a92c614cf949de906bea9a7c84d64450bb2
Signed-off-by: Dave Airlie <airlied@redhat.com>
Git-commit: c97291774c1b867b56c3d439ddaec9a965cf559e
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Signed-off-by: Abhinav Kumar <abhinavk@codeaurora.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/drm_edid.c | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index daf87189fcfc..909f560016ad 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -3775,6 +3775,30 @@ static void drm_add_display_info(struct edid *edid, 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 * @connector: connector we're probing @@ -4094,30 +4118,15 @@ static int drm_parse_display_id(struct drm_connector *connector, { /* if this is an EDID extension the first byte will be 0x70 */ int idx = 0; - struct displayid_hdr *base; struct displayid_block *block; - u8 csum = 0; - int i; int ret; if (is_edid_extension) idx = 1; - 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; - } + ret = validate_displayid(displayid, length, idx); + if (ret) + return ret; block = (struct displayid_block *)&displayid[idx + 4]; DRM_DEBUG_KMS("block id %d, rev %d, len %d\n", |