linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jai Luthra <j-luthra@ti.com>
To: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	Sakari Ailus <sakari.ailus@linux.intel.com>,
	Hans Verkuil <hverkuil-cisco@xs4all.nl>,
	Vaishnav Achath <vaishnav.a@ti.com>,
	Maxime Ripard <mripard@kernel.org>, Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Conor Dooley <conor+dt@kernel.org>
Cc: <linux-media@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<devicetree@vger.kernel.org>,
	Vignesh Raghavendra <vigneshr@ti.com>,
	Aradhya Bhatia <a-bhatia1@ti.com>,
	Devarsh Thakkar <devarsht@ti.com>,
	Changhuang Liang <changhuang.liang@starfivetech.com>,
	Jack Zhu <jack.zhu@starfivetech.com>,
	Julien Massot <julien.massot@collabora.com>,
	Jayshri Pawar <jpawar@cadence.com>, Jai Luthra <j-luthra@ti.com>
Subject: [PATCH RFC 14/21] media: cadence: csi2rx: Enable stream-wise routing
Date: Thu, 22 Feb 2024 17:01:30 +0530	[thread overview]
Message-ID: <20240222-multistream-v1-14-1837ed916eeb@ti.com> (raw)
In-Reply-To: <20240222-multistream-v1-0-1837ed916eeb@ti.com>

Cadence CSI-2 bridge IP supports capturing multiple virtual "streams"
of data over the same physical interface using MIPI Virtual Channels.

The V4L2 subdev APIs should reflect this capability and allow per-stream
routing and controls.

While the hardware IP supports usecases where streams coming in the sink
pad can be broadcasted to multiple source pads, the driver will need
significant re-architecture to make that possible. The two users of this
IP in mainline linux are TI Shim and StarFive JH7110 CAMSS, and both
have only integrated the first source pad i.e stream0 of this IP. So for
now keep it simple and only allow 1-to-1 mapping of streams from sink to
source, without any broadcasting.

This commit only adds support for subdev routing APIs, without actually
setting the registers in the Cadence IP to filter for particular virtual
channels. Subsequent commits will add that support.

Signed-off-by: Jai Luthra <j-luthra@ti.com>
---
 drivers/media/platform/cadence/cdns-csi2rx.c | 91 ++++++++++++++++++++++------
 1 file changed, 71 insertions(+), 20 deletions(-)

diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c
index bac341881e41..1b76610ff617 100644
--- a/drivers/media/platform/cadence/cdns-csi2rx.c
+++ b/drivers/media/platform/cadence/cdns-csi2rx.c
@@ -450,12 +450,55 @@ static int csi2rx_enum_mbus_code(struct v4l2_subdev *subdev,
 	return 0;
 }
 
+static int _csi2rx_set_routing(struct v4l2_subdev *subdev,
+			       struct v4l2_subdev_state *state,
+			       struct v4l2_subdev_krouting *routing)
+{
+	static const struct v4l2_mbus_framefmt format = {
+		.width = 640,
+		.height = 480,
+		.code = MEDIA_BUS_FMT_UYVY8_1X16,
+		.field = V4L2_FIELD_NONE,
+		.colorspace = V4L2_COLORSPACE_SRGB,
+		.ycbcr_enc = V4L2_YCBCR_ENC_601,
+		.quantization = V4L2_QUANTIZATION_LIM_RANGE,
+		.xfer_func = V4L2_XFER_FUNC_SRGB,
+	};
+	int ret;
+
+	if (routing->num_routes > V4L2_FRAME_DESC_ENTRY_MAX)
+		return -EINVAL;
+
+	ret = v4l2_subdev_routing_validate(subdev, routing,
+					   V4L2_SUBDEV_ROUTING_ONLY_1_TO_1);
+	if (ret)
+		return ret;
+
+	ret = v4l2_subdev_set_routing_with_fmt(subdev, state, routing, &format);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
+static int csi2rx_set_routing(struct v4l2_subdev *subdev,
+			      struct v4l2_subdev_state *state,
+			      enum v4l2_subdev_format_whence which,
+			      struct v4l2_subdev_krouting *routing)
+{
+	struct csi2rx_priv *csi2rx = v4l2_subdev_to_csi2rx(subdev);
+
+	if (which == V4L2_SUBDEV_FORMAT_ACTIVE && csi2rx->count)
+		return -EBUSY;
+
+	return _csi2rx_set_routing(subdev, state, routing);
+}
+
 static int csi2rx_set_fmt(struct v4l2_subdev *subdev,
 			  struct v4l2_subdev_state *state,
 			  struct v4l2_subdev_format *format)
 {
 	struct v4l2_mbus_framefmt *fmt;
-	unsigned int i;
 
 	/* No transcoding, source and sink formats must match. */
 	if (format->pad != CSI2RX_PAD_SINK)
@@ -467,14 +510,19 @@ static int csi2rx_set_fmt(struct v4l2_subdev *subdev,
 	format->format.field = V4L2_FIELD_NONE;
 
 	/* Set sink format */
-	fmt = v4l2_subdev_state_get_format(state, format->pad);
+	fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
+	if (!fmt)
+		return -EINVAL;
+
 	*fmt = format->format;
 
-	/* Propagate to source formats */
-	for (i = CSI2RX_PAD_SOURCE_STREAM0; i < CSI2RX_PAD_MAX; i++) {
-		fmt = v4l2_subdev_state_get_format(state, i);
-		*fmt = format->format;
-	}
+	/* Propagate to source format */
+	fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
+							   format->stream);
+	if (!fmt)
+		return -EINVAL;
+
+	*fmt = format->format;
 
 	return 0;
 }
@@ -482,21 +530,22 @@ static int csi2rx_set_fmt(struct v4l2_subdev *subdev,
 static int csi2rx_init_state(struct v4l2_subdev *subdev,
 			     struct v4l2_subdev_state *state)
 {
-	struct v4l2_subdev_format format = {
-		.pad = CSI2RX_PAD_SINK,
-		.format = {
-			.width = 640,
-			.height = 480,
-			.code = MEDIA_BUS_FMT_UYVY8_1X16,
-			.field = V4L2_FIELD_NONE,
-			.colorspace = V4L2_COLORSPACE_SRGB,
-			.ycbcr_enc = V4L2_YCBCR_ENC_601,
-			.quantization = V4L2_QUANTIZATION_LIM_RANGE,
-			.xfer_func = V4L2_XFER_FUNC_SRGB,
+	struct v4l2_subdev_route routes[] = {
+		{
+			.sink_pad = CSI2RX_PAD_SINK,
+			.sink_stream = 0,
+			.source_pad = CSI2RX_PAD_SOURCE_STREAM0,
+			.source_stream = 0,
+			.flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
 		},
 	};
 
-	return csi2rx_set_fmt(subdev, state, &format);
+	struct v4l2_subdev_krouting routing = {
+		.num_routes = ARRAY_SIZE(routes),
+		.routes = routes,
+	};
+
+	return _csi2rx_set_routing(subdev, state, &routing);
 }
 
 static int csi2rx_get_frame_desc(struct v4l2_subdev *subdev, unsigned int pad,
@@ -512,6 +561,7 @@ static const struct v4l2_subdev_pad_ops csi2rx_pad_ops = {
 	.get_fmt	= v4l2_subdev_get_fmt,
 	.set_fmt	= csi2rx_set_fmt,
 	.get_frame_desc = csi2rx_get_frame_desc,
+	.set_routing	= csi2rx_set_routing,
 };
 
 static const struct v4l2_subdev_video_ops csi2rx_video_ops = {
@@ -770,7 +820,8 @@ static int csi2rx_probe(struct platform_device *pdev)
 	csi2rx->pads[CSI2RX_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
 	for (i = CSI2RX_PAD_SOURCE_STREAM0; i < CSI2RX_PAD_MAX; i++)
 		csi2rx->pads[i].flags = MEDIA_PAD_FL_SOURCE;
-	csi2rx->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+	csi2rx->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		V4L2_SUBDEV_FL_STREAMS;
 	csi2rx->subdev.entity.ops = &csi2rx_media_ops;
 
 	ret = media_entity_pads_init(&csi2rx->subdev.entity, CSI2RX_PAD_MAX,

-- 
2.43.0


  parent reply	other threads:[~2024-02-22 11:33 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-22 11:31 [PATCH RFC 00/21] media: cadence,ti: CSI2RX Multistream Support Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 01/21] media: ti: j721e-csi2rx: Fix races while restarting DMA Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 02/21] media: cadence: csi2rx: configure DPHY before starting source stream Jai Luthra
2024-02-22 14:29   ` Julien Massot
2024-02-23  7:23     ` Jai Luthra
2024-02-23  2:46   ` 回复: " Changhuang Liang
2024-02-22 11:31 ` [PATCH RFC 03/21] media: cadence: csi2rx: Support runtime PM Jai Luthra
2024-03-22  9:26   ` 回复: " Changhuang Liang
2024-03-22 11:13     ` Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 04/21] dt-bindings: media: ti,j721e-csi2rx-shim: Support 32 dma chans Jai Luthra
2024-02-22 12:25   ` Rob Herring
2024-02-23  7:44     ` Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 05/21] media: ti: j721e-csi2rx: separate out device and context Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 06/21] media: ti: j721e-csi2rx: prepare SHIM code for multiple contexts Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 07/21] media: ti: j721e-csi2rx: allocate DMA channel based on context index Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 08/21] media: ti: j721e-csi2rx: add a subdev for the core device Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 09/21] SQUASH: media: ti: j721e-csi2rx: Fix link validation for multi-stream Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 10/21] media: ti: j721e-csi2rx: get number of contexts from device tree Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 11/21] media: cadence: csi2rx: add get_frame_desc wrapper Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 12/21] media: ti: j721e-csi2rx: add support for processing virtual channels Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 13/21] media: cadence: csi2rx: Use new enable stream APIs Jai Luthra
2024-02-22 11:31 ` Jai Luthra [this message]
2024-02-22 11:31 ` [PATCH RFC 15/21] SQUASH: media: cadence: csi2rx: Enable per-stream controls Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 16/21] SQUASH: media: cadence: csi2rx: Filter using MIPI virtual channels Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 17/21] SQUASH: media: cadence: csi2rx: Filter streams in get_frame_desc Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 18/21] media: ti: j721e-csi2rx: add multistream support Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 19/21] SQUASH: media: ti: j721e-csi2rx: Enable per-stream controls Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 20/21] SQUASH: media: ti: j721e-csi2rx: Assert pixel reset before stopping last stream Jai Luthra
2024-02-22 11:31 ` [PATCH RFC 21/21] media: ti: j721e-csi2rx: Submit all available buffers Jai Luthra
2024-02-23  2:53 ` 回复: [PATCH RFC 00/21] media: cadence,ti: CSI2RX Multistream Support Changhuang Liang
2024-02-23  7:49   ` Jai Luthra

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=20240222-multistream-v1-14-1837ed916eeb@ti.com \
    --to=j-luthra@ti.com \
    --cc=a-bhatia1@ti.com \
    --cc=changhuang.liang@starfivetech.com \
    --cc=conor+dt@kernel.org \
    --cc=devarsht@ti.com \
    --cc=devicetree@vger.kernel.org \
    --cc=hverkuil-cisco@xs4all.nl \
    --cc=jack.zhu@starfivetech.com \
    --cc=jpawar@cadence.com \
    --cc=julien.massot@collabora.com \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=mripard@kernel.org \
    --cc=robh@kernel.org \
    --cc=sakari.ailus@linux.intel.com \
    --cc=tomi.valkeinen@ideasonboard.com \
    --cc=vaishnav.a@ti.com \
    --cc=vigneshr@ti.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;
as well as URLs for NNTP newsgroup(s).