mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 09:19:51 +00:00
[media] v4l: vb2-vmalloc: add support for dmabuf importing
This patch adds support for importing DMABUF files for vmalloc allocator in Videobuf2. Signed-off-by: Tomasz Stanislawski <t.stanislaws@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Hans Verkuil <hans.verkuil@cisco.com> Tested-by: Mauro Carvalho Chehab <mchehab@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
8c417d03a8
commit
89d2ee0890
2 changed files with 57 additions and 0 deletions
|
@ -75,6 +75,7 @@ config VIDEOBUF2_VMALLOC
|
|||
tristate
|
||||
select VIDEOBUF2_CORE
|
||||
select VIDEOBUF2_MEMOPS
|
||||
select DMA_SHARED_BUFFER
|
||||
|
||||
config VIDEOBUF2_DMA_SG
|
||||
tristate
|
||||
|
|
|
@ -30,6 +30,7 @@ struct vb2_vmalloc_buf {
|
|||
unsigned int n_pages;
|
||||
atomic_t refcount;
|
||||
struct vb2_vmarea_handler handler;
|
||||
struct dma_buf *dbuf;
|
||||
};
|
||||
|
||||
static void vb2_vmalloc_put(void *buf_priv);
|
||||
|
@ -207,11 +208,66 @@ static int vb2_vmalloc_mmap(void *buf_priv, struct vm_area_struct *vma)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*********************************************/
|
||||
/* callbacks for DMABUF buffers */
|
||||
/*********************************************/
|
||||
|
||||
static int vb2_vmalloc_map_dmabuf(void *mem_priv)
|
||||
{
|
||||
struct vb2_vmalloc_buf *buf = mem_priv;
|
||||
|
||||
buf->vaddr = dma_buf_vmap(buf->dbuf);
|
||||
|
||||
return buf->vaddr ? 0 : -EFAULT;
|
||||
}
|
||||
|
||||
static void vb2_vmalloc_unmap_dmabuf(void *mem_priv)
|
||||
{
|
||||
struct vb2_vmalloc_buf *buf = mem_priv;
|
||||
|
||||
dma_buf_vunmap(buf->dbuf, buf->vaddr);
|
||||
buf->vaddr = NULL;
|
||||
}
|
||||
|
||||
static void vb2_vmalloc_detach_dmabuf(void *mem_priv)
|
||||
{
|
||||
struct vb2_vmalloc_buf *buf = mem_priv;
|
||||
|
||||
if (buf->vaddr)
|
||||
dma_buf_vunmap(buf->dbuf, buf->vaddr);
|
||||
|
||||
kfree(buf);
|
||||
}
|
||||
|
||||
static void *vb2_vmalloc_attach_dmabuf(void *alloc_ctx, struct dma_buf *dbuf,
|
||||
unsigned long size, int write)
|
||||
{
|
||||
struct vb2_vmalloc_buf *buf;
|
||||
|
||||
if (dbuf->size < size)
|
||||
return ERR_PTR(-EFAULT);
|
||||
|
||||
buf = kzalloc(sizeof(*buf), GFP_KERNEL);
|
||||
if (!buf)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
buf->dbuf = dbuf;
|
||||
buf->write = write;
|
||||
buf->size = size;
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
const struct vb2_mem_ops vb2_vmalloc_memops = {
|
||||
.alloc = vb2_vmalloc_alloc,
|
||||
.put = vb2_vmalloc_put,
|
||||
.get_userptr = vb2_vmalloc_get_userptr,
|
||||
.put_userptr = vb2_vmalloc_put_userptr,
|
||||
.map_dmabuf = vb2_vmalloc_map_dmabuf,
|
||||
.unmap_dmabuf = vb2_vmalloc_unmap_dmabuf,
|
||||
.attach_dmabuf = vb2_vmalloc_attach_dmabuf,
|
||||
.detach_dmabuf = vb2_vmalloc_detach_dmabuf,
|
||||
.vaddr = vb2_vmalloc_vaddr,
|
||||
.mmap = vb2_vmalloc_mmap,
|
||||
.num_users = vb2_vmalloc_num_users,
|
||||
|
|
Loading…
Reference in a new issue