omap: add API to import bo's from dmabuf fd's
authorRob Clark <rob@ti.com>
Mon, 11 Jun 2012 22:17:17 +0000 (17:17 -0500)
committerRob Clark <rob@ti.com>
Fri, 13 Jul 2012 21:16:46 +0000 (16:16 -0500)
Signed-off-by: Rob Clark <rob@ti.com>
omap/omap_drm.c
omap/omap_drmif.h

index 464dea9cc5a33a97f74725d883b09104351233d5..1d37e451d903c1c8176de6693400edc2bcfe4ba1 100644 (file)
@@ -218,6 +218,38 @@ fail:
        return NULL;
 }
 
+/* import a buffer from dmabuf fd, does not take ownership of the
+ * fd so caller should close() the fd when it is otherwise done
+ * with it (even if it is still using the 'struct omap_bo *')
+ */
+struct omap_bo * omap_bo_from_dmabuf(struct omap_device *dev, int fd)
+{
+       struct omap_bo *bo;
+       struct drm_prime_handle req = {
+                       .fd = fd,
+       };
+       int ret;
+
+       bo = calloc(sizeof(*bo), 1);
+       if (!bo) {
+               goto fail;
+       }
+
+       ret = drmIoctl(dev->fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &req);
+       if (ret) {
+               goto fail;
+       }
+
+       bo->dev = dev;
+       bo->handle = req.handle;
+
+       return bo;
+
+fail:
+       free(bo);
+       return NULL;
+}
+
 /* destroy a buffer object */
 void omap_bo_del(struct omap_bo *bo)
 {
index 1e03eee14127d4a3c51686bdf2b3bd67ffcfdb4d..284b9cccc467d75661bf55cec2718a5df6b0c3d8 100644 (file)
@@ -50,6 +50,7 @@ struct omap_bo * omap_bo_new(struct omap_device *dev,
 struct omap_bo * omap_bo_new_tiled(struct omap_device *dev,
                uint32_t width, uint32_t height, uint32_t flags);
 struct omap_bo * omap_bo_from_name(struct omap_device *dev, uint32_t name);
+struct omap_bo * omap_bo_from_dmabuf(struct omap_device *dev, int fd);
 void omap_bo_del(struct omap_bo *bo);
 int omap_bo_get_name(struct omap_bo *bo, uint32_t *name);
 uint32_t omap_bo_handle(struct omap_bo *bo);