linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [v4l-utils] [PATCH v2 0/7] Support for the generic line-based metadata support
@ 2024-04-24 15:22 Laurent Pinchart
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 1/7] v4l-utils: sync-with-kernel Laurent Pinchart
                   ` (6 more replies)
  0 siblings, 7 replies; 10+ messages in thread
From: Laurent Pinchart @ 2024-04-24 15:22 UTC (permalink / raw)
  To: linux-media; +Cc: Sakari Ailus, Tomi Valkeinen, Hans Verkuil, Gregor Jasny

Hello,

This patch series adds support for the generic line-based metadata
support API. The API is currently under development, with the latest
version posted to the linux-media mailing list in [1].

The series by pulling in the kernel header changes for the generic
line-based metadata support (1/7). This patch is not meant to be merged
as-is, but should be replaced with a kernel header sync with the stage
tree once the kernel side gets merged.

The next three patches (2/7 to 4/7) update media-ctl and v4l2-compliance
to use the changed routing API, and test the
V4L2_FMT_FLAG_META_LINE_BASED flag.

The remaining patches then extend support in media-ctl and
v4l2-compliance for the MEDIA_PAD_FL_INTERNAL and
V4L2_SUBDEV_ROUTE_FL_IMMUTABLE flags. They depend on further API
extensions that are not ready yet, and are thus not meant to be merged
at this point. They are needed to support further development related to
sensor embedded data, used with Unicam and the IMX219 sensor driver.

This has been tested on a Raspberry Pi 4 with an IMX219 sensor, and the
in-progress work to upstream the Raspberry Pi Unicam driver. The kernel
code can be found in [2].

[1] https://lore.kernel.org/linux-media/20240424122237.875000-1-sakari.ailus@linux.intel.com/
[2] https://git.kernel.org/pub/scm/linux/kernel/git/pinchartl/linux.git/log/?h=rpi/v6.9/merge

Laurent Pinchart (5):
  v4l-utils: sync-with-kernel
  v4l2-compliance: Support the changed routing API
  v4l2-compliance: Add tests for V4L2_FMT_FLAG_META_LINE_BASED flag
  v4l-utils: sync-with-kernel
  v4l2-compliance: Test IMMUTABLE route flag

Sakari Ailus (2):
  utils: media-ctl: Support changed routing API
  utils: media-ctl: Print the INTERNAL pad flag

 contrib/freebsd/include/linux/videodev2.h   | 26 ++++++++++++++++++++-
 contrib/test/ioctl_32.h                     |  4 ++--
 contrib/test/ioctl_64.h                     |  4 ++--
 include/linux/dvb/frontend.h                |  2 +-
 include/linux/media-bus-format.h            |  9 +++++++
 include/linux/media.h                       |  1 +
 include/linux/v4l2-mediabus.h               | 18 +++++++++-----
 include/linux/v4l2-subdev.h                 | 18 +++++++++++---
 include/linux/videodev2.h                   | 26 ++++++++++++++++++++-
 lib/include/libdvbv5/dvb-frontend.h         |  2 +-
 utils/common/v4l2-pix-formats.h             |  9 +++++++
 utils/media-ctl/libv4l2subdev.c             |  4 +++-
 utils/media-ctl/media-ctl.c                 |  1 +
 utils/v4l2-compliance/v4l2-compliance.cpp   | 12 ++++++----
 utils/v4l2-compliance/v4l2-test-formats.cpp | 17 +++++++++++++-
 utils/v4l2-compliance/v4l2-test-subdevs.cpp | 24 ++++++++++++-------
 utils/v4l2-tracer/retrace-gen.cpp           | 14 ++++++++++-
 utils/v4l2-tracer/trace-gen.cpp             |  5 +++-
 utils/v4l2-tracer/v4l2-tracer-info-gen.h    |  4 ++++
 19 files changed, 165 insertions(+), 35 deletions(-)

-- 
Regards,

Laurent Pinchart


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [v4l-utils] [PATCH v2 1/7] v4l-utils: sync-with-kernel
  2024-04-24 15:22 [v4l-utils] [PATCH v2 0/7] Support for the generic line-based metadata support Laurent Pinchart
@ 2024-04-24 15:22 ` Laurent Pinchart
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 2/7] utils: media-ctl: Support changed routing API Laurent Pinchart
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Laurent Pinchart @ 2024-04-24 15:22 UTC (permalink / raw)
  To: linux-media; +Cc: Sakari Ailus, Tomi Valkeinen, Hans Verkuil, Gregor Jasny

Update v4l-utils to the kernel headers coming from the Unicam v11
branch.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 contrib/freebsd/include/linux/videodev2.h | 26 ++++++++++++++++++++++-
 contrib/test/ioctl_32.h                   |  4 ++--
 contrib/test/ioctl_64.h                   |  4 ++--
 include/linux/dvb/frontend.h              |  2 +-
 include/linux/media-bus-format.h          |  9 ++++++++
 include/linux/v4l2-mediabus.h             | 18 ++++++++++------
 include/linux/v4l2-subdev.h               | 13 +++++++++---
 include/linux/videodev2.h                 | 26 ++++++++++++++++++++++-
 lib/include/libdvbv5/dvb-frontend.h       |  2 +-
 utils/common/v4l2-pix-formats.h           |  9 ++++++++
 utils/v4l2-tracer/retrace-gen.cpp         | 14 +++++++++++-
 utils/v4l2-tracer/trace-gen.cpp           |  5 ++++-
 utils/v4l2-tracer/v4l2-tracer-info-gen.h  |  3 +++
 13 files changed, 116 insertions(+), 19 deletions(-)

diff --git a/contrib/freebsd/include/linux/videodev2.h b/contrib/freebsd/include/linux/videodev2.h
index 4815944b0b8c..752035421389 100644
--- a/contrib/freebsd/include/linux/videodev2.h
+++ b/contrib/freebsd/include/linux/videodev2.h
@@ -606,6 +606,8 @@ struct v4l2_pix_format {
 #define V4L2_PIX_FMT_Y10BPACK    v4l2_fourcc('Y', '1', '0', 'B') /* 10  Greyscale bit-packed */
 #define V4L2_PIX_FMT_Y10P    v4l2_fourcc('Y', '1', '0', 'P') /* 10  Greyscale, MIPI RAW10 packed */
 #define V4L2_PIX_FMT_IPU3_Y10		v4l2_fourcc('i', 'p', '3', 'y') /* IPU3 packed 10-bit greyscale */
+#define V4L2_PIX_FMT_Y12P    v4l2_fourcc('Y', '1', '2', 'P') /* 12  Greyscale, MIPI RAW12 packed */
+#define V4L2_PIX_FMT_Y14P    v4l2_fourcc('Y', '1', '4', 'P') /* 14  Greyscale, MIPI RAW14 packed */
 
 /* Palette formats */
 #define V4L2_PIX_FMT_PAL8    v4l2_fourcc('P', 'A', 'L', '8') /*  8  8-bit palette */
@@ -846,6 +848,18 @@ struct v4l2_pix_format {
 #define V4L2_META_FMT_RK_ISP1_PARAMS	v4l2_fourcc('R', 'K', '1', 'P') /* Rockchip ISP1 3A Parameters */
 #define V4L2_META_FMT_RK_ISP1_STAT_3A	v4l2_fourcc('R', 'K', '1', 'S') /* Rockchip ISP1 3A Statistics */
 
+/*
+ * Line-based metadata formats. Remember to update v4l_fill_fmtdesc() when
+ * adding new ones!
+ */
+#define V4L2_META_FMT_GENERIC_8		v4l2_fourcc('M', 'E', 'T', '8') /* Generic 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_10	v4l2_fourcc('M', 'C', '1', 'A') /* 10-bit CSI-2 packed 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_12	v4l2_fourcc('M', 'C', '1', 'C') /* 12-bit CSI-2 packed 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_14	v4l2_fourcc('M', 'C', '1', 'E') /* 14-bit CSI-2 packed 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_16	v4l2_fourcc('M', 'C', '1', 'G') /* 16-bit CSI-2 packed 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_20	v4l2_fourcc('M', 'C', '1', 'K') /* 20-bit CSI-2 packed 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_24	v4l2_fourcc('M', 'C', '1', 'O') /* 24-bit CSI-2 packed 8-bit metadata */
+
 /* priv field value to indicates that subsequent fields are valid. */
 #define V4L2_PIX_FMT_PRIV_MAGIC		0xfeedcafe
 
@@ -876,6 +890,7 @@ struct v4l2_fmtdesc {
 #define V4L2_FMT_FLAG_CSC_YCBCR_ENC		0x0080
 #define V4L2_FMT_FLAG_CSC_HSV_ENC		V4L2_FMT_FLAG_CSC_YCBCR_ENC
 #define V4L2_FMT_FLAG_CSC_QUANTIZATION		0x0100
+#define V4L2_FMT_FLAG_META_LINE_BASED		0x0200
 
 	/* Frame Size and frame rate enumeration */
 /*
@@ -1824,7 +1839,7 @@ struct v4l2_ext_control {
 		struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll_info;
 		struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering_display;
 		void *ptr;
-	};
+	} __attribute__ ((packed));
 } __attribute__ ((packed));
 
 struct v4l2_ext_controls {
@@ -2394,10 +2409,19 @@ struct v4l2_sdr_format {
  * struct v4l2_meta_format - metadata format definition
  * @dataformat:		little endian four character code (fourcc)
  * @buffersize:		maximum size in bytes required for data
+ * @width:		number of data units of data per line (valid for line
+ *			based formats only, see format documentation)
+ * @height:		number of lines of data per buffer (valid for line based
+ *			formats only)
+ * @bytesperline:	offset between the beginnings of two adjacent lines in
+ *			bytes (valid for line based formats only)
  */
 struct v4l2_meta_format {
 	uint32_t				dataformat;
 	uint32_t				buffersize;
+	uint32_t				width;
+	uint32_t				height;
+	uint32_t				bytesperline;
 } __attribute__ ((packed));
 
 /**
diff --git a/contrib/test/ioctl_32.h b/contrib/test/ioctl_32.h
index 97f58676fce1..42997b76cf8d 100644
--- a/contrib/test/ioctl_32.h
+++ b/contrib/test/ioctl_32.h
@@ -103,7 +103,7 @@
 #define CMD32_VIDIOC_SUBDEV_G_EDID 0xc0245628
 #define CMD32_VIDIOC_SUBDEV_G_FMT 0xc0585604
 #define CMD32_VIDIOC_SUBDEV_G_FRAME_INTERVAL 0xc0305615
-#define CMD32_VIDIOC_SUBDEV_G_ROUTING 0xc0285626
+#define CMD32_VIDIOC_SUBDEV_G_ROUTING 0xc0405626
 #define CMD32_VIDIOC_SUBDEV_G_SELECTION 0xc040563d
 #define CMD32_VIDIOC_SUBDEV_G_STD 0x80085617
 #define CMD32_VIDIOC_SUBDEV_QUERYCAP 0x80405600
@@ -115,7 +115,7 @@
 #define CMD32_VIDIOC_SUBDEV_S_EDID 0xc0245629
 #define CMD32_VIDIOC_SUBDEV_S_FMT 0xc0585605
 #define CMD32_VIDIOC_SUBDEV_S_FRAME_INTERVAL 0xc0305616
-#define CMD32_VIDIOC_SUBDEV_S_ROUTING 0xc0285627
+#define CMD32_VIDIOC_SUBDEV_S_ROUTING 0xc0405627
 #define CMD32_VIDIOC_SUBDEV_S_SELECTION 0xc040563e
 #define CMD32_VIDIOC_SUBDEV_S_STD 0x40085618
 #define CMD32_VIDIOC_SUBSCRIBE_EVENT 0x4020565a
diff --git a/contrib/test/ioctl_64.h b/contrib/test/ioctl_64.h
index 2bad335dab60..8539622cf329 100644
--- a/contrib/test/ioctl_64.h
+++ b/contrib/test/ioctl_64.h
@@ -103,7 +103,7 @@
 #define CMD64_VIDIOC_SUBDEV_G_EDID 0xc0285628
 #define CMD64_VIDIOC_SUBDEV_G_FMT 0xc0585604
 #define CMD64_VIDIOC_SUBDEV_G_FRAME_INTERVAL 0xc0305615
-#define CMD64_VIDIOC_SUBDEV_G_ROUTING 0xc0285626
+#define CMD64_VIDIOC_SUBDEV_G_ROUTING 0xc0405626
 #define CMD64_VIDIOC_SUBDEV_G_SELECTION 0xc040563d
 #define CMD64_VIDIOC_SUBDEV_G_STD 0x80085617
 #define CMD64_VIDIOC_SUBDEV_QUERYCAP 0x80405600
@@ -115,7 +115,7 @@
 #define CMD64_VIDIOC_SUBDEV_S_EDID 0xc0285629
 #define CMD64_VIDIOC_SUBDEV_S_FMT 0xc0585605
 #define CMD64_VIDIOC_SUBDEV_S_FRAME_INTERVAL 0xc0305616
-#define CMD64_VIDIOC_SUBDEV_S_ROUTING 0xc0285627
+#define CMD64_VIDIOC_SUBDEV_S_ROUTING 0xc0405627
 #define CMD64_VIDIOC_SUBDEV_S_SELECTION 0xc040563e
 #define CMD64_VIDIOC_SUBDEV_S_STD 0x40085618
 #define CMD64_VIDIOC_SUBSCRIBE_EVENT 0x4020565a
diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h
index 392171a7d651..844762889343 100644
--- a/include/linux/dvb/frontend.h
+++ b/include/linux/dvb/frontend.h
@@ -854,7 +854,7 @@ struct dtv_stats {
 	union {
 		__u64 uvalue;	/* for counters and relative scales */
 		__s64 svalue;	/* for 0.001 dB measures */
-	};
+	}  __attribute__ ((packed));
 } __attribute__ ((packed));
 
 
diff --git a/include/linux/media-bus-format.h b/include/linux/media-bus-format.h
index f05f747e444d..d4c1d991014b 100644
--- a/include/linux/media-bus-format.h
+++ b/include/linux/media-bus-format.h
@@ -174,4 +174,13 @@
  */
 #define MEDIA_BUS_FMT_METADATA_FIXED		0x7001
 
+/* Generic line based metadata formats for serial buses. Next is 0x8008. */
+#define MEDIA_BUS_FMT_META_8			0x8001
+#define MEDIA_BUS_FMT_META_10			0x8002
+#define MEDIA_BUS_FMT_META_12			0x8003
+#define MEDIA_BUS_FMT_META_14			0x8004
+#define MEDIA_BUS_FMT_META_16			0x8005
+#define MEDIA_BUS_FMT_META_20			0x8006
+#define MEDIA_BUS_FMT_META_24			0x8007
+
 #endif /* __LINUX_MEDIA_BUS_FORMAT_H */
diff --git a/include/linux/v4l2-mediabus.h b/include/linux/v4l2-mediabus.h
index 2c318de10485..097ef73924f8 100644
--- a/include/linux/v4l2-mediabus.h
+++ b/include/linux/v4l2-mediabus.h
@@ -19,12 +19,18 @@
  * @width:	image width
  * @height:	image height
  * @code:	data format code (from enum v4l2_mbus_pixelcode)
- * @field:	used interlacing type (from enum v4l2_field)
- * @colorspace:	colorspace of the data (from enum v4l2_colorspace)
- * @ycbcr_enc:	YCbCr encoding of the data (from enum v4l2_ycbcr_encoding)
- * @hsv_enc:	HSV encoding of the data (from enum v4l2_hsv_encoding)
- * @quantization: quantization of the data (from enum v4l2_quantization)
- * @xfer_func:  transfer function of the data (from enum v4l2_xfer_func)
+ * @field:	used interlacing type (from enum v4l2_field), zero for metadata
+ *		mbus codes
+ * @colorspace:	colorspace of the data (from enum v4l2_colorspace), zero on
+ *		metadata mbus codes
+ * @ycbcr_enc:	YCbCr encoding of the data (from enum v4l2_ycbcr_encoding), zero
+ *		for metadata mbus codes
+ * @hsv_enc:	HSV encoding of the data (from enum v4l2_hsv_encoding), zero for
+ *		metadata mbus codes
+ * @quantization: quantization of the data (from enum v4l2_quantization), zero
+ *		for metadata mbus codes
+ * @xfer_func:  transfer function of the data (from enum v4l2_xfer_func), zero
+ *		for metadata mbus codes
  * @flags:	flags (V4L2_MBUS_FRAMEFMT_*)
  * @reserved:  reserved bytes that can be later used
  */
diff --git a/include/linux/v4l2-subdev.h b/include/linux/v4l2-subdev.h
index 7048c51581c6..6a39128d0606 100644
--- a/include/linux/v4l2-subdev.h
+++ b/include/linux/v4l2-subdev.h
@@ -50,6 +50,10 @@ struct v4l2_subdev_format {
  * @rect: pad crop rectangle boundaries
  * @stream: stream number, defined in subdev routing
  * @reserved: drivers and applications must zero this array
+ *
+ * The subdev crop API is an obsolete interface and may be removed in the
+ * future. It is superseded by the selection API. No new extensions to this
+ * structure will be accepted.
  */
 struct v4l2_subdev_crop {
 	__u32 which;
@@ -224,15 +228,18 @@ struct v4l2_subdev_route {
  * struct v4l2_subdev_routing - Subdev routing information
  *
  * @which: configuration type (from enum v4l2_subdev_format_whence)
- * @num_routes: the total number of routes in the routes array
+ * @len_routes: the length of the routes array, in routes
  * @routes: pointer to the routes array
+ * @num_routes: the total number of routes, possibly more than fits in the
+ *		routes array
  * @reserved: drivers and applications must zero this array
  */
 struct v4l2_subdev_routing {
 	__u32 which;
-	__u32 num_routes;
+	__u32 len_routes;
 	__u64 routes;
-	__u32 reserved[6];
+	__u32 num_routes;
+	__u32 reserved[11];
 };
 
 /*
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
index b21e7f2c67cd..34cc419b6b5a 100644
--- a/include/linux/videodev2.h
+++ b/include/linux/videodev2.h
@@ -572,6 +572,8 @@ struct v4l2_pix_format {
 #define V4L2_PIX_FMT_Y10BPACK    v4l2_fourcc('Y', '1', '0', 'B') /* 10  Greyscale bit-packed */
 #define V4L2_PIX_FMT_Y10P    v4l2_fourcc('Y', '1', '0', 'P') /* 10  Greyscale, MIPI RAW10 packed */
 #define V4L2_PIX_FMT_IPU3_Y10		v4l2_fourcc('i', 'p', '3', 'y') /* IPU3 packed 10-bit greyscale */
+#define V4L2_PIX_FMT_Y12P    v4l2_fourcc('Y', '1', '2', 'P') /* 12  Greyscale, MIPI RAW12 packed */
+#define V4L2_PIX_FMT_Y14P    v4l2_fourcc('Y', '1', '4', 'P') /* 14  Greyscale, MIPI RAW14 packed */
 
 /* Palette formats */
 #define V4L2_PIX_FMT_PAL8    v4l2_fourcc('P', 'A', 'L', '8') /*  8  8-bit palette */
@@ -812,6 +814,18 @@ struct v4l2_pix_format {
 #define V4L2_META_FMT_RK_ISP1_PARAMS	v4l2_fourcc('R', 'K', '1', 'P') /* Rockchip ISP1 3A Parameters */
 #define V4L2_META_FMT_RK_ISP1_STAT_3A	v4l2_fourcc('R', 'K', '1', 'S') /* Rockchip ISP1 3A Statistics */
 
+/*
+ * Line-based metadata formats. Remember to update v4l_fill_fmtdesc() when
+ * adding new ones!
+ */
+#define V4L2_META_FMT_GENERIC_8		v4l2_fourcc('M', 'E', 'T', '8') /* Generic 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_10	v4l2_fourcc('M', 'C', '1', 'A') /* 10-bit CSI-2 packed 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_12	v4l2_fourcc('M', 'C', '1', 'C') /* 12-bit CSI-2 packed 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_14	v4l2_fourcc('M', 'C', '1', 'E') /* 14-bit CSI-2 packed 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_16	v4l2_fourcc('M', 'C', '1', 'G') /* 16-bit CSI-2 packed 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_20	v4l2_fourcc('M', 'C', '1', 'K') /* 20-bit CSI-2 packed 8-bit metadata */
+#define V4L2_META_FMT_GENERIC_CSI2_24	v4l2_fourcc('M', 'C', '1', 'O') /* 24-bit CSI-2 packed 8-bit metadata */
+
 /* priv field value to indicates that subsequent fields are valid. */
 #define V4L2_PIX_FMT_PRIV_MAGIC		0xfeedcafe
 
@@ -842,6 +856,7 @@ struct v4l2_fmtdesc {
 #define V4L2_FMT_FLAG_CSC_YCBCR_ENC		0x0080
 #define V4L2_FMT_FLAG_CSC_HSV_ENC		V4L2_FMT_FLAG_CSC_YCBCR_ENC
 #define V4L2_FMT_FLAG_CSC_QUANTIZATION		0x0100
+#define V4L2_FMT_FLAG_META_LINE_BASED		0x0200
 
 	/* Frame Size and frame rate enumeration */
 /*
@@ -1790,7 +1805,7 @@ struct v4l2_ext_control {
 		struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll_info;
 		struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering_display;
 		void *ptr;
-	};
+	} __attribute__ ((packed));
 } __attribute__ ((packed));
 
 struct v4l2_ext_controls {
@@ -2360,10 +2375,19 @@ struct v4l2_sdr_format {
  * struct v4l2_meta_format - metadata format definition
  * @dataformat:		little endian four character code (fourcc)
  * @buffersize:		maximum size in bytes required for data
+ * @width:		number of data units of data per line (valid for line
+ *			based formats only, see format documentation)
+ * @height:		number of lines of data per buffer (valid for line based
+ *			formats only)
+ * @bytesperline:	offset between the beginnings of two adjacent lines in
+ *			bytes (valid for line based formats only)
  */
 struct v4l2_meta_format {
 	__u32				dataformat;
 	__u32				buffersize;
+	__u32				width;
+	__u32				height;
+	__u32				bytesperline;
 } __attribute__ ((packed));
 
 /**
diff --git a/lib/include/libdvbv5/dvb-frontend.h b/lib/include/libdvbv5/dvb-frontend.h
index 392171a7d651..844762889343 100644
--- a/lib/include/libdvbv5/dvb-frontend.h
+++ b/lib/include/libdvbv5/dvb-frontend.h
@@ -854,7 +854,7 @@ struct dtv_stats {
 	union {
 		__u64 uvalue;	/* for counters and relative scales */
 		__s64 svalue;	/* for 0.001 dB measures */
-	};
+	}  __attribute__ ((packed));
 } __attribute__ ((packed));
 
 
diff --git a/utils/common/v4l2-pix-formats.h b/utils/common/v4l2-pix-formats.h
index e8d2e441fdfc..96a11f34f53c 100644
--- a/utils/common/v4l2-pix-formats.h
+++ b/utils/common/v4l2-pix-formats.h
@@ -52,6 +52,8 @@
 	case V4L2_PIX_FMT_Y10BPACK: return "10-bit Greyscale (Packed)";
 	case V4L2_PIX_FMT_Y10P: return "10-bit Greyscale (MIPI Packed)";
 	case V4L2_PIX_FMT_IPU3_Y10: return "10-bit greyscale (IPU3 Packed)";
+	case V4L2_PIX_FMT_Y12P: return "12-bit Greyscale (MIPI Packed)";
+	case V4L2_PIX_FMT_Y14P: return "14-bit Greyscale (MIPI Packed)";
 	case V4L2_PIX_FMT_Y8I: return "Interleaved 8-bit Greyscale";
 	case V4L2_PIX_FMT_Y12I: return "Interleaved 12-bit Greyscale";
 	case V4L2_PIX_FMT_Z16: return "16-bit Depth";
@@ -192,6 +194,13 @@
 	case V4L2_PIX_FMT_Y210: return "10-bit YUYV Packed";
 	case V4L2_PIX_FMT_Y212: return "12-bit YUYV Packed";
 	case V4L2_PIX_FMT_Y216: return "16-bit YUYV Packed";
+	case V4L2_META_FMT_GENERIC_8: return "8-bit Generic Metadata";
+	case V4L2_META_FMT_GENERIC_CSI2_10: return "8-bit Generic Meta, 10b CSI-2";
+	case V4L2_META_FMT_GENERIC_CSI2_12: return "8-bit Generic Meta, 12b CSI-2";
+	case V4L2_META_FMT_GENERIC_CSI2_14: return "8-bit Generic Meta, 14b CSI-2";
+	case V4L2_META_FMT_GENERIC_CSI2_16: return "8-bit Generic Meta, 16b CSI-2";
+	case V4L2_META_FMT_GENERIC_CSI2_20: return "8-bit Generic Meta, 20b CSI-2";
+	case V4L2_META_FMT_GENERIC_CSI2_24: return "8-bit Generic Meta, 24b CSI-2";
 	case V4L2_PIX_FMT_MJPEG: return "Motion-JPEG";
 	case V4L2_PIX_FMT_JPEG: return "JFIF JPEG";
 	case V4L2_PIX_FMT_DV: return "1394";
diff --git a/utils/v4l2-tracer/retrace-gen.cpp b/utils/v4l2-tracer/retrace-gen.cpp
index 08ed96164c28..52323a0b0d4d 100644
--- a/utils/v4l2-tracer/retrace-gen.cpp
+++ b/utils/v4l2-tracer/retrace-gen.cpp
@@ -4101,7 +4101,7 @@ struct v4l2_ext_control *retrace_v4l2_ext_control_gen(json_object *parent_obj, s
 	//struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll_info;
 	//struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering_display;
 	//void *ptr;
-	//end of union 	};
+	//end of union 	} __attribute__ ((packed));
 	return p;
 }
 struct v4l2_ext_controls *retrace_v4l2_ext_controls_gen(json_object *parent_obj, std::string key_name = "")
@@ -4930,6 +4930,18 @@ struct v4l2_meta_format *retrace_v4l2_meta_format_gen(json_object *parent_obj, s
 	if (json_object_object_get_ex(v4l2_meta_format_obj, "buffersize", &buffersize_obj))
 		p->buffersize = (__u32) json_object_get_int64(buffersize_obj);
 
+	json_object *width_obj;
+	if (json_object_object_get_ex(v4l2_meta_format_obj, "width", &width_obj))
+		p->width = (__u32) json_object_get_int64(width_obj);
+
+	json_object *height_obj;
+	if (json_object_object_get_ex(v4l2_meta_format_obj, "height", &height_obj))
+		p->height = (__u32) json_object_get_int64(height_obj);
+
+	json_object *bytesperline_obj;
+	if (json_object_object_get_ex(v4l2_meta_format_obj, "bytesperline", &bytesperline_obj))
+		p->bytesperline = (__u32) json_object_get_int64(bytesperline_obj);
+
 	return p;
 }
 struct v4l2_format *retrace_v4l2_format_gen(json_object *parent_obj, std::string key_name = "")
diff --git a/utils/v4l2-tracer/trace-gen.cpp b/utils/v4l2-tracer/trace-gen.cpp
index fd58d9182905..c1075e771078 100644
--- a/utils/v4l2-tracer/trace-gen.cpp
+++ b/utils/v4l2-tracer/trace-gen.cpp
@@ -2245,7 +2245,7 @@ void trace_v4l2_ext_control_gen(void *arg, json_object *parent_obj, std::string
 	//struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll_info;
 	//struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering_display;
 	//void *ptr;
-	//end of union 	};
+	//end of union 	} __attribute__ ((packed));
 
 	if (key_name.empty())
 		json_object_object_add(parent_obj, "v4l2_ext_control", v4l2_ext_control_obj);
@@ -2736,6 +2736,9 @@ void trace_v4l2_meta_format_gen(void *arg, json_object *parent_obj, std::string
 
 	json_object_object_add(v4l2_meta_format_obj, "dataformat", json_object_new_int64(p->dataformat));
 	json_object_object_add(v4l2_meta_format_obj, "buffersize", json_object_new_int64(p->buffersize));
+	json_object_object_add(v4l2_meta_format_obj, "width", json_object_new_int64(p->width));
+	json_object_object_add(v4l2_meta_format_obj, "height", json_object_new_int64(p->height));
+	json_object_object_add(v4l2_meta_format_obj, "bytesperline", json_object_new_int64(p->bytesperline));
 
 	if (key_name.empty())
 		json_object_object_add(parent_obj, "v4l2_meta_format", v4l2_meta_format_obj);
diff --git a/utils/v4l2-tracer/v4l2-tracer-info-gen.h b/utils/v4l2-tracer/v4l2-tracer-info-gen.h
index 022c435c34cf..1ed43074407e 100644
--- a/utils/v4l2-tracer/v4l2-tracer-info-gen.h
+++ b/utils/v4l2-tracer/v4l2-tracer-info-gen.h
@@ -1288,6 +1288,8 @@ constexpr val_def v4l2_pix_fmt_val_def[] = {
 	{ V4L2_PIX_FMT_Y10BPACK,	"V4L2_PIX_FMT_Y10BPACK" },
 	{ V4L2_PIX_FMT_Y10P,	"V4L2_PIX_FMT_Y10P" },
 	{ V4L2_PIX_FMT_IPU3_Y10,	"V4L2_PIX_FMT_IPU3_Y10" },
+	{ V4L2_PIX_FMT_Y12P,	"V4L2_PIX_FMT_Y12P" },
+	{ V4L2_PIX_FMT_Y14P,	"V4L2_PIX_FMT_Y14P" },
 	{ V4L2_PIX_FMT_PAL8,	"V4L2_PIX_FMT_PAL8" },
 	{ V4L2_PIX_FMT_UV8,	"V4L2_PIX_FMT_UV8" },
 	{ V4L2_PIX_FMT_YUYV,	"V4L2_PIX_FMT_YUYV" },
@@ -1482,6 +1484,7 @@ constexpr flag_def v4l2_fmt_flag_def[] = {
 	{ V4L2_FMT_FLAG_CSC_YCBCR_ENC, "V4L2_FMT_FLAG_CSC_YCBCR_ENC" },
 	{ V4L2_FMT_FLAG_CSC_HSV_ENC, "V4L2_FMT_FLAG_CSC_HSV_ENC" },
 	{ V4L2_FMT_FLAG_CSC_QUANTIZATION, "V4L2_FMT_FLAG_CSC_QUANTIZATION" },
+	{ V4L2_FMT_FLAG_META_LINE_BASED, "V4L2_FMT_FLAG_META_LINE_BASED" },
 	{ 0, "" }
 };
 
-- 
Regards,

Laurent Pinchart


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [v4l-utils] [PATCH v2 2/7] utils: media-ctl: Support changed routing API
  2024-04-24 15:22 [v4l-utils] [PATCH v2 0/7] Support for the generic line-based metadata support Laurent Pinchart
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 1/7] v4l-utils: sync-with-kernel Laurent Pinchart
@ 2024-04-24 15:22 ` Laurent Pinchart
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 3/7] v4l2-compliance: Support the " Laurent Pinchart
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Laurent Pinchart @ 2024-04-24 15:22 UTC (permalink / raw)
  To: linux-media
  Cc: Sakari Ailus, Tomi Valkeinen, Hans Verkuil, Gregor Jasny, Sakari Ailus

From: Sakari Ailus <sakari.ailus@linux.intel.com>

Set len_routes of struct v4l2_subdev_routing. ENOSPC error code is no
longer used, i.e. having room for fewer routes than exist in the
configuration is not considered an error anymore.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
 utils/media-ctl/libv4l2subdev.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/utils/media-ctl/libv4l2subdev.c b/utils/media-ctl/libv4l2subdev.c
index c614f4a2e0fd..e0df686e01c7 100644
--- a/utils/media-ctl/libv4l2subdev.c
+++ b/utils/media-ctl/libv4l2subdev.c
@@ -258,7 +258,7 @@ int v4l2_subdev_get_routing(struct media_entity *entity,
 	}
 
 	ret = ioctl(entity->fd, VIDIOC_SUBDEV_G_ROUTING, &routing);
-	if (ret == -1 && errno != ENOSPC)
+	if (ret == -1)
 		return -errno;
 
 	if (!routing.num_routes) {
@@ -272,6 +272,7 @@ int v4l2_subdev_get_routing(struct media_entity *entity,
 		return -ENOMEM;
 
 	routing.routes = (uintptr_t)r;
+	routing.len_routes = routing.num_routes;
 	ret = ioctl(entity->fd, VIDIOC_SUBDEV_G_ROUTING, &routing);
 	if (ret) {
 		free(r);
@@ -292,6 +293,7 @@ int v4l2_subdev_set_routing(struct media_entity *entity,
 		.which = V4L2_SUBDEV_FORMAT_ACTIVE,
 		.routes = (uintptr_t)routes,
 		.num_routes = num_routes,
+		.len_routes = num_routes,
 	};
 	int ret;
 
-- 
Regards,

Laurent Pinchart


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [v4l-utils] [PATCH v2 3/7] v4l2-compliance: Support the changed routing API
  2024-04-24 15:22 [v4l-utils] [PATCH v2 0/7] Support for the generic line-based metadata support Laurent Pinchart
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 1/7] v4l-utils: sync-with-kernel Laurent Pinchart
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 2/7] utils: media-ctl: Support changed routing API Laurent Pinchart
@ 2024-04-24 15:22 ` Laurent Pinchart
  2024-04-24 15:50   ` Hans Verkuil
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 4/7] v4l2-compliance: Add tests for V4L2_FMT_FLAG_META_LINE_BASED flag Laurent Pinchart
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 10+ messages in thread
From: Laurent Pinchart @ 2024-04-24 15:22 UTC (permalink / raw)
  To: linux-media; +Cc: Sakari Ailus, Tomi Valkeinen, Hans Verkuil, Gregor Jasny

Set len_routes of struct v4l2_subdev_routing. ENOSPC error code is no
longer used, i.e. having room for fewer routes than exist in the
configuration is not considered an error anymore.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 utils/v4l2-compliance/v4l2-compliance.cpp   | 12 +++++++-----
 utils/v4l2-compliance/v4l2-test-subdevs.cpp | 19 +++++++++++--------
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/utils/v4l2-compliance/v4l2-compliance.cpp b/utils/v4l2-compliance/v4l2-compliance.cpp
index fd7e7d76e214..144f961842c6 100644
--- a/utils/v4l2-compliance/v4l2-compliance.cpp
+++ b/utils/v4l2-compliance/v4l2-compliance.cpp
@@ -1272,15 +1272,17 @@ void testNode(struct node &node, struct node &node_m2m_cap, struct node &expbuf_
 
 			for (unsigned which = V4L2_SUBDEV_FORMAT_TRY;
 				which <= V4L2_SUBDEV_FORMAT_ACTIVE; which++) {
+				struct v4l2_subdev_routing &routing = sd_routing[which];
 
-				sd_routing[which].which = which;
-				sd_routing[which].routes = (uintptr_t)sd_routes[which];
-				sd_routing[which].num_routes = NUM_ROUTES_MAX;
+				routing.which = which;
+				routing.routes = (uintptr_t)sd_routes[which];
+				routing.len_routes = NUM_ROUTES_MAX;
+				routing.num_routes = 0;
 
-				ret = doioctl(&node, VIDIOC_SUBDEV_G_ROUTING, &sd_routing[which]);
+				ret = doioctl(&node, VIDIOC_SUBDEV_G_ROUTING, &routing);
 				if (ret) {
 					fail("VIDIOC_SUBDEV_G_ROUTING: failed to get routing\n");
-					sd_routing[which].num_routes = 0;
+					routing.num_routes = 0;
 				}
 			}
 		}
diff --git a/utils/v4l2-compliance/v4l2-test-subdevs.cpp b/utils/v4l2-compliance/v4l2-test-subdevs.cpp
index da304a8caa8a..41eaf77112f0 100644
--- a/utils/v4l2-compliance/v4l2-test-subdevs.cpp
+++ b/utils/v4l2-compliance/v4l2-test-subdevs.cpp
@@ -587,17 +587,15 @@ int testSubDevRouting(struct node *node, unsigned which)
 
 	routing.which = which;
 	routing.routes = (uintptr_t)&routes;
+	routing.len_routes = 0;
 	routing.num_routes = 0;
 	memset(routing.reserved, 0xff, sizeof(routing.reserved));
 
-	/*
-	 * First test that G_ROUTING either returns success, or ENOSPC and
-	 * updates num_routes.
-	 */
+	/* First test that G_ROUTING returns success even when len_routes is 0. */
 
 	ret = doioctl(node, VIDIOC_SUBDEV_G_ROUTING, &routing);
-	fail_on_test(ret && ret != ENOSPC);
-	fail_on_test(ret == ENOSPC && routing.num_routes == 0);
+	fail_on_test(ret);
+	fail_on_test(routing.num_routes > NUM_ROUTES_MAX);
 	fail_on_test(check_0(routing.reserved, sizeof(routing.reserved)));
 
 	if (!routing.num_routes)
@@ -609,7 +607,8 @@ int testSubDevRouting(struct node *node, unsigned which)
 	 */
 
 	uint32_t num_routes = routing.num_routes;
-	routing.num_routes = num_routes + 1;
+	routing.len_routes = NUM_ROUTES_MAX;
+	routing.num_routes = 0;
 	fail_on_test(doioctl(node, VIDIOC_SUBDEV_G_ROUTING, &routing));
 	fail_on_test(routing.num_routes != num_routes);
 
@@ -633,10 +632,14 @@ int testSubDevRouting(struct node *node, unsigned which)
 		}
 	}
 
-	/* Set the same routes back, which should always succeed. */
+	/*
+	 * Set the same routes back, which should always succeed and report the
+	 * same number of routes.
+	 */
 
 	memset(routing.reserved, 0xff, sizeof(routing.reserved));
 	fail_on_test(doioctl(node, VIDIOC_SUBDEV_S_ROUTING, &routing));
+	fail_on_test(routing.num_routes != num_routes);
 	fail_on_test(check_0(routing.reserved, sizeof(routing.reserved)));
 
 	/* Test setting invalid pads */
-- 
Regards,

Laurent Pinchart


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [v4l-utils] [PATCH v2 4/7] v4l2-compliance: Add tests for V4L2_FMT_FLAG_META_LINE_BASED flag
  2024-04-24 15:22 [v4l-utils] [PATCH v2 0/7] Support for the generic line-based metadata support Laurent Pinchart
                   ` (2 preceding siblings ...)
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 3/7] v4l2-compliance: Support the " Laurent Pinchart
@ 2024-04-24 15:22 ` Laurent Pinchart
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 5/7] v4l-utils: sync-with-kernel Laurent Pinchart
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Laurent Pinchart @ 2024-04-24 15:22 UTC (permalink / raw)
  To: linux-media; +Cc: Sakari Ailus, Tomi Valkeinen, Hans Verkuil, Gregor Jasny

The metadata API supports a new flag, V4L2_FMT_FLAG_META_LINE_BASED. It
can be set for metadata formats only, and is the only flag that can be
set for metadata formats. When set, the width, height and bytesperline
fields must not be zero. Add corresponding tests.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 utils/v4l2-compliance/v4l2-test-formats.cpp | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/utils/v4l2-compliance/v4l2-test-formats.cpp b/utils/v4l2-compliance/v4l2-test-formats.cpp
index 423567fe573b..5507e45ef3dd 100644
--- a/utils/v4l2-compliance/v4l2-test-formats.cpp
+++ b/utils/v4l2-compliance/v4l2-test-formats.cpp
@@ -281,12 +281,23 @@ static int testEnumFormatsType(struct node *node, unsigned type)
 				      V4L2_FMT_FLAG_ENC_CAP_FRAME_INTERVAL |
 				      V4L2_FMT_FLAG_CSC_COLORSPACE |
 				      V4L2_FMT_FLAG_CSC_YCBCR_ENC | V4L2_FMT_FLAG_CSC_HSV_ENC |
-				      V4L2_FMT_FLAG_CSC_QUANTIZATION | V4L2_FMT_FLAG_CSC_XFER_FUNC))
+				      V4L2_FMT_FLAG_CSC_QUANTIZATION | V4L2_FMT_FLAG_CSC_XFER_FUNC |
+				      V4L2_FMT_FLAG_META_LINE_BASED))
 			return fail("unknown flag %08x returned\n", fmtdesc.flags);
 		if (!(fmtdesc.flags & V4L2_FMT_FLAG_COMPRESSED))
 			fail_on_test(fmtdesc.flags & (V4L2_FMT_FLAG_CONTINUOUS_BYTESTREAM |
 						      V4L2_FMT_FLAG_DYN_RESOLUTION |
 						      V4L2_FMT_FLAG_ENC_CAP_FRAME_INTERVAL));
+
+		// Checks for metadata formats.
+		// The META_LINE_BASED flag can be set for metadata formats only.
+		if (type == V4L2_BUF_TYPE_META_OUTPUT || type == V4L2_BUF_TYPE_META_CAPTURE)
+			fail_on_test(fmtdesc.flags & ~V4L2_FMT_FLAG_META_LINE_BASED);
+		// Only the META_LINE_BASED flag is valid for metadata formats.
+		if (fmtdesc.flags & V4L2_FMT_FLAG_META_LINE_BASED)
+			fail_on_test(type != V4L2_BUF_TYPE_META_OUTPUT &&
+				     type != V4L2_BUF_TYPE_META_CAPTURE);
+
 		ret = testEnumFrameSizes(node, fmtdesc.pixelformat);
 		if (ret)
 			fail_on_test(node->codec_mask & STATEFUL_ENCODER);
@@ -590,6 +601,10 @@ static int testFormatsType(struct node *node, int ret,  unsigned type, struct v4
 			return fail("dataformat %08x (%s) for buftype %d not reported by ENUM_FMT\n",
 					meta.dataformat, fcc2s(meta.dataformat).c_str(), type);
 		fail_on_test(meta.buffersize == 0);
+		if (map.at(meta.dataformat) & V4L2_FMT_FLAG_META_LINE_BASED) {
+			fail_on_test(!meta.width || !meta.height);
+			fail_on_test(!meta.bytesperline);
+		}
 		break;
 	case V4L2_BUF_TYPE_PRIVATE:
 		break;
-- 
Regards,

Laurent Pinchart


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [v4l-utils] [PATCH v2 5/7] v4l-utils: sync-with-kernel
  2024-04-24 15:22 [v4l-utils] [PATCH v2 0/7] Support for the generic line-based metadata support Laurent Pinchart
                   ` (3 preceding siblings ...)
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 4/7] v4l2-compliance: Add tests for V4L2_FMT_FLAG_META_LINE_BASED flag Laurent Pinchart
@ 2024-04-24 15:22 ` Laurent Pinchart
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 6/7] utils: media-ctl: Print the INTERNAL pad flag Laurent Pinchart
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 7/7] v4l2-compliance: Test IMMUTABLE route flag Laurent Pinchart
  6 siblings, 0 replies; 10+ messages in thread
From: Laurent Pinchart @ 2024-04-24 15:22 UTC (permalink / raw)
  To: linux-media; +Cc: Sakari Ailus, Tomi Valkeinen, Hans Verkuil, Gregor Jasny

Update v4l-utils to the kernel headers from the internal pads series.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 include/linux/media.h                    | 1 +
 include/linux/v4l2-subdev.h              | 5 +++++
 utils/v4l2-tracer/v4l2-tracer-info-gen.h | 1 +
 3 files changed, 7 insertions(+)

diff --git a/include/linux/media.h b/include/linux/media.h
index b5a77bbf4062..4a733b9beb27 100644
--- a/include/linux/media.h
+++ b/include/linux/media.h
@@ -206,6 +206,7 @@ struct media_entity_desc {
 #define MEDIA_PAD_FL_SINK			(1U << 0)
 #define MEDIA_PAD_FL_SOURCE			(1U << 1)
 #define MEDIA_PAD_FL_MUST_CONNECT		(1U << 2)
+#define MEDIA_PAD_FL_INTERNAL			(1U << 3)
 
 struct media_pad_desc {
 	__u32 entity;		/* entity ID */
diff --git a/include/linux/v4l2-subdev.h b/include/linux/v4l2-subdev.h
index 6a39128d0606..c6f1228d43b1 100644
--- a/include/linux/v4l2-subdev.h
+++ b/include/linux/v4l2-subdev.h
@@ -204,6 +204,11 @@ struct v4l2_subdev_capability {
  * on a video node.
  */
 #define V4L2_SUBDEV_ROUTE_FL_ACTIVE		(1U << 0)
+/*
+ * Is the route immutable. The ACTIVE flag of an immutable route may not be
+ * changed.
+ */
+#define V4L2_SUBDEV_ROUTE_FL_IMMUTABLE		(1U << 1)
 
 /**
  * struct v4l2_subdev_route - A route inside a subdev
diff --git a/utils/v4l2-tracer/v4l2-tracer-info-gen.h b/utils/v4l2-tracer/v4l2-tracer-info-gen.h
index 1ed43074407e..51eeb7b7ec60 100644
--- a/utils/v4l2-tracer/v4l2-tracer-info-gen.h
+++ b/utils/v4l2-tracer/v4l2-tracer-info-gen.h
@@ -1852,6 +1852,7 @@ constexpr flag_def media_pad_flag_def[] = {
 	{ MEDIA_PAD_FL_SINK, "MEDIA_PAD_FL_SINK" },
 	{ MEDIA_PAD_FL_SOURCE, "MEDIA_PAD_FL_SOURCE" },
 	{ MEDIA_PAD_FL_MUST_CONNECT, "MEDIA_PAD_FL_MUST_CONNECT" },
+	{ MEDIA_PAD_FL_INTERNAL, "MEDIA_PAD_FL_INTERNAL" },
 	{ 0, "" }
 };
 
-- 
Regards,

Laurent Pinchart


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [v4l-utils] [PATCH v2 6/7] utils: media-ctl: Print the INTERNAL pad flag
  2024-04-24 15:22 [v4l-utils] [PATCH v2 0/7] Support for the generic line-based metadata support Laurent Pinchart
                   ` (4 preceding siblings ...)
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 5/7] v4l-utils: sync-with-kernel Laurent Pinchart
@ 2024-04-24 15:22 ` Laurent Pinchart
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 7/7] v4l2-compliance: Test IMMUTABLE route flag Laurent Pinchart
  6 siblings, 0 replies; 10+ messages in thread
From: Laurent Pinchart @ 2024-04-24 15:22 UTC (permalink / raw)
  To: linux-media
  Cc: Sakari Ailus, Tomi Valkeinen, Hans Verkuil, Gregor Jasny, Sakari Ailus

From: Sakari Ailus <sakari.ailus@linux.intel.com>

Add the INTERNAL pad flag to the list of known flags, to print it by
name instead of numerical value.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 utils/media-ctl/media-ctl.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/utils/media-ctl/media-ctl.c b/utils/media-ctl/media-ctl.c
index 1a9e393ac1f3..510479d83de4 100644
--- a/utils/media-ctl/media-ctl.c
+++ b/utils/media-ctl/media-ctl.c
@@ -517,6 +517,7 @@ static void media_print_topology_text_entity(struct media_device *media,
 		{ MEDIA_PAD_FL_SINK, "SINK" },
 		{ MEDIA_PAD_FL_SOURCE, "SOURCE" },
 		{ MEDIA_PAD_FL_MUST_CONNECT, "MUST_CONNECT" },
+		{ MEDIA_PAD_FL_INTERNAL, "INTERNAL" },
 	};
 	const struct media_entity_desc *info = media_entity_get_info(entity);
 	const char *devname = media_entity_get_devname(entity);
-- 
Regards,

Laurent Pinchart


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [v4l-utils] [PATCH v2 7/7] v4l2-compliance: Test IMMUTABLE route flag
  2024-04-24 15:22 [v4l-utils] [PATCH v2 0/7] Support for the generic line-based metadata support Laurent Pinchart
                   ` (5 preceding siblings ...)
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 6/7] utils: media-ctl: Print the INTERNAL pad flag Laurent Pinchart
@ 2024-04-24 15:22 ` Laurent Pinchart
  6 siblings, 0 replies; 10+ messages in thread
From: Laurent Pinchart @ 2024-04-24 15:22 UTC (permalink / raw)
  To: linux-media; +Cc: Sakari Ailus, Tomi Valkeinen, Hans Verkuil, Gregor Jasny

Accept the new V4L2_SUBDEV_ROUTE_FL_IMMUTABLE route flag when testing
routing, and verify that immutable routes are active as mandated by the
routing API specification.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 utils/v4l2-compliance/v4l2-test-subdevs.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/utils/v4l2-compliance/v4l2-test-subdevs.cpp b/utils/v4l2-compliance/v4l2-test-subdevs.cpp
index 41eaf77112f0..409e82dae480 100644
--- a/utils/v4l2-compliance/v4l2-test-subdevs.cpp
+++ b/utils/v4l2-compliance/v4l2-test-subdevs.cpp
@@ -579,7 +579,8 @@ int testSubDevSelection(struct node *node, unsigned which, unsigned pad, unsigne
 
 int testSubDevRouting(struct node *node, unsigned which)
 {
-	const uint32_t all_route_flags_mask = V4L2_SUBDEV_ROUTE_FL_ACTIVE;
+	const uint32_t all_route_flags_mask = V4L2_SUBDEV_ROUTE_FL_ACTIVE
+					    | V4L2_SUBDEV_ROUTE_FL_IMMUTABLE;
 	struct v4l2_subdev_routing routing = {};
 	struct v4l2_subdev_route routes[NUM_ROUTES_MAX] = {};
 	unsigned int i;
@@ -629,6 +630,8 @@ int testSubDevRouting(struct node *node, unsigned which)
 			fail_on_test(!(sink->flags & MEDIA_PAD_FL_SINK));
 			fail_on_test(!(source->flags & MEDIA_PAD_FL_SOURCE));
 			fail_on_test(route->flags & ~all_route_flags_mask);
+			fail_on_test((route->flags & V4L2_SUBDEV_ROUTE_FL_IMMUTABLE) &&
+				     !(route->flags & V4L2_SUBDEV_ROUTE_FL_ACTIVE));
 		}
 	}
 
-- 
Regards,

Laurent Pinchart


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [v4l-utils] [PATCH v2 3/7] v4l2-compliance: Support the changed routing API
  2024-04-24 15:22 ` [v4l-utils] [PATCH v2 3/7] v4l2-compliance: Support the " Laurent Pinchart
@ 2024-04-24 15:50   ` Hans Verkuil
  2024-04-24 16:07     ` Laurent Pinchart
  0 siblings, 1 reply; 10+ messages in thread
From: Hans Verkuil @ 2024-04-24 15:50 UTC (permalink / raw)
  To: Laurent Pinchart, linux-media; +Cc: Sakari Ailus, Tomi Valkeinen, Gregor Jasny

On 24/04/2024 17:22, Laurent Pinchart wrote:
> Set len_routes of struct v4l2_subdev_routing. ENOSPC error code is no
> longer used, i.e. having room for fewer routes than exist in the
> configuration is not considered an error anymore.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>  utils/v4l2-compliance/v4l2-compliance.cpp   | 12 +++++++-----
>  utils/v4l2-compliance/v4l2-test-subdevs.cpp | 19 +++++++++++--------
>  2 files changed, 18 insertions(+), 13 deletions(-)
> 
> diff --git a/utils/v4l2-compliance/v4l2-compliance.cpp b/utils/v4l2-compliance/v4l2-compliance.cpp
> index fd7e7d76e214..144f961842c6 100644
> --- a/utils/v4l2-compliance/v4l2-compliance.cpp
> +++ b/utils/v4l2-compliance/v4l2-compliance.cpp
> @@ -1272,15 +1272,17 @@ void testNode(struct node &node, struct node &node_m2m_cap, struct node &expbuf_
>  
>  			for (unsigned which = V4L2_SUBDEV_FORMAT_TRY;
>  				which <= V4L2_SUBDEV_FORMAT_ACTIVE; which++) {
> +				struct v4l2_subdev_routing &routing = sd_routing[which];
>  
> -				sd_routing[which].which = which;
> -				sd_routing[which].routes = (uintptr_t)sd_routes[which];
> -				sd_routing[which].num_routes = NUM_ROUTES_MAX;
> +				routing.which = which;
> +				routing.routes = (uintptr_t)sd_routes[which];
> +				routing.len_routes = NUM_ROUTES_MAX;
> +				routing.num_routes = 0;
>  
> -				ret = doioctl(&node, VIDIOC_SUBDEV_G_ROUTING, &sd_routing[which]);
> +				ret = doioctl(&node, VIDIOC_SUBDEV_G_ROUTING, &routing);
>  				if (ret) {
>  					fail("VIDIOC_SUBDEV_G_ROUTING: failed to get routing\n");
> -					sd_routing[which].num_routes = 0;
> +					routing.num_routes = 0;
>  				}
>  			}
>  		}
> diff --git a/utils/v4l2-compliance/v4l2-test-subdevs.cpp b/utils/v4l2-compliance/v4l2-test-subdevs.cpp
> index da304a8caa8a..41eaf77112f0 100644
> --- a/utils/v4l2-compliance/v4l2-test-subdevs.cpp
> +++ b/utils/v4l2-compliance/v4l2-test-subdevs.cpp
> @@ -587,17 +587,15 @@ int testSubDevRouting(struct node *node, unsigned which)
>  
>  	routing.which = which;
>  	routing.routes = (uintptr_t)&routes;
> +	routing.len_routes = 0;
>  	routing.num_routes = 0;
>  	memset(routing.reserved, 0xff, sizeof(routing.reserved));
>  
> -	/*
> -	 * First test that G_ROUTING either returns success, or ENOSPC and
> -	 * updates num_routes.
> -	 */
> +	/* First test that G_ROUTING returns success even when len_routes is 0. */
>  
>  	ret = doioctl(node, VIDIOC_SUBDEV_G_ROUTING, &routing);
> -	fail_on_test(ret && ret != ENOSPC);
> -	fail_on_test(ret == ENOSPC && routing.num_routes == 0);
> +	fail_on_test(ret);
> +	fail_on_test(routing.num_routes > NUM_ROUTES_MAX);
>  	fail_on_test(check_0(routing.reserved, sizeof(routing.reserved)));
>  
>  	if (!routing.num_routes)
> @@ -609,7 +607,8 @@ int testSubDevRouting(struct node *node, unsigned which)
>  	 */
>  
>  	uint32_t num_routes = routing.num_routes;
> -	routing.num_routes = num_routes + 1;
> +	routing.len_routes = NUM_ROUTES_MAX;
> +	routing.num_routes = 0;
>  	fail_on_test(doioctl(node, VIDIOC_SUBDEV_G_ROUTING, &routing));
>  	fail_on_test(routing.num_routes != num_routes);
>  
> @@ -633,10 +632,14 @@ int testSubDevRouting(struct node *node, unsigned which)
>  		}
>  	}
>  
> -	/* Set the same routes back, which should always succeed. */
> +	/*
> +	 * Set the same routes back, which should always succeed and report the
> +	 * same number of routes.
> +	 */
>  
>  	memset(routing.reserved, 0xff, sizeof(routing.reserved));
>  	fail_on_test(doioctl(node, VIDIOC_SUBDEV_S_ROUTING, &routing));
> +	fail_on_test(routing.num_routes != num_routes);
>  	fail_on_test(check_0(routing.reserved, sizeof(routing.reserved)));

I think this needs another test: if S_ROUTING is called with num_routes > len_routes,
then EINVAL must be returned. This is an important test to make sure the core handles
this correctly and won't be using more than len_routes routes.

Regards,

	Hans

>  
>  	/* Test setting invalid pads */


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [v4l-utils] [PATCH v2 3/7] v4l2-compliance: Support the changed routing API
  2024-04-24 15:50   ` Hans Verkuil
@ 2024-04-24 16:07     ` Laurent Pinchart
  0 siblings, 0 replies; 10+ messages in thread
From: Laurent Pinchart @ 2024-04-24 16:07 UTC (permalink / raw)
  To: Hans Verkuil; +Cc: linux-media, Sakari Ailus, Tomi Valkeinen, Gregor Jasny

Hi Hans,

On Wed, Apr 24, 2024 at 05:50:56PM +0200, Hans Verkuil wrote:
> On 24/04/2024 17:22, Laurent Pinchart wrote:
> > Set len_routes of struct v4l2_subdev_routing. ENOSPC error code is no
> > longer used, i.e. having room for fewer routes than exist in the
> > configuration is not considered an error anymore.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> >  utils/v4l2-compliance/v4l2-compliance.cpp   | 12 +++++++-----
> >  utils/v4l2-compliance/v4l2-test-subdevs.cpp | 19 +++++++++++--------
> >  2 files changed, 18 insertions(+), 13 deletions(-)
> > 
> > diff --git a/utils/v4l2-compliance/v4l2-compliance.cpp b/utils/v4l2-compliance/v4l2-compliance.cpp
> > index fd7e7d76e214..144f961842c6 100644
> > --- a/utils/v4l2-compliance/v4l2-compliance.cpp
> > +++ b/utils/v4l2-compliance/v4l2-compliance.cpp
> > @@ -1272,15 +1272,17 @@ void testNode(struct node &node, struct node &node_m2m_cap, struct node &expbuf_
> >  
> >  			for (unsigned which = V4L2_SUBDEV_FORMAT_TRY;
> >  				which <= V4L2_SUBDEV_FORMAT_ACTIVE; which++) {
> > +				struct v4l2_subdev_routing &routing = sd_routing[which];
> >  
> > -				sd_routing[which].which = which;
> > -				sd_routing[which].routes = (uintptr_t)sd_routes[which];
> > -				sd_routing[which].num_routes = NUM_ROUTES_MAX;
> > +				routing.which = which;
> > +				routing.routes = (uintptr_t)sd_routes[which];
> > +				routing.len_routes = NUM_ROUTES_MAX;
> > +				routing.num_routes = 0;
> >  
> > -				ret = doioctl(&node, VIDIOC_SUBDEV_G_ROUTING, &sd_routing[which]);
> > +				ret = doioctl(&node, VIDIOC_SUBDEV_G_ROUTING, &routing);
> >  				if (ret) {
> >  					fail("VIDIOC_SUBDEV_G_ROUTING: failed to get routing\n");
> > -					sd_routing[which].num_routes = 0;
> > +					routing.num_routes = 0;
> >  				}
> >  			}
> >  		}
> > diff --git a/utils/v4l2-compliance/v4l2-test-subdevs.cpp b/utils/v4l2-compliance/v4l2-test-subdevs.cpp
> > index da304a8caa8a..41eaf77112f0 100644
> > --- a/utils/v4l2-compliance/v4l2-test-subdevs.cpp
> > +++ b/utils/v4l2-compliance/v4l2-test-subdevs.cpp
> > @@ -587,17 +587,15 @@ int testSubDevRouting(struct node *node, unsigned which)
> >  
> >  	routing.which = which;
> >  	routing.routes = (uintptr_t)&routes;
> > +	routing.len_routes = 0;
> >  	routing.num_routes = 0;
> >  	memset(routing.reserved, 0xff, sizeof(routing.reserved));
> >  
> > -	/*
> > -	 * First test that G_ROUTING either returns success, or ENOSPC and
> > -	 * updates num_routes.
> > -	 */
> > +	/* First test that G_ROUTING returns success even when len_routes is 0. */
> >  
> >  	ret = doioctl(node, VIDIOC_SUBDEV_G_ROUTING, &routing);
> > -	fail_on_test(ret && ret != ENOSPC);
> > -	fail_on_test(ret == ENOSPC && routing.num_routes == 0);
> > +	fail_on_test(ret);
> > +	fail_on_test(routing.num_routes > NUM_ROUTES_MAX);
> >  	fail_on_test(check_0(routing.reserved, sizeof(routing.reserved)));
> >  
> >  	if (!routing.num_routes)
> > @@ -609,7 +607,8 @@ int testSubDevRouting(struct node *node, unsigned which)
> >  	 */
> >  
> >  	uint32_t num_routes = routing.num_routes;
> > -	routing.num_routes = num_routes + 1;
> > +	routing.len_routes = NUM_ROUTES_MAX;
> > +	routing.num_routes = 0;
> >  	fail_on_test(doioctl(node, VIDIOC_SUBDEV_G_ROUTING, &routing));
> >  	fail_on_test(routing.num_routes != num_routes);
> >  
> > @@ -633,10 +632,14 @@ int testSubDevRouting(struct node *node, unsigned which)
> >  		}
> >  	}
> >  
> > -	/* Set the same routes back, which should always succeed. */
> > +	/*
> > +	 * Set the same routes back, which should always succeed and report the
> > +	 * same number of routes.
> > +	 */
> >  
> >  	memset(routing.reserved, 0xff, sizeof(routing.reserved));
> >  	fail_on_test(doioctl(node, VIDIOC_SUBDEV_S_ROUTING, &routing));
> > +	fail_on_test(routing.num_routes != num_routes);
> >  	fail_on_test(check_0(routing.reserved, sizeof(routing.reserved)));
> 
> I think this needs another test: if S_ROUTING is called with num_routes > len_routes,
> then EINVAL must be returned. This is an important test to make sure the core handles
> this correctly and won't be using more than len_routes routes.

I'll add the test now, that should be easy. I'll push an update to my
branch but won't repost the patches yet, to let reviewers a chance to
check the series.

> >  
> >  	/* Test setting invalid pads */

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-04-24 16:07 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-24 15:22 [v4l-utils] [PATCH v2 0/7] Support for the generic line-based metadata support Laurent Pinchart
2024-04-24 15:22 ` [v4l-utils] [PATCH v2 1/7] v4l-utils: sync-with-kernel Laurent Pinchart
2024-04-24 15:22 ` [v4l-utils] [PATCH v2 2/7] utils: media-ctl: Support changed routing API Laurent Pinchart
2024-04-24 15:22 ` [v4l-utils] [PATCH v2 3/7] v4l2-compliance: Support the " Laurent Pinchart
2024-04-24 15:50   ` Hans Verkuil
2024-04-24 16:07     ` Laurent Pinchart
2024-04-24 15:22 ` [v4l-utils] [PATCH v2 4/7] v4l2-compliance: Add tests for V4L2_FMT_FLAG_META_LINE_BASED flag Laurent Pinchart
2024-04-24 15:22 ` [v4l-utils] [PATCH v2 5/7] v4l-utils: sync-with-kernel Laurent Pinchart
2024-04-24 15:22 ` [v4l-utils] [PATCH v2 6/7] utils: media-ctl: Print the INTERNAL pad flag Laurent Pinchart
2024-04-24 15:22 ` [v4l-utils] [PATCH v2 7/7] v4l2-compliance: Test IMMUTABLE route flag Laurent Pinchart

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).