Commit d055a76c authored by Benjamin Gaignard's avatar Benjamin Gaignard Committed by Mauro Carvalho Chehab
Browse files

media: core: Report the maximum possible number of buffers for the queue



Use one of the struct v4l2_create_buffers reserved bytes to report
the maximum possible number of buffers for the queue.
V4l2 framework set V4L2_BUF_CAP_SUPPORTS_MAX_NUM_BUFFERS flags in queue
capabilities so userland can know when the field is valid.
Does the same change in v4l2_create_buffers32 structure.

Signed-off-by: default avatarBenjamin Gaignard <benjamin.gaignard@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent c838530d
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -116,9 +116,13 @@ than the number requested.
      - ``flags``
      - Specifies additional buffer management attributes.
	See :ref:`memory-flags`.

    * - __u32
      - ``reserved``\ [6]
      - ``max_num_buffers``
      - If the V4L2_BUF_CAP_SUPPORTS_MAX_NUM_BUFFERS capability flag is set
        this field indicates the maximum possible number of buffers
        for this queue.
    * - __u32
      - ``reserved``\ [5]
      - A place holder for future extensions. Drivers and applications
	must set the array to zero.

+1 −0
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ aborting or finishing any DMA in progress, an implicit
.. _V4L2-BUF-CAP-SUPPORTS-ORPHANED-BUFS:
.. _V4L2-BUF-CAP-SUPPORTS-M2M-HOLD-CAPTURE-BUF:
.. _V4L2-BUF-CAP-SUPPORTS-MMAP-CACHE-HINTS:
.. _V4L2-BUF-CAP-SUPPORTS-MAX-NUM-BUFFERS:

.. raw:: latex

+2 −0
Original line number Diff line number Diff line
@@ -756,6 +756,8 @@ int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create)
	fill_buf_caps(q, &create->capabilities);
	validate_memory_flags(q, create->memory, &create->flags);
	create->index = vb2_get_num_buffers(q);
	create->max_num_buffers = q->max_num_buffers;
	create->capabilities |= V4L2_BUF_CAP_SUPPORTS_MAX_NUM_BUFFERS;
	if (create->count == 0)
		return ret != -EBUSY ? ret : 0;

+9 −1
Original line number Diff line number Diff line
@@ -116,6 +116,9 @@ struct v4l2_format32 {
 * @flags:	additional buffer management attributes (ignored unless the
 *		queue has V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS capability and
 *		configured for MMAP streaming I/O).
 * @max_num_buffers: if V4L2_BUF_CAP_SUPPORTS_MAX_NUM_BUFFERS capability flag is set
 *		this field indicate the maximum possible number of buffers
 *		for this queue.
 * @reserved:	future extensions
 */
struct v4l2_create_buffers32 {
@@ -125,7 +128,8 @@ struct v4l2_create_buffers32 {
	struct v4l2_format32	format;
	__u32			capabilities;
	__u32			flags;
	__u32			reserved[6];
	__u32			max_num_buffers;
	__u32			reserved[5];
};

static int get_v4l2_format32(struct v4l2_format *p64,
@@ -175,6 +179,9 @@ static int get_v4l2_create32(struct v4l2_create_buffers *p64,
		return -EFAULT;
	if (copy_from_user(&p64->flags, &p32->flags, sizeof(p32->flags)))
		return -EFAULT;
	if (copy_from_user(&p64->max_num_buffers, &p32->max_num_buffers,
			   sizeof(p32->max_num_buffers)))
		return -EFAULT;
	return get_v4l2_format32(&p64->format, &p32->format);
}

@@ -221,6 +228,7 @@ static int put_v4l2_create32(struct v4l2_create_buffers *p64,
			 offsetof(struct v4l2_create_buffers32, format)) ||
	    put_user(p64->capabilities, &p32->capabilities) ||
	    put_user(p64->flags, &p32->flags) ||
	    put_user(p64->max_num_buffers, &p32->max_num_buffers) ||
	    copy_to_user(p32->reserved, p64->reserved, sizeof(p64->reserved)))
		return -EFAULT;
	return put_v4l2_format32(&p64->format, &p32->format);
+2 −2
Original line number Diff line number Diff line
@@ -483,9 +483,9 @@ static void v4l_print_create_buffers(const void *arg, bool write_only)
{
	const struct v4l2_create_buffers *p = arg;

	pr_cont("index=%d, count=%d, memory=%s, capabilities=0x%08x, ",
	pr_cont("index=%d, count=%d, memory=%s, capabilities=0x%08x, max num buffers=%u",
		p->index, p->count, prt_names(p->memory, v4l2_memory_names),
		p->capabilities);
		p->capabilities, p->max_num_buffers);
	v4l_print_format(&p->format, write_only);
}

Loading