]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: nvmap: Support importer private
authorArto Merilainen <amerilainen@nvidia.com>
Tue, 25 Feb 2014 12:46:16 +0000 (14:46 +0200)
committerTerje Bergstrom <tbergstrom@nvidia.com>
Thu, 27 Feb 2014 06:35:43 +0000 (22:35 -0800)
This patch adds importer private support to nvmap. The private data
is stored to the same location with nvhost private data.

Bug 1450489

Change-Id: Id05574703985dd2991a53a1e9ce726d6471e8370
Signed-off-by: Arto Merilainen <amerilainen@nvidia.com>
Reviewed-on: http://git-master/r/374267
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
drivers/video/tegra/nvmap/nvmap_dmabuf.c

index 9d4ce803b6f9929287710da6f90ec4931eff12ef..9723d8578af655c8e15918de94aeb02fcb2dd027 100644 (file)
@@ -79,6 +79,7 @@ struct nvmap_handle_sgt {
 static DEFINE_MUTEX(nvmap_stashed_maps_lock);
 static LIST_HEAD(nvmap_stashed_maps);
 static struct kmem_cache *handle_sgt_cache;
+static struct dma_buf_ops nvmap_dma_buf_ops;
 
 /*
  * Initialize a kmem cache for allocating nvmap_handle_sgt's.
@@ -522,6 +523,41 @@ static void nvmap_dmabuf_vunmap(struct dma_buf *dmabuf, void *vaddr)
        __nvmap_munmap(info->handle, vaddr);
 }
 
+static int nvmap_dmabuf_set_private(struct dma_buf *dmabuf,
+               struct device *dev, void *priv, void (*delete)(void *priv))
+{
+       struct nvmap_handle_info *info;
+
+       if (WARN_ON(dmabuf->ops != &nvmap_dma_buf_ops))
+               return -EINVAL;
+
+       if (WARN_ON(!virt_addr_valid(dmabuf)))
+               return -EINVAL;
+
+       info = dmabuf->priv;
+       info->handle->nvhost_priv = priv;
+       info->handle->nvhost_priv_delete = delete;
+
+       return 0;
+}
+
+static void *nvmap_dmabuf_get_private(struct dma_buf *dmabuf,
+               struct device *dev)
+{
+       void *priv;
+       struct nvmap_handle_info *info;
+
+       if (WARN_ON(dmabuf->ops != &nvmap_dma_buf_ops))
+               return ERR_PTR(-EINVAL);
+
+       if (WARN_ON(!virt_addr_valid(dmabuf)))
+               return ERR_PTR(-EINVAL);
+
+       info = dmabuf->priv;
+       priv = info->handle->nvhost_priv;
+       return priv;
+}
+
 static struct dma_buf_ops nvmap_dma_buf_ops = {
        .attach         = nvmap_dmabuf_attach,
        .detach         = nvmap_dmabuf_detach,
@@ -536,6 +572,8 @@ static struct dma_buf_ops nvmap_dma_buf_ops = {
        .mmap           = nvmap_dmabuf_mmap,
        .vmap           = nvmap_dmabuf_vmap,
        .vunmap         = nvmap_dmabuf_vunmap,
+       .set_drvdata    = nvmap_dmabuf_set_private,
+       .get_drvdata    = nvmap_dmabuf_get_private,
 };
 
 /*