diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2017-04-11 02:34:25 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-04-11 02:34:24 -0700 |
commit | f1283dace88b6a6696f194a881e89d7d5b3a25c5 (patch) | |
tree | 8fd06d9da2d8c128bd783732e543e36e6c3af27d /drivers/gpu | |
parent | f52bb19a62b985656dc1a208c8ea48869539a8c7 (diff) | |
parent | a45e2639921048ba4750f18b7303e7c62842ee5a (diff) |
Merge "drm/displayid: Iterate over all DisplayID blocks"
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/drm_edid.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 909f560016ad..4679c7dd6e1b 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -4128,19 +4128,27 @@ static int drm_parse_display_id(struct drm_connector *connector, if (ret) return ret; - block = (struct displayid_block *)&displayid[idx + 4]; - DRM_DEBUG_KMS("block id %d, rev %d, len %d\n", - block->tag, block->rev, block->num_bytes); - - switch (block->tag) { - case DATA_BLOCK_TILED_DISPLAY: - ret = drm_parse_tiled_block(connector, block); - if (ret) - return ret; - break; - default: - printk("unknown displayid tag %d\n", block->tag); - break; + idx += sizeof(struct displayid_hdr); + while (block = (struct displayid_block *)&displayid[idx], + idx + sizeof(struct displayid_block) <= length && + idx + sizeof(struct displayid_block) + + block->num_bytes <= length && + block->num_bytes > 0) { + idx += block->num_bytes + sizeof(struct displayid_block); + DRM_DEBUG_KMS("block id 0x%x, rev %d, len %d\n", + block->tag, block->rev, block->num_bytes); + + switch (block->tag) { + case DATA_BLOCK_TILED_DISPLAY: + ret = drm_parse_tiled_block(connector, block); + if (ret) + return ret; + break; + default: + DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", + block->tag); + break; + } } return 0; } |