diff options
author | Tomas Bzatek <tomas@bzatek.net> | 2016-05-01 09:02:45 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-05-22 21:34:48 -0400 |
commit | 3a4a2ea39f86c581054794c0a727597745f1084b (patch) | |
tree | e58bb608d95b54b3b2b0af04925677564c241cb4 | |
parent | 5e546cd5b3bc76824069ffa98c52a5f48cf91aba (diff) |
drm/displayid: Iterate over all DisplayID blocks
This will iterate over all DisplayID blocks found in the buffer.
Previously only the first block was parsed.
https://bugs.freedesktop.org/show_bug.cgi?id=95207
Signed-off-by: Tomas Bzatek <tomas@bzatek.net>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | drivers/gpu/drm/drm_edid.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 4724596ebf53..0b95a7f2db03 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -4237,19 +4237,25 @@ static int drm_parse_display_id(struct drm_connector *connector, | |||
4237 | return -EINVAL; | 4237 | return -EINVAL; |
4238 | } | 4238 | } |
4239 | 4239 | ||
4240 | block = (struct displayid_block *)&displayid[idx + 4]; | 4240 | idx += sizeof(struct displayid_hdr); |
4241 | DRM_DEBUG_KMS("block id %d, rev %d, len %d\n", | 4241 | while (block = (struct displayid_block *)&displayid[idx], |
4242 | block->tag, block->rev, block->num_bytes); | 4242 | idx + sizeof(struct displayid_block) <= length && |
4243 | 4243 | idx + sizeof(struct displayid_block) + block->num_bytes <= length && | |
4244 | switch (block->tag) { | 4244 | block->num_bytes > 0) { |
4245 | case DATA_BLOCK_TILED_DISPLAY: | 4245 | idx += block->num_bytes + sizeof(struct displayid_block); |
4246 | ret = drm_parse_tiled_block(connector, block); | 4246 | DRM_DEBUG_KMS("block id 0x%x, rev %d, len %d\n", |
4247 | if (ret) | 4247 | block->tag, block->rev, block->num_bytes); |
4248 | return ret; | 4248 | |
4249 | break; | 4249 | switch (block->tag) { |
4250 | default: | 4250 | case DATA_BLOCK_TILED_DISPLAY: |
4251 | printk("unknown displayid tag %d\n", block->tag); | 4251 | ret = drm_parse_tiled_block(connector, block); |
4252 | break; | 4252 | if (ret) |
4253 | return ret; | ||
4254 | break; | ||
4255 | default: | ||
4256 | DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", block->tag); | ||
4257 | break; | ||
4258 | } | ||
4253 | } | 4259 | } |
4254 | return 0; | 4260 | return 0; |
4255 | } | 4261 | } |