aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Bzatek <tomas@bzatek.net>2016-05-01 09:02:45 -0400
committerDave Airlie <airlied@redhat.com>2016-05-22 21:34:48 -0400
commit3a4a2ea39f86c581054794c0a727597745f1084b (patch)
treee58bb608d95b54b3b2b0af04925677564c241cb4
parent5e546cd5b3bc76824069ffa98c52a5f48cf91aba (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.c32
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}