@@ -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)
@@ -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,