* [PATCH v6 0/7] media: renesas: vsp1: Add support for IIF
@ 2025-03-21 15:45 Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 1/7] media: vsp1: Add support IIF ISP Interface Jacopo Mondi
` (6 more replies)
0 siblings, 7 replies; 13+ messages in thread
From: Jacopo Mondi @ 2025-03-21 15:45 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 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 v6:
- Little cosmetic change as suggested by Laurent
- Collect tags
- Link to v5: https://lore.kernel.org/r/20250319-v4h-iif-v5-0-0a10456d792c@ideasonboard.com
Changes in v5:
- Drop additional empty line 5/6
- Link to v4: https://lore.kernel.org/r/20250318-v4h-iif-v4-0-10ed4c41c195@ideasonboard.com
Changes in v4:
- Fix SWAP bits for RAW10, RAW12 and RAW16
- Link to v3: https://lore.kernel.org/r/20250317-v4h-iif-v3-0-63aab8982b50@ideasonboard.com
Changes in v3:
- Drop 2/6 from v2
- Add 5/7 to prepare for a new implementation of 6/7
- Individual changelog per patch
- Add 7/7
- Link to v2: https://lore.kernel.org/r/20250224-v4h-iif-v2-0-0305e3c1fe2d@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 (7):
media: vsp1: Add support IIF ISP Interface
media: vsp1: dl: Use singleshot DL for VSPX
media: vsp1: rwpf: Break out format handling
media: vsp1: wpf: Propagate vsp1_rwpf_init_ctrls()
media: vsp1: rwpf: Initialize image formats
media: vsp1: rwpf: Support operations with IIF
media: vsp1: pipe: Add RAW Bayer formats mapping
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 | 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 | 121 ++++++++++++++++++++++
drivers/media/platform/renesas/vsp1/vsp1_iif.h | 26 +++++
drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 73 ++++++++++++-
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 | 16 ++-
drivers/media/platform/renesas/vsp1/vsp1_rwpf.c | 91 ++++++++++++++--
drivers/media/platform/renesas/vsp1/vsp1_rwpf.h | 4 +
drivers/media/platform/renesas/vsp1/vsp1_wpf.c | 31 ++++--
15 files changed, 379 insertions(+), 24 deletions(-)
---
base-commit: f2151613e040973c868d28c8b00885dfab69eb75
change-id: 20250123-v4h-iif-a1dda640c95d
Best regards,
--
Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v6 1/7] media: vsp1: Add support IIF ISP Interface
2025-03-21 15:45 [PATCH v6 0/7] media: renesas: vsp1: Add support for IIF Jacopo Mondi
@ 2025-03-21 15:45 ` Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 2/7] media: vsp1: dl: Use singleshot DL for VSPX Jacopo Mondi
` (5 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Jacopo Mondi @ 2025-03-21 15:45 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 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().
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
v2->v3:
- Replace SRGGB codes with luma-only
- Fix CI loop warning report
- Drop a hunk that was not meant to be there
---
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 | 121 ++++++++++++++++++++++
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 ++
10 files changed, 181 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/renesas/vsp1/Makefile b/drivers/media/platform/renesas/vsp1/Makefile
index 4bb4dcbef7b5..de8c802e1d1a 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 2f6f0c6ae555..263024639dd2 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 9fc6bf624a52..d13e9b31aa7c 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 8b8945bd8f10..2096a09a1278 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 1bcc9e27dfdc..bdcb780a79da 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 000000000000..5dd62bebbe8c
--- /dev/null
+++ b/drivers/media/platform/renesas/vsp1/vsp1_iif.c
@@ -0,0 +1,121 @@
+// 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_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)
+ 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 000000000000..165996a822c1
--- /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 bb0739f684f3..8e9be3ec1b4d 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 1ba7bdbad5a8..1655a820da10 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 7eca82e0ba7e..86e47c2d991f 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)
--
2.48.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v6 2/7] media: vsp1: dl: Use singleshot DL for VSPX
2025-03-21 15:45 [PATCH v6 0/7] media: renesas: vsp1: Add support for IIF Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 1/7] media: vsp1: Add support IIF ISP Interface Jacopo Mondi
@ 2025-03-21 15:45 ` Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 3/7] media: vsp1: rwpf: Break out format handling Jacopo Mondi
` (4 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Jacopo Mondi @ 2025-03-21 15:45 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 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: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
v2->v3:
- Drop () in condition
---
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 ad3fa1c9cc73..bb8228b19824 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] 13+ messages in thread
* [PATCH v6 3/7] media: vsp1: rwpf: Break out format handling
2025-03-21 15:45 [PATCH v6 0/7] media: renesas: vsp1: Add support for IIF Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 1/7] media: vsp1: Add support IIF ISP Interface Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 2/7] media: vsp1: dl: Use singleshot DL for VSPX Jacopo Mondi
@ 2025-03-21 15:45 ` Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 4/7] media: vsp1: wpf: Propagate vsp1_rwpf_init_ctrls() Jacopo Mondi
` (3 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Jacopo Mondi @ 2025-03-21 15:45 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>
Tested-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 9d38203e73d0..93b0ed5fd0da 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] 13+ messages in thread
* [PATCH v6 4/7] media: vsp1: wpf: Propagate vsp1_rwpf_init_ctrls()
2025-03-21 15:45 [PATCH v6 0/7] media: renesas: vsp1: Add support for IIF Jacopo Mondi
` (2 preceding siblings ...)
2025-03-21 15:45 ` [PATCH v6 3/7] media: vsp1: rwpf: Break out format handling Jacopo Mondi
@ 2025-03-21 15:45 ` Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 5/7] media: vsp1: rwpf: Initialize image formats Jacopo Mondi
` (2 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Jacopo Mondi @ 2025-03-21 15:45 UTC (permalink / raw)
To: Laurent Pinchart, Kieran Bingham, Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc, Jacopo Mondi
vsp1_wpf.c calls vsp1_rwpf_init_ctrls() to initialize controls that
are common between RPF and WPF.
However, the vsp1_wpf.c implementation does not check for the function
call return value. Fix this by propagating to the caller the return
value.
While at it, drop a duplicated error message in wpf_init_controls() as
the caller already report it.
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
v2->v3:
- New patch
---
drivers/media/platform/renesas/vsp1/vsp1_wpf.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
index f176750ccd98..da651a882bbb 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
@@ -133,6 +133,7 @@ static int wpf_init_controls(struct vsp1_rwpf *wpf)
{
struct vsp1_device *vsp1 = wpf->entity.vsp1;
unsigned int num_flip_ctrls;
+ int ret;
spin_lock_init(&wpf->flip.lock);
@@ -156,7 +157,9 @@ static int wpf_init_controls(struct vsp1_rwpf *wpf)
num_flip_ctrls = 0;
}
- vsp1_rwpf_init_ctrls(wpf, num_flip_ctrls);
+ ret = vsp1_rwpf_init_ctrls(wpf, num_flip_ctrls);
+ if (ret < 0)
+ return ret;
if (num_flip_ctrls >= 1) {
wpf->flip.ctrls.vflip =
@@ -174,11 +177,8 @@ static int wpf_init_controls(struct vsp1_rwpf *wpf)
v4l2_ctrl_cluster(3, &wpf->flip.ctrls.vflip);
}
- if (wpf->ctrls.error) {
- dev_err(vsp1->dev, "wpf%u: failed to initialize controls\n",
- wpf->entity.index);
+ if (wpf->ctrls.error)
return wpf->ctrls.error;
- }
return 0;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v6 5/7] media: vsp1: rwpf: Initialize image formats
2025-03-21 15:45 [PATCH v6 0/7] media: renesas: vsp1: Add support for IIF Jacopo Mondi
` (3 preceding siblings ...)
2025-03-21 15:45 ` [PATCH v6 4/7] media: vsp1: wpf: Propagate vsp1_rwpf_init_ctrls() Jacopo Mondi
@ 2025-03-21 15:45 ` Jacopo Mondi
2025-03-21 17:08 ` Laurent Pinchart
2025-03-21 15:45 ` [PATCH v6 6/7] media: vsp1: rwpf: Support operations with IIF Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 7/7] media: vsp1: pipe: Add RAW Bayer formats mapping Jacopo Mondi
6 siblings, 1 reply; 13+ messages in thread
From: Jacopo Mondi @ 2025-03-21 15:45 UTC (permalink / raw)
To: Laurent Pinchart, Kieran Bingham, Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc, Jacopo Mondi,
Niklas Söderlund
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.
Store the list of valid mbus code in the rwpf device and initialize it
in the new vsp1_rwpf_init_formats() function, called by RPFs and WFPs at
entity creation time.
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
v4->v5:
- Drop double empty line
v2->v3:
- Introduce vsp1_rwpf_init_formats()
- Store the list of mbus codes at init time instead of computing it
---
drivers/media/platform/renesas/vsp1/vsp1_rpf.c | 7 +++
drivers/media/platform/renesas/vsp1/vsp1_rwpf.c | 78 +++++++++++++++++++++++--
drivers/media/platform/renesas/vsp1/vsp1_rwpf.h | 4 ++
drivers/media/platform/renesas/vsp1/vsp1_wpf.c | 7 +++
4 files changed, 90 insertions(+), 6 deletions(-)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
index 5c8b3ba1bd3c..056491286577 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
@@ -400,6 +400,13 @@ struct vsp1_rwpf *vsp1_rpf_create(struct vsp1_device *vsp1, unsigned int index)
rpf->entity.type = VSP1_ENTITY_RPF;
rpf->entity.index = index;
+ ret = vsp1_rwpf_init_formats(vsp1, rpf);
+ if (ret < 0) {
+ dev_err(vsp1->dev, "rpf%u: failed to initialize formats\n",
+ index);
+ return ERR_PTR(ret);
+ }
+
sprintf(name, "rpf.%u", index);
ret = vsp1_entity_init(vsp1, &rpf->entity, name, 2, &vsp1_rwpf_subdev_ops,
MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER);
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
index 93b0ed5fd0da..91d70886e64d 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
@@ -16,12 +16,47 @@
#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_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_Y8_1X8,
+ MEDIA_BUS_FMT_Y10_1X10,
+ MEDIA_BUS_FMT_Y12_1X12,
+ MEDIA_BUS_FMT_Y16_1X16,
+};
+
+static const struct vsp1_rwpf_codes vspx_rpf1_codes = {
+ .codes = vspx_rpf1_mbus_codes,
+ .num_codes = ARRAY_SIZE(vspx_rpf1_mbus_codes),
+};
+
/* -----------------------------------------------------------------------------
* V4L2 Subdevice Operations
*/
@@ -30,10 +65,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))
+ struct vsp1_rwpf *rwpf = to_rwpf(subdev);
+
+ if (code->index >= rwpf->mbus_codes->num_codes)
return -EINVAL;
- code->code = rwpf_mbus_codes[code->index];
+ code->code = rwpf->mbus_codes->codes[code->index];
return 0;
}
@@ -69,12 +106,12 @@ 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 < rwpf->mbus_codes->num_codes; ++i) {
+ if (fmt->format.code == rwpf->mbus_codes->codes[i])
break;
}
- if (i == ARRAY_SIZE(rwpf_mbus_codes))
- fmt->format.code = MEDIA_BUS_FMT_AYUV8_1X32;
+ if (i == rwpf->mbus_codes->num_codes)
+ fmt->format.code = rwpf->mbus_codes->codes[0];
format = v4l2_subdev_state_get_format(state, fmt->pad);
@@ -267,8 +304,37 @@ static const struct v4l2_ctrl_ops vsp1_rwpf_ctrl_ops = {
.s_ctrl = vsp1_rwpf_s_ctrl,
};
+int vsp1_rwpf_init_formats(struct vsp1_device *vsp1, struct vsp1_rwpf *rwpf)
+{
+ /* Only VSPX and RPF support reading Bayer data. */
+ if (!vsp1_feature(vsp1, VSP1_HAS_IIF) ||
+ rwpf->entity.type != VSP1_ENTITY_RPF) {
+ rwpf->mbus_codes = &rwpf_codes;
+ return 0;
+ }
+
+ /*
+ * VSPX only features RPF0 and RPF1. RPF0 supports reading ISP ConfigDMA
+ * and Bayer data, RPF1 supports reading Bayer data only.
+ */
+ switch (rwpf->entity.index) {
+ case 0:
+ rwpf->mbus_codes = &vspx_rpf0_codes;
+ break;
+ case 1:
+ rwpf->mbus_codes = &vspx_rpf1_codes;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
int vsp1_rwpf_init_ctrls(struct vsp1_rwpf *rwpf, unsigned int ncontrols)
{
+ /* Initialize controls. */
+
v4l2_ctrl_handler_init(&rwpf->ctrls, ncontrols + 1);
v4l2_ctrl_new_std(&rwpf->ctrls, &vsp1_rwpf_ctrl_ops,
V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 255);
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.h b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.h
index 5ac9f0a6fafc..64feb4742494 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.h
+++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.h
@@ -30,6 +30,7 @@ struct vsp1_rwpf_memory {
dma_addr_t addr[3];
};
+struct vsp1_rwpf_codes;
struct vsp1_rwpf {
struct vsp1_entity entity;
struct v4l2_ctrl_handler ctrls;
@@ -39,6 +40,8 @@ struct vsp1_rwpf {
unsigned int max_width;
unsigned int max_height;
+ const struct vsp1_rwpf_codes *mbus_codes;
+
struct v4l2_pix_format_mplane format;
const struct vsp1_format_info *fmtinfo;
unsigned int brx_input;
@@ -81,6 +84,7 @@ struct vsp1_rwpf *vsp1_wpf_create(struct vsp1_device *vsp1, unsigned int index);
void vsp1_wpf_stop(struct vsp1_rwpf *wpf);
+int vsp1_rwpf_init_formats(struct vsp1_device *vsp1, struct vsp1_rwpf *rwpf);
int vsp1_rwpf_init_ctrls(struct vsp1_rwpf *rwpf, unsigned int ncontrols);
extern const struct v4l2_subdev_ops vsp1_rwpf_subdev_ops;
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
index da651a882bbb..a32e4b3527db 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
@@ -548,6 +548,13 @@ struct vsp1_rwpf *vsp1_wpf_create(struct vsp1_device *vsp1, unsigned int index)
wpf->entity.type = VSP1_ENTITY_WPF;
wpf->entity.index = index;
+ ret = vsp1_rwpf_init_formats(vsp1, wpf);
+ if (ret < 0) {
+ dev_err(vsp1->dev, "wpf%u: failed to initialize formats\n",
+ index);
+ return ERR_PTR(ret);
+ }
+
sprintf(name, "wpf.%u", index);
ret = vsp1_entity_init(vsp1, &wpf->entity, name, 2, &vsp1_rwpf_subdev_ops,
MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER);
--
2.48.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v6 6/7] media: vsp1: rwpf: Support operations with IIF
2025-03-21 15:45 [PATCH v6 0/7] media: renesas: vsp1: Add support for IIF Jacopo Mondi
` (4 preceding siblings ...)
2025-03-21 15:45 ` [PATCH v6 5/7] media: vsp1: rwpf: Initialize image formats Jacopo Mondi
@ 2025-03-21 15:45 ` Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 7/7] media: vsp1: pipe: Add RAW Bayer formats mapping Jacopo Mondi
6 siblings, 0 replies; 13+ messages in thread
From: Jacopo Mondi @ 2025-03-21 15:45 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
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 entities by checking if
the pipe features an IIF instance and writing only the relevant
registers.
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-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_rpf.c | 9 ++++++++-
drivers/media/platform/renesas/vsp1/vsp1_wpf.c | 14 ++++++++++----
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
index 056491286577..6f6cf70e267b 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,6 +98,13 @@ 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);
+ /* 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;
+ }
+
if (entity->vsp1->info->gen == 4) {
u32 ext_infmt0;
u32 ext_infmt1;
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
index a32e4b3527db..fafef9eeb3f8 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] 13+ messages in thread
* [PATCH v6 7/7] media: vsp1: pipe: Add RAW Bayer formats mapping
2025-03-21 15:45 [PATCH v6 0/7] media: renesas: vsp1: Add support for IIF Jacopo Mondi
` (5 preceding siblings ...)
2025-03-21 15:45 ` [PATCH v6 6/7] media: vsp1: rwpf: Support operations with IIF Jacopo Mondi
@ 2025-03-21 15:45 ` Jacopo Mondi
2025-03-21 21:56 ` Laurent Pinchart
6 siblings, 1 reply; 13+ messages in thread
From: Jacopo Mondi @ 2025-03-21 15:45 UTC (permalink / raw)
To: Laurent Pinchart, Kieran Bingham, Niklas Söderlund
Cc: linux-kernel, linux-media, linux-renesas-soc, Jacopo Mondi,
Niklas Söderlund
Add formats definition for RAW Bayer formats in vsp1_pipe.c.
8-bits RAW Bayer pixel formats map on VSP format RGB332.
10, 12 and 16 bits RAW Bayer pixel formats map on RGB565 insted.
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
v3->v4:
- Fix SWAP bits for RAW 10, 12 and 16
---
drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 72 ++++++++++++++++++++++++-
1 file changed, 71 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
index 8e9be3ec1b4d..a51061738edc 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
@@ -30,10 +30,80 @@
*/
static const struct vsp1_format_info vsp1_video_formats[] = {
- { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
+ /* Raw Bayer 8-bit: Maps on RGB332 */
+ { V4L2_PIX_FMT_SBGGR8, MEDIA_BUS_FMT_Y8_1X8,
+ VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
+ 1, { 8, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SGBRG8, MEDIA_BUS_FMT_Y8_1X8,
+ VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
+ 1, { 8, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SGRBG8, MEDIA_BUS_FMT_Y8_1X8,
+ VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
+ 1, { 8, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SRGGB8, MEDIA_BUS_FMT_Y8_1X8,
VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
1, { 8, 0, 0 }, false, false, 1, 1, false },
+
+ /* Raw Bayer 10/12/16-bit: Maps on RGB565 */
+ { V4L2_PIX_FMT_SBGGR10, MEDIA_BUS_FMT_Y10_1X10,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 10, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SGBRG10, MEDIA_BUS_FMT_Y10_1X10,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 10, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SGRBG10, MEDIA_BUS_FMT_Y10_1X10,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 10, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SRGGB10, MEDIA_BUS_FMT_Y10_1X10,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 10, 0, 0 }, false, false, 1, 1, false },
+
+ { V4L2_PIX_FMT_SBGGR12, MEDIA_BUS_FMT_Y12_1X12,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 12, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SGBRG12, MEDIA_BUS_FMT_Y12_1X12,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 12, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SGRBG12, MEDIA_BUS_FMT_Y12_1X12,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 12, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SRGGB12, MEDIA_BUS_FMT_Y12_1X12,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 12, 0, 0 }, false, false, 1, 1, false },
+
+ { V4L2_PIX_FMT_SBGGR16, MEDIA_BUS_FMT_Y16_1X16,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 16, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SGBRG16, MEDIA_BUS_FMT_Y16_1X16,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 16, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SGRBG16, MEDIA_BUS_FMT_Y16_1X16,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 16, 0, 0 }, false, false, 1, 1, false },
+ { V4L2_PIX_FMT_SRGGB16, MEDIA_BUS_FMT_Y16_1X16,
+ VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS,
+ 1, { 16, 0, 0 }, false, false, 1, 1, false },
+
+ { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
+ VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
+ VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
+ 1, { 10, 0, 0 }, false, false, 1, 1, false },
{ V4L2_PIX_FMT_ARGB444, MEDIA_BUS_FMT_ARGB8888_1X32,
VI6_FMT_ARGB_4444, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
VI6_RPF_DSWAP_P_WDS,
--
2.48.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v6 5/7] media: vsp1: rwpf: Initialize image formats
2025-03-21 15:45 ` [PATCH v6 5/7] media: vsp1: rwpf: Initialize image formats Jacopo Mondi
@ 2025-03-21 17:08 ` Laurent Pinchart
0 siblings, 0 replies; 13+ messages in thread
From: Laurent Pinchart @ 2025-03-21 17:08 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 Fri, Mar 21, 2025 at 04:45:37PM +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.
>
> Store the list of valid mbus code in the rwpf device and initialize it
> in the new vsp1_rwpf_init_formats() function, called by RPFs and WFPs at
> entity creation time.
>
> Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
>
> ---
> v4->v5:
> - Drop double empty line
> v2->v3:
> - Introduce vsp1_rwpf_init_formats()
> - Store the list of mbus codes at init time instead of computing it
> ---
> drivers/media/platform/renesas/vsp1/vsp1_rpf.c | 7 +++
> drivers/media/platform/renesas/vsp1/vsp1_rwpf.c | 78 +++++++++++++++++++++++--
> drivers/media/platform/renesas/vsp1/vsp1_rwpf.h | 4 ++
> drivers/media/platform/renesas/vsp1/vsp1_wpf.c | 7 +++
> 4 files changed, 90 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> index 5c8b3ba1bd3c..056491286577 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> @@ -400,6 +400,13 @@ struct vsp1_rwpf *vsp1_rpf_create(struct vsp1_device *vsp1, unsigned int index)
> rpf->entity.type = VSP1_ENTITY_RPF;
> rpf->entity.index = index;
>
> + ret = vsp1_rwpf_init_formats(vsp1, rpf);
> + if (ret < 0) {
> + dev_err(vsp1->dev, "rpf%u: failed to initialize formats\n",
> + index);
> + return ERR_PTR(ret);
> + }
> +
> sprintf(name, "rpf.%u", index);
> ret = vsp1_entity_init(vsp1, &rpf->entity, name, 2, &vsp1_rwpf_subdev_ops,
> MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER);
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> index 93b0ed5fd0da..91d70886e64d 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> @@ -16,12 +16,47 @@
> #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_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_Y8_1X8,
> + MEDIA_BUS_FMT_Y10_1X10,
> + MEDIA_BUS_FMT_Y12_1X12,
> + MEDIA_BUS_FMT_Y16_1X16,
> +};
> +
> +static const struct vsp1_rwpf_codes vspx_rpf1_codes = {
> + .codes = vspx_rpf1_mbus_codes,
> + .num_codes = ARRAY_SIZE(vspx_rpf1_mbus_codes),
> +};
> +
> /* -----------------------------------------------------------------------------
> * V4L2 Subdevice Operations
> */
> @@ -30,10 +65,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))
> + struct vsp1_rwpf *rwpf = to_rwpf(subdev);
> +
> + if (code->index >= rwpf->mbus_codes->num_codes)
> return -EINVAL;
>
> - code->code = rwpf_mbus_codes[code->index];
> + code->code = rwpf->mbus_codes->codes[code->index];
>
> return 0;
> }
> @@ -69,12 +106,12 @@ 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 < rwpf->mbus_codes->num_codes; ++i) {
> + if (fmt->format.code == rwpf->mbus_codes->codes[i])
> break;
> }
> - if (i == ARRAY_SIZE(rwpf_mbus_codes))
> - fmt->format.code = MEDIA_BUS_FMT_AYUV8_1X32;
> + if (i == rwpf->mbus_codes->num_codes)
> + fmt->format.code = rwpf->mbus_codes->codes[0];
>
> format = v4l2_subdev_state_get_format(state, fmt->pad);
>
> @@ -267,8 +304,37 @@ static const struct v4l2_ctrl_ops vsp1_rwpf_ctrl_ops = {
> .s_ctrl = vsp1_rwpf_s_ctrl,
> };
>
> +int vsp1_rwpf_init_formats(struct vsp1_device *vsp1, struct vsp1_rwpf *rwpf)
> +{
> + /* Only VSPX and RPF support reading Bayer data. */
> + if (!vsp1_feature(vsp1, VSP1_HAS_IIF) ||
> + rwpf->entity.type != VSP1_ENTITY_RPF) {
> + rwpf->mbus_codes = &rwpf_codes;
> + return 0;
> + }
> +
> + /*
> + * VSPX only features RPF0 and RPF1. RPF0 supports reading ISP ConfigDMA
> + * and Bayer data, RPF1 supports reading Bayer data only.
> + */
> + switch (rwpf->entity.index) {
> + case 0:
> + rwpf->mbus_codes = &vspx_rpf0_codes;
> + break;
> + case 1:
> + rwpf->mbus_codes = &vspx_rpf1_codes;
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> int vsp1_rwpf_init_ctrls(struct vsp1_rwpf *rwpf, unsigned int ncontrols)
> {
> + /* Initialize controls. */
> +
> v4l2_ctrl_handler_init(&rwpf->ctrls, ncontrols + 1);
> v4l2_ctrl_new_std(&rwpf->ctrls, &vsp1_rwpf_ctrl_ops,
> V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 255);
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.h b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.h
> index 5ac9f0a6fafc..64feb4742494 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.h
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.h
> @@ -30,6 +30,7 @@ struct vsp1_rwpf_memory {
> dma_addr_t addr[3];
> };
>
> +struct vsp1_rwpf_codes;
I'll add a blank line here.
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> struct vsp1_rwpf {
> struct vsp1_entity entity;
> struct v4l2_ctrl_handler ctrls;
> @@ -39,6 +40,8 @@ struct vsp1_rwpf {
> unsigned int max_width;
> unsigned int max_height;
>
> + const struct vsp1_rwpf_codes *mbus_codes;
> +
> struct v4l2_pix_format_mplane format;
> const struct vsp1_format_info *fmtinfo;
> unsigned int brx_input;
> @@ -81,6 +84,7 @@ struct vsp1_rwpf *vsp1_wpf_create(struct vsp1_device *vsp1, unsigned int index);
>
> void vsp1_wpf_stop(struct vsp1_rwpf *wpf);
>
> +int vsp1_rwpf_init_formats(struct vsp1_device *vsp1, struct vsp1_rwpf *rwpf);
> int vsp1_rwpf_init_ctrls(struct vsp1_rwpf *rwpf, unsigned int ncontrols);
>
> extern const struct v4l2_subdev_ops vsp1_rwpf_subdev_ops;
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
> index da651a882bbb..a32e4b3527db 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
> @@ -548,6 +548,13 @@ struct vsp1_rwpf *vsp1_wpf_create(struct vsp1_device *vsp1, unsigned int index)
> wpf->entity.type = VSP1_ENTITY_WPF;
> wpf->entity.index = index;
>
> + ret = vsp1_rwpf_init_formats(vsp1, wpf);
> + if (ret < 0) {
> + dev_err(vsp1->dev, "wpf%u: failed to initialize formats\n",
> + index);
> + return ERR_PTR(ret);
> + }
> +
> sprintf(name, "wpf.%u", index);
> ret = vsp1_entity_init(vsp1, &wpf->entity, name, 2, &vsp1_rwpf_subdev_ops,
> MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER);
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v6 7/7] media: vsp1: pipe: Add RAW Bayer formats mapping
2025-03-21 15:45 ` [PATCH v6 7/7] media: vsp1: pipe: Add RAW Bayer formats mapping Jacopo Mondi
@ 2025-03-21 21:56 ` Laurent Pinchart
2025-03-24 8:27 ` Jacopo Mondi
0 siblings, 1 reply; 13+ messages in thread
From: Laurent Pinchart @ 2025-03-21 21:56 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 Fri, Mar 21, 2025 at 04:45:39PM +0100, Jacopo Mondi wrote:
> Add formats definition for RAW Bayer formats in vsp1_pipe.c.
>
> 8-bits RAW Bayer pixel formats map on VSP format RGB332.
s/map on/map to/
> 10, 12 and 16 bits RAW Bayer pixel formats map on RGB565 insted.
>
> Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> ---
> v3->v4:
> - Fix SWAP bits for RAW 10, 12 and 16
> ---
> drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 72 ++++++++++++++++++++++++-
> 1 file changed, 71 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> index 8e9be3ec1b4d..a51061738edc 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> @@ -30,10 +30,80 @@
> */
>
> static const struct vsp1_format_info vsp1_video_formats[] = {
> - { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> + /* Raw Bayer 8-bit: Maps on RGB332 */
> + { V4L2_PIX_FMT_SBGGR8, MEDIA_BUS_FMT_Y8_1X8,
> + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SGBRG8, MEDIA_BUS_FMT_Y8_1X8,
> + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SGRBG8, MEDIA_BUS_FMT_Y8_1X8,
> + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SRGGB8, MEDIA_BUS_FMT_Y8_1X8,
> VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> 1, { 8, 0, 0 }, false, false, 1, 1, false },
Similarly to the media bus codes, could we have a single entry, using
V4L2_PIX_FMT_GREY ? Same below with V4L2_PIX_FMT_Y10, V4L2_PIX_FMT_Y12
and V4L2_PIX_FMT_Y16.
This would still duplicate entries, as V4L2_PIX_FMT_Y1[026] are
essentially treated the same, and they are identical to
V4L2_PIX_FMT_RGB565. We could ask the ISP driver to use
V4L2_PIX_FMT_RGB565 (and V4L2_PIX_FMT_RGB332 for 8-bit raw) when
configuring the VSPX, but that's a bit of a hack.
Another option would be to handle the translation in
vsp1_vspx_rwpf_set_subdev_fmt(). I would still in that case only expect
the V4L2_PIX_FMT_GREY and V4L2_PIX_FMT_Y* 4CCs from the ISP driver. This
patch could then be dropped.
What's your preference ?
> +
> + /* Raw Bayer 10/12/16-bit: Maps on RGB565 */
> + { V4L2_PIX_FMT_SBGGR10, MEDIA_BUS_FMT_Y10_1X10,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 10, 0, 0 }, false, false, 1, 1, false },
The bpp values are used to calculate memory offsets. Unless I'm
mistaken, you should use 16 here, not 10.
> + { V4L2_PIX_FMT_SGBRG10, MEDIA_BUS_FMT_Y10_1X10,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SGRBG10, MEDIA_BUS_FMT_Y10_1X10,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SRGGB10, MEDIA_BUS_FMT_Y10_1X10,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> +
> + { V4L2_PIX_FMT_SBGGR12, MEDIA_BUS_FMT_Y12_1X12,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SGBRG12, MEDIA_BUS_FMT_Y12_1X12,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SGRBG12, MEDIA_BUS_FMT_Y12_1X12,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SRGGB12, MEDIA_BUS_FMT_Y12_1X12,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> +
> + { V4L2_PIX_FMT_SBGGR16, MEDIA_BUS_FMT_Y16_1X16,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SGBRG16, MEDIA_BUS_FMT_Y16_1X16,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SGRBG16, MEDIA_BUS_FMT_Y16_1X16,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> + { V4L2_PIX_FMT_SRGGB16, MEDIA_BUS_FMT_Y16_1X16,
> + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS,
> + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> +
> + { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> + 1, { 10, 0, 0 }, false, false, 1, 1, false },
This doesn't seem right, the patch is changing the V4L2_PIX_FMT_RGB332.
> { V4L2_PIX_FMT_ARGB444, MEDIA_BUS_FMT_ARGB8888_1X32,
> VI6_FMT_ARGB_4444, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> VI6_RPF_DSWAP_P_WDS,
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v6 7/7] media: vsp1: pipe: Add RAW Bayer formats mapping
2025-03-21 21:56 ` Laurent Pinchart
@ 2025-03-24 8:27 ` Jacopo Mondi
2025-03-24 8:35 ` niklas soderlund
0 siblings, 1 reply; 13+ messages in thread
From: Jacopo Mondi @ 2025-03-24 8:27 UTC (permalink / raw)
To: Laurent Pinchart, niklas soderlund
Cc: Jacopo Mondi, Kieran Bingham, Niklas Söderlund, linux-kernel,
linux-media, linux-renesas-soc, Niklas Söderlund
Hi Laurent
On Fri, Mar 21, 2025 at 11:56:34PM +0200, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Fri, Mar 21, 2025 at 04:45:39PM +0100, Jacopo Mondi wrote:
> > Add formats definition for RAW Bayer formats in vsp1_pipe.c.
> >
> > 8-bits RAW Bayer pixel formats map on VSP format RGB332.
>
> s/map on/map to/
>
> > 10, 12 and 16 bits RAW Bayer pixel formats map on RGB565 insted.
> >
> > Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> > Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> > Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> > ---
> > v3->v4:
> > - Fix SWAP bits for RAW 10, 12 and 16
> > ---
> > drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 72 ++++++++++++++++++++++++-
> > 1 file changed, 71 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > index 8e9be3ec1b4d..a51061738edc 100644
> > --- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > @@ -30,10 +30,80 @@
> > */
> >
> > static const struct vsp1_format_info vsp1_video_formats[] = {
> > - { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> > + /* Raw Bayer 8-bit: Maps on RGB332 */
> > + { V4L2_PIX_FMT_SBGGR8, MEDIA_BUS_FMT_Y8_1X8,
> > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SGBRG8, MEDIA_BUS_FMT_Y8_1X8,
> > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SGRBG8, MEDIA_BUS_FMT_Y8_1X8,
> > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SRGGB8, MEDIA_BUS_FMT_Y8_1X8,
> > VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > 1, { 8, 0, 0 }, false, false, 1, 1, false },
>
> Similarly to the media bus codes, could we have a single entry, using
> V4L2_PIX_FMT_GREY ? Same below with V4L2_PIX_FMT_Y10, V4L2_PIX_FMT_Y12
> and V4L2_PIX_FMT_Y16.
mmm, the SRGB mbus codes come from the R-Car ISP input image format.
I understand these are multiple identical entries, but having
somewhere a translation from SRGB->Y formats just to have fewer
entries here it feels a bit of an hack
>
> This would still duplicate entries, as V4L2_PIX_FMT_Y1[026] are
> essentially treated the same, and they are identical to
> V4L2_PIX_FMT_RGB565. We could ask the ISP driver to use
> V4L2_PIX_FMT_RGB565 (and V4L2_PIX_FMT_RGB332 for 8-bit raw) when
> configuring the VSPX, but that's a bit of a hack.
Indeed, but I don't think 3 "duplicated" entries are any bad, if
that's how the HW work.
>
> Another option would be to handle the translation in
> vsp1_vspx_rwpf_set_subdev_fmt(). I would still in that case only expect
> the V4L2_PIX_FMT_GREY and V4L2_PIX_FMT_Y* 4CCs from the ISP driver. This
Do you expect the ISP driver to translate SRGB to Y formats ?
> patch could then be dropped.
So are you suggesting to translate in the ISP driver
SRGB8 -> RGB332
SRGB10/12/16 -> RGB565
Niklas, what do you think ?
>
> What's your preference ?
>
> > +
> > + /* Raw Bayer 10/12/16-bit: Maps on RGB565 */
> > + { V4L2_PIX_FMT_SBGGR10, MEDIA_BUS_FMT_Y10_1X10,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
>
> The bpp values are used to calculate memory offsets. Unless I'm
> mistaken, you should use 16 here, not 10.
>
I'm rounding up in the vspx driver. However it is true these formats
are sampled in 16bpp chunks, so I can use 16 here.
> > + { V4L2_PIX_FMT_SGBRG10, MEDIA_BUS_FMT_Y10_1X10,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SGRBG10, MEDIA_BUS_FMT_Y10_1X10,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SRGGB10, MEDIA_BUS_FMT_Y10_1X10,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > +
> > + { V4L2_PIX_FMT_SBGGR12, MEDIA_BUS_FMT_Y12_1X12,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SGBRG12, MEDIA_BUS_FMT_Y12_1X12,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SGRBG12, MEDIA_BUS_FMT_Y12_1X12,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SRGGB12, MEDIA_BUS_FMT_Y12_1X12,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > +
> > + { V4L2_PIX_FMT_SBGGR16, MEDIA_BUS_FMT_Y16_1X16,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SGBRG16, MEDIA_BUS_FMT_Y16_1X16,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SGRBG16, MEDIA_BUS_FMT_Y16_1X16,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > + { V4L2_PIX_FMT_SRGGB16, MEDIA_BUS_FMT_Y16_1X16,
> > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS,
> > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > +
> > + { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
>
> This doesn't seem right, the patch is changing the V4L2_PIX_FMT_RGB332.
If I'm not mistaken V4L2_PIX_FMT_RGB332 was
{ V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
1, { 8, 0, 0 }, false, false, 1, 1, false }
and is now
{ V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
1, { 10, 0, 0 }, false, false, 1, 1, false },
Seems like I messed up the bpp
With that fixed the diff looks saner. Thanks for spotting.
>
> > { V4L2_PIX_FMT_ARGB444, MEDIA_BUS_FMT_ARGB8888_1X32,
> > VI6_FMT_ARGB_4444, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > VI6_RPF_DSWAP_P_WDS,
>
> --
> Regards,
>
> Laurent Pinchart
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v6 7/7] media: vsp1: pipe: Add RAW Bayer formats mapping
2025-03-24 8:27 ` Jacopo Mondi
@ 2025-03-24 8:35 ` niklas soderlund
2025-03-24 15:51 ` Laurent Pinchart
0 siblings, 1 reply; 13+ messages in thread
From: niklas soderlund @ 2025-03-24 8:35 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Laurent Pinchart, Jacopo Mondi, Kieran Bingham, linux-kernel,
linux-media, linux-renesas-soc
Hello Jacopo,
On 2025-03-24 09:27:56 +0100, Jacopo Mondi wrote:
> Hi Laurent
>
> On Fri, Mar 21, 2025 at 11:56:34PM +0200, Laurent Pinchart wrote:
> > Hi Jacopo,
> >
> > Thank you for the patch.
> >
> > On Fri, Mar 21, 2025 at 04:45:39PM +0100, Jacopo Mondi wrote:
> > > Add formats definition for RAW Bayer formats in vsp1_pipe.c.
> > >
> > > 8-bits RAW Bayer pixel formats map on VSP format RGB332.
> >
> > s/map on/map to/
> >
> > > 10, 12 and 16 bits RAW Bayer pixel formats map on RGB565 insted.
> > >
> > > Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> > > Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> > > Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> > > ---
> > > v3->v4:
> > > - Fix SWAP bits for RAW 10, 12 and 16
> > > ---
> > > drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 72 ++++++++++++++++++++++++-
> > > 1 file changed, 71 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > > index 8e9be3ec1b4d..a51061738edc 100644
> > > --- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > > +++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > > @@ -30,10 +30,80 @@
> > > */
> > >
> > > static const struct vsp1_format_info vsp1_video_formats[] = {
> > > - { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> > > + /* Raw Bayer 8-bit: Maps on RGB332 */
> > > + { V4L2_PIX_FMT_SBGGR8, MEDIA_BUS_FMT_Y8_1X8,
> > > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > > + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SGBRG8, MEDIA_BUS_FMT_Y8_1X8,
> > > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > > + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SGRBG8, MEDIA_BUS_FMT_Y8_1X8,
> > > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > > + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SRGGB8, MEDIA_BUS_FMT_Y8_1X8,
> > > VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > > 1, { 8, 0, 0 }, false, false, 1, 1, false },
> >
> > Similarly to the media bus codes, could we have a single entry, using
> > V4L2_PIX_FMT_GREY ? Same below with V4L2_PIX_FMT_Y10, V4L2_PIX_FMT_Y12
> > and V4L2_PIX_FMT_Y16.
>
> mmm, the SRGB mbus codes come from the R-Car ISP input image format.
> I understand these are multiple identical entries, but having
> somewhere a translation from SRGB->Y formats just to have fewer
> entries here it feels a bit of an hack
>
> >
> > This would still duplicate entries, as V4L2_PIX_FMT_Y1[026] are
> > essentially treated the same, and they are identical to
> > V4L2_PIX_FMT_RGB565. We could ask the ISP driver to use
> > V4L2_PIX_FMT_RGB565 (and V4L2_PIX_FMT_RGB332 for 8-bit raw) when
> > configuring the VSPX, but that's a bit of a hack.
>
> Indeed, but I don't think 3 "duplicated" entries are any bad, if
> that's how the HW work.
>
> >
> > Another option would be to handle the translation in
> > vsp1_vspx_rwpf_set_subdev_fmt(). I would still in that case only expect
> > the V4L2_PIX_FMT_GREY and V4L2_PIX_FMT_Y* 4CCs from the ISP driver. This
>
> Do you expect the ISP driver to translate SRGB to Y formats ?
>
>
> > patch could then be dropped.
>
> So are you suggesting to translate in the ISP driver
>
> SRGB8 -> RGB332
>
> SRGB10/12/16 -> RGB565
>
> Niklas, what do you think ?
I would rather keep the true formats in the API between the VSP and ISP,
that is keep it as is. If really needed maybe a translation in the VSP
driver prior to querying vsp1_video_formats[] could be added? But this
driver is complex enough as-is :-)
>
>
> >
> > What's your preference ?
> >
> > > +
> > > + /* Raw Bayer 10/12/16-bit: Maps on RGB565 */
> > > + { V4L2_PIX_FMT_SBGGR10, MEDIA_BUS_FMT_Y10_1X10,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> >
> > The bpp values are used to calculate memory offsets. Unless I'm
> > mistaken, you should use 16 here, not 10.
> >
>
> I'm rounding up in the vspx driver. However it is true these formats
> are sampled in 16bpp chunks, so I can use 16 here.
>
> > > + { V4L2_PIX_FMT_SGBRG10, MEDIA_BUS_FMT_Y10_1X10,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SGRBG10, MEDIA_BUS_FMT_Y10_1X10,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SRGGB10, MEDIA_BUS_FMT_Y10_1X10,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > > +
> > > + { V4L2_PIX_FMT_SBGGR12, MEDIA_BUS_FMT_Y12_1X12,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SGBRG12, MEDIA_BUS_FMT_Y12_1X12,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SGRBG12, MEDIA_BUS_FMT_Y12_1X12,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SRGGB12, MEDIA_BUS_FMT_Y12_1X12,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > > +
> > > + { V4L2_PIX_FMT_SBGGR16, MEDIA_BUS_FMT_Y16_1X16,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SGBRG16, MEDIA_BUS_FMT_Y16_1X16,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SGRBG16, MEDIA_BUS_FMT_Y16_1X16,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > > + { V4L2_PIX_FMT_SRGGB16, MEDIA_BUS_FMT_Y16_1X16,
> > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS,
> > > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > > +
> > > + { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> > > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> >
> > This doesn't seem right, the patch is changing the V4L2_PIX_FMT_RGB332.
>
> If I'm not mistaken V4L2_PIX_FMT_RGB332 was
>
> { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> 1, { 8, 0, 0 }, false, false, 1, 1, false }
>
> and is now
>
> { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> 1, { 10, 0, 0 }, false, false, 1, 1, false },
>
> Seems like I messed up the bpp
>
> With that fixed the diff looks saner. Thanks for spotting.
>
>
> >
> > > { V4L2_PIX_FMT_ARGB444, MEDIA_BUS_FMT_ARGB8888_1X32,
> > > VI6_FMT_ARGB_4444, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > VI6_RPF_DSWAP_P_WDS,
> >
> > --
> > Regards,
> >
> > Laurent Pinchart
--
Kind Regards,
Niklas Söderlund
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v6 7/7] media: vsp1: pipe: Add RAW Bayer formats mapping
2025-03-24 8:35 ` niklas soderlund
@ 2025-03-24 15:51 ` Laurent Pinchart
0 siblings, 0 replies; 13+ messages in thread
From: Laurent Pinchart @ 2025-03-24 15:51 UTC (permalink / raw)
To: niklas soderlund
Cc: Jacopo Mondi, Jacopo Mondi, Kieran Bingham, linux-kernel,
linux-media, linux-renesas-soc
On Mon, Mar 24, 2025 at 09:35:13AM +0100, Niklas Söderlund wrote:
> On 2025-03-24 09:27:56 +0100, Jacopo Mondi wrote:
> > On Fri, Mar 21, 2025 at 11:56:34PM +0200, Laurent Pinchart wrote:
> > > On Fri, Mar 21, 2025 at 04:45:39PM +0100, Jacopo Mondi wrote:
> > > > Add formats definition for RAW Bayer formats in vsp1_pipe.c.
> > > >
> > > > 8-bits RAW Bayer pixel formats map on VSP format RGB332.
> > >
> > > s/map on/map to/
> > >
> > > > 10, 12 and 16 bits RAW Bayer pixel formats map on RGB565 insted.
> > > >
> > > > Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> > > > Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> > > > Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> > > > ---
> > > > v3->v4:
> > > > - Fix SWAP bits for RAW 10, 12 and 16
> > > > ---
> > > > drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 72 ++++++++++++++++++++++++-
> > > > 1 file changed, 71 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > > > index 8e9be3ec1b4d..a51061738edc 100644
> > > > --- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > > > +++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > > > @@ -30,10 +30,80 @@
> > > > */
> > > >
> > > > static const struct vsp1_format_info vsp1_video_formats[] = {
> > > > - { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> > > > + /* Raw Bayer 8-bit: Maps on RGB332 */
> > > > + { V4L2_PIX_FMT_SBGGR8, MEDIA_BUS_FMT_Y8_1X8,
> > > > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > > > + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SGBRG8, MEDIA_BUS_FMT_Y8_1X8,
> > > > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > > > + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SGRBG8, MEDIA_BUS_FMT_Y8_1X8,
> > > > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > > > + 1, { 8, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SRGGB8, MEDIA_BUS_FMT_Y8_1X8,
> > > > VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > > > 1, { 8, 0, 0 }, false, false, 1, 1, false },
> > >
> > > Similarly to the media bus codes, could we have a single entry, using
> > > V4L2_PIX_FMT_GREY ? Same below with V4L2_PIX_FMT_Y10, V4L2_PIX_FMT_Y12
> > > and V4L2_PIX_FMT_Y16.
> >
> > mmm, the SRGB mbus codes come from the R-Car ISP input image format.
> > I understand these are multiple identical entries, but having
> > somewhere a translation from SRGB->Y formats just to have fewer
> > entries here it feels a bit of an hack
handling the CFA pattern in the media bus code and pixel format was a
historical mistake that we're slowly addressing for new drivers. Sakari
has for instance posted patches to use the Y formats only on sensor
subdevs that will follow the new raw camera sensor subdev model. I think
we should use Y formats in the VSP and ISP drivers already.
> > > This would still duplicate entries, as V4L2_PIX_FMT_Y1[026] are
> > > essentially treated the same, and they are identical to
> > > V4L2_PIX_FMT_RGB565. We could ask the ISP driver to use
> > > V4L2_PIX_FMT_RGB565 (and V4L2_PIX_FMT_RGB332 for 8-bit raw) when
> > > configuring the VSPX, but that's a bit of a hack.
> >
> > Indeed, but I don't think 3 "duplicated" entries are any bad, if
> > that's how the HW work.
> >
> > > Another option would be to handle the translation in
> > > vsp1_vspx_rwpf_set_subdev_fmt(). I would still in that case only expect
> > > the V4L2_PIX_FMT_GREY and V4L2_PIX_FMT_Y* 4CCs from the ISP driver. This
> >
> > Do you expect the ISP driver to translate SRGB to Y formats ?
I actually expect the ISP driver to expose Y formats only to userspace,
and get the CFA pattern from the ISP parameters buffers.
> > > patch could then be dropped.
> >
> > So are you suggesting to translate in the ISP driver
> >
> > SRGB8 -> RGB332
> >
> > SRGB10/12/16 -> RGB565
No quite, the ISP driver would give us Y formats, and the translation to
RGB332 and RGB565 would be handled within the VSP1 driver, in the
vsp1_vspx_rwpf_set_subdev_fmt() function.
> > Niklas, what do you think ?
>
> I would rather keep the true formats in the API between the VSP and ISP,
> that is keep it as is. If really needed maybe a translation in the VSP
> driver prior to querying vsp1_video_formats[] could be added? But this
> driver is complex enough as-is :-)
>
> > > What's your preference ?
> > >
> > > > +
> > > > + /* Raw Bayer 10/12/16-bit: Maps on RGB565 */
> > > > + { V4L2_PIX_FMT_SBGGR10, MEDIA_BUS_FMT_Y10_1X10,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > >
> > > The bpp values are used to calculate memory offsets. Unless I'm
> > > mistaken, you should use 16 here, not 10.
> >
> > I'm rounding up in the vspx driver. However it is true these formats
> > are sampled in 16bpp chunks, so I can use 16 here.
> >
> > > > + { V4L2_PIX_FMT_SGBRG10, MEDIA_BUS_FMT_Y10_1X10,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SGRBG10, MEDIA_BUS_FMT_Y10_1X10,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SRGGB10, MEDIA_BUS_FMT_Y10_1X10,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > > > +
> > > > + { V4L2_PIX_FMT_SBGGR12, MEDIA_BUS_FMT_Y12_1X12,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SGBRG12, MEDIA_BUS_FMT_Y12_1X12,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SGRBG12, MEDIA_BUS_FMT_Y12_1X12,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SRGGB12, MEDIA_BUS_FMT_Y12_1X12,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 12, 0, 0 }, false, false, 1, 1, false },
> > > > +
> > > > + { V4L2_PIX_FMT_SBGGR16, MEDIA_BUS_FMT_Y16_1X16,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SGBRG16, MEDIA_BUS_FMT_Y16_1X16,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SGRBG16, MEDIA_BUS_FMT_Y16_1X16,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > > > + { V4L2_PIX_FMT_SRGGB16, MEDIA_BUS_FMT_Y16_1X16,
> > > > + VI6_FMT_RGB_565, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS,
> > > > + 1, { 16, 0, 0 }, false, false, 1, 1, false },
> > > > +
> > > > + { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> > > > + VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > + VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > > > + 1, { 10, 0, 0 }, false, false, 1, 1, false },
> > >
> > > This doesn't seem right, the patch is changing the V4L2_PIX_FMT_RGB332.
> >
> > If I'm not mistaken V4L2_PIX_FMT_RGB332 was
> >
> > { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> > VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > 1, { 8, 0, 0 }, false, false, 1, 1, false }
> >
> > and is now
> >
> > { V4L2_PIX_FMT_RGB332, MEDIA_BUS_FMT_ARGB8888_1X32,
> > VI6_FMT_RGB_332, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > VI6_RPF_DSWAP_P_WDS | VI6_RPF_DSWAP_P_BTS,
> > 1, { 10, 0, 0 }, false, false, 1, 1, false },
> >
> > Seems like I messed up the bpp
> >
> > With that fixed the diff looks saner. Thanks for spotting.
> >
> > > > { V4L2_PIX_FMT_ARGB444, MEDIA_BUS_FMT_ARGB8888_1X32,
> > > > VI6_FMT_ARGB_4444, VI6_RPF_DSWAP_P_LLS | VI6_RPF_DSWAP_P_LWS |
> > > > VI6_RPF_DSWAP_P_WDS,
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-03-24 15:52 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-21 15:45 [PATCH v6 0/7] media: renesas: vsp1: Add support for IIF Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 1/7] media: vsp1: Add support IIF ISP Interface Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 2/7] media: vsp1: dl: Use singleshot DL for VSPX Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 3/7] media: vsp1: rwpf: Break out format handling Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 4/7] media: vsp1: wpf: Propagate vsp1_rwpf_init_ctrls() Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 5/7] media: vsp1: rwpf: Initialize image formats Jacopo Mondi
2025-03-21 17:08 ` Laurent Pinchart
2025-03-21 15:45 ` [PATCH v6 6/7] media: vsp1: rwpf: Support operations with IIF Jacopo Mondi
2025-03-21 15:45 ` [PATCH v6 7/7] media: vsp1: pipe: Add RAW Bayer formats mapping Jacopo Mondi
2025-03-21 21:56 ` Laurent Pinchart
2025-03-24 8:27 ` Jacopo Mondi
2025-03-24 8:35 ` niklas soderlund
2025-03-24 15:51 ` Laurent Pinchart
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox