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.

Reply via email to