Loading drivers/gpu/drm/drm_edid.c +64 −51 Original line number Diff line number Diff line Loading @@ -4029,44 +4029,11 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, } EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode); static int drm_parse_display_id(struct drm_connector *connector, u8 *displayid, int length, bool is_edid_extension) static int drm_parse_tiled_block(struct drm_connector *connector, struct displayid_block *block) { /* 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; 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; } 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: { struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block; struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block; u16 w, h; u8 tile_v_loc, tile_h_loc; u8 num_v_tile, num_h_tile; Loading Loading @@ -4095,26 +4062,72 @@ static int drm_parse_display_id(struct drm_connector *connector, DRM_DEBUG_KMS("tile_size %d x %d\n", w + 1, h + 1); DRM_DEBUG_KMS("topo num tiles %dx%d, location %dx%d\n", num_h_tile + 1, num_v_tile + 1, tile_h_loc, tile_v_loc); DRM_DEBUG_KMS("vend %c%c%c\n", tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]); DRM_DEBUG_KMS("vend %c%c%c\n", tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]); tg = drm_mode_get_tile_group(connector->dev, tile->topology_id); if (!tg) { tg = drm_mode_create_tile_group(connector->dev, tile->topology_id); } if (!tg) tg = drm_mode_create_tile_group(connector->dev, tile->topology_id); if (!tg) return -ENOMEM; if (connector->tile_group != tg) { /* if we haven't got a pointer, take the reference, drop ref to old tile group */ if (connector->tile_group) { drm_mode_put_tile_group(connector->dev, connector->tile_group); } * take the reference, drop ref to old tile group */ if (connector->tile_group) drm_mode_put_tile_group(connector->dev, connector->tile_group); connector->tile_group = tg; } else /* if same tile group, then release the ref we just took. */ drm_mode_put_tile_group(connector->dev, tg); return 0; } static int drm_parse_display_id(struct drm_connector *connector, u8 *displayid, int length, bool is_edid_extension) { /* 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; } 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); Loading Loading
drivers/gpu/drm/drm_edid.c +64 −51 Original line number Diff line number Diff line Loading @@ -4029,44 +4029,11 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, } EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode); static int drm_parse_display_id(struct drm_connector *connector, u8 *displayid, int length, bool is_edid_extension) static int drm_parse_tiled_block(struct drm_connector *connector, struct displayid_block *block) { /* 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; 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; } 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: { struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block; struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block; u16 w, h; u8 tile_v_loc, tile_h_loc; u8 num_v_tile, num_h_tile; Loading Loading @@ -4095,26 +4062,72 @@ static int drm_parse_display_id(struct drm_connector *connector, DRM_DEBUG_KMS("tile_size %d x %d\n", w + 1, h + 1); DRM_DEBUG_KMS("topo num tiles %dx%d, location %dx%d\n", num_h_tile + 1, num_v_tile + 1, tile_h_loc, tile_v_loc); DRM_DEBUG_KMS("vend %c%c%c\n", tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]); DRM_DEBUG_KMS("vend %c%c%c\n", tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]); tg = drm_mode_get_tile_group(connector->dev, tile->topology_id); if (!tg) { tg = drm_mode_create_tile_group(connector->dev, tile->topology_id); } if (!tg) tg = drm_mode_create_tile_group(connector->dev, tile->topology_id); if (!tg) return -ENOMEM; if (connector->tile_group != tg) { /* if we haven't got a pointer, take the reference, drop ref to old tile group */ if (connector->tile_group) { drm_mode_put_tile_group(connector->dev, connector->tile_group); } * take the reference, drop ref to old tile group */ if (connector->tile_group) drm_mode_put_tile_group(connector->dev, connector->tile_group); connector->tile_group = tg; } else /* if same tile group, then release the ref we just took. */ drm_mode_put_tile_group(connector->dev, tg); return 0; } static int drm_parse_display_id(struct drm_connector *connector, u8 *displayid, int length, bool is_edid_extension) { /* 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; } 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); Loading