Ultimately we want lookups happening only once in komeda's fb_create implementation. Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@xxxxxxxxxxxxx> --- .../arm/display/komeda/komeda_framebuffer.c | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c b/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c index 43db95a76291..6b11a1b21ef6 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c @@ -39,6 +39,7 @@ static const struct drm_framebuffer_funcs komeda_fb_funcs = { static int komeda_fb_afbc_size_check(struct komeda_fb *kfb, const struct drm_format_info *info, + struct drm_gem_object **objs, struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd) { @@ -47,11 +48,7 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, u32 alignment_w = 0, alignment_h = 0, alignment_header, n_blocks, bpp; u64 min_size; - obj = drm_gem_object_lookup(file, mode_cmd->handles[0]); - if (!obj) { - DRM_DEBUG_KMS("Failed to lookup GEM object\n"); - return -ENOENT; - } + obj = objs[0]; if (!drm_afbc_get_superblock_wh(fb->modifier, &alignment_w, &alignment_h)) return -EINVAL; @@ -70,7 +67,7 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, if (fb->offsets[0] % alignment_header) { DRM_DEBUG_KMS("afbc offset alignment check failed.\n"); - goto check_failed; + return -EINVAL; } n_blocks = (kfb->aligned_w * kfb->aligned_h) / AFBC_SUPERBLK_PIXELS; @@ -85,15 +82,10 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, if (min_size > obj->size) { DRM_DEBUG_KMS("afbc size check failed, obj_size: 0x%zx. min_size 0x%llx.\n", obj->size, min_size); - goto check_failed; + return -EINVAL; } - fb->obj[0] = obj; return 0; - -check_failed: - drm_gem_object_put_unlocked(obj); - return -EINVAL; } static int @@ -162,12 +154,24 @@ komeda_fb_create(struct drm_device *dev, struct drm_file *file, info = kfb->base.format; if (kfb->base.modifier) { + struct drm_gem_object *objs[4]; + if (info->num_planes != 1) { DRM_DEBUG_KMS("AFBC requires exactly 1 plane.\n"); kfree(kfb); return ERR_PTR(-EINVAL); } - ret = komeda_fb_afbc_size_check(kfb, info, file, mode_cmd); + + ret = drm_gem_fb_lookup(dev, file, mode_cmd, objs); + if (ret < 0) { + kfree(kfb); + return ERR_PTR(ret); + } + + ret = komeda_fb_afbc_size_check(kfb, info, objs, file, + mode_cmd); + for (i = 0; i < info->num_planes; ++i) + kfb->base.obj[i] = objs[i]; } else { struct drm_gem_object *objs[4]; -- 2.17.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel