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.stanisl...@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.p...@samsung.com>
---
 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],
+                       dbuf, q->plane_sizes[plane], write);
                if (IS_ERR(mem_priv)) {
                        dprintk(1, "qbuf: failed acquiring dmabuf "
                                "memory for plane %d\n", plane);
@@ -1089,6 +1087,7 @@ static int __qbuf_dmabuf(struct vb2_buffer *vb, const 
struct v4l2_buffer *b)
                        goto err;
                }
 
+               planes[plane].length = dbuf->size;
                vb->planes[plane].dbuf = dbuf;
                vb->planes[plane].mem_priv = mem_priv;
        }
@@ -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);
+               ret = call_memop(q, map_dmabuf, vb->planes[plane].mem_priv);
                if (ret) {
                        dprintk(1, "qbuf: failed mapping dmabuf "
                                "memory for plane %d\n", plane);
@@ -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,
+                               unsigned long size, int write);
        void            (*detach_dmabuf)(void *buf_priv);
-       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);
-- 
1.7.5.4

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to