Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20eedf0e authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

[media] videobuf2-core: call __setup_offsets before buf_init()



Ensure that the offsets are correct before buf_init() is called.
As a consequence the __setup_offsets() function now sets up the
offsets for the given buffer instead of for all new buffers.

Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent e32f856a
Loading
Loading
Loading
Loading
+16 −26
Original line number Diff line number Diff line
@@ -288,39 +288,31 @@ static void __vb2_buf_dmabuf_put(struct vb2_buffer *vb)

/**
 * __setup_offsets() - setup unique offsets ("cookies") for every plane in
 * every buffer on the queue
 * the buffer.
 */
static void __setup_offsets(struct vb2_queue *q, unsigned int n)
static void __setup_offsets(struct vb2_buffer *vb)
{
	unsigned int buffer, plane;
	struct vb2_buffer *vb;
	unsigned long off;
	struct vb2_queue *q = vb->vb2_queue;
	unsigned int plane;
	unsigned long off = 0;

	if (vb->index) {
		struct vb2_buffer *prev = q->bufs[vb->index - 1];
		struct vb2_plane *p = &prev->planes[prev->num_planes - 1];

	if (q->num_buffers) {
		struct vb2_plane *p;
		vb = q->bufs[q->num_buffers - 1];
		p = &vb->planes[vb->num_planes - 1];
		off = PAGE_ALIGN(p->m.offset + p->length);
	} else {
		off = 0;
	}

	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->planes[plane].m.offset = off;

		dprintk(3, "buffer %d, plane %d offset 0x%08lx\n",
					buffer, plane, off);
				vb->index, plane, off);

		off += vb->planes[plane].length;
		off = PAGE_ALIGN(off);
	}
}
}

/**
 * __vb2_queue_alloc() - allocate videobuf buffer structures and (for MMAP type)
@@ -364,6 +356,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
				q->bufs[vb->index] = NULL;
				break;
			}
			__setup_offsets(vb);
			/*
			 * Call the driver-provided buffer initialization
			 * callback, if given. An error in initialization
@@ -381,9 +374,6 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
		}
	}

	if (memory == VB2_MEMORY_MMAP)
		__setup_offsets(q, buffer);

	dprintk(1, "allocated %d buffers, %d plane(s) each\n",
			buffer, num_planes);