drm/syncobj: extract two helpers from drm_syncobj_create
authorMarek Olšák <marek.olsak@amd.com>
Tue, 12 Sep 2017 20:42:12 +0000 (22:42 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 6 Oct 2017 20:47:51 +0000 (16:47 -0400)
For amdgpu.

drm_syncobj_create is renamed to drm_syncobj_create_as_handle, and new
helpers drm_syncobj_create and drm_syncobj_get_handle are added.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/drm_syncobj.c
include/drm/drm_syncobj.h

index 0422b8c..0bb1741 100644 (file)
@@ -262,8 +262,14 @@ void drm_syncobj_free(struct kref *kref)
 }
 EXPORT_SYMBOL(drm_syncobj_free);
 
-static int drm_syncobj_create(struct drm_file *file_private,
-                             u32 *handle, uint32_t flags)
+/**
+ * drm_syncobj_create - create a new syncobj
+ * @out_syncobj: returned syncobj
+ * @flags: DRM_SYNCOBJ_* flags
+ * @fence: if non-NULL, the syncobj will represent this fence
+ */
+int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
+                      struct dma_fence *fence)
 {
        int ret;
        struct drm_syncobj *syncobj;
@@ -284,6 +290,25 @@ static int drm_syncobj_create(struct drm_file *file_private,
                }
        }
 
+       if (fence)
+               drm_syncobj_replace_fence(syncobj, fence);
+
+       *out_syncobj = syncobj;
+       return 0;
+}
+EXPORT_SYMBOL(drm_syncobj_create);
+
+/**
+ * drm_syncobj_get_handle - get a handle from a syncobj
+ */
+int drm_syncobj_get_handle(struct drm_file *file_private,
+                          struct drm_syncobj *syncobj, u32 *handle)
+{
+       int ret;
+
+       /* take a reference to put in the idr */
+       drm_syncobj_get(syncobj);
+
        idr_preload(GFP_KERNEL);
        spin_lock(&file_private->syncobj_table_lock);
        ret = idr_alloc(&file_private->syncobj_idr, syncobj, 1, 0, GFP_NOWAIT);
@@ -299,6 +324,22 @@ static int drm_syncobj_create(struct drm_file *file_private,
        *handle = ret;
        return 0;
 }
+EXPORT_SYMBOL(drm_syncobj_get_handle);
+
+static int drm_syncobj_create_as_handle(struct drm_file *file_private,
+                                       u32 *handle, uint32_t flags)
+{
+       int ret;
+       struct drm_syncobj *syncobj;
+
+       ret = drm_syncobj_create(&syncobj, flags, NULL);
+       if (ret)
+               return ret;
+
+       ret = drm_syncobj_get_handle(file_private, syncobj, handle);
+       drm_syncobj_put(syncobj);
+       return ret;
+}
 
 static int drm_syncobj_destroy(struct drm_file *file_private,
                               u32 handle)
@@ -522,8 +563,8 @@ drm_syncobj_create_ioctl(struct drm_device *dev, void *data,
        if (args->flags & ~DRM_SYNCOBJ_CREATE_SIGNALED)
                return -EINVAL;
 
-       return drm_syncobj_create(file_private,
-                                 &args->handle, args->flags);
+       return drm_syncobj_create_as_handle(file_private,
+                                           &args->handle, args->flags);
 }
 
 int
index c00fee5..e7f0035 100644 (file)
@@ -136,5 +136,9 @@ int drm_syncobj_find_fence(struct drm_file *file_private,
                           u32 handle,
                           struct dma_fence **fence);
 void drm_syncobj_free(struct kref *kref);
+int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
+                      struct dma_fence *fence);
+int drm_syncobj_get_handle(struct drm_file *file_private,
+                          struct drm_syncobj *syncobj, u32 *handle);
 
 #endif