v2: Use the new helper in drm_gem_prime_import

Signed-off-by: Felix Kuehling <[email protected]>
Reviewed-by: Christian König <[email protected]>
Reviewed-by: Daniel Vetter <[email protected]>
---
 drivers/gpu/drm/drm_prime.c | 43 +++++++++++++++++++++++++++++++++----------
 include/drm/drmP.h          |  2 ++
 2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 25aa455..1ccf354 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -594,6 +594,31 @@ int drm_gem_prime_handle_to_fd(struct drm_device *dev,
 EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
 
 /**
+ * drm_gem_prime_dmabuf_to_object - try to cast dmabuf to GEM object
+ * @dma_buf: dma-buf object to cast
+ * @driver: driver that is the expected exporter of the dma-buf
+ *
+ * If @dma_buf represents a GEM object, this function return a pointer
+ * to it. Optionally, if @driver is not NULL, it also checks that the
+ * object was exported by @driver. Otherwise it returns NULL.
+ */
+struct drm_gem_object *drm_gem_prime_dmabuf_to_object(struct dma_buf *dma_buf,
+                                                     struct drm_driver *driver)
+{
+       struct drm_gem_object *obj;
+
+       if (dma_buf->ops != &drm_gem_prime_dmabuf_ops)
+               return NULL;
+
+       obj = dma_buf->priv;
+       if (driver && obj->dev->driver != driver)
+               return NULL;
+
+       return obj;
+}
+EXPORT_SYMBOL(drm_gem_prime_dmabuf_to_object);
+
+/**
  * drm_gem_prime_import - helper library implementation of the import callback
  * @dev: drm_device to import into
  * @dma_buf: dma-buf object to import
@@ -609,16 +634,14 @@ struct drm_gem_object *drm_gem_prime_import(struct 
drm_device *dev,
        struct drm_gem_object *obj;
        int ret;
 
-       if (dma_buf->ops == &drm_gem_prime_dmabuf_ops) {
-               obj = dma_buf->priv;
-               if (obj->dev == dev) {
-                       /*
-                        * Importing dmabuf exported from out own gem increases
-                        * refcount on gem itself instead of f_count of dmabuf.
-                        */
-                       drm_gem_object_reference(obj);
-                       return obj;
-               }
+       obj = drm_gem_prime_dmabuf_to_object(dma_buf, NULL);
+       if (obj && obj->dev == dev) {
+               /*
+                * Importing dmabuf exported from out own gem increases
+                * refcount on gem itself instead of f_count of dmabuf.
+                */
+               drm_gem_object_reference(obj);
+               return obj;
        }
 
        if (!dev->driver->gem_prime_import_sg_table)
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 6105c05..79c2b23 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -767,6 +767,8 @@ extern struct dma_buf *drm_gem_prime_export(struct 
drm_device *dev,
 extern int drm_gem_prime_handle_to_fd(struct drm_device *dev,
                struct drm_file *file_priv, uint32_t handle, uint32_t flags,
                int *prime_fd);
+extern struct drm_gem_object *drm_gem_prime_dmabuf_to_object(
+               struct dma_buf *dma_buf, struct drm_driver *driver);
 extern struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
                struct dma_buf *dma_buf);
 extern int drm_gem_prime_fd_to_handle(struct drm_device *dev,
-- 
1.9.1

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to