Pixel pipes are made of an isp subdev (only main pipe) and a
postproc subdev. This commit add a helper functions common to
those 2 subdevs such as for handling format enumeration,
set_selection handling, so that they do not have to be
duplicated in the two subdeves.
Signed-off-by: Alain Volmat <alain.volmat@foss.st.com>
---
.../media/platform/st/stm32/stm32-dcmipp/Makefile | 1 +
.../st/stm32/stm32-dcmipp/dcmipp-pixelcommon.c | 180 +++++++++++++++++++++
.../st/stm32/stm32-dcmipp/dcmipp-pixelcommon.h | 41 +++++
3 files changed, 222 insertions(+)
diff --git a/drivers/media/platform/st/stm32/stm32-dcmipp/Makefile b/drivers/media/platform/st/stm32/stm32-dcmipp/Makefile
index 159105fb40b8..54231569ed6f 100644
--- a/drivers/media/platform/st/stm32/stm32-dcmipp/Makefile
+++ b/drivers/media/platform/st/stm32/stm32-dcmipp/Makefile
@@ -1,4 +1,5 @@
# SPDX-License-Identifier: GPL-2.0
stm32-dcmipp-y := dcmipp-core.o dcmipp-common.o dcmipp-input.o dcmipp-byteproc.o dcmipp-bytecap.o
+stm32-dcmipp-y += dcmipp-pixelcommon.o
obj-$(CONFIG_VIDEO_STM32_DCMIPP) += stm32-dcmipp.o
diff --git a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-pixelcommon.c b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-pixelcommon.c
new file mode 100644
index 000000000000..142463bee226
--- /dev/null
+++ b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-pixelcommon.c
@@ -0,0 +1,180 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Driver for STM32 Digital Camera Memory Interface Pixel Processor
+ *
+ * Copyright (C) STMicroelectronics SA 2026
+ * Authors: Hugues Fruchet <hugues.fruchet@foss.st.com>
+ * Alain Volmat <alain.volmat@foss.st.com>
+ * for STMicroelectronics.
+ */
+
+#include <linux/v4l2-mediabus.h>
+#include <media/v4l2-rect.h>
+#include <media/v4l2-subdev.h>
+
+#include "dcmipp-common.h"
+#include "dcmipp-pixelcommon.h"
+
+#define DCMIPP_ENT(id, pad) (1 << (2 * (id) + (pad)))
+#define DCMIPP_ISP_SINK (DCMIPP_ENT(DCMIPP_ISP, 0))
+#define DCMIPP_ISP_SRC (DCMIPP_ENT(DCMIPP_ISP, 1))
+#define DCMIPP_ISP_INOUT (DCMIPP_ISP_SINK | DCMIPP_ISP_SRC)
+#define DCMIPP_MAIN_POSTPROC_SINK (DCMIPP_ENT(DCMIPP_MAIN, 0))
+#define DCMIPP_MAIN_POSTPROC_SRC (DCMIPP_ENT(DCMIPP_MAIN, 1))
+#define DCMIPP_MAIN_POSTPROC_INOUT \
+ (DCMIPP_MAIN_POSTPROC_SINK | DCMIPP_MAIN_POSTPROC_SRC)
+#define DCMIPP_AUX_POSTPROC_SINK (DCMIPP_ENT(DCMIPP_AUX, 0))
+#define DCMIPP_AUX_POSTPROC_SRC (DCMIPP_ENT(DCMIPP_AUX, 1))
+#define DCMIPP_AUX_POSTPROC_INOUT \
+ (DCMIPP_AUX_POSTPROC_SINK | DCMIPP_AUX_POSTPROC_SRC)
+#define DCMIPP_ALL_POSTPROC_SINK \
+ (DCMIPP_MAIN_POSTPROC_SINK | DCMIPP_AUX_POSTPROC_SINK)
+#define DCMIPP_ALL_POSTPROC_INOUT \
+ (DCMIPP_MAIN_POSTPROC_INOUT | DCMIPP_AUX_POSTPROC_INOUT)
+
+#define PIXMAP_MBUS(mbus, applicable_pipes) \
+ { \
+ .code = MEDIA_BUS_FMT_##mbus, \
+ .pipes = applicable_pipes, \
+ }
+const struct dcmipp_pixelpipe_pix_map
+dcmipp_pixel_formats_list[] = {
+ /* RGB formats */
+ /* RGB565 / RGB888 */
+ PIXMAP_MBUS(RGB565_2X8_LE, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(RGB565_1X16, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(RGB888_3X8, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(RGB888_1X24, DCMIPP_ALL_POSTPROC_INOUT | DCMIPP_ISP_INOUT),
+ /* YUV formats */
+ PIXMAP_MBUS(YUYV8_2X8, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(UYVY8_1X16, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(YUV8_1X24, DCMIPP_ALL_POSTPROC_INOUT | DCMIPP_ISP_SRC),
+ /* GREY */
+ PIXMAP_MBUS(Y8_1X8, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(Y10_1X10, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(Y12_1X12, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(Y14_1X14, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
+ /* Raw Bayer */
+ /* Raw 8 */
+ PIXMAP_MBUS(SBGGR8_1X8, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SGBRG8_1X8, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SGRBG8_1X8, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SRGGB8_1X8, DCMIPP_ISP_SINK),
+ /* Raw 10 */
+ PIXMAP_MBUS(SBGGR10_1X10, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SGBRG10_1X10, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SGRBG10_1X10, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SRGGB10_1X10, DCMIPP_ISP_SINK),
+ /* Raw 12 */
+ PIXMAP_MBUS(SBGGR12_1X12, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SGBRG12_1X12, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SGRBG12_1X12, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SRGGB12_1X12, DCMIPP_ISP_SINK),
+ /* Raw 14 */
+ PIXMAP_MBUS(SBGGR14_1X14, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SGBRG14_1X14, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SGRBG14_1X14, DCMIPP_ISP_SINK),
+ PIXMAP_MBUS(SRGGB14_1X14, DCMIPP_ISP_SINK),
+};
+
+const struct dcmipp_pixelpipe_pix_map *
+dcmipp_pixelpipe_pix_map_by_code(__u32 code, unsigned int id, unsigned int pad)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(dcmipp_pixel_formats_list); i++) {
+ if (dcmipp_pixel_formats_list[i].code == code &&
+ dcmipp_pixel_formats_list[i].pipes & DCMIPP_ENT(id, pad))
+ return &dcmipp_pixel_formats_list[i];
+ }
+
+ return NULL;
+}
+
+int dcmipp_pixelpipe_enum_mbus_code(unsigned int id,
+ struct v4l2_subdev_mbus_code_enum *code)
+{
+ unsigned int index = code->index;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(dcmipp_pixel_formats_list); i++) {
+ if (!(dcmipp_pixel_formats_list[i].pipes &
+ DCMIPP_ENT(id, code->pad)))
+ continue;
+
+ if (index == 0)
+ break;
+
+ index--;
+ }
+
+ if (i == ARRAY_SIZE(dcmipp_pixel_formats_list))
+ return -EINVAL;
+
+ code->code = dcmipp_pixel_formats_list[i].code;
+
+ return 0;
+}
+
+int dcmipp_pixelpipe_enum_frame_size(unsigned int id,
+ struct v4l2_subdev_frame_size_enum *fse)
+{
+ const struct dcmipp_pixelpipe_pix_map *vpix;
+
+ if (fse->index)
+ return -EINVAL;
+
+ /* Only accept code in the pix map table */
+ vpix = dcmipp_pixelpipe_pix_map_by_code(fse->code, id, fse->pad);
+ if (!vpix)
+ return -EINVAL;
+
+ fse->min_width = DCMIPP_FRAME_MIN_WIDTH;
+ fse->max_width = DCMIPP_FRAME_MAX_WIDTH;
+ fse->min_height = DCMIPP_FRAME_MIN_HEIGHT;
+ fse->max_height = DCMIPP_FRAME_MAX_HEIGHT;
+
+ return 0;
+}
+
+int dcmipp_pixelpipe_get_selection(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ struct v4l2_subdev_selection *s)
+{
+ struct v4l2_mbus_framefmt *sink_fmt;
+
+ if (IS_SRC(s->pad))
+ return -EINVAL;
+
+ switch (s->target) {
+ case V4L2_SEL_TGT_CROP:
+ case V4L2_SEL_TGT_COMPOSE_BOUNDS:
+ case V4L2_SEL_TGT_COMPOSE_DEFAULT:
+ s->r = *v4l2_subdev_state_get_crop(state, s->pad);
+ break;
+ case V4L2_SEL_TGT_CROP_BOUNDS:
+ case V4L2_SEL_TGT_CROP_DEFAULT:
+ sink_fmt = v4l2_subdev_state_get_format(state, s->pad);
+ s->r.top = 0;
+ s->r.left = 0;
+ s->r.width = sink_fmt->width;
+ s->r.height = sink_fmt->height;
+ break;
+ case V4L2_SEL_TGT_COMPOSE:
+ s->r = *v4l2_subdev_state_get_compose(state, s->pad);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+__u32 dcmipp_pixelpipe_src_format(__u32 input_format)
+{
+ if (input_format >= MEDIA_BUS_FMT_Y8_1X8 &&
+ input_format < MEDIA_BUS_FMT_SBGGR8_1X8)
+ return MEDIA_BUS_FMT_YUV8_1X24;
+
+ return MEDIA_BUS_FMT_RGB888_1X24;
+}
diff --git a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-pixelcommon.h b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-pixelcommon.h
new file mode 100644
index 000000000000..db29e1fe939e
--- /dev/null
+++ b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-pixelcommon.h
@@ -0,0 +1,41 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Driver for STM32 Digital Camera Memory Interface Pixel Processor
+ *
+ * Copyright (C) STMicroelectronics SA 2026
+ * Authors: Hugues Fruchet <hugues.fruchet@foss.st.com>
+ * Alain Volmat <alain.volmat@foss.st.com>
+ * for STMicroelectronics.
+ */
+
+#ifndef _DCMIPP_PIXELCOMMON_H
+#define _DCMIPP_PIXELCOMMON_H
+
+#define IS_SINK(pad) (!(pad))
+#define IS_SRC(pad) ((pad))
+
+#define DCMIPP_ISP 0
+#define DCMIPP_MAIN 1
+#define DCMIPP_AUX 2
+
+struct dcmipp_pixelpipe_pix_map {
+ __u32 code;
+ __u32 pipes;
+};
+
+const struct dcmipp_pixelpipe_pix_map *
+dcmipp_pixelpipe_pix_map_by_code(__u32 code, unsigned int id, unsigned int pad);
+
+int dcmipp_pixelpipe_enum_mbus_code(unsigned int id,
+ struct v4l2_subdev_mbus_code_enum *code);
+
+int dcmipp_pixelpipe_enum_frame_size(unsigned int id,
+ struct v4l2_subdev_frame_size_enum *fse);
+
+int dcmipp_pixelpipe_get_selection(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ struct v4l2_subdev_selection *s);
+
+__u32 dcmipp_pixelpipe_src_format(__u32 input_format);
+
+#endif
--
2.34.1
Hi Alain,
kernel test robot noticed the following build warnings:
[auto build test WARNING on eb4ee870747c3a77a9c3c84d84efb64bd481013a]
url: https://github.com/intel-lab-lkp/linux/commits/Alain-Volmat/media-stm32-dcmipp-share-struct-dcmipp_device-among-subdevs/20260202-220852
base: eb4ee870747c3a77a9c3c84d84efb64bd481013a
patch link: https://lore.kernel.org/r/20260202-stm32-dcmipp-pixel-pipes-support-v1-8-8d8d51f5e014%40foss.st.com
patch subject: [PATCH 08/13] media: stm32: dcmipp: add pixel pipes helper functions
config: riscv-randconfig-r122-20260204 (https://download.01.org/0day-ci/archive/20260204/202602040608.vLI553iq-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9b8addffa70cee5b2acc5454712d9cf78ce45710)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260204/202602040608.vLI553iq-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602040608.vLI553iq-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
WARNING: invalid argument to '-march': '_zacas_zabha'
>> drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-pixelcommon.c:41:1: sparse: sparse: symbol 'dcmipp_pixel_formats_list' was not declared. Should it be static?
vim +/dcmipp_pixel_formats_list +41 drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-pixelcommon.c
17
18 #define DCMIPP_ENT(id, pad) (1 << (2 * (id) + (pad)))
19 #define DCMIPP_ISP_SINK (DCMIPP_ENT(DCMIPP_ISP, 0))
20 #define DCMIPP_ISP_SRC (DCMIPP_ENT(DCMIPP_ISP, 1))
21 #define DCMIPP_ISP_INOUT (DCMIPP_ISP_SINK | DCMIPP_ISP_SRC)
22 #define DCMIPP_MAIN_POSTPROC_SINK (DCMIPP_ENT(DCMIPP_MAIN, 0))
23 #define DCMIPP_MAIN_POSTPROC_SRC (DCMIPP_ENT(DCMIPP_MAIN, 1))
24 #define DCMIPP_MAIN_POSTPROC_INOUT \
25 (DCMIPP_MAIN_POSTPROC_SINK | DCMIPP_MAIN_POSTPROC_SRC)
26 #define DCMIPP_AUX_POSTPROC_SINK (DCMIPP_ENT(DCMIPP_AUX, 0))
27 #define DCMIPP_AUX_POSTPROC_SRC (DCMIPP_ENT(DCMIPP_AUX, 1))
28 #define DCMIPP_AUX_POSTPROC_INOUT \
29 (DCMIPP_AUX_POSTPROC_SINK | DCMIPP_AUX_POSTPROC_SRC)
30 #define DCMIPP_ALL_POSTPROC_SINK \
31 (DCMIPP_MAIN_POSTPROC_SINK | DCMIPP_AUX_POSTPROC_SINK)
32 #define DCMIPP_ALL_POSTPROC_INOUT \
33 (DCMIPP_MAIN_POSTPROC_INOUT | DCMIPP_AUX_POSTPROC_INOUT)
34
35 #define PIXMAP_MBUS(mbus, applicable_pipes) \
36 { \
37 .code = MEDIA_BUS_FMT_##mbus, \
38 .pipes = applicable_pipes, \
39 }
40 const struct dcmipp_pixelpipe_pix_map
> 41 dcmipp_pixel_formats_list[] = {
42 /* RGB formats */
43 /* RGB565 / RGB888 */
44 PIXMAP_MBUS(RGB565_2X8_LE, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
45 PIXMAP_MBUS(RGB565_1X16, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
46 PIXMAP_MBUS(RGB888_3X8, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
47 PIXMAP_MBUS(RGB888_1X24, DCMIPP_ALL_POSTPROC_INOUT | DCMIPP_ISP_INOUT),
48 /* YUV formats */
49 PIXMAP_MBUS(YUYV8_2X8, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
50 PIXMAP_MBUS(UYVY8_1X16, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
51 PIXMAP_MBUS(YUV8_1X24, DCMIPP_ALL_POSTPROC_INOUT | DCMIPP_ISP_SRC),
52 /* GREY */
53 PIXMAP_MBUS(Y8_1X8, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
54 PIXMAP_MBUS(Y10_1X10, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
55 PIXMAP_MBUS(Y12_1X12, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
56 PIXMAP_MBUS(Y14_1X14, DCMIPP_AUX_POSTPROC_SINK | DCMIPP_ISP_SINK),
57 /* Raw Bayer */
58 /* Raw 8 */
59 PIXMAP_MBUS(SBGGR8_1X8, DCMIPP_ISP_SINK),
60 PIXMAP_MBUS(SGBRG8_1X8, DCMIPP_ISP_SINK),
61 PIXMAP_MBUS(SGRBG8_1X8, DCMIPP_ISP_SINK),
62 PIXMAP_MBUS(SRGGB8_1X8, DCMIPP_ISP_SINK),
63 /* Raw 10 */
64 PIXMAP_MBUS(SBGGR10_1X10, DCMIPP_ISP_SINK),
65 PIXMAP_MBUS(SGBRG10_1X10, DCMIPP_ISP_SINK),
66 PIXMAP_MBUS(SGRBG10_1X10, DCMIPP_ISP_SINK),
67 PIXMAP_MBUS(SRGGB10_1X10, DCMIPP_ISP_SINK),
68 /* Raw 12 */
69 PIXMAP_MBUS(SBGGR12_1X12, DCMIPP_ISP_SINK),
70 PIXMAP_MBUS(SGBRG12_1X12, DCMIPP_ISP_SINK),
71 PIXMAP_MBUS(SGRBG12_1X12, DCMIPP_ISP_SINK),
72 PIXMAP_MBUS(SRGGB12_1X12, DCMIPP_ISP_SINK),
73 /* Raw 14 */
74 PIXMAP_MBUS(SBGGR14_1X14, DCMIPP_ISP_SINK),
75 PIXMAP_MBUS(SGBRG14_1X14, DCMIPP_ISP_SINK),
76 PIXMAP_MBUS(SGRBG14_1X14, DCMIPP_ISP_SINK),
77 PIXMAP_MBUS(SRGGB14_1X14, DCMIPP_ISP_SINK),
78 };
79
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2026 Red Hat, Inc.