Hi Tomasz,
Thanks for the patch.
On Tuesday 13 March 2012 11:16:59 Tomasz Stanislawski wrote:
This patch contains fixes to DMABUF support in vb2-core.
- fixes number of arguments of call_memop macro
- fixes setup of plane length
- fixes handling of error pointers
Signed-off-by: Tomasz Stanislawski t.stanislaws@samsung.com Signed-off-by: Kyungmin Park kyungmin.park@samsung.com
Tested-by: Laurent Pinchart laurent.pinchart@ideasonboard.com
I suppose this will be squashed with Sumit's "[RFCv1 2/4] v4l:vb2: add support for shared buffer (dma_buf)" patch.
drivers/media/video/videobuf2-core.c | 24 +++++++++++------------- include/media/videobuf2-core.h | 6 +++--- 2 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/drivers/media/video/videobuf2-core.c b/drivers/media/video/videobuf2-core.c index 951cb56..e7df560 100644 --- a/drivers/media/video/videobuf2-core.c +++ b/drivers/media/video/videobuf2-core.c @@ -118,7 +118,7 @@ static void __vb2_buf_dmabuf_put(struct vb2_buffer *vb) void *mem_priv = vb->planes[plane].mem_priv;
if (mem_priv) {
call_memop(q, plane, detach_dmabuf, mem_priv);
call_memop(q, detach_dmabuf, mem_priv); dma_buf_put(vb->planes[plane].dbuf); vb->planes[plane].dbuf = NULL; vb->planes[plane].mem_priv = NULL;
@@ -905,6 +905,8 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b, } if (b->memory == V4L2_MEMORY_DMABUF) { for (plane = 0; plane < vb->num_planes; ++plane) {
v4l2_planes[plane].bytesused =
}b->m.planes[plane].bytesused; v4l2_planes[plane].m.fd = b->m.planes[plane].m.fd; }
@@ -1052,17 +1054,13 @@ static int __qbuf_dmabuf(struct vb2_buffer *vb, const struct v4l2_buffer *b) if (IS_ERR_OR_NULL(dbuf)) { dprintk(1, "qbuf: invalid dmabuf fd for " "plane %d\n", plane);
ret = PTR_ERR(dbuf);
}ret = -EINVAL; goto err;
/* this doesn't get filled in until __fill_vb2_buffer(),
* since it isn't known until after dma_buf_get()..
*/
planes[plane].length = dbuf->size;
- /* Skip the plane if already verified */ if (dbuf == vb->planes[plane].dbuf) {
}planes[plane].length = dbuf->size; dma_buf_put(dbuf); continue;
@@ -1072,7 +1070,7 @@ static int __qbuf_dmabuf(struct vb2_buffer *vb, const struct v4l2_buffer *b)
/* Release previously acquired memory if present */ if (vb->planes[plane].mem_priv) {
call_memop(q, plane, detach_dmabuf,
}call_memop(q, detach_dmabuf, vb->planes[plane].mem_priv); dma_buf_put(vb->planes[plane].dbuf);
@@ -1080,8 +1078,8 @@ static int __qbuf_dmabuf(struct vb2_buffer *vb, const struct v4l2_buffer *b) vb->planes[plane].mem_priv = NULL;
/* Acquire each plane's memory */
mem_priv = q->mem_ops->attach_dmabuf(
q->alloc_ctx[plane], dbuf);
mem_priv = call_memop(q, attach_dmabuf, q->alloc_ctx[plane],
if (IS_ERR(mem_priv)) { dprintk(1, "qbuf: failed acquiring dmabuf " "memory for plane %d\n", plane);dbuf, q->plane_sizes[plane], write);
@@ -1089,6 +1087,7 @@ static int __qbuf_dmabuf(struct vb2_buffer *vb, const struct v4l2_buffer *b) goto err; }
vb->planes[plane].dbuf = dbuf; vb->planes[plane].mem_priv = mem_priv; }planes[plane].length = dbuf->size;
@@ -1098,8 +1097,7 @@ static int __qbuf_dmabuf(struct vb2_buffer *vb, const struct v4l2_buffer *b) * the buffer(s).. */ for (plane = 0; plane < vb->num_planes; ++plane) {
ret = q->mem_ops->map_dmabuf(
vb->planes[plane].mem_priv, write);
if (ret) { dprintk(1, "qbuf: failed mapping dmabuf " "memory for plane %d\n", plane);ret = call_memop(q, map_dmabuf, vb->planes[plane].mem_priv);
@@ -1527,7 +1525,7 @@ int vb2_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking) */ if (q->memory == V4L2_MEMORY_DMABUF) for (plane = 0; plane < vb->num_planes; ++plane)
call_memop(q, plane, unmap_dmabuf,
call_memop(q, unmap_dmabuf, vb->planes[plane].mem_priv);
switch (vb->state) {
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h index d8b8171..412c6a4 100644 --- a/include/media/videobuf2-core.h +++ b/include/media/videobuf2-core.h @@ -88,10 +88,10 @@ struct vb2_mem_ops { * in the vb2 core, and vb2_mem_ops really just need to get/put the * sglist (and make sure that the sglist fits it's needs..) */
- void *(*attach_dmabuf)(void *alloc_ctx,
struct dma_buf *dbuf);
- void *(*attach_dmabuf)(void *alloc_ctx, struct dma_buf *dbuf,
void (*detach_dmabuf)(void *buf_priv);unsigned long size, int write);
- int (*map_dmabuf)(void *buf_priv, int write);
int (*map_dmabuf)(void *buf_priv); void (*unmap_dmabuf)(void *buf_priv);
void *(*vaddr)(void *buf_priv);