Skip to content

Commit

Permalink
media: core: Report the maximum possible number of buffers for the queue
Browse files Browse the repository at this point in the history
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: Benjamin Gaignard <benjamin.gaignard@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
  • Loading branch information
Benjamin Gaignard authored and Mauro Carvalho Chehab committed Nov 23, 2023
1 parent c838530 commit d055a76
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 6 deletions.
8 changes: 6 additions & 2 deletions Documentation/userspace-api/media/v4l/vidioc-create-bufs.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
1 change: 1 addition & 0 deletions Documentation/userspace-api/media/v4l/vidioc-reqbufs.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 2 additions & 0 deletions drivers/media/common/videobuf2/videobuf2-v4l2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
10 changes: 9 additions & 1 deletion drivers/media/v4l2-core/v4l2-compat-ioctl32.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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,
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions drivers/media/v4l2-core/v4l2-ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
7 changes: 6 additions & 1 deletion include/uapi/linux/videodev2.h
Original file line number Diff line number Diff line change
Expand Up @@ -1035,6 +1035,7 @@ struct v4l2_requestbuffers {
#define V4L2_BUF_CAP_SUPPORTS_ORPHANED_BUFS (1 << 4)
#define V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF (1 << 5)
#define V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS (1 << 6)
#define V4L2_BUF_CAP_SUPPORTS_MAX_NUM_BUFFERS (1 << 7)

/**
* struct v4l2_plane - plane info for multi-planar buffers
Expand Down Expand Up @@ -2605,6 +2606,9 @@ struct v4l2_dbg_chip_info {
* @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_buffers {
Expand All @@ -2614,7 +2618,8 @@ struct v4l2_create_buffers {
struct v4l2_format format;
__u32 capabilities;
__u32 flags;
__u32 reserved[6];
__u32 max_num_buffers;
__u32 reserved[5];
};

/*
Expand Down

0 comments on commit d055a76

Please sign in to comment.