| From 74ac8bd3b5c6ed23308341fa41681db6a3b45c46 Mon Sep 17 00:00:00 2001 |
| From: Dave Stevenson <dave.stevenson@raspberrypi.org> |
| Date: Mon, 29 Oct 2018 17:57:45 +0000 |
| Subject: [PATCH] media: videobuf2: Allow exporting of a struct dmabuf |
| |
| videobuf2 only allowed exporting a dmabuf as a file descriptor, |
| but there are instances where having the struct dma_buf is |
| useful within the kernel. |
| |
| Split the current implementation into two, one step which |
| exports a struct dma_buf, and the second which converts that |
| into an fd. |
| |
| Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org> |
| --- |
| .../media/common/videobuf2/videobuf2-core.c | 21 ++++++++++++++++--- |
| include/media/videobuf2-core.h | 15 +++++++++++++ |
| 2 files changed, 33 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/media/common/videobuf2/videobuf2-core.c |
| +++ b/drivers/media/common/videobuf2/videobuf2-core.c |
| @@ -2084,12 +2084,12 @@ static int __find_plane_by_offset(struct |
| return -EINVAL; |
| } |
| |
| -int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type, |
| - unsigned int index, unsigned int plane, unsigned int flags) |
| +int vb2_core_expbuf_dmabuf(struct vb2_queue *q, unsigned int type, |
| + unsigned int index, unsigned int plane, |
| + unsigned int flags, struct dma_buf **dmabuf) |
| { |
| struct vb2_buffer *vb = NULL; |
| struct vb2_plane *vb_plane; |
| - int ret; |
| struct dma_buf *dbuf; |
| |
| if (q->memory != VB2_MEMORY_MMAP) { |
| @@ -2139,6 +2139,21 @@ int vb2_core_expbuf(struct vb2_queue *q, |
| return -EINVAL; |
| } |
| |
| + *dmabuf = dbuf; |
| + return 0; |
| +} |
| +EXPORT_SYMBOL_GPL(vb2_core_expbuf_dmabuf); |
| + |
| +int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type, |
| + unsigned int index, unsigned int plane, unsigned int flags) |
| +{ |
| + struct dma_buf *dbuf; |
| + int ret; |
| + |
| + ret = vb2_core_expbuf_dmabuf(q, type, index, plane, flags, &dbuf); |
| + if (ret) |
| + return ret; |
| + |
| ret = dma_buf_fd(dbuf, flags & ~O_ACCMODE); |
| if (ret < 0) { |
| dprintk(3, "buffer %d, plane %d failed to export (%d)\n", |
| --- a/include/media/videobuf2-core.h |
| +++ b/include/media/videobuf2-core.h |
| @@ -870,6 +870,21 @@ int vb2_core_streamon(struct vb2_queue * |
| int vb2_core_streamoff(struct vb2_queue *q, unsigned int type); |
| |
| /** |
| + * vb2_core_expbuf_dmabuf() - Export a buffer as a dma_buf structure |
| + * @q: videobuf2 queue |
| + * @type: buffer type |
| + * @index: id number of the buffer |
| + * @plane: index of the plane to be exported, 0 for single plane queues |
| + * @flags: flags for newly created file, currently only O_CLOEXEC is |
| + * supported, refer to manual of open syscall for more details |
| + * @dmabuf: Returns the dmabuf pointer |
| + * |
| + */ |
| +int vb2_core_expbuf_dmabuf(struct vb2_queue *q, unsigned int type, |
| + unsigned int index, unsigned int plane, |
| + unsigned int flags, struct dma_buf **dmabuf); |
| + |
| +/** |
| * vb2_core_expbuf() - Export a buffer as a file descriptor. |
| * @q: pointer to &struct vb2_queue with videobuf2 queue. |
| * @fd: pointer to the file descriptor associated with DMABUF |