]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: v4l2-subdev: Limit the number of active routes to V4L2_FRAME_DESC_ENTRY_MAX
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Thu, 19 Jun 2025 20:47:08 +0000 (23:47 +0300)
committerHans Verkuil <hverkuil@xs4all.nl>
Mon, 30 Jun 2025 07:06:21 +0000 (09:06 +0200)
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.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/media/v4l2-core/v4l2-subdev.c

index a3074f469b1503880845bfb953cc2b69807f6746..c69d1aff701fd00edfbcf463d2444639c66da47e 100644 (file)
@@ -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.