Commit 3aac4502 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Greg Kroah-Hartman
Browse files

dma-buf: use reservation objects



This allows reservation objects to be used in dma-buf. it's required
for implementing polling support on the fences that belong to a dma-buf.

Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@canonical.com>
Acked-by: Mauro Carvalho Chehab <m.chehab@samsung.com> #drivers/media/v4l2-core/
Acked-by: Thomas Hellstrom <thellstrom@vmware.com> #drivers/gpu/drm/ttm
Acked-by: default avatarSumit Semwal <sumit.semwal@linaro.org>
Acked-by: default avatarDaniel Vetter <daniel@ffwll.ch>
Signed-off-by: Vincent Stehlé <vincent.stehle@laposte.net> #drivers/gpu/drm/armada/
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 606b23ad
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -25,10 +25,12 @@
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/dma-buf.h>
#include <linux/fence.h>
#include <linux/anon_inodes.h>
#include <linux/export.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
#include <linux/reservation.h>

static inline int is_dma_buf_file(struct file *);

@@ -56,6 +58,9 @@ static int dma_buf_release(struct inode *inode, struct file *file)
	list_del(&dmabuf->list_node);
	mutex_unlock(&db_list.lock);

	if (dmabuf->resv == (struct reservation_object *)&dmabuf[1])
		reservation_object_fini(dmabuf->resv);

	kfree(dmabuf);
	return 0;
}
@@ -128,6 +133,7 @@ static inline int is_dma_buf_file(struct file *file)
 * @size:	[in]	Size of the buffer
 * @flags:	[in]	mode flags for the file.
 * @exp_name:	[in]	name of the exporting module - useful for debugging.
 * @resv:	[in]	reservation-object, NULL to allocate default one.
 *
 * Returns, on success, a newly created dma_buf object, which wraps the
 * supplied private data and operations for dma_buf_ops. On either missing
@@ -135,10 +141,17 @@ static inline int is_dma_buf_file(struct file *file)
 *
 */
struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
				size_t size, int flags, const char *exp_name)
				size_t size, int flags, const char *exp_name,
				struct reservation_object *resv)
{
	struct dma_buf *dmabuf;
	struct file *file;
	size_t alloc_size = sizeof(struct dma_buf);
	if (!resv)
		alloc_size += sizeof(struct reservation_object);
	else
		/* prevent &dma_buf[1] == dma_buf->resv */
		alloc_size += 1;

	if (WARN_ON(!priv || !ops
			  || !ops->map_dma_buf
@@ -150,7 +163,7 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
		return ERR_PTR(-EINVAL);
	}

	dmabuf = kzalloc(sizeof(struct dma_buf), GFP_KERNEL);
	dmabuf = kzalloc(alloc_size, GFP_KERNEL);
	if (dmabuf == NULL)
		return ERR_PTR(-ENOMEM);

@@ -158,6 +171,11 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
	dmabuf->ops = ops;
	dmabuf->size = size;
	dmabuf->exp_name = exp_name;
	if (!resv) {
		resv = (struct reservation_object *)&dmabuf[1];
		reservation_object_init(resv);
	}
	dmabuf->resv = resv;

	file = anon_inode_getfile("dmabuf", &dma_buf_fops, dmabuf, flags);
	if (IS_ERR(file)) {
+1 −1
Original line number Diff line number Diff line
@@ -539,7 +539,7 @@ armada_gem_prime_export(struct drm_device *dev, struct drm_gem_object *obj,
	int flags)
{
	return dma_buf_export(obj, &armada_gem_prime_dmabuf_ops, obj->size,
			      O_RDWR);
			      O_RDWR, NULL);
}

struct drm_gem_object *
+7 −1
Original line number Diff line number Diff line
@@ -336,7 +336,13 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops = {
struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
				     struct drm_gem_object *obj, int flags)
{
	return dma_buf_export(obj, &drm_gem_prime_dmabuf_ops, obj->size, flags);
	struct reservation_object *robj = NULL;

	if (dev->driver->gem_prime_res_obj)
		robj = dev->driver->gem_prime_res_obj(obj);

	return dma_buf_export(obj, &drm_gem_prime_dmabuf_ops, obj->size,
			      flags, robj);
}
EXPORT_SYMBOL(drm_gem_prime_export);

+1 −1
Original line number Diff line number Diff line
@@ -187,7 +187,7 @@ struct dma_buf *exynos_dmabuf_prime_export(struct drm_device *drm_dev,
	struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);

	return dma_buf_export(obj, &exynos_dmabuf_ops,
				exynos_gem_obj->base.size, flags);
				exynos_gem_obj->base.size, flags, NULL);
}

struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev,
+2 −1
Original line number Diff line number Diff line
@@ -237,7 +237,8 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
			return ERR_PTR(ret);
	}

	return dma_buf_export(gem_obj, &i915_dmabuf_ops, gem_obj->size, flags);
	return dma_buf_export(gem_obj, &i915_dmabuf_ops, gem_obj->size, flags,
			      NULL);
}

static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj)
Loading