| From 202cc7db651502af16a0e981f3ac310d6789005b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 14 Jan 2024 15:55:40 +0200 |
| Subject: media: mc: Add local pad to pipeline regardless of the link state |
| |
| From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| |
| [ Upstream commit 78f0daa026d4c5e192d31801d1be6caf88250220 ] |
| |
| When building pipelines by following links, the |
| media_pipeline_explore_next_link() function only traverses enabled |
| links. The remote pad of a disabled link is not added to the pipeline, |
| and neither is the local pad. While the former is correct as disabled |
| links should not be followed, not adding the local pad breaks processing |
| of the MEDIA_PAD_FL_MUST_CONNECT flag. |
| |
| The MEDIA_PAD_FL_MUST_CONNECT flag is checked in the |
| __media_pipeline_start() function that iterates over all pads after |
| populating the pipeline. If the pad is not present, the check gets |
| skipped, rendering it useless. |
| |
| Fix this by adding the local pad of all links regardless of their state, |
| only skipping the remote pad for disabled links. |
| |
| Cc: stable@vger.kernel.org # 6.1 |
| Fixes: ae219872834a ("media: mc: entity: Rewrite media_pipeline_start()") |
| Reported-by: Frieder Schrempf <frieder.schrempf@kontron.de> |
| Closes: https://lore.kernel.org/linux-media/7658a15a-80c5-219f-2477-2a94ba6c6ba1@kontron.de |
| Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com> |
| Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/mc/mc-entity.c | 18 +++++++++--------- |
| 1 file changed, 9 insertions(+), 9 deletions(-) |
| |
| diff --git a/drivers/media/mc/mc-entity.c b/drivers/media/mc/mc-entity.c |
| index 83468d4a440b3..737fc14e92dd3 100644 |
| --- a/drivers/media/mc/mc-entity.c |
| +++ b/drivers/media/mc/mc-entity.c |
| @@ -607,13 +607,6 @@ static int media_pipeline_explore_next_link(struct media_pipeline *pipe, |
| link->source->entity->name, link->source->index, |
| link->sink->entity->name, link->sink->index); |
| |
| - /* Skip links that are not enabled. */ |
| - if (!(link->flags & MEDIA_LNK_FL_ENABLED)) { |
| - dev_dbg(walk->mdev->dev, |
| - "media pipeline: skipping link (disabled)\n"); |
| - return 0; |
| - } |
| - |
| /* Get the local pad and remote pad. */ |
| if (link->source->entity == pad->entity) { |
| local = link->source; |
| @@ -635,13 +628,20 @@ static int media_pipeline_explore_next_link(struct media_pipeline *pipe, |
| } |
| |
| /* |
| - * Add the local and remote pads of the link to the pipeline and push |
| - * them to the stack, if they're not already present. |
| + * Add the local pad of the link to the pipeline and push it to the |
| + * stack, if not already present. |
| */ |
| ret = media_pipeline_add_pad(pipe, walk, local); |
| if (ret) |
| return ret; |
| |
| + /* Similarly, add the remote pad, but only if the link is enabled. */ |
| + if (!(link->flags & MEDIA_LNK_FL_ENABLED)) { |
| + dev_dbg(walk->mdev->dev, |
| + "media pipeline: skipping link (disabled)\n"); |
| + return 0; |
| + } |
| + |
| ret = media_pipeline_add_pad(pipe, walk, remote); |
| if (ret) |
| return ret; |
| -- |
| 2.43.0 |
| |