* [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF
@ 2025-02-24 20:19 Jacopo Mondi
2025-02-24 20:19 ` [PATCH v2 1/6] media: vsp1: Add support IIF ISP Interface Jacopo Mondi
` (6 more replies)
0 siblings, 7 replies; 16+ messages in thread
From: Jacopo Mondi @ 2025-02-24 20:19 UTC (permalink / raw)
To: Laurent Pinchart, Kieran Bingham, Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc, Jacopo Mondi,
Niklas Söderlund, Laurent Pinchart
The IIF (ISP InterFace) is a VSP2 function that reads data from
external memory using two RPF instances and feed it to the ISP.
The IIF support is modeled in the vsp1 driver as a new, simple,
entity type.
IIF is part of VSPX, a version of the VSP2 IP specialized for ISP
interfacing. To prepare to support VSPX, support IIF first by
introducing a new entity and by adjusting the RPF/WPF drivers to
operate correctly when an IIF is present.
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
Changes in v2:
- Collect tags
- Address review comments from Laurent, a lot of tiny changes here and
there but no major redesign worth an entry in the patchset changelog
---
Jacopo Mondi (6):
media: vsp1: Add support IIF ISP Interface
media: vsp1: Clean FRE interrupt status
media: vsp1: dl: Use singleshot DL for VSPX
media: vsp1: rwpf: Break out format handling
media: vsp1: rwpf: Support RAW Bayer and ISP config
media: vsp1: rwpf: Support operations with IIF
drivers/media/platform/renesas/vsp1/Makefile | 2 +-
drivers/media/platform/renesas/vsp1/vsp1.h | 3 +
drivers/media/platform/renesas/vsp1/vsp1_dl.c | 7 +-
drivers/media/platform/renesas/vsp1/vsp1_drv.c | 14 ++-
drivers/media/platform/renesas/vsp1/vsp1_entity.c | 8 ++
drivers/media/platform/renesas/vsp1/vsp1_entity.h | 1 +
drivers/media/platform/renesas/vsp1/vsp1_iif.c | 133 ++++++++++++++++++++++
drivers/media/platform/renesas/vsp1/vsp1_iif.h | 26 +++++
drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 1 +
drivers/media/platform/renesas/vsp1/vsp1_pipe.h | 1 +
drivers/media/platform/renesas/vsp1/vsp1_regs.h | 8 ++
drivers/media/platform/renesas/vsp1/vsp1_rpf.c | 18 ++-
drivers/media/platform/renesas/vsp1/vsp1_rwpf.c | 110 ++++++++++++++++--
drivers/media/platform/renesas/vsp1/vsp1_wpf.c | 14 ++-
14 files changed, 327 insertions(+), 19 deletions(-)
---
base-commit: b2c4bf0c102084e77ed1b12090d77a76469a6814
change-id: 20250123-v4h-iif-a1dda640c95d
Best regards,
--
Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v2 1/6] media: vsp1: Add support IIF ISP Interface
2025-02-24 20:19 [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Jacopo Mondi
@ 2025-02-24 20:19 ` Jacopo Mondi
2025-03-02 13:42 ` Laurent Pinchart
2025-02-24 20:19 ` [PATCH v2 2/6] media: vsp1: Clean FRE interrupt status Jacopo Mondi
` (5 subsequent siblings)
6 siblings, 1 reply; 16+ messages in thread
From: Jacopo Mondi @ 2025-02-24 20:19 UTC (permalink / raw)
To: Laurent Pinchart, Kieran Bingham, Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc, Jacopo Mondi
The IIF (ISP InterFace) is a VSP2 function that transfers data
to the ISP by reading from external memory through two RPF
instances.
Add support for it in the vsp1 driver by introducing a new entity
type. The sole required operation is to enable the IIF function
during configure_stream().
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/vsp1/Makefile | 2 +-
drivers/media/platform/renesas/vsp1/vsp1.h | 3 +
drivers/media/platform/renesas/vsp1/vsp1_drv.c | 11 ++
drivers/media/platform/renesas/vsp1/vsp1_entity.c | 8 ++
drivers/media/platform/renesas/vsp1/vsp1_entity.h | 1 +
drivers/media/platform/renesas/vsp1/vsp1_iif.c | 133 ++++++++++++++++++++++
drivers/media/platform/renesas/vsp1/vsp1_iif.h | 26 +++++
drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 1 +
drivers/media/platform/renesas/vsp1/vsp1_pipe.h | 1 +
drivers/media/platform/renesas/vsp1/vsp1_regs.h | 8 ++
drivers/media/platform/renesas/vsp1/vsp1_rpf.c | 7 ++
11 files changed, 200 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/renesas/vsp1/Makefile b/drivers/media/platform/renesas/vsp1/Makefile
index 4bb4dcbef7b55be7a40231a04e14029911da9beb..de8c802e1d1a16aabe1326fc8c27be33ad2b2e10 100644
--- a/drivers/media/platform/renesas/vsp1/Makefile
+++ b/drivers/media/platform/renesas/vsp1/Makefile
@@ -5,6 +5,6 @@ vsp1-y += vsp1_rpf.o vsp1_rwpf.o vsp1_wpf.o
vsp1-y += vsp1_clu.o vsp1_hsit.o vsp1_lut.o
vsp1-y += vsp1_brx.o vsp1_sru.o vsp1_uds.o
vsp1-y += vsp1_hgo.o vsp1_hgt.o vsp1_histo.o
-vsp1-y += vsp1_lif.o vsp1_uif.o
+vsp1-y += vsp1_iif.o vsp1_lif.o vsp1_uif.o
obj-$(CONFIG_VIDEO_RENESAS_VSP1) += vsp1.o
diff --git a/drivers/media/platform/renesas/vsp1/vsp1.h b/drivers/media/platform/renesas/vsp1/vsp1.h
index 2f6f0c6ae55514d312e48232a5f8c8673f69ba13..263024639dd2a7564fc70ad52dbe17f9a5279f45 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1.h
+++ b/drivers/media/platform/renesas/vsp1/vsp1.h
@@ -32,6 +32,7 @@ struct vsp1_clu;
struct vsp1_hgo;
struct vsp1_hgt;
struct vsp1_hsit;
+struct vsp1_iif;
struct vsp1_lif;
struct vsp1_lut;
struct vsp1_rwpf;
@@ -56,6 +57,7 @@ struct vsp1_uif;
#define VSP1_HAS_BRS BIT(9)
#define VSP1_HAS_EXT_DL BIT(10)
#define VSP1_HAS_NON_ZERO_LBA BIT(11)
+#define VSP1_HAS_IIF BIT(12)
struct vsp1_device_info {
u32 version;
@@ -91,6 +93,7 @@ struct vsp1_device {
struct vsp1_hgt *hgt;
struct vsp1_hsit *hsi;
struct vsp1_hsit *hst;
+ struct vsp1_iif *iif;
struct vsp1_lif *lif[VSP1_MAX_LIF];
struct vsp1_lut *lut;
struct vsp1_rwpf *rpf[VSP1_MAX_RPF];
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_drv.c b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
index 9fc6bf624a520ae38e9c5f30dfa4dfa412eec38e..d13e9b31aa7cff8610ea196ae4de88ab22e44e0f 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_drv.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
@@ -29,6 +29,7 @@
#include "vsp1_hgo.h"
#include "vsp1_hgt.h"
#include "vsp1_hsit.h"
+#include "vsp1_iif.h"
#include "vsp1_lif.h"
#include "vsp1_lut.h"
#include "vsp1_pipe.h"
@@ -340,6 +341,16 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
&vsp1->entities);
}
+ if (vsp1_feature(vsp1, VSP1_HAS_IIF)) {
+ vsp1->iif = vsp1_iif_create(vsp1);
+ if (IS_ERR(vsp1->iif)) {
+ ret = PTR_ERR(vsp1->iif);
+ goto done;
+ }
+
+ list_add_tail(&vsp1->iif->entity.list_dev, &vsp1->entities);
+ }
+
/*
* The LIFs are only supported when used in conjunction with the DU, in
* which case the userspace API is disabled. If the userspace API is
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.c b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
index 8b8945bd8f108354f1b484530bc496dbac7d3d88..2096a09a12780ce64d9e8690aa4363bdaef3521e 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_entity.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
@@ -63,9 +63,14 @@ void vsp1_entity_route_setup(struct vsp1_entity *entity,
/*
* The ILV and BRS share the same data path route. The extra BRSSEL bit
* selects between the ILV and BRS.
+ *
+ * The BRU and IIF share the same data path route. The extra IIFSEL bit
+ * selects between the IIF and BRU.
*/
if (source->type == VSP1_ENTITY_BRS)
route |= VI6_DPR_ROUTE_BRSSEL;
+ else if (source->type == VSP1_ENTITY_IIF)
+ route |= VI6_DPR_ROUTE_IIFSEL;
vsp1_dl_body_write(dlb, source->route->reg, route);
}
@@ -528,6 +533,9 @@ struct media_pad *vsp1_entity_remote_pad(struct media_pad *pad)
{ VI6_DPR_NODE_WPF(idx) }, VI6_DPR_NODE_WPF(idx) }
static const struct vsp1_route vsp1_routes[] = {
+ { VSP1_ENTITY_IIF, 0, VI6_DPR_BRU_ROUTE,
+ { VI6_DPR_NODE_BRU_IN(0), VI6_DPR_NODE_BRU_IN(1),
+ VI6_DPR_NODE_BRU_IN(3) }, VI6_DPR_NODE_WPF(0) },
{ VSP1_ENTITY_BRS, 0, VI6_DPR_ILV_BRS_ROUTE,
{ VI6_DPR_NODE_BRS_IN(0), VI6_DPR_NODE_BRS_IN(1) }, 0 },
{ VSP1_ENTITY_BRU, 0, VI6_DPR_BRU_ROUTE,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.h b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
index 1bcc9e27dfdc7385e91987c84c46fc3725f3b90e..bdcb780a79dafccda3843bd65d337b64d6e12eb3 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_entity.h
+++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
@@ -28,6 +28,7 @@ enum vsp1_entity_type {
VSP1_ENTITY_HGT,
VSP1_ENTITY_HSI,
VSP1_ENTITY_HST,
+ VSP1_ENTITY_IIF,
VSP1_ENTITY_LIF,
VSP1_ENTITY_LUT,
VSP1_ENTITY_RPF,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_iif.c b/drivers/media/platform/renesas/vsp1/vsp1_iif.c
new file mode 100644
index 0000000000000000000000000000000000000000..12889885b14f8d61ee5e416b4111d2eced7a0715
--- /dev/null
+++ b/drivers/media/platform/renesas/vsp1/vsp1_iif.c
@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * vsp1_iif.c -- R-Car VSP1 IIF (ISP Interface)
+ *
+ * Copyright (C) 2025 Ideas On Board Oy
+ * Copyright (C) 2025 Renesas Corporation
+ */
+
+#include "vsp1.h"
+#include "vsp1_dl.h"
+#include "vsp1_iif.h"
+
+#define IIF_MIN_WIDTH 128U
+#define IIF_MIN_HEIGHT 32U
+#define IIF_MAX_WIDTH 5120U
+#define IIF_MAX_HEIGHT 4096U
+
+/* -----------------------------------------------------------------------------
+ * Device Access
+ */
+
+static inline void vsp1_iif_write(struct vsp1_dl_body *dlb, u32 reg, u32 data)
+{
+ vsp1_dl_body_write(dlb, reg, data);
+}
+
+/* -----------------------------------------------------------------------------
+ * V4L2 Subdevice Operations
+ */
+
+static const unsigned int iif_codes[] = {
+ MEDIA_BUS_FMT_SBGGR8_1X8,
+ MEDIA_BUS_FMT_SGBRG8_1X8,
+ MEDIA_BUS_FMT_SGRBG8_1X8,
+ MEDIA_BUS_FMT_SRGGB8_1X8,
+ MEDIA_BUS_FMT_SBGGR10_1X10,
+ MEDIA_BUS_FMT_SGBRG10_1X10,
+ MEDIA_BUS_FMT_SGRBG10_1X10,
+ MEDIA_BUS_FMT_SRGGB10_1X10,
+ MEDIA_BUS_FMT_SBGGR12_1X12,
+ MEDIA_BUS_FMT_SGBRG12_1X12,
+ MEDIA_BUS_FMT_SGRBG12_1X12,
+ MEDIA_BUS_FMT_SRGGB12_1X12,
+ MEDIA_BUS_FMT_SBGGR16_1X16,
+ MEDIA_BUS_FMT_SGBRG16_1X16,
+ MEDIA_BUS_FMT_SGRBG16_1X16,
+ MEDIA_BUS_FMT_SRGGB16_1X16,
+ MEDIA_BUS_FMT_METADATA_FIXED
+};
+
+static int iif_enum_mbus_code(struct v4l2_subdev *subdev,
+ struct v4l2_subdev_state *sd_state,
+ struct v4l2_subdev_mbus_code_enum *code)
+{
+ return vsp1_subdev_enum_mbus_code(subdev, sd_state, code, iif_codes,
+ ARRAY_SIZE(iif_codes));
+}
+
+static int iif_enum_frame_size(struct v4l2_subdev *subdev,
+ struct v4l2_subdev_state *sd_state,
+ struct v4l2_subdev_frame_size_enum *fse)
+{
+ return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
+ IIF_MIN_WIDTH, IIF_MIN_HEIGHT,
+ IIF_MAX_WIDTH, IIF_MAX_HEIGHT);
+}
+
+static int iif_set_format(struct v4l2_subdev *subdev,
+ struct v4l2_subdev_state *sd_state,
+ struct v4l2_subdev_format *fmt)
+{
+ return vsp1_subdev_set_pad_format(subdev, sd_state, fmt, iif_codes,
+ ARRAY_SIZE(iif_codes),
+ IIF_MIN_WIDTH, IIF_MIN_HEIGHT,
+ IIF_MAX_WIDTH, IIF_MAX_HEIGHT);
+}
+
+static const struct v4l2_subdev_pad_ops iif_pad_ops = {
+ .enum_mbus_code = iif_enum_mbus_code,
+ .enum_frame_size = iif_enum_frame_size,
+ .get_fmt = vsp1_subdev_get_pad_format,
+ .set_fmt = iif_set_format,
+};
+
+static const struct v4l2_subdev_ops iif_ops = {
+ .pad = &iif_pad_ops,
+};
+
+/* -----------------------------------------------------------------------------
+ * VSP1 Entity Operations
+ */
+
+static void iif_configure_stream(struct vsp1_entity *entity,
+ struct v4l2_subdev_state *state,
+ struct vsp1_pipeline *pipe,
+ struct vsp1_dl_list *dl,
+ struct vsp1_dl_body *dlb)
+{
+ vsp1_iif_write(dlb, VI6_IIF_CTRL, VI6_IIF_CTRL_CTRL);
+}
+
+static const struct vsp1_entity_operations iif_entity_ops = {
+ .configure_stream = iif_configure_stream,
+};
+
+/* -----------------------------------------------------------------------------
+ * Initialization and Cleanup
+ */
+
+struct vsp1_iif *vsp1_iif_create(struct vsp1_device *vsp1)
+{
+ struct vsp1_iif *iif;
+ int ret;
+
+ iif = devm_kzalloc(vsp1->dev, sizeof(*iif), GFP_KERNEL);
+ if (iif == NULL)
+ return ERR_PTR(-ENOMEM);
+
+ iif->entity.ops = &iif_entity_ops;
+ iif->entity.type = VSP1_ENTITY_IIF;
+
+ /*
+ * The IIF is never exposed to userspace, but media entity registration
+ * requires a function to be set. Use PROC_VIDEO_PIXEL_FORMATTER just to
+ * avoid triggering a WARN_ON(), the value won't be seen anywhere.
+ */
+ ret = vsp1_entity_init(vsp1, &iif->entity, "iif", 3, &iif_ops,
+ MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER);
+ if (ret < 0)
+ return ERR_PTR(ret);
+
+ return iif;
+}
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_iif.h b/drivers/media/platform/renesas/vsp1/vsp1_iif.h
new file mode 100644
index 0000000000000000000000000000000000000000..165996a822c1baab1fc40636884c9e7a67e4db07
--- /dev/null
+++ b/drivers/media/platform/renesas/vsp1/vsp1_iif.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * vsp1_iif.h -- R-Car VSP1 IIF (ISP Interface)
+ *
+ * Copyright (C) 2025 Ideas On Board Oy
+ * Copyright (C) 2025 Renesas Corporation
+ */
+#ifndef __VSP1_IIF_H__
+#define __VSP1_IIF_H__
+
+#include <media/v4l2-subdev.h>
+
+#include "vsp1_entity.h"
+
+struct vsp1_iif {
+ struct vsp1_entity entity;
+};
+
+static inline struct vsp1_iif *to_iif(struct v4l2_subdev *subdev)
+{
+ return container_of(subdev, struct vsp1_iif, entity.subdev);
+}
+
+struct vsp1_iif *vsp1_iif_create(struct vsp1_device *vsp1);
+
+#endif /* __VSP1_IIF_H__ */
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
index bb0739f684f39e23326a4d8fdb9f43e020bc23c8..8e9be3ec1b4dbdad1cbe35ae3a88952f46e41343 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
@@ -286,6 +286,7 @@ void vsp1_pipeline_reset(struct vsp1_pipeline *pipe)
pipe->brx = NULL;
pipe->hgo = NULL;
pipe->hgt = NULL;
+ pipe->iif = NULL;
pipe->lif = NULL;
pipe->uds = NULL;
}
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.h b/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
index 1ba7bdbad5a845da0a4d71888e193e46d62bed90..1655a820da102003d3d7da82a7cdd64e01c29ac6 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
+++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
@@ -119,6 +119,7 @@ struct vsp1_pipeline {
struct vsp1_entity *brx;
struct vsp1_entity *hgo;
struct vsp1_entity *hgt;
+ struct vsp1_entity *iif;
struct vsp1_entity *lif;
struct vsp1_entity *uds;
struct vsp1_entity *uds_input;
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_regs.h b/drivers/media/platform/renesas/vsp1/vsp1_regs.h
index 7eca82e0ba7ec5e02a5f3b9a30ccdcb48db39ed2..86e47c2d991fb4e0719b63c4ccb29340610ac24f 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_regs.h
+++ b/drivers/media/platform/renesas/vsp1/vsp1_regs.h
@@ -252,6 +252,13 @@
#define VI6_RPF_BRDITH_CTRL_ODE BIT(8)
#define VI6_RPF_BRDITH_CTRL_CBRM BIT(0)
+/* -----------------------------------------------------------------------------
+ * IIF Control Registers
+ */
+
+#define VI6_IIF_CTRL 0x0608
+#define VI6_IIF_CTRL_CTRL 0x13
+
/* -----------------------------------------------------------------------------
* WPF Control Registers
*/
@@ -388,6 +395,7 @@
#define VI6_DPR_HST_ROUTE 0x2044
#define VI6_DPR_HSI_ROUTE 0x2048
#define VI6_DPR_BRU_ROUTE 0x204c
+#define VI6_DPR_ROUTE_IIFSEL BIT(28)
#define VI6_DPR_ILV_BRS_ROUTE 0x2050
#define VI6_DPR_ROUTE_BRSSEL BIT(28)
#define VI6_DPR_ROUTE_FXA_MASK (0xff << 16)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
index 5c8b3ba1bd3c2c7b9289f05c9c2578e9717c23ff..e10ed836153633c4fe27224d0df39c77d4c8ab89 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
@@ -163,6 +163,13 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
if (pipe->interlaced)
top /= 2;
+ /* No further configuration for VSPX. */
+ if (pipe->iif) {
+ /* VSPX wants alpha_sel to be set to 0. */
+ vsp1_rpf_write(rpf, dlb, VI6_RPF_ALPH_SEL, 0);
+ return;
+ }
+
vsp1_rpf_write(rpf, dlb, VI6_RPF_LOC,
(left << VI6_RPF_LOC_HCOORD_SHIFT) |
(top << VI6_RPF_LOC_VCOORD_SHIFT));
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 2/6] media: vsp1: Clean FRE interrupt status
2025-02-24 20:19 [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Jacopo Mondi
2025-02-24 20:19 ` [PATCH v2 1/6] media: vsp1: Add support IIF ISP Interface Jacopo Mondi
@ 2025-02-24 20:19 ` Jacopo Mondi
2025-02-25 17:10 ` Sergey Shtylyov
` (2 more replies)
2025-02-24 20:19 ` [PATCH v2 3/6] media: vsp1: dl: Use singleshot DL for VSPX Jacopo Mondi
` (4 subsequent siblings)
6 siblings, 3 replies; 16+ messages in thread
From: Jacopo Mondi @ 2025-02-24 20:19 UTC (permalink / raw)
To: Laurent Pinchart, Kieran Bingham, Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc, Jacopo Mondi
The VSPX generates "FRame End" (FRE) interrutps, one for each
buffer transferred to the ISP.
Even if the FRE interrupt is not enabled, it is reported as active
in the interrupt status register.
Make sure to clean it when handling the interrupt.
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/vsp1/vsp1_drv.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_drv.c b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
index d13e9b31aa7cff8610ea196ae4de88ab22e44e0f..17ace4c6844d19aaafc27e79f016cc05091372bf 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_drv.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
@@ -69,7 +69,8 @@ static irqreturn_t vsp1_irq_handler(int irq, void *data)
i, wpf->entity.pipe->underrun_count);
}
- if (status & VI6_WPF_IRQ_STA_DFE) {
+ if (status & VI6_WPF_IRQ_STA_DFE ||
+ status & VI6_WPF_IRQ_STA_FRE) {
vsp1_pipeline_frame_end(wpf->entity.pipe);
ret = IRQ_HANDLED;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 3/6] media: vsp1: dl: Use singleshot DL for VSPX
2025-02-24 20:19 [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Jacopo Mondi
2025-02-24 20:19 ` [PATCH v2 1/6] media: vsp1: Add support IIF ISP Interface Jacopo Mondi
2025-02-24 20:19 ` [PATCH v2 2/6] media: vsp1: Clean FRE interrupt status Jacopo Mondi
@ 2025-02-24 20:19 ` Jacopo Mondi
2025-03-02 13:45 ` Laurent Pinchart
2025-02-24 20:19 ` [PATCH v2 4/6] media: vsp1: rwpf: Break out format handling Jacopo Mondi
` (3 subsequent siblings)
6 siblings, 1 reply; 16+ messages in thread
From: Jacopo Mondi @ 2025-02-24 20:19 UTC (permalink / raw)
To: Laurent Pinchart, Kieran Bingham, Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc, Jacopo Mondi,
Niklas Söderlund
The vsp1_dl library allows to program a display list and feed it
continuously to the VSP2. As an alternative operation mode, the library
allows to program the VSP2 in 'single shot' mode, where a display list
is submitted to the VSP on request only.
Currently the 'single shot' mode is only available when the VSP2 is
controlled by userspace, while it works in continuous mode when driven
by DRM, as frames have to be submitted to the display continuously.
For the VSPX use case, where there is no uapi support, we should however
work in single-shot mode as the ISP driver programs the VSPX on
request.
Initialize the display lists in single shot mode in case the VSP1 is
controlled by userspace or in case the pipeline features an IIF entity,
as in the VSPX case.
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/vsp1/vsp1_dl.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_dl.c b/drivers/media/platform/renesas/vsp1/vsp1_dl.c
index ad3fa1c9cc737c92870c087dd7cb8cf584fce41b..b8f0398522257f2fb771b419f34b56e59707476b 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_dl.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_dl.c
@@ -1099,7 +1099,12 @@ struct vsp1_dl_manager *vsp1_dlm_create(struct vsp1_device *vsp1,
return NULL;
dlm->index = index;
- dlm->singleshot = vsp1->info->uapi;
+ /*
+ * uapi = single shot mode;
+ * DRM = continuous mode;
+ * VSPX = single shot mode;
+ */
+ dlm->singleshot = (vsp1->info->uapi || vsp1->iif);
dlm->vsp1 = vsp1;
spin_lock_init(&dlm->lock);
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 4/6] media: vsp1: rwpf: Break out format handling
2025-02-24 20:19 [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Jacopo Mondi
` (2 preceding siblings ...)
2025-02-24 20:19 ` [PATCH v2 3/6] media: vsp1: dl: Use singleshot DL for VSPX Jacopo Mondi
@ 2025-02-24 20:19 ` Jacopo Mondi
2025-02-24 20:19 ` [PATCH v2 5/6] media: vsp1: rwpf: Support RAW Bayer and ISP config Jacopo Mondi
` (2 subsequent siblings)
6 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2025-02-24 20:19 UTC (permalink / raw)
To: Laurent Pinchart, Kieran Bingham, Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc, Jacopo Mondi,
Laurent Pinchart, Niklas Söderlund
The current implementation of the r/wpf format handling assumes
three formats to be supported in the RGB/YUV space.
With the forthcoming support for VSPX the r/wpf units will be
used to fetch from external memory images in RAW Bayer format
and buffers of ISP configuration parameters.
Prepare for adding support for these new formats by breaking
out the list of supported media bus codes in the vsp1_rwpf.c
file.
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/vsp1/vsp1_rwpf.c | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
index 9d38203e73d00b82a1a7db0353e2f0b5a94084f6..93b0ed5fd0da0c6a182dbbfe1e54eb8cfd66c493 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
@@ -16,6 +16,12 @@
#define RWPF_MIN_WIDTH 1
#define RWPF_MIN_HEIGHT 1
+static const u32 rwpf_mbus_codes[] = {
+ MEDIA_BUS_FMT_ARGB8888_1X32,
+ MEDIA_BUS_FMT_AHSV8888_1X32,
+ MEDIA_BUS_FMT_AYUV8_1X32,
+};
+
/* -----------------------------------------------------------------------------
* V4L2 Subdevice Operations
*/
@@ -24,16 +30,10 @@ static int vsp1_rwpf_enum_mbus_code(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
struct v4l2_subdev_mbus_code_enum *code)
{
- static const unsigned int codes[] = {
- MEDIA_BUS_FMT_ARGB8888_1X32,
- MEDIA_BUS_FMT_AHSV8888_1X32,
- MEDIA_BUS_FMT_AYUV8_1X32,
- };
-
- if (code->index >= ARRAY_SIZE(codes))
+ if (code->index >= ARRAY_SIZE(rwpf_mbus_codes))
return -EINVAL;
- code->code = codes[code->index];
+ code->code = rwpf_mbus_codes[code->index];
return 0;
}
@@ -57,6 +57,7 @@ static int vsp1_rwpf_set_format(struct v4l2_subdev *subdev,
struct vsp1_rwpf *rwpf = to_rwpf(subdev);
struct v4l2_subdev_state *state;
struct v4l2_mbus_framefmt *format;
+ unsigned int i;
int ret = 0;
mutex_lock(&rwpf->entity.lock);
@@ -68,9 +69,11 @@ static int vsp1_rwpf_set_format(struct v4l2_subdev *subdev,
}
/* Default to YUV if the requested format is not supported. */
- if (fmt->format.code != MEDIA_BUS_FMT_ARGB8888_1X32 &&
- fmt->format.code != MEDIA_BUS_FMT_AHSV8888_1X32 &&
- fmt->format.code != MEDIA_BUS_FMT_AYUV8_1X32)
+ for (i = 0; i < ARRAY_SIZE(rwpf_mbus_codes); ++i) {
+ if (fmt->format.code == rwpf_mbus_codes[i])
+ break;
+ }
+ if (i == ARRAY_SIZE(rwpf_mbus_codes))
fmt->format.code = MEDIA_BUS_FMT_AYUV8_1X32;
format = v4l2_subdev_state_get_format(state, fmt->pad);
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 5/6] media: vsp1: rwpf: Support RAW Bayer and ISP config
2025-02-24 20:19 [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Jacopo Mondi
` (3 preceding siblings ...)
2025-02-24 20:19 ` [PATCH v2 4/6] media: vsp1: rwpf: Break out format handling Jacopo Mondi
@ 2025-02-24 20:19 ` Jacopo Mondi
2025-03-02 14:01 ` Laurent Pinchart
2025-02-24 20:19 ` [PATCH v2 6/6] media: vsp1: rwpf: Support operations with IIF Jacopo Mondi
2025-02-25 22:56 ` [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Niklas Söderlund
6 siblings, 1 reply; 16+ messages in thread
From: Jacopo Mondi @ 2025-02-24 20:19 UTC (permalink / raw)
To: Laurent Pinchart, Kieran Bingham, Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc, Jacopo Mondi
With the forthcoming support for VSPX the r/wpf unit will be used
to perform memory access on the behalf of the ISP units.
Prepare to support reading from external memory images in RAW Bayer
format and ISP configuration parameters by expanding the list
of supported media bus codes.
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/vsp1/vsp1_rwpf.c | 97 +++++++++++++++++++++++--
1 file changed, 92 insertions(+), 5 deletions(-)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
index 93b0ed5fd0da0c6a182dbbfe1e54eb8cfd66c493..aef7b3d53a2171cda028a272f587641b4a8f85dc 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
@@ -10,18 +10,102 @@
#include <media/v4l2-subdev.h>
#include "vsp1.h"
+#include "vsp1_pipe.h"
#include "vsp1_rwpf.h"
#include "vsp1_video.h"
#define RWPF_MIN_WIDTH 1
#define RWPF_MIN_HEIGHT 1
+struct vsp1_rwpf_codes {
+ const u32 *codes;
+ unsigned int num_codes;
+};
+
static const u32 rwpf_mbus_codes[] = {
MEDIA_BUS_FMT_ARGB8888_1X32,
MEDIA_BUS_FMT_AHSV8888_1X32,
MEDIA_BUS_FMT_AYUV8_1X32,
};
+static const struct vsp1_rwpf_codes rwpf_codes = {
+ .codes = rwpf_mbus_codes,
+ .num_codes = ARRAY_SIZE(rwpf_mbus_codes),
+};
+
+static const u32 vspx_rpf0_mbus_codes[] = {
+ MEDIA_BUS_FMT_SBGGR8_1X8,
+ MEDIA_BUS_FMT_SGBRG8_1X8,
+ MEDIA_BUS_FMT_SGRBG8_1X8,
+ MEDIA_BUS_FMT_SRGGB8_1X8,
+ MEDIA_BUS_FMT_SBGGR10_1X10,
+ MEDIA_BUS_FMT_SGBRG10_1X10,
+ MEDIA_BUS_FMT_SGRBG10_1X10,
+ MEDIA_BUS_FMT_SRGGB10_1X10,
+ MEDIA_BUS_FMT_SBGGR12_1X12,
+ MEDIA_BUS_FMT_SGBRG12_1X12,
+ MEDIA_BUS_FMT_SGRBG12_1X12,
+ MEDIA_BUS_FMT_SRGGB12_1X12,
+ MEDIA_BUS_FMT_SBGGR16_1X16,
+ MEDIA_BUS_FMT_SGBRG16_1X16,
+ MEDIA_BUS_FMT_SGRBG16_1X16,
+ MEDIA_BUS_FMT_SRGGB16_1X16,
+ MEDIA_BUS_FMT_METADATA_FIXED
+};
+
+static const struct vsp1_rwpf_codes vspx_rpf0_codes = {
+ .codes = vspx_rpf0_mbus_codes,
+ .num_codes = ARRAY_SIZE(vspx_rpf0_mbus_codes),
+};
+
+static const u32 vspx_rpf1_mbus_codes[] = {
+ MEDIA_BUS_FMT_SBGGR8_1X8,
+ MEDIA_BUS_FMT_SGBRG8_1X8,
+ MEDIA_BUS_FMT_SGRBG8_1X8,
+ MEDIA_BUS_FMT_SRGGB8_1X8,
+ MEDIA_BUS_FMT_SBGGR10_1X10,
+ MEDIA_BUS_FMT_SGBRG10_1X10,
+ MEDIA_BUS_FMT_SGRBG10_1X10,
+ MEDIA_BUS_FMT_SRGGB10_1X10,
+ MEDIA_BUS_FMT_SBGGR12_1X12,
+ MEDIA_BUS_FMT_SGBRG12_1X12,
+ MEDIA_BUS_FMT_SGRBG12_1X12,
+ MEDIA_BUS_FMT_SRGGB12_1X12,
+ MEDIA_BUS_FMT_SBGGR16_1X16,
+ MEDIA_BUS_FMT_SGBRG16_1X16,
+ MEDIA_BUS_FMT_SGRBG16_1X16,
+ MEDIA_BUS_FMT_SRGGB16_1X16,
+};
+
+static const struct vsp1_rwpf_codes vspx_rpf1_codes = {
+ .codes = vspx_rpf1_mbus_codes,
+ .num_codes = ARRAY_SIZE(vspx_rpf1_mbus_codes),
+};
+
+static const struct vsp1_rwpf_codes *vsp1_rwpf_codes(struct v4l2_subdev *sd)
+{
+ struct vsp1_rwpf *rwpf = to_rwpf(sd);
+ struct vsp1_entity *ent = &rwpf->entity;
+
+ /* Only VSPX supports reading Bayer formats. */
+ if (!vsp1_feature(ent->vsp1, VSP1_HAS_IIF))
+ return &rwpf_codes;
+
+ if (ent->type == VSP1_ENTITY_RPF) {
+ switch (ent->index) {
+ case 0:
+ /* VSPX RPF0 supports ISP config data too. */
+ return &vspx_rpf0_codes;
+ case 1:
+ return &vspx_rpf1_codes;
+ default:
+ return &rwpf_codes;
+ }
+ }
+
+ return &rwpf_codes;
+}
+
/* -----------------------------------------------------------------------------
* V4L2 Subdevice Operations
*/
@@ -30,10 +114,12 @@ static int vsp1_rwpf_enum_mbus_code(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
struct v4l2_subdev_mbus_code_enum *code)
{
- if (code->index >= ARRAY_SIZE(rwpf_mbus_codes))
+ const struct vsp1_rwpf_codes *codes = vsp1_rwpf_codes(subdev);
+
+ if (code->index >= codes->num_codes)
return -EINVAL;
- code->code = rwpf_mbus_codes[code->index];
+ code->code = codes->codes[code->index];
return 0;
}
@@ -54,6 +140,7 @@ static int vsp1_rwpf_set_format(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
struct v4l2_subdev_format *fmt)
{
+ const struct vsp1_rwpf_codes *codes = vsp1_rwpf_codes(subdev);
struct vsp1_rwpf *rwpf = to_rwpf(subdev);
struct v4l2_subdev_state *state;
struct v4l2_mbus_framefmt *format;
@@ -69,11 +156,11 @@ static int vsp1_rwpf_set_format(struct v4l2_subdev *subdev,
}
/* Default to YUV if the requested format is not supported. */
- for (i = 0; i < ARRAY_SIZE(rwpf_mbus_codes); ++i) {
- if (fmt->format.code == rwpf_mbus_codes[i])
+ for (i = 0; i < codes->num_codes; ++i) {
+ if (fmt->format.code == codes->codes[i])
break;
}
- if (i == ARRAY_SIZE(rwpf_mbus_codes))
+ if (i == codes->num_codes)
fmt->format.code = MEDIA_BUS_FMT_AYUV8_1X32;
format = v4l2_subdev_state_get_format(state, fmt->pad);
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 6/6] media: vsp1: rwpf: Support operations with IIF
2025-02-24 20:19 [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Jacopo Mondi
` (4 preceding siblings ...)
2025-02-24 20:19 ` [PATCH v2 5/6] media: vsp1: rwpf: Support RAW Bayer and ISP config Jacopo Mondi
@ 2025-02-24 20:19 ` Jacopo Mondi
2025-03-02 14:05 ` Laurent Pinchart
2025-02-25 22:56 ` [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Niklas Söderlund
6 siblings, 1 reply; 16+ messages in thread
From: Jacopo Mondi @ 2025-02-24 20:19 UTC (permalink / raw)
To: Laurent Pinchart, Kieran Bingham, Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc, Jacopo Mondi
When the RPF/WPF units are used for ISP interfacing through
the IIF, the set of accessible registers is limited compared to
the regular VSPD operations.
Support ISP interfacing in the rpf and wpf drivers by checking if
the pipe features an IIF instance and writing only the relevant
registers.
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/vsp1/vsp1_rpf.c | 11 +++++++++--
drivers/media/platform/renesas/vsp1/vsp1_wpf.c | 14 ++++++++++----
2 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
index e10ed836153633c4fe27224d0df39c77d4c8ab89..dae94129a105a646917353dba0181f9c93327132 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
@@ -84,7 +84,7 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
sink_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SINK);
source_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SOURCE);
- infmt = VI6_RPF_INFMT_CIPM
+ infmt = (pipe->iif ? 0 : VI6_RPF_INFMT_CIPM)
| (fmtinfo->hwfmt << VI6_RPF_INFMT_RDFMT_SHIFT);
if (fmtinfo->swap_yc)
@@ -98,7 +98,7 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
vsp1_rpf_write(rpf, dlb, VI6_RPF_INFMT, infmt);
vsp1_rpf_write(rpf, dlb, VI6_RPF_DSWAP, fmtinfo->swap);
- if (entity->vsp1->info->gen == 4) {
+ if (entity->vsp1->info->gen == 4 && !pipe->iif) {
u32 ext_infmt0;
u32 ext_infmt1;
u32 ext_infmt2;
@@ -174,6 +174,13 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
(left << VI6_RPF_LOC_HCOORD_SHIFT) |
(top << VI6_RPF_LOC_VCOORD_SHIFT));
+ /* No further configuration for VSPX. */
+ if (pipe->iif) {
+ /* VSPX wants alpha_sel to be set to 0. */
+ vsp1_rpf_write(rpf, dlb, VI6_RPF_ALPH_SEL, 0);
+ return;
+ }
+
/*
* On Gen2 use the alpha channel (extended to 8 bits) when available or
* a fixed alpha value set through the V4L2_CID_ALPHA_COMPONENT control
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
index f176750ccd9847fdb8d51f7f51a6bd5092b70197..88db60596f0f2f459eddbbc2ea7247620d675dd8 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
@@ -247,8 +247,11 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
sink_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SINK);
source_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SOURCE);
- /* Format */
- if (!pipe->lif || wpf->writeback) {
+ /*
+ * Format configuration. Skip for IIF (VSPX) or if the pipe doesn't
+ * write to memory.
+ */
+ if (!pipe->iif && (!pipe->lif || wpf->writeback)) {
const struct v4l2_pix_format_mplane *format = &wpf->format;
const struct vsp1_format_info *fmtinfo = wpf->fmtinfo;
@@ -291,7 +294,7 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
* Sources. If the pipeline has a single input and BRx is not used,
* configure it as the master layer. Otherwise configure all
* inputs as sub-layers and select the virtual RPF as the master
- * layer.
+ * layer. For VSPX configure the enabled sources as masters.
*/
for (i = 0; i < vsp1->info->rpf_count; ++i) {
struct vsp1_rwpf *input = pipe->inputs[i];
@@ -299,7 +302,7 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
if (!input)
continue;
- srcrpf |= (!pipe->brx && pipe->num_inputs == 1)
+ srcrpf |= (pipe->iif || (!pipe->brx && pipe->num_inputs == 1))
? VI6_WPF_SRCRPF_RPF_ACT_MST(input->entity.index)
: VI6_WPF_SRCRPF_RPF_ACT_SUB(input->entity.index);
}
@@ -316,6 +319,9 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
vsp1_dl_body_write(dlb, VI6_WPF_IRQ_ENB(index),
VI6_WPF_IRQ_ENB_DFEE);
+ if (pipe->iif)
+ return;
+
/*
* Configure writeback for display pipelines (the wpf writeback flag is
* never set for memory-to-memory pipelines). Start by adding a chained
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v2 2/6] media: vsp1: Clean FRE interrupt status
2025-02-24 20:19 ` [PATCH v2 2/6] media: vsp1: Clean FRE interrupt status Jacopo Mondi
@ 2025-02-25 17:10 ` Sergey Shtylyov
2025-02-25 17:10 ` Sergey Shtylyov
2025-03-02 13:43 ` Laurent Pinchart
2 siblings, 0 replies; 16+ messages in thread
From: Sergey Shtylyov @ 2025-02-25 17:10 UTC (permalink / raw)
To: Jacopo Mondi, Laurent Pinchart, Kieran Bingham,
Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc
On 2/24/25 11:19 PM, Jacopo Mondi wrote:
> The VSPX generates "FRame End" (FRE) interrutps, one for each
> buffer transferred to the ISP.
>
> Even if the FRE interrupt is not enabled, it is reported as active
> in the interrupt status register.
>
> Make sure to clean it when handling the interrupt.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> ---
> drivers/media/platform/renesas/vsp1/vsp1_drv.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_drv.c b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> index d13e9b31aa7cff8610ea196ae4de88ab22e44e0f..17ace4c6844d19aaafc27e79f016cc05091372bf 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> @@ -69,7 +69,8 @@ static irqreturn_t vsp1_irq_handler(int irq, void *data)
> i, wpf->entity.pipe->underrun_count);
> }
>
> - if (status & VI6_WPF_IRQ_STA_DFE) {
> + if (status & VI6_WPF_IRQ_STA_DFE ||
> + status & VI6_WPF_IRQ_STA_FRE) {
Maybe:
if (status & (VI6_WPF_IRQ_STA_DFE | VI6_WPF_IRQ_STA_FRE)) {
[...]
MBR, Sergey
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 2/6] media: vsp1: Clean FRE interrupt status
2025-02-24 20:19 ` [PATCH v2 2/6] media: vsp1: Clean FRE interrupt status Jacopo Mondi
2025-02-25 17:10 ` Sergey Shtylyov
@ 2025-02-25 17:10 ` Sergey Shtylyov
2025-03-02 13:43 ` Laurent Pinchart
2 siblings, 0 replies; 16+ messages in thread
From: Sergey Shtylyov @ 2025-02-25 17:10 UTC (permalink / raw)
To: Jacopo Mondi, Laurent Pinchart, Kieran Bingham,
Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc
On 2/24/25 11:19 PM, Jacopo Mondi wrote:
> The VSPX generates "FRame End" (FRE) interrutps, one for each
> buffer transferred to the ISP.
>
> Even if the FRE interrupt is not enabled, it is reported as active
> in the interrupt status register.
>
> Make sure to clean it when handling the interrupt.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> ---
> drivers/media/platform/renesas/vsp1/vsp1_drv.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_drv.c b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> index d13e9b31aa7cff8610ea196ae4de88ab22e44e0f..17ace4c6844d19aaafc27e79f016cc05091372bf 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> @@ -69,7 +69,8 @@ static irqreturn_t vsp1_irq_handler(int irq, void *data)
> i, wpf->entity.pipe->underrun_count);
> }
>
> - if (status & VI6_WPF_IRQ_STA_DFE) {
> + if (status & VI6_WPF_IRQ_STA_DFE ||
> + status & VI6_WPF_IRQ_STA_FRE) {
Maybe:
if (status & (VI6_WPF_IRQ_STA_DFE | VI6_WPF_IRQ_STA_FRE)) {
[...]
MBR, Sergey
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF
2025-02-24 20:19 [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Jacopo Mondi
` (5 preceding siblings ...)
2025-02-24 20:19 ` [PATCH v2 6/6] media: vsp1: rwpf: Support operations with IIF Jacopo Mondi
@ 2025-02-25 22:56 ` Niklas Söderlund
6 siblings, 0 replies; 16+ messages in thread
From: Niklas Söderlund @ 2025-02-25 22:56 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Laurent Pinchart, Kieran Bingham, linux-kernel, linux-media,
linux-renesas-soc, Laurent Pinchart
Hi Jacopo,
Thanks for your work.
On 2025-02-24 21:19:40 +0100, Jacopo Mondi wrote:
> The IIF (ISP InterFace) is a VSP2 function that reads data from
> external memory using two RPF instances and feed it to the ISP.
>
> The IIF support is modeled in the vsp1 driver as a new, simple,
> entity type.
>
> IIF is part of VSPX, a version of the VSP2 IP specialized for ISP
> interfacing. To prepare to support VSPX, support IIF first by
> introducing a new entity and by adjusting the RPF/WPF drivers to
> operate correctly when an IIF is present.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> ---
> Changes in v2:
> - Collect tags
> - Address review comments from Laurent, a lot of tiny changes here and
> there but no major redesign worth an entry in the patchset changelog
I'm still no expert on the VSP1 but the changes looks good, so FWIW.
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
I also tested this with the ISP and it all works as expected,
Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
>
> ---
> Jacopo Mondi (6):
> media: vsp1: Add support IIF ISP Interface
> media: vsp1: Clean FRE interrupt status
> media: vsp1: dl: Use singleshot DL for VSPX
> media: vsp1: rwpf: Break out format handling
> media: vsp1: rwpf: Support RAW Bayer and ISP config
> media: vsp1: rwpf: Support operations with IIF
>
> drivers/media/platform/renesas/vsp1/Makefile | 2 +-
> drivers/media/platform/renesas/vsp1/vsp1.h | 3 +
> drivers/media/platform/renesas/vsp1/vsp1_dl.c | 7 +-
> drivers/media/platform/renesas/vsp1/vsp1_drv.c | 14 ++-
> drivers/media/platform/renesas/vsp1/vsp1_entity.c | 8 ++
> drivers/media/platform/renesas/vsp1/vsp1_entity.h | 1 +
> drivers/media/platform/renesas/vsp1/vsp1_iif.c | 133 ++++++++++++++++++++++
> drivers/media/platform/renesas/vsp1/vsp1_iif.h | 26 +++++
> drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 1 +
> drivers/media/platform/renesas/vsp1/vsp1_pipe.h | 1 +
> drivers/media/platform/renesas/vsp1/vsp1_regs.h | 8 ++
> drivers/media/platform/renesas/vsp1/vsp1_rpf.c | 18 ++-
> drivers/media/platform/renesas/vsp1/vsp1_rwpf.c | 110 ++++++++++++++++--
> drivers/media/platform/renesas/vsp1/vsp1_wpf.c | 14 ++-
> 14 files changed, 327 insertions(+), 19 deletions(-)
> ---
> base-commit: b2c4bf0c102084e77ed1b12090d77a76469a6814
> change-id: 20250123-v4h-iif-a1dda640c95d
>
> Best regards,
> --
> Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
>
--
Kind Regards,
Niklas Söderlund
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 1/6] media: vsp1: Add support IIF ISP Interface
2025-02-24 20:19 ` [PATCH v2 1/6] media: vsp1: Add support IIF ISP Interface Jacopo Mondi
@ 2025-03-02 13:42 ` Laurent Pinchart
2025-03-02 13:45 ` Laurent Pinchart
0 siblings, 1 reply; 16+ messages in thread
From: Laurent Pinchart @ 2025-03-02 13:42 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Kieran Bingham, Niklas Söderlund, linux-kernel, linux-media,
linux-renesas-soc
Hi Jacopo,
Thank you for the patch.
On Mon, Feb 24, 2025 at 09:19:41PM +0100, Jacopo Mondi wrote:
> The IIF (ISP InterFace) is a VSP2 function that transfers data
> to the ISP by reading from external memory through two RPF
> instances.
>
> Add support for it in the vsp1 driver by introducing a new entity
> type. The sole required operation is to enable the IIF function
> during configure_stream().
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> ---
> drivers/media/platform/renesas/vsp1/Makefile | 2 +-
> drivers/media/platform/renesas/vsp1/vsp1.h | 3 +
> drivers/media/platform/renesas/vsp1/vsp1_drv.c | 11 ++
> drivers/media/platform/renesas/vsp1/vsp1_entity.c | 8 ++
> drivers/media/platform/renesas/vsp1/vsp1_entity.h | 1 +
> drivers/media/platform/renesas/vsp1/vsp1_iif.c | 133 ++++++++++++++++++++++
> drivers/media/platform/renesas/vsp1/vsp1_iif.h | 26 +++++
> drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 1 +
> drivers/media/platform/renesas/vsp1/vsp1_pipe.h | 1 +
> drivers/media/platform/renesas/vsp1/vsp1_regs.h | 8 ++
> drivers/media/platform/renesas/vsp1/vsp1_rpf.c | 7 ++
> 11 files changed, 200 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/renesas/vsp1/Makefile b/drivers/media/platform/renesas/vsp1/Makefile
> index 4bb4dcbef7b55be7a40231a04e14029911da9beb..de8c802e1d1a16aabe1326fc8c27be33ad2b2e10 100644
> --- a/drivers/media/platform/renesas/vsp1/Makefile
> +++ b/drivers/media/platform/renesas/vsp1/Makefile
> @@ -5,6 +5,6 @@ vsp1-y += vsp1_rpf.o vsp1_rwpf.o vsp1_wpf.o
> vsp1-y += vsp1_clu.o vsp1_hsit.o vsp1_lut.o
> vsp1-y += vsp1_brx.o vsp1_sru.o vsp1_uds.o
> vsp1-y += vsp1_hgo.o vsp1_hgt.o vsp1_histo.o
> -vsp1-y += vsp1_lif.o vsp1_uif.o
> +vsp1-y += vsp1_iif.o vsp1_lif.o vsp1_uif.o
>
> obj-$(CONFIG_VIDEO_RENESAS_VSP1) += vsp1.o
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1.h b/drivers/media/platform/renesas/vsp1/vsp1.h
> index 2f6f0c6ae55514d312e48232a5f8c8673f69ba13..263024639dd2a7564fc70ad52dbe17f9a5279f45 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1.h
> +++ b/drivers/media/platform/renesas/vsp1/vsp1.h
> @@ -32,6 +32,7 @@ struct vsp1_clu;
> struct vsp1_hgo;
> struct vsp1_hgt;
> struct vsp1_hsit;
> +struct vsp1_iif;
> struct vsp1_lif;
> struct vsp1_lut;
> struct vsp1_rwpf;
> @@ -56,6 +57,7 @@ struct vsp1_uif;
> #define VSP1_HAS_BRS BIT(9)
> #define VSP1_HAS_EXT_DL BIT(10)
> #define VSP1_HAS_NON_ZERO_LBA BIT(11)
> +#define VSP1_HAS_IIF BIT(12)
>
> struct vsp1_device_info {
> u32 version;
> @@ -91,6 +93,7 @@ struct vsp1_device {
> struct vsp1_hgt *hgt;
> struct vsp1_hsit *hsi;
> struct vsp1_hsit *hst;
> + struct vsp1_iif *iif;
> struct vsp1_lif *lif[VSP1_MAX_LIF];
> struct vsp1_lut *lut;
> struct vsp1_rwpf *rpf[VSP1_MAX_RPF];
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_drv.c b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> index 9fc6bf624a520ae38e9c5f30dfa4dfa412eec38e..d13e9b31aa7cff8610ea196ae4de88ab22e44e0f 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> @@ -29,6 +29,7 @@
> #include "vsp1_hgo.h"
> #include "vsp1_hgt.h"
> #include "vsp1_hsit.h"
> +#include "vsp1_iif.h"
> #include "vsp1_lif.h"
> #include "vsp1_lut.h"
> #include "vsp1_pipe.h"
> @@ -340,6 +341,16 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
> &vsp1->entities);
> }
>
> + if (vsp1_feature(vsp1, VSP1_HAS_IIF)) {
> + vsp1->iif = vsp1_iif_create(vsp1);
> + if (IS_ERR(vsp1->iif)) {
> + ret = PTR_ERR(vsp1->iif);
> + goto done;
> + }
> +
> + list_add_tail(&vsp1->iif->entity.list_dev, &vsp1->entities);
> + }
> +
> /*
> * The LIFs are only supported when used in conjunction with the DU, in
> * which case the userspace API is disabled. If the userspace API is
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.c b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> index 8b8945bd8f108354f1b484530bc496dbac7d3d88..2096a09a12780ce64d9e8690aa4363bdaef3521e 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> @@ -63,9 +63,14 @@ void vsp1_entity_route_setup(struct vsp1_entity *entity,
> /*
> * The ILV and BRS share the same data path route. The extra BRSSEL bit
> * selects between the ILV and BRS.
> + *
> + * The BRU and IIF share the same data path route. The extra IIFSEL bit
> + * selects between the IIF and BRU.
> */
> if (source->type == VSP1_ENTITY_BRS)
> route |= VI6_DPR_ROUTE_BRSSEL;
> + else if (source->type == VSP1_ENTITY_IIF)
> + route |= VI6_DPR_ROUTE_IIFSEL;
> vsp1_dl_body_write(dlb, source->route->reg, route);
> }
>
> @@ -528,6 +533,9 @@ struct media_pad *vsp1_entity_remote_pad(struct media_pad *pad)
> { VI6_DPR_NODE_WPF(idx) }, VI6_DPR_NODE_WPF(idx) }
>
> static const struct vsp1_route vsp1_routes[] = {
> + { VSP1_ENTITY_IIF, 0, VI6_DPR_BRU_ROUTE,
> + { VI6_DPR_NODE_BRU_IN(0), VI6_DPR_NODE_BRU_IN(1),
> + VI6_DPR_NODE_BRU_IN(3) }, VI6_DPR_NODE_WPF(0) },
> { VSP1_ENTITY_BRS, 0, VI6_DPR_ILV_BRS_ROUTE,
> { VI6_DPR_NODE_BRS_IN(0), VI6_DPR_NODE_BRS_IN(1) }, 0 },
> { VSP1_ENTITY_BRU, 0, VI6_DPR_BRU_ROUTE,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.h b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> index 1bcc9e27dfdc7385e91987c84c46fc3725f3b90e..bdcb780a79dafccda3843bd65d337b64d6e12eb3 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> @@ -28,6 +28,7 @@ enum vsp1_entity_type {
> VSP1_ENTITY_HGT,
> VSP1_ENTITY_HSI,
> VSP1_ENTITY_HST,
> + VSP1_ENTITY_IIF,
> VSP1_ENTITY_LIF,
> VSP1_ENTITY_LUT,
> VSP1_ENTITY_RPF,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_iif.c b/drivers/media/platform/renesas/vsp1/vsp1_iif.c
> new file mode 100644
> index 0000000000000000000000000000000000000000..12889885b14f8d61ee5e416b4111d2eced7a0715
> --- /dev/null
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_iif.c
> @@ -0,0 +1,133 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * vsp1_iif.c -- R-Car VSP1 IIF (ISP Interface)
> + *
> + * Copyright (C) 2025 Ideas On Board Oy
> + * Copyright (C) 2025 Renesas Corporation
> + */
> +
> +#include "vsp1.h"
> +#include "vsp1_dl.h"
> +#include "vsp1_iif.h"
> +
> +#define IIF_MIN_WIDTH 128U
> +#define IIF_MIN_HEIGHT 32U
> +#define IIF_MAX_WIDTH 5120U
> +#define IIF_MAX_HEIGHT 4096U
> +
> +/* -----------------------------------------------------------------------------
> + * Device Access
> + */
> +
> +static inline void vsp1_iif_write(struct vsp1_dl_body *dlb, u32 reg, u32 data)
> +{
> + vsp1_dl_body_write(dlb, reg, data);
> +}
> +
> +/* -----------------------------------------------------------------------------
> + * V4L2 Subdevice Operations
> + */
> +
> +static const unsigned int iif_codes[] = {
> + MEDIA_BUS_FMT_SBGGR8_1X8,
> + MEDIA_BUS_FMT_SGBRG8_1X8,
> + MEDIA_BUS_FMT_SGRBG8_1X8,
> + MEDIA_BUS_FMT_SRGGB8_1X8,
> + MEDIA_BUS_FMT_SBGGR10_1X10,
> + MEDIA_BUS_FMT_SGBRG10_1X10,
> + MEDIA_BUS_FMT_SGRBG10_1X10,
> + MEDIA_BUS_FMT_SRGGB10_1X10,
> + MEDIA_BUS_FMT_SBGGR12_1X12,
> + MEDIA_BUS_FMT_SGBRG12_1X12,
> + MEDIA_BUS_FMT_SGRBG12_1X12,
> + MEDIA_BUS_FMT_SRGGB12_1X12,
> + MEDIA_BUS_FMT_SBGGR16_1X16,
> + MEDIA_BUS_FMT_SGBRG16_1X16,
> + MEDIA_BUS_FMT_SGRBG16_1X16,
> + MEDIA_BUS_FMT_SRGGB16_1X16,
As the VSP1 doesn't care about the bayer pattern, what would you think
about simplifying this to
MEDIA_BUS_FMT_Y8_1X8,
MEDIA_BUS_FMT_Y10_1X10,
MEDIA_BUS_FMT_Y12_1X12,
MEDIA_BUS_FMT_Y16_1X16,
> + MEDIA_BUS_FMT_METADATA_FIXED
> +};
> +
> +static int iif_enum_mbus_code(struct v4l2_subdev *subdev,
> + struct v4l2_subdev_state *sd_state,
> + struct v4l2_subdev_mbus_code_enum *code)
> +{
> + return vsp1_subdev_enum_mbus_code(subdev, sd_state, code, iif_codes,
> + ARRAY_SIZE(iif_codes));
> +}
> +
> +static int iif_enum_frame_size(struct v4l2_subdev *subdev,
> + struct v4l2_subdev_state *sd_state,
> + struct v4l2_subdev_frame_size_enum *fse)
> +{
> + return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
> + IIF_MIN_WIDTH, IIF_MIN_HEIGHT,
> + IIF_MAX_WIDTH, IIF_MAX_HEIGHT);
> +}
> +
> +static int iif_set_format(struct v4l2_subdev *subdev,
> + struct v4l2_subdev_state *sd_state,
> + struct v4l2_subdev_format *fmt)
> +{
> + return vsp1_subdev_set_pad_format(subdev, sd_state, fmt, iif_codes,
> + ARRAY_SIZE(iif_codes),
> + IIF_MIN_WIDTH, IIF_MIN_HEIGHT,
> + IIF_MAX_WIDTH, IIF_MAX_HEIGHT);
> +}
> +
> +static const struct v4l2_subdev_pad_ops iif_pad_ops = {
> + .enum_mbus_code = iif_enum_mbus_code,
> + .enum_frame_size = iif_enum_frame_size,
> + .get_fmt = vsp1_subdev_get_pad_format,
> + .set_fmt = iif_set_format,
> +};
> +
> +static const struct v4l2_subdev_ops iif_ops = {
> + .pad = &iif_pad_ops,
> +};
> +
> +/* -----------------------------------------------------------------------------
> + * VSP1 Entity Operations
> + */
> +
> +static void iif_configure_stream(struct vsp1_entity *entity,
> + struct v4l2_subdev_state *state,
> + struct vsp1_pipeline *pipe,
> + struct vsp1_dl_list *dl,
> + struct vsp1_dl_body *dlb)
> +{
> + vsp1_iif_write(dlb, VI6_IIF_CTRL, VI6_IIF_CTRL_CTRL);
> +}
> +
> +static const struct vsp1_entity_operations iif_entity_ops = {
> + .configure_stream = iif_configure_stream,
> +};
> +
> +/* -----------------------------------------------------------------------------
> + * Initialization and Cleanup
> + */
> +
> +struct vsp1_iif *vsp1_iif_create(struct vsp1_device *vsp1)
> +{
> + struct vsp1_iif *iif;
> + int ret;
> +
> + iif = devm_kzalloc(vsp1->dev, sizeof(*iif), GFP_KERNEL);
> + if (iif == NULL)
> + return ERR_PTR(-ENOMEM);
> +
> + iif->entity.ops = &iif_entity_ops;
> + iif->entity.type = VSP1_ENTITY_IIF;
> +
> + /*
> + * The IIF is never exposed to userspace, but media entity registration
> + * requires a function to be set. Use PROC_VIDEO_PIXEL_FORMATTER just to
> + * avoid triggering a WARN_ON(), the value won't be seen anywhere.
> + */
> + ret = vsp1_entity_init(vsp1, &iif->entity, "iif", 3, &iif_ops,
> + MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER);
> + if (ret < 0)
> + return ERR_PTR(ret);
> +
> + return iif;
> +}
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_iif.h b/drivers/media/platform/renesas/vsp1/vsp1_iif.h
> new file mode 100644
> index 0000000000000000000000000000000000000000..165996a822c1baab1fc40636884c9e7a67e4db07
> --- /dev/null
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_iif.h
> @@ -0,0 +1,26 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * vsp1_iif.h -- R-Car VSP1 IIF (ISP Interface)
> + *
> + * Copyright (C) 2025 Ideas On Board Oy
> + * Copyright (C) 2025 Renesas Corporation
> + */
> +#ifndef __VSP1_IIF_H__
> +#define __VSP1_IIF_H__
> +
> +#include <media/v4l2-subdev.h>
> +
> +#include "vsp1_entity.h"
> +
> +struct vsp1_iif {
> + struct vsp1_entity entity;
> +};
> +
> +static inline struct vsp1_iif *to_iif(struct v4l2_subdev *subdev)
> +{
> + return container_of(subdev, struct vsp1_iif, entity.subdev);
> +}
> +
> +struct vsp1_iif *vsp1_iif_create(struct vsp1_device *vsp1);
> +
> +#endif /* __VSP1_IIF_H__ */
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> index bb0739f684f39e23326a4d8fdb9f43e020bc23c8..8e9be3ec1b4dbdad1cbe35ae3a88952f46e41343 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> @@ -286,6 +286,7 @@ void vsp1_pipeline_reset(struct vsp1_pipeline *pipe)
> pipe->brx = NULL;
> pipe->hgo = NULL;
> pipe->hgt = NULL;
> + pipe->iif = NULL;
> pipe->lif = NULL;
> pipe->uds = NULL;
> }
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.h b/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
> index 1ba7bdbad5a845da0a4d71888e193e46d62bed90..1655a820da102003d3d7da82a7cdd64e01c29ac6 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
> @@ -119,6 +119,7 @@ struct vsp1_pipeline {
> struct vsp1_entity *brx;
> struct vsp1_entity *hgo;
> struct vsp1_entity *hgt;
> + struct vsp1_entity *iif;
> struct vsp1_entity *lif;
> struct vsp1_entity *uds;
> struct vsp1_entity *uds_input;
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_regs.h b/drivers/media/platform/renesas/vsp1/vsp1_regs.h
> index 7eca82e0ba7ec5e02a5f3b9a30ccdcb48db39ed2..86e47c2d991fb4e0719b63c4ccb29340610ac24f 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_regs.h
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_regs.h
> @@ -252,6 +252,13 @@
> #define VI6_RPF_BRDITH_CTRL_ODE BIT(8)
> #define VI6_RPF_BRDITH_CTRL_CBRM BIT(0)
>
> +/* -----------------------------------------------------------------------------
> + * IIF Control Registers
> + */
> +
> +#define VI6_IIF_CTRL 0x0608
> +#define VI6_IIF_CTRL_CTRL 0x13
> +
> /* -----------------------------------------------------------------------------
> * WPF Control Registers
> */
> @@ -388,6 +395,7 @@
> #define VI6_DPR_HST_ROUTE 0x2044
> #define VI6_DPR_HSI_ROUTE 0x2048
> #define VI6_DPR_BRU_ROUTE 0x204c
> +#define VI6_DPR_ROUTE_IIFSEL BIT(28)
> #define VI6_DPR_ILV_BRS_ROUTE 0x2050
> #define VI6_DPR_ROUTE_BRSSEL BIT(28)
> #define VI6_DPR_ROUTE_FXA_MASK (0xff << 16)
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> index 5c8b3ba1bd3c2c7b9289f05c9c2578e9717c23ff..e10ed836153633c4fe27224d0df39c77d4c8ab89 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> @@ -163,6 +163,13 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
> if (pipe->interlaced)
> top /= 2;
>
> + /* No further configuration for VSPX. */
> + if (pipe->iif) {
> + /* VSPX wants alpha_sel to be set to 0. */
> + vsp1_rpf_write(rpf, dlb, VI6_RPF_ALPH_SEL, 0);
> + return;
> + }
> +
I think this belongs to a separate patch where you adjust the RPF and
WPF code to support the VSP-X.
With those small issues addressed,
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> vsp1_rpf_write(rpf, dlb, VI6_RPF_LOC,
> (left << VI6_RPF_LOC_HCOORD_SHIFT) |
> (top << VI6_RPF_LOC_VCOORD_SHIFT));
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 2/6] media: vsp1: Clean FRE interrupt status
2025-02-24 20:19 ` [PATCH v2 2/6] media: vsp1: Clean FRE interrupt status Jacopo Mondi
2025-02-25 17:10 ` Sergey Shtylyov
2025-02-25 17:10 ` Sergey Shtylyov
@ 2025-03-02 13:43 ` Laurent Pinchart
2 siblings, 0 replies; 16+ messages in thread
From: Laurent Pinchart @ 2025-03-02 13:43 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Kieran Bingham, Niklas Söderlund, linux-kernel, linux-media,
linux-renesas-soc
Hi Jacopo,
Thank you for the patch.
On Mon, Feb 24, 2025 at 09:19:42PM +0100, Jacopo Mondi wrote:
> The VSPX generates "FRame End" (FRE) interrutps, one for each
> buffer transferred to the ISP.
>
> Even if the FRE interrupt is not enabled, it is reported as active
> in the interrupt status register.
>
> Make sure to clean it when handling the interrupt.
This doesn't seem to match the code code.
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> ---
> drivers/media/platform/renesas/vsp1/vsp1_drv.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_drv.c b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> index d13e9b31aa7cff8610ea196ae4de88ab22e44e0f..17ace4c6844d19aaafc27e79f016cc05091372bf 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> @@ -69,7 +69,8 @@ static irqreturn_t vsp1_irq_handler(int irq, void *data)
> i, wpf->entity.pipe->underrun_count);
> }
>
> - if (status & VI6_WPF_IRQ_STA_DFE) {
> + if (status & VI6_WPF_IRQ_STA_DFE ||
> + status & VI6_WPF_IRQ_STA_FRE) {
> vsp1_pipeline_frame_end(wpf->entity.pipe);
> ret = IRQ_HANDLED;
> }
>
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 3/6] media: vsp1: dl: Use singleshot DL for VSPX
2025-02-24 20:19 ` [PATCH v2 3/6] media: vsp1: dl: Use singleshot DL for VSPX Jacopo Mondi
@ 2025-03-02 13:45 ` Laurent Pinchart
0 siblings, 0 replies; 16+ messages in thread
From: Laurent Pinchart @ 2025-03-02 13:45 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Kieran Bingham, Niklas Söderlund, linux-kernel, linux-media,
linux-renesas-soc, Niklas Söderlund
Hi Jacopo,
Thank you for the patch.
On Mon, Feb 24, 2025 at 09:19:43PM +0100, Jacopo Mondi wrote:
> The vsp1_dl library allows to program a display list and feed it
> continuously to the VSP2. As an alternative operation mode, the library
> allows to program the VSP2 in 'single shot' mode, where a display list
> is submitted to the VSP on request only.
>
> Currently the 'single shot' mode is only available when the VSP2 is
> controlled by userspace, while it works in continuous mode when driven
> by DRM, as frames have to be submitted to the display continuously.
>
> For the VSPX use case, where there is no uapi support, we should however
> work in single-shot mode as the ISP driver programs the VSPX on
> request.
>
> Initialize the display lists in single shot mode in case the VSP1 is
> controlled by userspace or in case the pipeline features an IIF entity,
> as in the VSPX case.
>
> Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> ---
> drivers/media/platform/renesas/vsp1/vsp1_dl.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_dl.c b/drivers/media/platform/renesas/vsp1/vsp1_dl.c
> index ad3fa1c9cc737c92870c087dd7cb8cf584fce41b..b8f0398522257f2fb771b419f34b56e59707476b 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_dl.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_dl.c
> @@ -1099,7 +1099,12 @@ struct vsp1_dl_manager *vsp1_dlm_create(struct vsp1_device *vsp1,
> return NULL;
>
> dlm->index = index;
> - dlm->singleshot = vsp1->info->uapi;
> + /*
> + * uapi = single shot mode;
> + * DRM = continuous mode;
> + * VSPX = single shot mode;
> + */
> + dlm->singleshot = (vsp1->info->uapi || vsp1->iif);
Drop the parentheses.
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> dlm->vsp1 = vsp1;
>
> spin_lock_init(&dlm->lock);
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 1/6] media: vsp1: Add support IIF ISP Interface
2025-03-02 13:42 ` Laurent Pinchart
@ 2025-03-02 13:45 ` Laurent Pinchart
0 siblings, 0 replies; 16+ messages in thread
From: Laurent Pinchart @ 2025-03-02 13:45 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Kieran Bingham, Niklas Söderlund, linux-kernel, linux-media,
linux-renesas-soc
On Sun, Mar 02, 2025 at 03:42:11PM +0200, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Mon, Feb 24, 2025 at 09:19:41PM +0100, Jacopo Mondi wrote:
> > The IIF (ISP InterFace) is a VSP2 function that transfers data
> > to the ISP by reading from external memory through two RPF
> > instances.
> >
> > Add support for it in the vsp1 driver by introducing a new entity
> > type. The sole required operation is to enable the IIF function
> > during configure_stream().
> >
> > Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> > ---
> > drivers/media/platform/renesas/vsp1/Makefile | 2 +-
> > drivers/media/platform/renesas/vsp1/vsp1.h | 3 +
> > drivers/media/platform/renesas/vsp1/vsp1_drv.c | 11 ++
> > drivers/media/platform/renesas/vsp1/vsp1_entity.c | 8 ++
> > drivers/media/platform/renesas/vsp1/vsp1_entity.h | 1 +
> > drivers/media/platform/renesas/vsp1/vsp1_iif.c | 133 ++++++++++++++++++++++
> > drivers/media/platform/renesas/vsp1/vsp1_iif.h | 26 +++++
> > drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 1 +
> > drivers/media/platform/renesas/vsp1/vsp1_pipe.h | 1 +
> > drivers/media/platform/renesas/vsp1/vsp1_regs.h | 8 ++
> > drivers/media/platform/renesas/vsp1/vsp1_rpf.c | 7 ++
> > 11 files changed, 200 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/media/platform/renesas/vsp1/Makefile b/drivers/media/platform/renesas/vsp1/Makefile
> > index 4bb4dcbef7b55be7a40231a04e14029911da9beb..de8c802e1d1a16aabe1326fc8c27be33ad2b2e10 100644
> > --- a/drivers/media/platform/renesas/vsp1/Makefile
> > +++ b/drivers/media/platform/renesas/vsp1/Makefile
> > @@ -5,6 +5,6 @@ vsp1-y += vsp1_rpf.o vsp1_rwpf.o vsp1_wpf.o
> > vsp1-y += vsp1_clu.o vsp1_hsit.o vsp1_lut.o
> > vsp1-y += vsp1_brx.o vsp1_sru.o vsp1_uds.o
> > vsp1-y += vsp1_hgo.o vsp1_hgt.o vsp1_histo.o
> > -vsp1-y += vsp1_lif.o vsp1_uif.o
> > +vsp1-y += vsp1_iif.o vsp1_lif.o vsp1_uif.o
> >
> > obj-$(CONFIG_VIDEO_RENESAS_VSP1) += vsp1.o
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1.h b/drivers/media/platform/renesas/vsp1/vsp1.h
> > index 2f6f0c6ae55514d312e48232a5f8c8673f69ba13..263024639dd2a7564fc70ad52dbe17f9a5279f45 100644
> > --- a/drivers/media/platform/renesas/vsp1/vsp1.h
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1.h
> > @@ -32,6 +32,7 @@ struct vsp1_clu;
> > struct vsp1_hgo;
> > struct vsp1_hgt;
> > struct vsp1_hsit;
> > +struct vsp1_iif;
> > struct vsp1_lif;
> > struct vsp1_lut;
> > struct vsp1_rwpf;
> > @@ -56,6 +57,7 @@ struct vsp1_uif;
> > #define VSP1_HAS_BRS BIT(9)
> > #define VSP1_HAS_EXT_DL BIT(10)
> > #define VSP1_HAS_NON_ZERO_LBA BIT(11)
> > +#define VSP1_HAS_IIF BIT(12)
> >
> > struct vsp1_device_info {
> > u32 version;
> > @@ -91,6 +93,7 @@ struct vsp1_device {
> > struct vsp1_hgt *hgt;
> > struct vsp1_hsit *hsi;
> > struct vsp1_hsit *hst;
> > + struct vsp1_iif *iif;
> > struct vsp1_lif *lif[VSP1_MAX_LIF];
> > struct vsp1_lut *lut;
> > struct vsp1_rwpf *rpf[VSP1_MAX_RPF];
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_drv.c b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> > index 9fc6bf624a520ae38e9c5f30dfa4dfa412eec38e..d13e9b31aa7cff8610ea196ae4de88ab22e44e0f 100644
> > --- a/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_drv.c
> > @@ -29,6 +29,7 @@
> > #include "vsp1_hgo.h"
> > #include "vsp1_hgt.h"
> > #include "vsp1_hsit.h"
> > +#include "vsp1_iif.h"
> > #include "vsp1_lif.h"
> > #include "vsp1_lut.h"
> > #include "vsp1_pipe.h"
> > @@ -340,6 +341,16 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
> > &vsp1->entities);
> > }
> >
> > + if (vsp1_feature(vsp1, VSP1_HAS_IIF)) {
> > + vsp1->iif = vsp1_iif_create(vsp1);
> > + if (IS_ERR(vsp1->iif)) {
> > + ret = PTR_ERR(vsp1->iif);
> > + goto done;
> > + }
> > +
> > + list_add_tail(&vsp1->iif->entity.list_dev, &vsp1->entities);
> > + }
> > +
> > /*
> > * The LIFs are only supported when used in conjunction with the DU, in
> > * which case the userspace API is disabled. If the userspace API is
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.c b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> > index 8b8945bd8f108354f1b484530bc496dbac7d3d88..2096a09a12780ce64d9e8690aa4363bdaef3521e 100644
> > --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> > @@ -63,9 +63,14 @@ void vsp1_entity_route_setup(struct vsp1_entity *entity,
> > /*
> > * The ILV and BRS share the same data path route. The extra BRSSEL bit
> > * selects between the ILV and BRS.
> > + *
> > + * The BRU and IIF share the same data path route. The extra IIFSEL bit
> > + * selects between the IIF and BRU.
> > */
> > if (source->type == VSP1_ENTITY_BRS)
> > route |= VI6_DPR_ROUTE_BRSSEL;
> > + else if (source->type == VSP1_ENTITY_IIF)
> > + route |= VI6_DPR_ROUTE_IIFSEL;
> > vsp1_dl_body_write(dlb, source->route->reg, route);
> > }
> >
> > @@ -528,6 +533,9 @@ struct media_pad *vsp1_entity_remote_pad(struct media_pad *pad)
> > { VI6_DPR_NODE_WPF(idx) }, VI6_DPR_NODE_WPF(idx) }
> >
> > static const struct vsp1_route vsp1_routes[] = {
> > + { VSP1_ENTITY_IIF, 0, VI6_DPR_BRU_ROUTE,
> > + { VI6_DPR_NODE_BRU_IN(0), VI6_DPR_NODE_BRU_IN(1),
> > + VI6_DPR_NODE_BRU_IN(3) }, VI6_DPR_NODE_WPF(0) },
> > { VSP1_ENTITY_BRS, 0, VI6_DPR_ILV_BRS_ROUTE,
> > { VI6_DPR_NODE_BRS_IN(0), VI6_DPR_NODE_BRS_IN(1) }, 0 },
> > { VSP1_ENTITY_BRU, 0, VI6_DPR_BRU_ROUTE,
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.h b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> > index 1bcc9e27dfdc7385e91987c84c46fc3725f3b90e..bdcb780a79dafccda3843bd65d337b64d6e12eb3 100644
> > --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> > @@ -28,6 +28,7 @@ enum vsp1_entity_type {
> > VSP1_ENTITY_HGT,
> > VSP1_ENTITY_HSI,
> > VSP1_ENTITY_HST,
> > + VSP1_ENTITY_IIF,
> > VSP1_ENTITY_LIF,
> > VSP1_ENTITY_LUT,
> > VSP1_ENTITY_RPF,
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_iif.c b/drivers/media/platform/renesas/vsp1/vsp1_iif.c
> > new file mode 100644
> > index 0000000000000000000000000000000000000000..12889885b14f8d61ee5e416b4111d2eced7a0715
> > --- /dev/null
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_iif.c
> > @@ -0,0 +1,133 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +/*
> > + * vsp1_iif.c -- R-Car VSP1 IIF (ISP Interface)
> > + *
> > + * Copyright (C) 2025 Ideas On Board Oy
> > + * Copyright (C) 2025 Renesas Corporation
> > + */
> > +
> > +#include "vsp1.h"
> > +#include "vsp1_dl.h"
> > +#include "vsp1_iif.h"
> > +
> > +#define IIF_MIN_WIDTH 128U
> > +#define IIF_MIN_HEIGHT 32U
> > +#define IIF_MAX_WIDTH 5120U
> > +#define IIF_MAX_HEIGHT 4096U
> > +
> > +/* -----------------------------------------------------------------------------
> > + * Device Access
> > + */
> > +
> > +static inline void vsp1_iif_write(struct vsp1_dl_body *dlb, u32 reg, u32 data)
> > +{
> > + vsp1_dl_body_write(dlb, reg, data);
> > +}
> > +
> > +/* -----------------------------------------------------------------------------
> > + * V4L2 Subdevice Operations
> > + */
> > +
> > +static const unsigned int iif_codes[] = {
> > + MEDIA_BUS_FMT_SBGGR8_1X8,
> > + MEDIA_BUS_FMT_SGBRG8_1X8,
> > + MEDIA_BUS_FMT_SGRBG8_1X8,
> > + MEDIA_BUS_FMT_SRGGB8_1X8,
> > + MEDIA_BUS_FMT_SBGGR10_1X10,
> > + MEDIA_BUS_FMT_SGBRG10_1X10,
> > + MEDIA_BUS_FMT_SGRBG10_1X10,
> > + MEDIA_BUS_FMT_SRGGB10_1X10,
> > + MEDIA_BUS_FMT_SBGGR12_1X12,
> > + MEDIA_BUS_FMT_SGBRG12_1X12,
> > + MEDIA_BUS_FMT_SGRBG12_1X12,
> > + MEDIA_BUS_FMT_SRGGB12_1X12,
> > + MEDIA_BUS_FMT_SBGGR16_1X16,
> > + MEDIA_BUS_FMT_SGBRG16_1X16,
> > + MEDIA_BUS_FMT_SGRBG16_1X16,
> > + MEDIA_BUS_FMT_SRGGB16_1X16,
>
> As the VSP1 doesn't care about the bayer pattern, what would you think
> about simplifying this to
>
> MEDIA_BUS_FMT_Y8_1X8,
> MEDIA_BUS_FMT_Y10_1X10,
> MEDIA_BUS_FMT_Y12_1X12,
> MEDIA_BUS_FMT_Y16_1X16,
>
> > + MEDIA_BUS_FMT_METADATA_FIXED
> > +};
> > +
> > +static int iif_enum_mbus_code(struct v4l2_subdev *subdev,
> > + struct v4l2_subdev_state *sd_state,
> > + struct v4l2_subdev_mbus_code_enum *code)
> > +{
> > + return vsp1_subdev_enum_mbus_code(subdev, sd_state, code, iif_codes,
> > + ARRAY_SIZE(iif_codes));
> > +}
> > +
> > +static int iif_enum_frame_size(struct v4l2_subdev *subdev,
> > + struct v4l2_subdev_state *sd_state,
> > + struct v4l2_subdev_frame_size_enum *fse)
> > +{
> > + return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
> > + IIF_MIN_WIDTH, IIF_MIN_HEIGHT,
> > + IIF_MAX_WIDTH, IIF_MAX_HEIGHT);
> > +}
> > +
> > +static int iif_set_format(struct v4l2_subdev *subdev,
> > + struct v4l2_subdev_state *sd_state,
> > + struct v4l2_subdev_format *fmt)
> > +{
> > + return vsp1_subdev_set_pad_format(subdev, sd_state, fmt, iif_codes,
> > + ARRAY_SIZE(iif_codes),
> > + IIF_MIN_WIDTH, IIF_MIN_HEIGHT,
> > + IIF_MAX_WIDTH, IIF_MAX_HEIGHT);
> > +}
> > +
> > +static const struct v4l2_subdev_pad_ops iif_pad_ops = {
> > + .enum_mbus_code = iif_enum_mbus_code,
> > + .enum_frame_size = iif_enum_frame_size,
> > + .get_fmt = vsp1_subdev_get_pad_format,
> > + .set_fmt = iif_set_format,
> > +};
> > +
> > +static const struct v4l2_subdev_ops iif_ops = {
> > + .pad = &iif_pad_ops,
> > +};
> > +
> > +/* -----------------------------------------------------------------------------
> > + * VSP1 Entity Operations
> > + */
> > +
> > +static void iif_configure_stream(struct vsp1_entity *entity,
> > + struct v4l2_subdev_state *state,
> > + struct vsp1_pipeline *pipe,
> > + struct vsp1_dl_list *dl,
> > + struct vsp1_dl_body *dlb)
> > +{
> > + vsp1_iif_write(dlb, VI6_IIF_CTRL, VI6_IIF_CTRL_CTRL);
> > +}
> > +
> > +static const struct vsp1_entity_operations iif_entity_ops = {
> > + .configure_stream = iif_configure_stream,
> > +};
> > +
> > +/* -----------------------------------------------------------------------------
> > + * Initialization and Cleanup
> > + */
> > +
> > +struct vsp1_iif *vsp1_iif_create(struct vsp1_device *vsp1)
> > +{
> > + struct vsp1_iif *iif;
> > + int ret;
> > +
> > + iif = devm_kzalloc(vsp1->dev, sizeof(*iif), GFP_KERNEL);
> > + if (iif == NULL)
> > + return ERR_PTR(-ENOMEM);
> > +
> > + iif->entity.ops = &iif_entity_ops;
> > + iif->entity.type = VSP1_ENTITY_IIF;
> > +
> > + /*
> > + * The IIF is never exposed to userspace, but media entity registration
> > + * requires a function to be set. Use PROC_VIDEO_PIXEL_FORMATTER just to
> > + * avoid triggering a WARN_ON(), the value won't be seen anywhere.
> > + */
> > + ret = vsp1_entity_init(vsp1, &iif->entity, "iif", 3, &iif_ops,
> > + MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER);
> > + if (ret < 0)
> > + return ERR_PTR(ret);
> > +
> > + return iif;
> > +}
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_iif.h b/drivers/media/platform/renesas/vsp1/vsp1_iif.h
> > new file mode 100644
> > index 0000000000000000000000000000000000000000..165996a822c1baab1fc40636884c9e7a67e4db07
> > --- /dev/null
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_iif.h
> > @@ -0,0 +1,26 @@
> > +/* SPDX-License-Identifier: GPL-2.0+ */
> > +/*
> > + * vsp1_iif.h -- R-Car VSP1 IIF (ISP Interface)
> > + *
> > + * Copyright (C) 2025 Ideas On Board Oy
> > + * Copyright (C) 2025 Renesas Corporation
> > + */
> > +#ifndef __VSP1_IIF_H__
> > +#define __VSP1_IIF_H__
> > +
> > +#include <media/v4l2-subdev.h>
> > +
> > +#include "vsp1_entity.h"
> > +
> > +struct vsp1_iif {
> > + struct vsp1_entity entity;
> > +};
> > +
> > +static inline struct vsp1_iif *to_iif(struct v4l2_subdev *subdev)
> > +{
> > + return container_of(subdev, struct vsp1_iif, entity.subdev);
> > +}
> > +
> > +struct vsp1_iif *vsp1_iif_create(struct vsp1_device *vsp1);
> > +
> > +#endif /* __VSP1_IIF_H__ */
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > index bb0739f684f39e23326a4d8fdb9f43e020bc23c8..8e9be3ec1b4dbdad1cbe35ae3a88952f46e41343 100644
> > --- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > @@ -286,6 +286,7 @@ void vsp1_pipeline_reset(struct vsp1_pipeline *pipe)
> > pipe->brx = NULL;
> > pipe->hgo = NULL;
> > pipe->hgt = NULL;
> > + pipe->iif = NULL;
> > pipe->lif = NULL;
> > pipe->uds = NULL;
> > }
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.h b/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
> > index 1ba7bdbad5a845da0a4d71888e193e46d62bed90..1655a820da102003d3d7da82a7cdd64e01c29ac6 100644
> > --- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
> > @@ -119,6 +119,7 @@ struct vsp1_pipeline {
> > struct vsp1_entity *brx;
> > struct vsp1_entity *hgo;
> > struct vsp1_entity *hgt;
> > + struct vsp1_entity *iif;
> > struct vsp1_entity *lif;
> > struct vsp1_entity *uds;
> > struct vsp1_entity *uds_input;
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_regs.h b/drivers/media/platform/renesas/vsp1/vsp1_regs.h
> > index 7eca82e0ba7ec5e02a5f3b9a30ccdcb48db39ed2..86e47c2d991fb4e0719b63c4ccb29340610ac24f 100644
> > --- a/drivers/media/platform/renesas/vsp1/vsp1_regs.h
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_regs.h
> > @@ -252,6 +252,13 @@
> > #define VI6_RPF_BRDITH_CTRL_ODE BIT(8)
> > #define VI6_RPF_BRDITH_CTRL_CBRM BIT(0)
> >
> > +/* -----------------------------------------------------------------------------
> > + * IIF Control Registers
> > + */
> > +
> > +#define VI6_IIF_CTRL 0x0608
> > +#define VI6_IIF_CTRL_CTRL 0x13
> > +
> > /* -----------------------------------------------------------------------------
> > * WPF Control Registers
> > */
> > @@ -388,6 +395,7 @@
> > #define VI6_DPR_HST_ROUTE 0x2044
> > #define VI6_DPR_HSI_ROUTE 0x2048
> > #define VI6_DPR_BRU_ROUTE 0x204c
> > +#define VI6_DPR_ROUTE_IIFSEL BIT(28)
> > #define VI6_DPR_ILV_BRS_ROUTE 0x2050
> > #define VI6_DPR_ROUTE_BRSSEL BIT(28)
> > #define VI6_DPR_ROUTE_FXA_MASK (0xff << 16)
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> > index 5c8b3ba1bd3c2c7b9289f05c9c2578e9717c23ff..e10ed836153633c4fe27224d0df39c77d4c8ab89 100644
> > --- a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> > @@ -163,6 +163,13 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
> > if (pipe->interlaced)
> > top /= 2;
> >
> > + /* No further configuration for VSPX. */
> > + if (pipe->iif) {
> > + /* VSPX wants alpha_sel to be set to 0. */
> > + vsp1_rpf_write(rpf, dlb, VI6_RPF_ALPH_SEL, 0);
> > + return;
> > + }
> > +
>
> I think this belongs to a separate patch where you adjust the RPF and
> WPF code to support the VSP-X.
>
> With those small issues addressed,
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
I meant
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> > vsp1_rpf_write(rpf, dlb, VI6_RPF_LOC,
> > (left << VI6_RPF_LOC_HCOORD_SHIFT) |
> > (top << VI6_RPF_LOC_VCOORD_SHIFT));
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 5/6] media: vsp1: rwpf: Support RAW Bayer and ISP config
2025-02-24 20:19 ` [PATCH v2 5/6] media: vsp1: rwpf: Support RAW Bayer and ISP config Jacopo Mondi
@ 2025-03-02 14:01 ` Laurent Pinchart
0 siblings, 0 replies; 16+ messages in thread
From: Laurent Pinchart @ 2025-03-02 14:01 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Kieran Bingham, Niklas Söderlund, linux-kernel, linux-media,
linux-renesas-soc
Hi Jacopo,
Thank you for the patch.
On Mon, Feb 24, 2025 at 09:19:45PM +0100, Jacopo Mondi wrote:
> With the forthcoming support for VSPX the r/wpf unit will be used
> to perform memory access on the behalf of the ISP units.
>
> Prepare to support reading from external memory images in RAW Bayer
> format and ISP configuration parameters by expanding the list
> of supported media bus codes.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> ---
> drivers/media/platform/renesas/vsp1/vsp1_rwpf.c | 97 +++++++++++++++++++++++--
> 1 file changed, 92 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> index 93b0ed5fd0da0c6a182dbbfe1e54eb8cfd66c493..aef7b3d53a2171cda028a272f587641b4a8f85dc 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> @@ -10,18 +10,102 @@
> #include <media/v4l2-subdev.h>
>
> #include "vsp1.h"
> +#include "vsp1_pipe.h"
I don't think this is needed.
> #include "vsp1_rwpf.h"
> #include "vsp1_video.h"
>
> #define RWPF_MIN_WIDTH 1
> #define RWPF_MIN_HEIGHT 1
>
> +struct vsp1_rwpf_codes {
> + const u32 *codes;
> + unsigned int num_codes;
> +};
> +
> static const u32 rwpf_mbus_codes[] = {
> MEDIA_BUS_FMT_ARGB8888_1X32,
> MEDIA_BUS_FMT_AHSV8888_1X32,
> MEDIA_BUS_FMT_AYUV8_1X32,
> };
>
> +static const struct vsp1_rwpf_codes rwpf_codes = {
> + .codes = rwpf_mbus_codes,
> + .num_codes = ARRAY_SIZE(rwpf_mbus_codes),
> +};
> +
> +static const u32 vspx_rpf0_mbus_codes[] = {
> + MEDIA_BUS_FMT_SBGGR8_1X8,
> + MEDIA_BUS_FMT_SGBRG8_1X8,
> + MEDIA_BUS_FMT_SGRBG8_1X8,
> + MEDIA_BUS_FMT_SRGGB8_1X8,
> + MEDIA_BUS_FMT_SBGGR10_1X10,
> + MEDIA_BUS_FMT_SGBRG10_1X10,
> + MEDIA_BUS_FMT_SGRBG10_1X10,
> + MEDIA_BUS_FMT_SRGGB10_1X10,
> + MEDIA_BUS_FMT_SBGGR12_1X12,
> + MEDIA_BUS_FMT_SGBRG12_1X12,
> + MEDIA_BUS_FMT_SGRBG12_1X12,
> + MEDIA_BUS_FMT_SRGGB12_1X12,
> + MEDIA_BUS_FMT_SBGGR16_1X16,
> + MEDIA_BUS_FMT_SGBRG16_1X16,
> + MEDIA_BUS_FMT_SGRBG16_1X16,
> + MEDIA_BUS_FMT_SRGGB16_1X16,
Same comment as in 1/6,
MEDIA_BUS_FMT_Y8_1X8,
MEDIA_BUS_FMT_Y10_1X10,
MEDIA_BUS_FMT_Y12_1X12,
MEDIA_BUS_FMT_Y16_1X16,
> + MEDIA_BUS_FMT_METADATA_FIXED
> +};
> +
> +static const struct vsp1_rwpf_codes vspx_rpf0_codes = {
> + .codes = vspx_rpf0_mbus_codes,
> + .num_codes = ARRAY_SIZE(vspx_rpf0_mbus_codes),
> +};
> +
> +static const u32 vspx_rpf1_mbus_codes[] = {
> + MEDIA_BUS_FMT_SBGGR8_1X8,
> + MEDIA_BUS_FMT_SGBRG8_1X8,
> + MEDIA_BUS_FMT_SGRBG8_1X8,
> + MEDIA_BUS_FMT_SRGGB8_1X8,
> + MEDIA_BUS_FMT_SBGGR10_1X10,
> + MEDIA_BUS_FMT_SGBRG10_1X10,
> + MEDIA_BUS_FMT_SGRBG10_1X10,
> + MEDIA_BUS_FMT_SRGGB10_1X10,
> + MEDIA_BUS_FMT_SBGGR12_1X12,
> + MEDIA_BUS_FMT_SGBRG12_1X12,
> + MEDIA_BUS_FMT_SGRBG12_1X12,
> + MEDIA_BUS_FMT_SRGGB12_1X12,
> + MEDIA_BUS_FMT_SBGGR16_1X16,
> + MEDIA_BUS_FMT_SGBRG16_1X16,
> + MEDIA_BUS_FMT_SGRBG16_1X16,
> + MEDIA_BUS_FMT_SRGGB16_1X16,
Here too.
> +};
> +
> +static const struct vsp1_rwpf_codes vspx_rpf1_codes = {
> + .codes = vspx_rpf1_mbus_codes,
> + .num_codes = ARRAY_SIZE(vspx_rpf1_mbus_codes),
> +};
> +
> +static const struct vsp1_rwpf_codes *vsp1_rwpf_codes(struct v4l2_subdev *sd)
> +{
> + struct vsp1_rwpf *rwpf = to_rwpf(sd);
> + struct vsp1_entity *ent = &rwpf->entity;
> +
> + /* Only VSPX supports reading Bayer formats. */
> + if (!vsp1_feature(ent->vsp1, VSP1_HAS_IIF))
> + return &rwpf_codes;
> +
> + if (ent->type == VSP1_ENTITY_RPF) {
> + switch (ent->index) {
> + case 0:
> + /* VSPX RPF0 supports ISP config data too. */
> + return &vspx_rpf0_codes;
> + case 1:
> + return &vspx_rpf1_codes;
> + default:
This should never happen. See below for a proposal on how to handle it.
> + return &rwpf_codes;
> + }
> + }
> +
> + return &rwpf_codes;
You could lower indentation with
if (ent->type != VSP1_ENTITY_RPF)
return &rwpf_codes;
/* Only VSPX supports reading Bayer formats. */
if (!vsp1_feature(ent->vsp1, VSP1_HAS_IIF))
return &rwpf_codes;
switch (ent->index) {
case 0:
/* VSPX RPF0 supports ISP config data too. */
return &vspx_rpf0_codes;
case 1:
return &vspx_rpf1_codes;
default:
return &rwpf_codes;
}
> +}
Would it make sense to call this function at init time, and store the
const struct vsp1_rwpf_codes pointer in the vsp1_rwpf structure ? You
could rename vsp1_rwpf_init_ctrls() to vsp1_rwpf_init() (or add a
vsp1_rwpf_init() function that calls vsp1_rwpf_init_ctrls()) and handle
the format initialization there. If the RPF index is > 1,
vsp1_rwpf_init() should return an error (callers should be fixed to
handle the error, that's a patch that can be applied on its own
already).
> +
> /* -----------------------------------------------------------------------------
> * V4L2 Subdevice Operations
> */
> @@ -30,10 +114,12 @@ static int vsp1_rwpf_enum_mbus_code(struct v4l2_subdev *subdev,
> struct v4l2_subdev_state *sd_state,
> struct v4l2_subdev_mbus_code_enum *code)
> {
> - if (code->index >= ARRAY_SIZE(rwpf_mbus_codes))
> + const struct vsp1_rwpf_codes *codes = vsp1_rwpf_codes(subdev);
> +
> + if (code->index >= codes->num_codes)
> return -EINVAL;
>
> - code->code = rwpf_mbus_codes[code->index];
> + code->code = codes->codes[code->index];
>
> return 0;
> }
> @@ -54,6 +140,7 @@ static int vsp1_rwpf_set_format(struct v4l2_subdev *subdev,
> struct v4l2_subdev_state *sd_state,
> struct v4l2_subdev_format *fmt)
> {
> + const struct vsp1_rwpf_codes *codes = vsp1_rwpf_codes(subdev);
> struct vsp1_rwpf *rwpf = to_rwpf(subdev);
> struct v4l2_subdev_state *state;
> struct v4l2_mbus_framefmt *format;
> @@ -69,11 +156,11 @@ static int vsp1_rwpf_set_format(struct v4l2_subdev *subdev,
> }
>
> /* Default to YUV if the requested format is not supported. */
> - for (i = 0; i < ARRAY_SIZE(rwpf_mbus_codes); ++i) {
> - if (fmt->format.code == rwpf_mbus_codes[i])
> + for (i = 0; i < codes->num_codes; ++i) {
> + if (fmt->format.code == codes->codes[i])
> break;
> }
> - if (i == ARRAY_SIZE(rwpf_mbus_codes))
> + if (i == codes->num_codes)
> fmt->format.code = MEDIA_BUS_FMT_AYUV8_1X32;
This isn't a valid format for the VSP-X. I would pick codes->codes[0] as
a default.
>
> format = v4l2_subdev_state_get_format(state, fmt->pad);
>
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 6/6] media: vsp1: rwpf: Support operations with IIF
2025-02-24 20:19 ` [PATCH v2 6/6] media: vsp1: rwpf: Support operations with IIF Jacopo Mondi
@ 2025-03-02 14:05 ` Laurent Pinchart
0 siblings, 0 replies; 16+ messages in thread
From: Laurent Pinchart @ 2025-03-02 14:05 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Kieran Bingham, Niklas Söderlund, linux-kernel, linux-media,
linux-renesas-soc
Hi Jacopo,
Thank you for the patch.
On Mon, Feb 24, 2025 at 09:19:46PM +0100, Jacopo Mondi wrote:
> When the RPF/WPF units are used for ISP interfacing through
> the IIF, the set of accessible registers is limited compared to
> the regular VSPD operations.
>
> Support ISP interfacing in the rpf and wpf drivers by checking if
s/drivers/entities/ maybe
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> the pipe features an IIF instance and writing only the relevant
> registers.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> ---
> drivers/media/platform/renesas/vsp1/vsp1_rpf.c | 11 +++++++++--
> drivers/media/platform/renesas/vsp1/vsp1_wpf.c | 14 ++++++++++----
> 2 files changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> index e10ed836153633c4fe27224d0df39c77d4c8ab89..dae94129a105a646917353dba0181f9c93327132 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> @@ -84,7 +84,7 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
> sink_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SINK);
> source_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SOURCE);
>
> - infmt = VI6_RPF_INFMT_CIPM
> + infmt = (pipe->iif ? 0 : VI6_RPF_INFMT_CIPM)
> | (fmtinfo->hwfmt << VI6_RPF_INFMT_RDFMT_SHIFT);
>
> if (fmtinfo->swap_yc)
> @@ -98,7 +98,7 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
> vsp1_rpf_write(rpf, dlb, VI6_RPF_INFMT, infmt);
> vsp1_rpf_write(rpf, dlb, VI6_RPF_DSWAP, fmtinfo->swap);
>
> - if (entity->vsp1->info->gen == 4) {
> + if (entity->vsp1->info->gen == 4 && !pipe->iif) {
> u32 ext_infmt0;
> u32 ext_infmt1;
> u32 ext_infmt2;
> @@ -174,6 +174,13 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
> (left << VI6_RPF_LOC_HCOORD_SHIFT) |
> (top << VI6_RPF_LOC_VCOORD_SHIFT));
>
> + /* No further configuration for VSPX. */
> + if (pipe->iif) {
> + /* VSPX wants alpha_sel to be set to 0. */
> + vsp1_rpf_write(rpf, dlb, VI6_RPF_ALPH_SEL, 0);
> + return;
> + }
> +
> /*
> * On Gen2 use the alpha channel (extended to 8 bits) when available or
> * a fixed alpha value set through the V4L2_CID_ALPHA_COMPONENT control
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
> index f176750ccd9847fdb8d51f7f51a6bd5092b70197..88db60596f0f2f459eddbbc2ea7247620d675dd8 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
> @@ -247,8 +247,11 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
> sink_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SINK);
> source_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SOURCE);
>
> - /* Format */
> - if (!pipe->lif || wpf->writeback) {
> + /*
> + * Format configuration. Skip for IIF (VSPX) or if the pipe doesn't
> + * write to memory.
> + */
> + if (!pipe->iif && (!pipe->lif || wpf->writeback)) {
> const struct v4l2_pix_format_mplane *format = &wpf->format;
> const struct vsp1_format_info *fmtinfo = wpf->fmtinfo;
>
> @@ -291,7 +294,7 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
> * Sources. If the pipeline has a single input and BRx is not used,
> * configure it as the master layer. Otherwise configure all
> * inputs as sub-layers and select the virtual RPF as the master
> - * layer.
> + * layer. For VSPX configure the enabled sources as masters.
> */
> for (i = 0; i < vsp1->info->rpf_count; ++i) {
> struct vsp1_rwpf *input = pipe->inputs[i];
> @@ -299,7 +302,7 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
> if (!input)
> continue;
>
> - srcrpf |= (!pipe->brx && pipe->num_inputs == 1)
> + srcrpf |= (pipe->iif || (!pipe->brx && pipe->num_inputs == 1))
> ? VI6_WPF_SRCRPF_RPF_ACT_MST(input->entity.index)
> : VI6_WPF_SRCRPF_RPF_ACT_SUB(input->entity.index);
> }
> @@ -316,6 +319,9 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
> vsp1_dl_body_write(dlb, VI6_WPF_IRQ_ENB(index),
> VI6_WPF_IRQ_ENB_DFEE);
>
> + if (pipe->iif)
> + return;
> +
> /*
> * Configure writeback for display pipelines (the wpf writeback flag is
> * never set for memory-to-memory pipelines). Start by adding a chained
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2025-03-02 14:05 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-24 20:19 [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Jacopo Mondi
2025-02-24 20:19 ` [PATCH v2 1/6] media: vsp1: Add support IIF ISP Interface Jacopo Mondi
2025-03-02 13:42 ` Laurent Pinchart
2025-03-02 13:45 ` Laurent Pinchart
2025-02-24 20:19 ` [PATCH v2 2/6] media: vsp1: Clean FRE interrupt status Jacopo Mondi
2025-02-25 17:10 ` Sergey Shtylyov
2025-02-25 17:10 ` Sergey Shtylyov
2025-03-02 13:43 ` Laurent Pinchart
2025-02-24 20:19 ` [PATCH v2 3/6] media: vsp1: dl: Use singleshot DL for VSPX Jacopo Mondi
2025-03-02 13:45 ` Laurent Pinchart
2025-02-24 20:19 ` [PATCH v2 4/6] media: vsp1: rwpf: Break out format handling Jacopo Mondi
2025-02-24 20:19 ` [PATCH v2 5/6] media: vsp1: rwpf: Support RAW Bayer and ISP config Jacopo Mondi
2025-03-02 14:01 ` Laurent Pinchart
2025-02-24 20:19 ` [PATCH v2 6/6] media: vsp1: rwpf: Support operations with IIF Jacopo Mondi
2025-03-02 14:05 ` Laurent Pinchart
2025-02-25 22:56 ` [PATCH v2 0/6] media: renesas: vsp1: Add support for IIF Niklas Söderlund
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.