mirror of
https://github.com/torvalds/linux.git
synced 2024-11-01 09:41:44 +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
@ -75,6 +75,7 @@ config VIDEOBUF2_VMALLOC
|
|||||||
tristate
|
tristate
|
||||||
select VIDEOBUF2_CORE
|
select VIDEOBUF2_CORE
|
||||||
select VIDEOBUF2_MEMOPS
|
select VIDEOBUF2_MEMOPS
|
||||||
|
select DMA_SHARED_BUFFER
|
||||||
|
|
||||||
config VIDEOBUF2_DMA_SG
|
config VIDEOBUF2_DMA_SG
|
||||||
tristate
|
tristate
|
||||||
|
@ -30,6 +30,7 @@ struct vb2_vmalloc_buf {
|
|||||||
unsigned int n_pages;
|
unsigned int n_pages;
|
||||||
atomic_t refcount;
|
atomic_t refcount;
|
||||||
struct vb2_vmarea_handler handler;
|
struct vb2_vmarea_handler handler;
|
||||||
|
struct dma_buf *dbuf;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void vb2_vmalloc_put(void *buf_priv);
|
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;
|
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 = {
|
const struct vb2_mem_ops vb2_vmalloc_memops = {
|
||||||
.alloc = vb2_vmalloc_alloc,
|
.alloc = vb2_vmalloc_alloc,
|
||||||
.put = vb2_vmalloc_put,
|
.put = vb2_vmalloc_put,
|
||||||
.get_userptr = vb2_vmalloc_get_userptr,
|
.get_userptr = vb2_vmalloc_get_userptr,
|
||||||
.put_userptr = vb2_vmalloc_put_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,
|
.vaddr = vb2_vmalloc_vaddr,
|
||||||
.mmap = vb2_vmalloc_mmap,
|
.mmap = vb2_vmalloc_mmap,
|
||||||
.num_users = vb2_vmalloc_num_users,
|
.num_users = vb2_vmalloc_num_users,
|
||||||
|
Loading…
Reference in New Issue
Block a user