From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: linux-media@vger.kernel.org
Cc: hans@jjverkuil.nl, laurent.pinchart@ideasonboard.com,
Prabhakar <prabhakar.csengg@gmail.com>,
"Kate Hsuan" <hpa@redhat.com>,
"Alexander Shiyan" <eagle.alexander923@gmail.com>,
"Dave Stevenson" <dave.stevenson@raspberrypi.com>,
"Tommaso Merciai" <tomm.merciai@gmail.com>,
"Benjamin Mugnier" <benjamin.mugnier@foss.st.com>,
"Sylvain Petinot" <sylvain.petinot@foss.st.com>,
"Christophe JAILLET" <christophe.jaillet@wanadoo.fr>,
"Julien Massot" <julien.massot@collabora.com>,
"Naushir Patuck" <naush@raspberrypi.com>,
"Yan, Dongcheng" <dongcheng.yan@intel.com>,
"Cao, Bingbu" <bingbu.cao@intel.com>,
"Qiu, Tian Shu" <tian.shu.qiu@intel.com>,
"Stefan Klug" <stefan.klug@ideasonboard.com>,
"Mirela Rabulea" <mirela.rabulea@nxp.com>,
"André Apitzsch" <git@apitzsch.eu>,
"Heimir Thor Sverrisson" <heimir.sverrisson@gmail.com>,
"Kieran Bingham" <kieran.bingham@ideasonboard.com>,
"Mehdi Djait" <mehdi.djait@linux.intel.com>,
"Ricardo Ribalda Delgado" <ribalda@kernel.org>,
"Hans de Goede" <hansg@kernel.org>,
"Jacopo Mondi" <jacopo.mondi@ideasonboard.com>,
"Tomi Valkeinen" <tomi.valkeinen@ideasonboard.com>,
"David Plowman" <david.plowman@raspberrypi.com>,
"Yu, Ong Hock" <ong.hock.yu@intel.com>,
"Ng, Khai Wen" <khai.wen.ng@intel.com>
Subject: [PATCH v2 07/14] media: mc: Add MEDIA_LNK_FL_VALIDATE_LATE
Date: Wed, 11 Feb 2026 11:09:13 +0200 [thread overview]
Message-ID: <20260211090920.1851141-8-sakari.ailus@linux.intel.com> (raw)
In-Reply-To: <20260211090920.1851141-1-sakari.ailus@linux.intel.com>
Add MEDIA_LNK_FL_VALIDATE_LATE flag to support late validation of links.
This is serving the use case where video devices are configured and
started streaming indepenently of each other but this sequence may be run
in series, in such a way that a video device in a pipeline starts
streaming before another one is configured.
Before this flag, drivers have resorted to implementing the link
validation separately for the video nodes as part of streaming start
sequence.
media_pipeline_start() shall be called on each leaf entity connected to
the graph with a link where MEDIA_LNK_FL_VALIDATE_LATE is set before
uphardware operation.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
.../media/mediactl/media-ioc-setup-link.rst | 4 ++
.../media/mediactl/media-types.rst | 5 ++
drivers/media/mc/mc-entity.c | 58 ++++++++++++++++++-
include/uapi/linux/media.h | 1 +
4 files changed, 66 insertions(+), 2 deletions(-)
diff --git a/Documentation/userspace-api/media/mediactl/media-ioc-setup-link.rst b/Documentation/userspace-api/media/mediactl/media-ioc-setup-link.rst
index 23208300cb61..7a9a43c71cde 100644
--- a/Documentation/userspace-api/media/mediactl/media-ioc-setup-link.rst
+++ b/Documentation/userspace-api/media/mediactl/media-ioc-setup-link.rst
@@ -49,6 +49,10 @@ Only links marked with the ``DYNAMIC`` link flag can be enabled/disabled
while streaming media data. Attempting to enable or disable a streaming
non-dynamic link will return an ``EBUSY`` error code.
+The ``VALIDATE_LATE`` flag is used to signal that the validation of the link may
+be delayed until actual hardware operation even if the rest of the pipeline
+would be validated at an earlier point of time.
+
If the specified link can't be found the driver returns with an ``EINVAL``
error code.
diff --git a/Documentation/userspace-api/media/mediactl/media-types.rst b/Documentation/userspace-api/media/mediactl/media-types.rst
index 6332e8395263..d6a690655a01 100644
--- a/Documentation/userspace-api/media/mediactl/media-types.rst
+++ b/Documentation/userspace-api/media/mediactl/media-types.rst
@@ -391,6 +391,7 @@ must be set for every pad.
.. _MEDIA-LNK-FL-ENABLED:
.. _MEDIA-LNK-FL-IMMUTABLE:
.. _MEDIA-LNK-FL-DYNAMIC:
+.. _MEDIA-LNK-FL-VALIDATE-LATE:
.. _MEDIA-LNK-FL-LINK-TYPE:
.. flat-table:: Media link flags
@@ -410,6 +411,10 @@ must be set for every pad.
- The link enabled state can be modified during streaming. This flag
is set by drivers and is read-only for applications.
+ * - ``MEDIA_LNK_FL_VALIDATE_LATE``
+ - The validation of the link may be delayed up to until the start of
+ hardware operation.
+
* - ``MEDIA_LNK_FL_LINK_TYPE``
- This is a bitmask that defines the type of the link. The following
link types are currently supported:
diff --git a/drivers/media/mc/mc-entity.c b/drivers/media/mc/mc-entity.c
index ef959e9bb313..b29b519237d6 100644
--- a/drivers/media/mc/mc-entity.c
+++ b/drivers/media/mc/mc-entity.c
@@ -772,7 +772,7 @@ static int
__media_pipeline_validate_one(struct media_pad *origin,
struct media_pipeline *pipe,
struct media_pad *pad, struct media_link *link,
- bool *has_enabled_link)
+ bool *has_enabled_link, bool skip_validation)
{
struct media_device *mdev = origin->graph_obj.mdev;
struct media_entity *entity = pad->entity;
@@ -782,6 +782,9 @@ __media_pipeline_validate_one(struct media_pad *origin,
if (link->flags & MEDIA_LNK_FL_ENABLED && has_enabled_link)
*has_enabled_link = true;
+ if (skip_validation)
+ return 0;
+
/*
* Validate the link if it's enabled and has the
* current pad as its sink.
@@ -833,7 +836,24 @@ __must_check int __media_pipeline_start(struct media_pad *origin,
* valid, so just increase the start count.
*/
if (pipe->start_count) {
+ struct media_link *link;
+
+ link = __media_entity_next_link(origin->entity, NULL,
+ MEDIA_LNK_FL_DATA_LINK);
+ if (link && link->flags & MEDIA_LNK_FL_VALIDATE_LATE) {
+ dev_dbg(mdev->dev,
+ "Validating pad '%s':%u late\n",
+ origin->entity->name, origin->index);
+
+ ret = __media_pipeline_validate_one(link->sink, pipe,
+ link->sink, link,
+ NULL, false);
+ if (ret)
+ return ret;
+ }
+
pipe->start_count++;
+
return 0;
}
@@ -881,9 +901,16 @@ __must_check int __media_pipeline_start(struct media_pad *origin,
if (link->sink != pad && link->source != pad)
continue;
+ /* Skip late-validated links not connected to origin. */
+ bool skip_validation =
+ link->flags & MEDIA_LNK_FL_VALIDATE_LATE &&
+ (link->sink == origin ||
+ link->source == origin);
+
ret = __media_pipeline_validate_one(origin, pipe,
origin, link,
- &has_enabled_link);
+ &has_enabled_link,
+ skip_validation);
if (ret)
goto error;
}
@@ -1163,6 +1190,33 @@ media_create_pad_link(struct media_entity *source, u16 source_pad,
if (WARN_ON(!(sink->pads[sink_pad].flags & MEDIA_PAD_FL_SINK)))
return -EINVAL;
+ /*
+ * With the late validate flag, either source or sink shall have exactly
+ * one pad and no links before this one. Similarly, no links may be
+ * added to entities with a single pad and an existing late-validated
+ * link.
+ */
+ if (flags & MEDIA_LNK_FL_VALIDATE_LATE) {
+ if (!(source->num_pads == 1 && !source->num_links) &&
+ !(sink->num_pads == 1 && !sink->num_links))
+ return -EINVAL;
+ } else {
+ struct media_entity *entities[] = { source, sink };
+
+ for (unsigned int i = 0; i < ARRAY_SIZE(entities); i++) {
+ if (entities[i]->num_pads != 1)
+ continue;
+
+ struct media_link *__link =
+ __media_entity_next_link(entities[i], NULL,
+ MEDIA_LNK_FL_DATA_LINK);
+
+ if (__link &&
+ __link->flags & MEDIA_LNK_FL_VALIDATE_LATE)
+ return -EINVAL;
+ }
+ }
+
link = media_add_link(&source->links);
if (link == NULL)
return -ENOMEM;
diff --git a/include/uapi/linux/media.h b/include/uapi/linux/media.h
index 1c80b1d6bbaf..c96e2118ea99 100644
--- a/include/uapi/linux/media.h
+++ b/include/uapi/linux/media.h
@@ -219,6 +219,7 @@ struct media_pad_desc {
#define MEDIA_LNK_FL_ENABLED (1U << 0)
#define MEDIA_LNK_FL_IMMUTABLE (1U << 1)
#define MEDIA_LNK_FL_DYNAMIC (1U << 2)
+#define MEDIA_LNK_FL_VALIDATE_LATE (1U << 3)
#define MEDIA_LNK_FL_LINK_TYPE (0xf << 28)
# define MEDIA_LNK_FL_DATA_LINK (0U << 28)
--
2.47.3
next prev parent reply other threads:[~2026-02-11 9:09 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-11 9:09 [PATCH v2 00/14] Metadata series preparation Sakari Ailus
2026-02-11 9:09 ` [PATCH v2 01/14] media: imx219: Rename "PIXEL_ARRAY" as "CROP" Sakari Ailus
2026-02-13 14:42 ` Jacopo Mondi
2026-02-13 17:24 ` Sakari Ailus
2026-02-11 9:09 ` [PATCH v2 02/14] media: v4l2-subdev: Allow accessing routes with STREAMS client capability Sakari Ailus
2026-02-13 14:48 ` Jacopo Mondi
2026-02-15 14:18 ` Mirela Rabulea
2026-02-11 9:09 ` [PATCH v2 03/14] media: Documentation: Improve LINK_FREQ documentation Sakari Ailus
2026-02-13 14:49 ` Jacopo Mondi
2026-02-15 14:37 ` Mirela Rabulea
2026-02-16 8:42 ` Sakari Ailus
2026-02-11 9:09 ` [PATCH v2 04/14] media: Documentation: Improve pixel rate calculation documentation Sakari Ailus
2026-02-13 14:49 ` Jacopo Mondi
2026-02-15 14:38 ` Mirela Rabulea
2026-02-11 9:09 ` [PATCH v2 05/14] media: v4l2-subdev: Refactor returning routes Sakari Ailus
2026-02-13 15:01 ` Jacopo Mondi
2026-02-13 17:29 ` Sakari Ailus
2026-02-15 14:39 ` Mirela Rabulea
2026-02-16 9:02 ` Sakari Ailus
2026-02-16 10:09 ` Mirela Rabulea
2026-02-11 9:09 ` [PATCH v2 06/14] media: mc: Separate single link validation into a new function Sakari Ailus
2026-02-15 14:42 ` Mirela Rabulea
2026-02-16 9:18 ` Sakari Ailus
2026-02-11 9:09 ` Sakari Ailus [this message]
2026-02-16 13:19 ` [PATCH v2 07/14] media: mc: Add MEDIA_LNK_FL_VALIDATE_LATE Mirela Rabulea
2026-02-16 21:14 ` Sakari Ailus
2026-02-11 9:09 ` [PATCH v2 08/14] media: mc: Don't care about unsettable flags in MEDIA_IOC_LINK_SETUP Sakari Ailus
2026-02-16 13:55 ` Mirela Rabulea
2026-02-16 21:31 ` Sakari Ailus
2026-02-11 9:09 ` [PATCH v2 09/14] media: Document enable_streams and disable_streams behaviour Sakari Ailus
2026-02-16 14:03 ` Mirela Rabulea
2026-02-17 8:37 ` Sakari Ailus
2026-03-25 9:16 ` Sakari Ailus
2026-02-11 9:09 ` [PATCH v2 10/14] media: v4l2-subdev: Move subdev client capabilities into a new struct Sakari Ailus
2026-02-16 15:40 ` Mirela Rabulea
2026-02-11 9:09 ` [PATCH v2 11/14] media: v4l2-subdev: Add struct v4l2_subdev_client_info pointer to pad ops Sakari Ailus
2026-02-16 15:40 ` Mirela Rabulea
2026-02-16 21:35 ` Sakari Ailus
2026-02-11 9:09 ` [PATCH v2 12/14] media: v4l2-subdev: Add v4l2_subdev_call_ci_active_state Sakari Ailus
2026-02-16 16:20 ` Mirela Rabulea
2026-02-17 8:09 ` Sakari Ailus
2026-02-11 9:09 ` [PATCH v2 13/14] media: v4l2-subdev: Perform client info changes to i2c drivers Sakari Ailus
2026-02-11 9:09 ` [PATCH v2 14/14] media: v4l2-subdev: Add struct v4l2_subdev_client_info argument to pad ops Sakari Ailus
2026-02-13 14:36 ` [PATCH v2 00/14] Metadata series preparation Jacopo Mondi
2026-02-13 17:16 ` Sakari Ailus
2026-02-16 8:50 ` Jacopo Mondi
2026-02-16 11:19 ` Sakari Ailus
2026-02-16 11:56 ` Jacopo Mondi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260211090920.1851141-8-sakari.ailus@linux.intel.com \
--to=sakari.ailus@linux.intel.com \
--cc=benjamin.mugnier@foss.st.com \
--cc=bingbu.cao@intel.com \
--cc=christophe.jaillet@wanadoo.fr \
--cc=dave.stevenson@raspberrypi.com \
--cc=david.plowman@raspberrypi.com \
--cc=dongcheng.yan@intel.com \
--cc=eagle.alexander923@gmail.com \
--cc=git@apitzsch.eu \
--cc=hans@jjverkuil.nl \
--cc=hansg@kernel.org \
--cc=heimir.sverrisson@gmail.com \
--cc=hpa@redhat.com \
--cc=jacopo.mondi@ideasonboard.com \
--cc=julien.massot@collabora.com \
--cc=khai.wen.ng@intel.com \
--cc=kieran.bingham@ideasonboard.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mehdi.djait@linux.intel.com \
--cc=mirela.rabulea@nxp.com \
--cc=naush@raspberrypi.com \
--cc=ong.hock.yu@intel.com \
--cc=prabhakar.csengg@gmail.com \
--cc=ribalda@kernel.org \
--cc=stefan.klug@ideasonboard.com \
--cc=sylvain.petinot@foss.st.com \
--cc=tian.shu.qiu@intel.com \
--cc=tomi.valkeinen@ideasonboard.com \
--cc=tomm.merciai@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox