On Thu Jun 19 23:47:08 2025 +0300, Laurent Pinchart wrote: > Drivers that implement routing need to report a frame descriptor > accordingly, with up to one entry per route. The number of frame > descriptor entries is fixed to V4L2_FRAME_DESC_ENTRY_MAX, currently > equal to 8. Multiple drivers therefore limit the number of routes to > V4L2_FRAME_DESC_ENTRY_MAX, with a note indicating that the limit should > be lifted when frame descriptor entries will be allocated dynamically. > > Duplicating the check in multiple drivers isn't ideal. Move it to the > VIDIOC_SUBDEV_S_ROUTING handling code in the v4l2-subdev core. > > Signed-off-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com> > Reviewed-by: Jacopo Mondi <jacopo.mo...@ideasonboard.com> > Reviewed-by: Tomi Valkeinen <tomi.valkei...@ideasonboard.com> > Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad...@bp.renesas.com> > Signed-off-by: Sakari Ailus <sakari.ai...@linux.intel.com> > Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>
Patch committed. Thanks, Hans Verkuil drivers/media/v4l2-core/v4l2-subdev.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) --- diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index a3074f469b15..c69d1aff701f 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -1004,6 +1004,7 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg, struct v4l2_subdev_route *routes = (struct v4l2_subdev_route *)(uintptr_t)routing->routes; struct v4l2_subdev_krouting krouting = {}; + unsigned int num_active_routes = 0; unsigned int i; if (!v4l2_subdev_enable_streams_api) @@ -1041,8 +1042,21 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg, if (!(pads[route->source_pad].flags & MEDIA_PAD_FL_SOURCE)) return -EINVAL; + + if (route->flags & V4L2_SUBDEV_ROUTE_FL_ACTIVE) + num_active_routes++; } + /* + * Drivers that implement routing need to report a frame + * descriptor accordingly, with up to one entry per route. Until + * the frame descriptors entries get allocated dynamically, + * limit the number of active routes to + * V4L2_FRAME_DESC_ENTRY_MAX. + */ + if (num_active_routes > V4L2_FRAME_DESC_ENTRY_MAX) + return -E2BIG; + /* * If the driver doesn't support setting routing, just return * the routing table.