[PATCHv4 16/36] drm/komeda: Factor out object lookups for afbc case

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 07520cec6fbd..4e29fa5bd342 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))
@@ -71,7 +68,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;
@@ -86,15 +83,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
@@ -163,12 +155,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



[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux