vb2: regression fix: always set length field.
PATCH 1/1 vb2: regression fix: always set length field.
Commit dc77523c5da5513df1bbc74db2a522a94f4cec0e ensured that m.offset is only set for the MMAP memory mode by calling __setup_offsets only for that mode.
However, __setup_offsets also initializes the length fields, and that should be done regardless of the memory mode. Because of that change the v4l2-ctl test application fails for the USERPTR mode.
This fix creates a __setup_lengths function that sets the length, and __setup_offsets just sets the offset and no longer touches the length.
--- drivers/media/v4l2-core/videobuf2-core.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)
drivers/media/v4l2-core/videobuf2-core.c +20 -1
@@ -145,6 +145,25 @@ static void __vb2_buf_dmabuf_put(struct vb2_buffer *vb) }/** +* __setup_lengths() - setup initial lengths for every plane in +* every buffer on the queue +*/ +static void __setup_lengths (struct vb2_queue *q,unsigned int n) +{ +unsigned int buffer, plane; +struct vb2_buffer *vb; + +for (buffer = q->num_buffers; buffer < q->num_buffers + n; ++buffer) { + vb = q->bufs[buffer]; +if (!vb) +continue ; + +for (plane =0 ; plane < vb->num_planes; ++plane) + vb->v4l2_planes[plane].length = q->plane_sizes[plane]; + } +} + +/** * __setup_offsets() - setup unique offsets ("cookies") for every plane in * every buffer on the queue */
@@ -169,7 +188,6 @@ static void __setup_offsets(struct vb2_queue *q, unsigned int n)continue ;for (plane =0 ; plane < vb->num_planes; ++plane) { - vb->v4l2_planes[plane].length = q->plane_sizes[plane]; vb->v4l2_planes[plane].m.mem_offset = off; dprintk(3, "Buffer %d, plane %d offset 0x%08lx\n",
@@ -241,6 +259,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum v4l2_memory memory, q->bufs[q->num_buffers + buffer] = vb; } +__setup_lengths (q, buffer);if (memory ==V4L2_MEMORY_MMAP )__setup_offsets (q, buffer);
Signature · 1 line
1.8.4.rc3
Hello,
Quoted 4 lines · Hans Verkuil
Commit
dc77523c5da5513df1bbc74db2a522a94f4cec0eensured that m.offset is only set for the MMAP memory mode by calling__setup_offsetsonly for that mode.
Quoted 8 lines
However,
__setup_offsetsalso initializes the length fields, and that should be done regardless of the memory mode. Because of that change the v4l2-ctl test application fails for the USERPTR mode.This fix creates a
__setup_lengthsfunction that sets the length, and__setup_offsetsjust sets the offset and no longer touches the length.Signed-off-by Hans Verkuil <[email protected]>
Quoted 43 lines
--- drivers/media/v4l2-core/videobuf2-core.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)drivers/media/v4l2-core/videobuf2-core.c +19
-1@@ -145,6 +145,25 @@ static void __vb2_buf_dmabuf_put(struct vb2_buffer *vb) }/** +* __setup_lengths() - setup initial lengths for every plane in +* every buffer on the queue +*/ +static void __setup_lengths (struct vb2_queue *q,unsigned int n) +{ +unsigned int buffer, plane; +struct vb2_buffer *vb; + +for (buffer = q->num_buffers; buffer < q->num_buffers + n; ++buffer) { + vb = q->bufs[buffer]; +if (!vb) +continue ; + +for (plane =0 ; plane < vb->num_planes; ++plane) + vb->v4l2_planes[plane].length = q->plane_sizes[plane]; + } +} + +/** * __setup_offsets() - setup unique offsets ("cookies") for every plane in * every buffer on the queue */ @@ -169,7 +188,6 @@ static void __setup_offsets(struct vb2_queue *q, unsigned int n)continue ;for (plane =0 ; plane < vb->num_planes; ++plane) { - vb->v4l2_planes[plane].length = q->plane_sizes[plane]; vb->v4l2_planes[plane].m.mem_offset = off; dprintk(3, "Buffer %d, plane %d offset 0x%08lx\n",
drivers/media/v4l2-core/videobuf2-core.c static int __vb2_queue_alloc(struct vb2_queue *q, enum v4l2_memory memory, · line 265
Quoted 7 lines
drivers/media/v4l2-core/videobuf2-core.c +1
-0@@ -241,6 +259,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum v4l2_memory memory, q->bufs[q->num_buffers + buffer] = vb; } +__setup_lengths (q, buffer);if (memory ==V4L2_MEMORY_MMAP )__setup_offsets (q, buffer);
Best regards
Signature · 2 lines
Marek Szyprowski, PhD Samsung R&D Institute Poland