From patchwork Wed Mar 26 11:09:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomi Valkeinen X-Patchwork-Id: 14029961 X-Patchwork-Delegate: kieran@bingham.xyz Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1DA331F3D49; Wed, 26 Mar 2025 11:10:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742987443; cv=none; b=ZDRnHtcuDQimIDTcPDqgqPydno4MKo6gIraqh+IWP2A40BIYUaWdFo7nKJ5bk7FeQVG0gY26tNEGgag6ionN4npqygbiRCKyT480J17vSSjIBs/Q0Z+D0XJfqKNSt9Yy0EQaJVuYzq2ZWyHfjT+p9VxL/1trwfpah0Wq5zOUow8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742987443; c=relaxed/simple; bh=aqbmhsHX5IxfR08kY9FbOyMcyYBn9kBKkZQk0J+/pcA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qcdVAc/Qv9Dpe99G0Vene8FgK9XD5NnU+dK10VZacqf7YPQtSuYWVhIN25lsKrmJ9vHtpEoH24FBZYzXAGHyz+06nx0LSOHntNZSxlFrbeHyRKyBnDjcfkEvVWqKVHHSwgzItyLdJaN8xr11AOokUeE7xuA1Ye4AJH6NrIADts8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=vdwb5sfX; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="vdwb5sfX" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id F16091D29; Wed, 26 Mar 2025 12:08:34 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1742987315; bh=aqbmhsHX5IxfR08kY9FbOyMcyYBn9kBKkZQk0J+/pcA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=vdwb5sfXe+js/Z0xMRXLtMyvZ90ghRyvtFWREgzBgf7XJd9QB+OQXfBa/WtZ18O0B uTTAtM7MZorVzw/0xocrAfM0mx2pHY4+a/HimuFjoaRqwHVywNiX1Su7LCRHWjZsne ZZyNsddpoVLAdpfqFc/mjwO7p3nsh5pQAetkqksQ= From: Tomi Valkeinen Date: Wed, 26 Mar 2025 13:09:35 +0200 Subject: [PATCH v2 13/15] media: rcar-csi2: Call get_frame_desc to find out VC & DT (Gen3) Precedence: bulk X-Mailing-List: linux-renesas-soc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250326-rcar-streams-v2-13-d0d7002c641f@ideasonboard.com> References: <20250326-rcar-streams-v2-0-d0d7002c641f@ideasonboard.com> In-Reply-To: <20250326-rcar-streams-v2-0-d0d7002c641f@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=5089; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=aqbmhsHX5IxfR08kY9FbOyMcyYBn9kBKkZQk0J+/pcA=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBn4+CU0xwc7tNGTqI07vzb7zB8zjfiIaEx6Q2fi nu7Y9pYLtaJAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCZ+PglAAKCRD6PaqMvJYe 9Qu0D/oCpFRJn0c+6tT8uPFhHKnHCek9oDJ0kW/095P3UZgFwYMPY0Av90BwBzrA2hksDuEsuH3 x3FoRSh9QrJcppSUN5HPKYfFryz27ZcX5Hr2DLTUwf8Z0ACrZRxiw/FKM3bD14Hfaa1X3hBrzj7 jwKmh7910l4E2AjkMSEIwJ1uiNFf7Ub7Mgmo95HyKLCX3kDrnm9COrUKIbNhrFZTOuSul6RR0p6 rub8OD5VD0YSBXtjZ5C2M/uXLN4zzTAfKSzJ2P9nuW9Vx3uD/PwGE2N1xhKbBFGuxB0ZooKAb1/ eaMqeDOT7X5kbRrfnRGbtUqxuFnbDOAMszxxHx/b/EtA1N8b0Rb8URUHiA6Dofkj11ob/tvbOCz k4X6ENIsrPvajPhgxpiiJjJ/9yaJPcjVt47dNmQuyHa/RhzaalxkJXEa466Ma6K3SPaRj5x/ebC BanPXczjFVa6TFS7H5MEyZwqwAKio/R21Kjueis4DSN3+o8AjSrtqL9OAznNVzpZSFUIMLcL4T4 EPHxIXBl2HtZ8jhVnLOluELGXIvlxoDISOFBQR0ylFOocU4A6Tg/39M726zk0dOT9IVCmFQBSah TN7aZSuisG96z+v9cZgx/Qy12j0JPyb4CUajn0DupIZui5ydzYfH1fuyuvog3sPYtG6uLuSoElV mpz8np8Z3TSYqjw== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 Call get_frame_desc to find out VC & DT, for Gen3 platforms, instead of hardcoding the VC routing and deducing the DT based on the mbus format. If the source subdevice doesn't implement .get_frame_desc, we use a fallback case where we assume there's a single stream with VC = 0 and DT based on the mbus format. Signed-off-by: Tomi Valkeinen --- drivers/media/platform/renesas/rcar-csi2.c | 113 +++++++++++++++++++---------- 1 file changed, 76 insertions(+), 37 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c index b9f83aae725a..8f708196ef49 100644 --- a/drivers/media/platform/renesas/rcar-csi2.c +++ b/drivers/media/platform/renesas/rcar-csi2.c @@ -71,10 +71,7 @@ struct rcar_csi2; #define FLD_REG 0x1c #define FLD_FLD_NUM(n) (((n) & 0xff) << 16) #define FLD_DET_SEL(n) (((n) & 0x3) << 4) -#define FLD_FLD_EN4 BIT(3) -#define FLD_FLD_EN3 BIT(2) -#define FLD_FLD_EN2 BIT(1) -#define FLD_FLD_EN BIT(0) +#define FLD_FLD_EN(ch) BIT(ch) /* Automatic Standby Control */ #define ASTBY_REG 0x20 @@ -1066,52 +1063,94 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv, static int rcsi2_start_receiver_gen3(struct rcar_csi2 *priv, struct v4l2_subdev_state *state) { - const struct rcar_csi2_format *format; - u32 phycnt, vcdt = 0, vcdt2 = 0, fld = 0; - const struct v4l2_mbus_framefmt *fmt; + u32 phycnt, vcdt = 0, vcdt2 = 0; + u32 fld = FLD_DET_SEL(1); + struct v4l2_mbus_frame_desc source_fd; + struct v4l2_subdev_route *route; unsigned int lanes; - unsigned int i; int mbps, ret; + u8 ch = 0; - /* Use the format on the sink pad to compute the receiver config. */ - fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0); + ret = v4l2_subdev_call(priv->remote, pad, get_frame_desc, + priv->remote_pad, &source_fd); + if (ret && ret != -ENOIOCTLCMD) { + return ret; + } else if (ret == -ENOIOCTLCMD) { + /* Create a fallback source_fd */ + struct v4l2_mbus_frame_desc *fd = &source_fd; + const struct rcar_csi2_format *format; + struct v4l2_mbus_framefmt *fmt; - dev_dbg(priv->dev, "Input size (%ux%u%c)\n", - fmt->width, fmt->height, - fmt->field == V4L2_FIELD_NONE ? 'p' : 'i'); + fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0); + if (!fmt) + return -EINVAL; - /* Code is validated in set_fmt. */ - format = rcsi2_code_to_fmt(fmt->code); - if (!format) - return -EINVAL; + format = rcsi2_code_to_fmt(fmt->code); + if (!format) + return -EINVAL; - /* - * Enable all supported CSI-2 channels with virtual channel and - * data type matching. - * - * NOTE: It's not possible to get individual datatype for each - * source virtual channel. Once this is possible in V4L2 - * it should be used here. - */ - for (i = 0; i < priv->info->num_channels; i++) { + memset(fd, 0, sizeof(*fd)); + + fd->num_entries = 1; + fd->type = V4L2_MBUS_FRAME_DESC_TYPE_CSI2; + fd->entry[0].stream = 0; + fd->entry[0].pixelcode = fmt->code; + fd->entry[0].bus.csi2.vc = 0; + fd->entry[0].bus.csi2.dt = format->datatype; + } + + for_each_active_route(&state->routing, route) { + struct v4l2_mbus_frame_desc_entry *source_entry = NULL; + const struct v4l2_mbus_framefmt *fmt; + const struct rcar_csi2_format *format; + unsigned int i; + u8 vc, dt; u32 vcdt_part; - if (priv->channel_vc[i] < 0) - continue; + for (i = 0; i < source_fd.num_entries; i++) { + if (source_fd.entry[i].stream == route->sink_stream) { + source_entry = &source_fd.entry[i]; + break; + } + } + + if (!source_entry) { + dev_err(priv->dev, + "Failed to find stream from source frame desc\n"); + return -EPIPE; + } - vcdt_part = VCDT_SEL_VC(priv->channel_vc[i]) | VCDT_VCDTN_EN | - VCDT_SEL_DTN_ON | VCDT_SEL_DT(format->datatype); + vc = source_entry->bus.csi2.vc; + dt = source_entry->bus.csi2.dt; + + vcdt_part = VCDT_SEL_VC(vc) | VCDT_VCDTN_EN | + VCDT_SEL_DTN_ON | VCDT_SEL_DT(dt); /* Store in correct reg and offset. */ - if (i < 2) - vcdt |= vcdt_part << ((i % 2) * 16); + if (ch < 2) + vcdt |= vcdt_part << ((ch % 2) * 16); else - vcdt2 |= vcdt_part << ((i % 2) * 16); - } + vcdt2 |= vcdt_part << ((ch % 2) * 16); + + fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, + route->sink_stream); + if (!fmt) + return -EINVAL; + + dev_dbg(priv->dev, "Input size (%ux%u%c)\n", + fmt->width, fmt->height, + fmt->field == V4L2_FIELD_NONE ? 'p' : 'i'); - if (fmt->field == V4L2_FIELD_ALTERNATE) - fld = FLD_DET_SEL(1) | FLD_FLD_EN4 | FLD_FLD_EN3 | FLD_FLD_EN2 - | FLD_FLD_EN; + /* Code is validated in set_fmt. */ + format = rcsi2_code_to_fmt(fmt->code); + if (!format) + return -EINVAL; + + if (fmt->field == V4L2_FIELD_ALTERNATE) + fld |= FLD_FLD_EN(ch); + + ch++; + } /* * Get the number of active data lanes inspecting the remote mbus