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: Benjamin Gaignard <benjamin.gaignard@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
Benjamin Gaignard 2023-11-09 17:35:00 +01:00 committed by Mauro Carvalho Chehab
parent c838530d23
commit d055a76c00
6 changed files with 26 additions and 6 deletions

View File

@ -116,9 +116,13 @@ than the number requested.
- ``flags`` - ``flags``
- Specifies additional buffer management attributes. - Specifies additional buffer management attributes.
See :ref:`memory-flags`. See :ref:`memory-flags`.
* - __u32 * - __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 - A place holder for future extensions. Drivers and applications
must set the array to zero. must set the array to zero.

View File

@ -120,6 +120,7 @@ aborting or finishing any DMA in progress, an implicit
.. _V4L2-BUF-CAP-SUPPORTS-ORPHANED-BUFS: .. _V4L2-BUF-CAP-SUPPORTS-ORPHANED-BUFS:
.. _V4L2-BUF-CAP-SUPPORTS-M2M-HOLD-CAPTURE-BUF: .. _V4L2-BUF-CAP-SUPPORTS-M2M-HOLD-CAPTURE-BUF:
.. _V4L2-BUF-CAP-SUPPORTS-MMAP-CACHE-HINTS: .. _V4L2-BUF-CAP-SUPPORTS-MMAP-CACHE-HINTS:
.. _V4L2-BUF-CAP-SUPPORTS-MAX-NUM-BUFFERS:
.. raw:: latex .. raw:: latex

View File

@ -756,6 +756,8 @@ int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create)
fill_buf_caps(q, &create->capabilities); fill_buf_caps(q, &create->capabilities);
validate_memory_flags(q, create->memory, &create->flags); validate_memory_flags(q, create->memory, &create->flags);
create->index = vb2_get_num_buffers(q); 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) if (create->count == 0)
return ret != -EBUSY ? ret : 0; return ret != -EBUSY ? ret : 0;

View File

@ -116,6 +116,9 @@ struct v4l2_format32 {
* @flags: additional buffer management attributes (ignored unless the * @flags: additional buffer management attributes (ignored unless the
* queue has V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS capability and * queue has V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS capability and
* configured for MMAP streaming I/O). * 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 * @reserved: future extensions
*/ */
struct v4l2_create_buffers32 { struct v4l2_create_buffers32 {
@ -125,7 +128,8 @@ struct v4l2_create_buffers32 {
struct v4l2_format32 format; struct v4l2_format32 format;
__u32 capabilities; __u32 capabilities;
__u32 flags; __u32 flags;
__u32 reserved[6]; __u32 max_num_buffers;
__u32 reserved[5];
}; };
static int get_v4l2_format32(struct v4l2_format *p64, 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; return -EFAULT;
if (copy_from_user(&p64->flags, &p32->flags, sizeof(p32->flags))) if (copy_from_user(&p64->flags, &p32->flags, sizeof(p32->flags)))
return -EFAULT; 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); 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)) || offsetof(struct v4l2_create_buffers32, format)) ||
put_user(p64->capabilities, &p32->capabilities) || put_user(p64->capabilities, &p32->capabilities) ||
put_user(p64->flags, &p32->flags) || 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))) copy_to_user(p32->reserved, p64->reserved, sizeof(p64->reserved)))
return -EFAULT; return -EFAULT;
return put_v4l2_format32(&p64->format, &p32->format); return put_v4l2_format32(&p64->format, &p32->format);

View File

@ -483,9 +483,9 @@ static void v4l_print_create_buffers(const void *arg, bool write_only)
{ {
const struct v4l2_create_buffers *p = arg; 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->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); v4l_print_format(&p->format, write_only);
} }

View File

@ -1035,6 +1035,7 @@ struct v4l2_requestbuffers {
#define V4L2_BUF_CAP_SUPPORTS_ORPHANED_BUFS (1 << 4) #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_M2M_HOLD_CAPTURE_BUF (1 << 5)
#define V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS (1 << 6) #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 * struct v4l2_plane - plane info for multi-planar buffers
@ -2605,6 +2606,9 @@ struct v4l2_dbg_chip_info {
* @flags: additional buffer management attributes (ignored unless the * @flags: additional buffer management attributes (ignored unless the
* queue has V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS capability * queue has V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS capability
* and configured for MMAP streaming I/O). * 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 * @reserved: future extensions
*/ */
struct v4l2_create_buffers { struct v4l2_create_buffers {
@ -2614,7 +2618,8 @@ struct v4l2_create_buffers {
struct v4l2_format format; struct v4l2_format format;
__u32 capabilities; __u32 capabilities;
__u32 flags; __u32 flags;
__u32 reserved[6]; __u32 max_num_buffers;
__u32 reserved[5];
}; };
/* /*