diff options
author | Tomasz Stanislawski <t.stanislaws@samsung.com> | 2012-06-14 09:37:46 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-11-25 14:18:58 -0500 |
commit | 89d2ee08909836b218de6d5baa99a56a9df05a6e (patch) | |
tree | 9d4f3ced258a3057f1a9d534a0697a195560a064 | |
parent | 8c417d03a840f6c0b15e141e6e721b16a5f5d81d (diff) |
[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>
-rw-r--r-- | drivers/media/v4l2-core/Kconfig | 1 | ||||
-rw-r--r-- | drivers/media/v4l2-core/videobuf2-vmalloc.c | 56 |
2 files changed, 57 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/Kconfig b/drivers/media/v4l2-core/Kconfig index e30583b88420..65875c3aba1b 100644 --- a/drivers/media/v4l2-core/Kconfig +++ b/drivers/media/v4l2-core/Kconfig | |||
@@ -75,6 +75,7 @@ config VIDEOBUF2_VMALLOC | |||
75 | tristate | 75 | tristate |
76 | select VIDEOBUF2_CORE | 76 | select VIDEOBUF2_CORE |
77 | select VIDEOBUF2_MEMOPS | 77 | select VIDEOBUF2_MEMOPS |
78 | select DMA_SHARED_BUFFER | ||
78 | 79 | ||
79 | config VIDEOBUF2_DMA_SG | 80 | config VIDEOBUF2_DMA_SG |
80 | tristate | 81 | tristate |
diff --git a/drivers/media/v4l2-core/videobuf2-vmalloc.c b/drivers/media/v4l2-core/videobuf2-vmalloc.c index 94efa04d8d55..a47fd4f589a1 100644 --- a/drivers/media/v4l2-core/videobuf2-vmalloc.c +++ b/drivers/media/v4l2-core/videobuf2-vmalloc.c | |||
@@ -30,6 +30,7 @@ struct vb2_vmalloc_buf { | |||
30 | unsigned int n_pages; | 30 | unsigned int n_pages; |
31 | atomic_t refcount; | 31 | atomic_t refcount; |
32 | struct vb2_vmarea_handler handler; | 32 | struct vb2_vmarea_handler handler; |
33 | struct dma_buf *dbuf; | ||
33 | }; | 34 | }; |
34 | 35 | ||
35 | static void vb2_vmalloc_put(void *buf_priv); | 36 | 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) | |||
207 | return 0; | 208 | return 0; |
208 | } | 209 | } |
209 | 210 | ||
211 | /*********************************************/ | ||
212 | /* callbacks for DMABUF buffers */ | ||
213 | /*********************************************/ | ||
214 | |||
215 | static int vb2_vmalloc_map_dmabuf(void *mem_priv) | ||
216 | { | ||
217 | struct vb2_vmalloc_buf *buf = mem_priv; | ||
218 | |||
219 | buf->vaddr = dma_buf_vmap(buf->dbuf); | ||
220 | |||
221 | return buf->vaddr ? 0 : -EFAULT; | ||
222 | } | ||
223 | |||
224 | static void vb2_vmalloc_unmap_dmabuf(void *mem_priv) | ||
225 | { | ||
226 | struct vb2_vmalloc_buf *buf = mem_priv; | ||
227 | |||
228 | dma_buf_vunmap(buf->dbuf, buf->vaddr); | ||
229 | buf->vaddr = NULL; | ||
230 | } | ||
231 | |||
232 | static void vb2_vmalloc_detach_dmabuf(void *mem_priv) | ||
233 | { | ||
234 | struct vb2_vmalloc_buf *buf = mem_priv; | ||
235 | |||
236 | if (buf->vaddr) | ||
237 | dma_buf_vunmap(buf->dbuf, buf->vaddr); | ||
238 | |||
239 | kfree(buf); | ||
240 | } | ||
241 | |||
242 | static void *vb2_vmalloc_attach_dmabuf(void *alloc_ctx, struct dma_buf *dbuf, | ||
243 | unsigned long size, int write) | ||
244 | { | ||
245 | struct vb2_vmalloc_buf *buf; | ||
246 | |||
247 | if (dbuf->size < size) | ||
248 | return ERR_PTR(-EFAULT); | ||
249 | |||
250 | buf = kzalloc(sizeof(*buf), GFP_KERNEL); | ||
251 | if (!buf) | ||
252 | return ERR_PTR(-ENOMEM); | ||
253 | |||
254 | buf->dbuf = dbuf; | ||
255 | buf->write = write; | ||
256 | buf->size = size; | ||
257 | |||
258 | return buf; | ||
259 | } | ||
260 | |||
261 | |||
210 | const struct vb2_mem_ops vb2_vmalloc_memops = { | 262 | const struct vb2_mem_ops vb2_vmalloc_memops = { |
211 | .alloc = vb2_vmalloc_alloc, | 263 | .alloc = vb2_vmalloc_alloc, |
212 | .put = vb2_vmalloc_put, | 264 | .put = vb2_vmalloc_put, |
213 | .get_userptr = vb2_vmalloc_get_userptr, | 265 | .get_userptr = vb2_vmalloc_get_userptr, |
214 | .put_userptr = vb2_vmalloc_put_userptr, | 266 | .put_userptr = vb2_vmalloc_put_userptr, |
267 | .map_dmabuf = vb2_vmalloc_map_dmabuf, | ||
268 | .unmap_dmabuf = vb2_vmalloc_unmap_dmabuf, | ||
269 | .attach_dmabuf = vb2_vmalloc_attach_dmabuf, | ||
270 | .detach_dmabuf = vb2_vmalloc_detach_dmabuf, | ||
215 | .vaddr = vb2_vmalloc_vaddr, | 271 | .vaddr = vb2_vmalloc_vaddr, |
216 | .mmap = vb2_vmalloc_mmap, | 272 | .mmap = vb2_vmalloc_mmap, |
217 | .num_users = vb2_vmalloc_num_users, | 273 | .num_users = vb2_vmalloc_num_users, |