[PATCH RFC 032/111] staging: etnaviv: convert prime import to use etnaviv_gem_ops

Lucas Stach l.stach at pengutronix.de
Thu Apr 2 08:29:34 PDT 2015


From: Russell King <rmk+kernel at arm.linux.org.uk>

Convert the prime import code to use etnaviv_gem_ops release method
to clean up the object.  This removes the prime specific code from
the generic object cleanup path.

Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
---
 drivers/staging/etnaviv/etnaviv_gem.c | 32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/etnaviv/etnaviv_gem.c b/drivers/staging/etnaviv/etnaviv_gem.c
index eface33ad445..865b34b8496c 100644
--- a/drivers/staging/etnaviv/etnaviv_gem.c
+++ b/drivers/staging/etnaviv/etnaviv_gem.c
@@ -538,18 +538,6 @@ static void etnaviv_free_obj(struct drm_gem_object *obj)
 
 	if (etnaviv_obj->ops) {
 		etnaviv_obj->ops->release(etnaviv_obj);
-	} else if (obj->import_attach) {
-		if (etnaviv_obj->vaddr)
-			dma_buf_vunmap(obj->import_attach->dmabuf,
-				       etnaviv_obj->vaddr);
-
-		/* Don't drop the pages for imported dmabuf, as they are not
-		 * ours, just free the array we allocated:
-		 */
-		if (etnaviv_obj->pages)
-			drm_free_large(etnaviv_obj->pages);
-
-		drm_prime_gem_destroy(obj, etnaviv_obj->sgt);
 	} else {
 		if (etnaviv_obj->vaddr)
 			vunmap(etnaviv_obj->vaddr);
@@ -698,6 +686,25 @@ fail:
 	return ERR_PTR(ret);
 }
 
+static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)
+{
+	if (etnaviv_obj->vaddr)
+		dma_buf_vunmap(etnaviv_obj->base.import_attach->dmabuf,
+			       etnaviv_obj->vaddr);
+
+	/* Don't drop the pages for imported dmabuf, as they are not
+	 * ours, just free the array we allocated:
+	 */
+	if (etnaviv_obj->pages)
+		drm_free_large(etnaviv_obj->pages);
+
+	drm_prime_gem_destroy(&etnaviv_obj->base, etnaviv_obj->sgt);
+}
+
+static const struct etnaviv_gem_ops etnaviv_gem_prime_ops = {
+	.release = etnaviv_gem_prime_release,
+};
+
 struct drm_gem_object *msm_gem_import(struct drm_device *dev,
 		uint32_t size, struct sg_table *sgt)
 {
@@ -716,6 +723,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
 	npages = size / PAGE_SIZE;
 
 	etnaviv_obj = to_etnaviv_bo(obj);
+	etnaviv_obj->ops = &etnaviv_gem_prime_ops;
 	etnaviv_obj->sgt = sgt;
 	etnaviv_obj->pages = drm_malloc_ab(npages, sizeof(struct page *));
 	if (!etnaviv_obj->pages) {
-- 
2.1.4



More information about the dri-devel mailing list