[v2,2/6] libcamera: formats: Add PiSP specific image and config buffer formats
diff mbox series

Message ID 20240508080401.14850-3-naush@raspberrypi.com
State Superseded
Headers show
Series
  • Pre Raspberry Pi 5 support changes
Related show

Commit Message

Naushir Patuck May 8, 2024, 8:03 a.m. UTC
Add the Raspberry Pi 5 PiSP specific verification format:
- V4L2_PIX_FMT_RPI_BE

Add the Raspberry Pi 5 PiSP specific compressed Bayer format types 1/2:
- V4L2_PIX_FMT_PISP_COMP1_xxx
- V4L2_PIX_FMT_PISP_COMP2_xxx

Add the Raspberry Pi 5 PiSP Frontend and Backend config formats:
- V4L2_META_FMT_RPI_FE_CFG
- V4L2_META_FMT_RPI_BE_CFG

Add the Raspberry Pi 5 PiSP Frontend statistics format:
- V4L2_META_FMT_RPI_FE_STATS

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
---
 include/libcamera/internal/bayer_format.h |  2 +
 include/linux/drm_fourcc.h                |  5 +++
 include/linux/videodev2.h                 | 21 ++++++++++
 src/libcamera/bayer_format.cpp            | 14 +++++++
 src/libcamera/formats.cpp                 | 51 ++++++++++++++++++++++-
 src/libcamera/formats.yaml                | 16 +++++++
 src/libcamera/v4l2_pixelformat.cpp        | 10 +++++
 7 files changed, 118 insertions(+), 1 deletion(-)

Comments

Laurent Pinchart May 9, 2024, 11:29 a.m. UTC | #1
Hi Naush,

Thank you for the patch.

On Wed, May 08, 2024 at 09:03:57AM +0100, Naushir Patuck wrote:
> Add the Raspberry Pi 5 PiSP specific verification format:
> - V4L2_PIX_FMT_RPI_BE
> 
> Add the Raspberry Pi 5 PiSP specific compressed Bayer format types 1/2:
> - V4L2_PIX_FMT_PISP_COMP1_xxx
> - V4L2_PIX_FMT_PISP_COMP2_xxx
> 
> Add the Raspberry Pi 5 PiSP Frontend and Backend config formats:
> - V4L2_META_FMT_RPI_FE_CFG
> - V4L2_META_FMT_RPI_BE_CFG
> 
> Add the Raspberry Pi 5 PiSP Frontend statistics format:
> - V4L2_META_FMT_RPI_FE_STATS
> 
> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
> Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> ---
>  include/libcamera/internal/bayer_format.h |  2 +
>  include/linux/drm_fourcc.h                |  5 +++
>  include/linux/videodev2.h                 | 21 ++++++++++

As for 1/6, it would be nice to split changes to kernel headers to a
separate patch. The commit message should indicate where the changes
come from (name of the patch series and links to lore.kernel.org is
likely the best option). It's absolutely fine to merge kernel header
changes that are not in upstream yet, but I want to track their origin
to avoid maintenance headaches later. You can even split this in one
patch per series submitted upstream.

>  src/libcamera/bayer_format.cpp            | 14 +++++++
>  src/libcamera/formats.cpp                 | 51 ++++++++++++++++++++++-
>  src/libcamera/formats.yaml                | 16 +++++++
>  src/libcamera/v4l2_pixelformat.cpp        | 10 +++++
>  7 files changed, 118 insertions(+), 1 deletion(-)
> 
> diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h
> index 78ba3969913d..164743f7e9f6 100644
> --- a/include/libcamera/internal/bayer_format.h
> +++ b/include/libcamera/internal/bayer_format.h
> @@ -34,6 +34,8 @@ public:
>  		None = 0,
>  		CSI2 = 1,
>  		IPU3 = 2,
> +		PISP1 = 3,
> +		PISP2 = 4,

Missing documentation in bayer_format.cpp.

>  	};
>  
>  	constexpr BayerFormat()
> diff --git a/include/linux/drm_fourcc.h b/include/linux/drm_fourcc.h
> index 5133a6551a34..927095c4e0df 100644
> --- a/include/linux/drm_fourcc.h
> +++ b/include/linux/drm_fourcc.h
> @@ -490,6 +490,7 @@ extern "C" {
>  #define DRM_FORMAT_MOD_VENDOR_ALLWINNER 0x09
>  #define DRM_FORMAT_MOD_VENDOR_AMLOGIC 0x0a
>  #define DRM_FORMAT_MOD_VENDOR_MIPI 0x0b
> +#define DRM_FORMAT_MOD_VENDOR_RPI 0x0c
>  
>  /* add more to the end as needed */
>  
> @@ -1670,6 +1671,10 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
>   */
>  #define MIPI_FORMAT_MOD_CSI2_PACKED fourcc_mod_code(MIPI, 1)
>  
> +#define PISP_FORMAT_MOD_COMPRESS_MODE1 fourcc_mod_code(RPI, 1)
> +#define PISP_FORMAT_MOD_COMPRESS_MODE2 fourcc_mod_code(RPI, 2)
> +#define PISP_FORMAT_MOD_VERIFICATION fourcc_mod_code(RPI, 3)

Just checking, given that you only define PISP1 and PISP2 in
BayerFormat::Packing, will this one be used ?

> +
>  #if defined(__cplusplus)
>  }
>  #endif
> diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
> index 4fdd91494041..0b5482a07ae4 100644
> --- a/include/linux/videodev2.h
> +++ b/include/linux/videodev2.h
> @@ -787,6 +787,18 @@ struct v4l2_pix_format {
>  #define V4L2_PIX_FMT_IPU3_SGRBG10	v4l2_fourcc('i', 'p', '3', 'G') /* IPU3 packed 10-bit GRBG bayer */
>  #define V4L2_PIX_FMT_IPU3_SRGGB10	v4l2_fourcc('i', 'p', '3', 'r') /* IPU3 packed 10-bit RGGB bayer */
>  
> +/* Raspberry Pi PiSP compressed formats. */
> +#define V4L2_PIX_FMT_PISP_COMP1_RGGB	v4l2_fourcc('P', 'C', '1', 'R') /* PiSP 8-bit mode 1 compressed RGGB bayer */
> +#define V4L2_PIX_FMT_PISP_COMP1_GRBG	v4l2_fourcc('P', 'C', '1', 'G') /* PiSP 8-bit mode 1 compressed GRBG bayer */
> +#define V4L2_PIX_FMT_PISP_COMP1_GBRG	v4l2_fourcc('P', 'C', '1', 'g') /* PiSP 8-bit mode 1 compressed GBRG bayer */
> +#define V4L2_PIX_FMT_PISP_COMP1_BGGR	v4l2_fourcc('P', 'C', '1', 'B') /* PiSP 8-bit mode 1 compressed BGGR bayer */
> +#define V4L2_PIX_FMT_PISP_COMP1_MONO	v4l2_fourcc('P', 'C', '1', 'M') /* PiSP 8-bit mode 1 compressed monochrome */
> +#define V4L2_PIX_FMT_PISP_COMP2_RGGB	v4l2_fourcc('P', 'C', '2', 'R') /* PiSP 8-bit mode 2 compressed RGGB bayer */
> +#define V4L2_PIX_FMT_PISP_COMP2_GRBG	v4l2_fourcc('P', 'C', '2', 'G') /* PiSP 8-bit mode 2 compressed GRBG bayer */
> +#define V4L2_PIX_FMT_PISP_COMP2_GBRG	v4l2_fourcc('P', 'C', '2', 'g') /* PiSP 8-bit mode 2 compressed GBRG bayer */
> +#define V4L2_PIX_FMT_PISP_COMP2_BGGR	v4l2_fourcc('P', 'C', '2', 'B') /* PiSP 8-bit mode 2 compressed BGGR bayer */
> +#define V4L2_PIX_FMT_PISP_COMP2_MONO	v4l2_fourcc('P', 'C', '2', 'M') /* PiSP 8-bit mode 2 compressed monochrome */

The COMP2 formats are not used below. Do you plan to use them later ?

> +
>  /* SDR formats - used only for Software Defined Radio devices */
>  #define V4L2_SDR_FMT_CU8          v4l2_fourcc('C', 'U', '0', '8') /* IQ u8 */
>  #define V4L2_SDR_FMT_CU16LE       v4l2_fourcc('C', 'U', '1', '6') /* IQ u16le */
> @@ -816,6 +828,15 @@ 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 */
>  
> +/* The metadata format identifier for BE configuration buffers. */
> +#define V4L2_META_FMT_RPI_BE_CFG v4l2_fourcc('R', 'P', 'B', 'C')
> +
> +/* The metadata format identifier for FE configuration buffers. */
> +#define V4L2_META_FMT_RPI_FE_CFG v4l2_fourcc('R', 'P', 'F', 'C')
> +
> +/* The metadata format identifier for FE stats buffers. */
> +#define V4L2_META_FMT_RPI_FE_STATS v4l2_fourcc('R', 'P', 'F', 'S')
> +
>  /* priv field value to indicates that subsequent fields are valid. */
>  #define V4L2_PIX_FMT_PRIV_MAGIC		0xfeedcafe
>  
> diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp
> index 20aedfa6d925..ed6f7d62a7a3 100644
> --- a/src/libcamera/bayer_format.cpp
> +++ b/src/libcamera/bayer_format.cpp
> @@ -164,6 +164,14 @@ const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{
>  		{ formats::SGRBG16, V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16) } },
>  	{ { BayerFormat::RGGB, 16, BayerFormat::Packing::None },
>  		{ formats::SRGGB16, V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) } },
> +	{ { BayerFormat::BGGR, 16, BayerFormat::Packing::PISP1 },
> +		{ formats::BGGR_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR) } },
> +	{ { BayerFormat::GBRG, 16, BayerFormat::Packing::PISP1 },
> +		{ formats::GBRG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG) } },
> +	{ { BayerFormat::GRBG, 16, BayerFormat::Packing::PISP1 },
> +		{ formats::GRBG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG) } },
> +	{ { BayerFormat::RGGB, 16, BayerFormat::Packing::PISP1 },
> +		{ formats::RGGB_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB) } },
>  	{ { BayerFormat::MONO, 8, BayerFormat::Packing::None },
>  		{ formats::R8, V4L2PixelFormat(V4L2_PIX_FMT_GREY) } },
>  	{ { BayerFormat::MONO, 10, BayerFormat::Packing::None },
> @@ -174,6 +182,8 @@ const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{
>  		{ formats::R12, V4L2PixelFormat(V4L2_PIX_FMT_Y12) } },
>  	{ { BayerFormat::MONO, 16, BayerFormat::Packing::None },
>  		{ formats::R16, V4L2PixelFormat(V4L2_PIX_FMT_Y16) } },
> +	{ { BayerFormat::MONO, 16, BayerFormat::Packing::PISP1 },
> +		{ formats::MONO_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO) } },
>  };
>  
>  const std::unordered_map<unsigned int, BayerFormat> mbusCodeToBayer{
> @@ -303,6 +313,10 @@ std::ostream &operator<<(std::ostream &out, const BayerFormat &f)
>  		out << "-CSI2P";
>  	else if (f.packing == BayerFormat::Packing::IPU3)
>  		out << "-IPU3P";
> +	else if (f.packing == BayerFormat::Packing::PISP1)
> +		out << "-PISP1";
> +	else if (f.packing == BayerFormat::Packing::PISP2)
> +		out << "-PISP2";
>  
>  	return out;
>  }
> diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
> index 21a7719e84c4..2e2c33075fab 100644
> --- a/src/libcamera/formats.cpp
> +++ b/src/libcamera/formats.cpp
> @@ -547,6 +547,16 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  		.pixelsPerGroup = 1,
>  		.planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
>  	} },
> +	{ formats::MONO_PISP_COMP1, {
> +		.name = "MONO_PISP_COMP1",
> +		.format = formats::MONO_PISP_COMP1,
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO), },
> +		.bitsPerPixel = 8,
> +		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
> +		.packed = true,
> +		.pixelsPerGroup = 1,
> +		.planes = {{ { 1, 1 }, { 0, 0 }, { 0, 0 } }},
> +	} },
>  
>  	/* Bayer formats. */
>  	{ formats::SBGGR8, {
> @@ -910,7 +920,46 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  		.pixelsPerGroup = 25,
>  		.planes = {{ { 32, 1 }, { 0, 0 }, { 0, 0 } }},
>  	} },
> -
> +	{ formats::BGGR_PISP_COMP1, {
> +		.name = "BGGR_PISP_COMP1",
> +		.format = formats::BGGR_PISP_COMP1,
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR), },
> +		.bitsPerPixel = 8,
> +		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
> +		.packed = true,
> +		.pixelsPerGroup = 2,
> +		.planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
> +	} },
> +	{ formats::GBRG_PISP_COMP1, {
> +		.name = "GBRG_PISP_COMP1",
> +		.format = formats::GBRG_PISP_COMP1,
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG), },
> +		.bitsPerPixel = 8,
> +		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
> +		.packed = true,
> +		.pixelsPerGroup = 2,
> +		.planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
> +	} },
> +	{ formats::GRBG_PISP_COMP1, {
> +		.name = "GRBG_PISP_COMP1",
> +		.format = formats::GRBG_PISP_COMP1,
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG), },
> +		.bitsPerPixel = 8,
> +		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
> +		.packed = true,
> +		.pixelsPerGroup = 2,
> +		.planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
> +	} },
> +	{ formats::RGGB_PISP_COMP1, {
> +		.name = "RGGB_PISP_COMP1",
> +		.format = formats::RGGB_PISP_COMP1,
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB), },
> +		.bitsPerPixel = 8,
> +		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
> +		.packed = true,
> +		.pixelsPerGroup = 2,
> +		.planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
> +	} },
>  	/* Compressed formats. */
>  	{ formats::MJPEG, {
>  		.name = "MJPEG",
> diff --git a/src/libcamera/formats.yaml b/src/libcamera/formats.yaml
> index bde2cc803b98..fe027a7cce70 100644
> --- a/src/libcamera/formats.yaml
> +++ b/src/libcamera/formats.yaml
> @@ -190,4 +190,20 @@ formats:
>    - SBGGR10_IPU3:
>        fourcc: DRM_FORMAT_SBGGR10
>        mod: IPU3_FORMAT_MOD_PACKED
> +
> +  - RGGB_PISP_COMP1:
> +      fourcc: DRM_FORMAT_SRGGB16
> +      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
> +  - GRBG_PISP_COMP1:
> +      fourcc: DRM_FORMAT_SGRBG16
> +      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
> +  - GBRG_PISP_COMP1:
> +      fourcc: DRM_FORMAT_SGBRG16
> +      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
> +  - BGGR_PISP_COMP1:
> +      fourcc: DRM_FORMAT_SBGGR16
> +      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
> +  - MONO_PISP_COMP1:
> +      fourcc: DRM_FORMAT_R16
> +      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
>  ...
> diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp
> index efb6f2940235..977ae5834017 100644
> --- a/src/libcamera/v4l2_pixelformat.cpp
> +++ b/src/libcamera/v4l2_pixelformat.cpp
> @@ -207,6 +207,16 @@ const std::map<V4L2PixelFormat, V4L2PixelFormat::Info> vpf2pf{
>  		{ formats::SGRBG16, "16-bit Bayer GRGR/BGBG" } },
>  	{ V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16),
>  		{ formats::SRGGB16, "16-bit Bayer RGRG/GBGB" } },
> +	{ V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR),
> +		{ formats::BGGR_PISP_COMP1, "16-bit Bayer BGBG/GRGR PiSP Compress Mode 1" } },
> +	{ V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG),
> +		{ formats::GBRG_PISP_COMP1, "16-bit Bayer GBGB/RGRG PiSP Compress Mode 1" } },
> +	{ V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG),
> +		{ formats::GRBG_PISP_COMP1, "16-bit Bayer GRGR/BGBG PiSP Compress Mode 1" } },
> +	{ V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB),
> +		{ formats::RGGB_PISP_COMP1, "16-bit Bayer RGRG/GBGB PiSP Compress Mode 1" } },
> +	{ V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO),
> +		{ formats::MONO_PISP_COMP1, "16-bit Mono PiSP Compress Mode 1" } },
>  
>  	/* Compressed formats. */
>  	{ V4L2PixelFormat(V4L2_PIX_FMT_MJPEG),
Naushir Patuck May 10, 2024, 7:39 a.m. UTC | #2
Hi Laurent,

Thank you for the feedback.

On Thu, 9 May 2024 at 12:29, Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
>
> Hi Naush,
>
> Thank you for the patch.
>
> On Wed, May 08, 2024 at 09:03:57AM +0100, Naushir Patuck wrote:
> > Add the Raspberry Pi 5 PiSP specific verification format:
> > - V4L2_PIX_FMT_RPI_BE
> >
> > Add the Raspberry Pi 5 PiSP specific compressed Bayer format types 1/2:
> > - V4L2_PIX_FMT_PISP_COMP1_xxx
> > - V4L2_PIX_FMT_PISP_COMP2_xxx
> >
> > Add the Raspberry Pi 5 PiSP Frontend and Backend config formats:
> > - V4L2_META_FMT_RPI_FE_CFG
> > - V4L2_META_FMT_RPI_BE_CFG
> >
> > Add the Raspberry Pi 5 PiSP Frontend statistics format:
> > - V4L2_META_FMT_RPI_FE_STATS
> >
> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
> > Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
> > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> > ---
> >  include/libcamera/internal/bayer_format.h |  2 +
> >  include/linux/drm_fourcc.h                |  5 +++
> >  include/linux/videodev2.h                 | 21 ++++++++++
>
> As for 1/6, it would be nice to split changes to kernel headers to a
> separate patch. The commit message should indicate where the changes
> come from (name of the patch series and links to lore.kernel.org is
> likely the best option). It's absolutely fine to merge kernel header
> changes that are not in upstream yet, but I want to track their origin
> to avoid maintenance headaches later. You can even split this in one
> patch per series submitted upstream.

Ack, I'll split this and do the same for patch 1/6.

>
> >  src/libcamera/bayer_format.cpp            | 14 +++++++
> >  src/libcamera/formats.cpp                 | 51 ++++++++++++++++++++++-
> >  src/libcamera/formats.yaml                | 16 +++++++
> >  src/libcamera/v4l2_pixelformat.cpp        | 10 +++++
> >  7 files changed, 118 insertions(+), 1 deletion(-)
> >
> > diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h
> > index 78ba3969913d..164743f7e9f6 100644
> > --- a/include/libcamera/internal/bayer_format.h
> > +++ b/include/libcamera/internal/bayer_format.h
> > @@ -34,6 +34,8 @@ public:
> >               None = 0,
> >               CSI2 = 1,
> >               IPU3 = 2,
> > +             PISP1 = 3,
> > +             PISP2 = 4,
>
> Missing documentation in bayer_format.cpp.

Ack.

>
> >       };
> >
> >       constexpr BayerFormat()
> > diff --git a/include/linux/drm_fourcc.h b/include/linux/drm_fourcc.h
> > index 5133a6551a34..927095c4e0df 100644
> > --- a/include/linux/drm_fourcc.h
> > +++ b/include/linux/drm_fourcc.h
> > @@ -490,6 +490,7 @@ extern "C" {
> >  #define DRM_FORMAT_MOD_VENDOR_ALLWINNER 0x09
> >  #define DRM_FORMAT_MOD_VENDOR_AMLOGIC 0x0a
> >  #define DRM_FORMAT_MOD_VENDOR_MIPI 0x0b
> > +#define DRM_FORMAT_MOD_VENDOR_RPI 0x0c
> >
> >  /* add more to the end as needed */
> >
> > @@ -1670,6 +1671,10 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
> >   */
> >  #define MIPI_FORMAT_MOD_CSI2_PACKED fourcc_mod_code(MIPI, 1)
> >
> > +#define PISP_FORMAT_MOD_COMPRESS_MODE1 fourcc_mod_code(RPI, 1)
> > +#define PISP_FORMAT_MOD_COMPRESS_MODE2 fourcc_mod_code(RPI, 2)
> > +#define PISP_FORMAT_MOD_VERIFICATION fourcc_mod_code(RPI, 3)
>
> Just checking, given that you only define PISP1 and PISP2 in
> BayerFormat::Packing, will this one be used ?

No we won't, and actually we agreed earlier to remove
PISP_FORMAT_MOD_VERIFICATION, so that should go now!

>
> > +
> >  #if defined(__cplusplus)
> >  }
> >  #endif
> > diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
> > index 4fdd91494041..0b5482a07ae4 100644
> > --- a/include/linux/videodev2.h
> > +++ b/include/linux/videodev2.h
> > @@ -787,6 +787,18 @@ struct v4l2_pix_format {
> >  #define V4L2_PIX_FMT_IPU3_SGRBG10    v4l2_fourcc('i', 'p', '3', 'G') /* IPU3 packed 10-bit GRBG bayer */
> >  #define V4L2_PIX_FMT_IPU3_SRGGB10    v4l2_fourcc('i', 'p', '3', 'r') /* IPU3 packed 10-bit RGGB bayer */
> >
> > +/* Raspberry Pi PiSP compressed formats. */
> > +#define V4L2_PIX_FMT_PISP_COMP1_RGGB v4l2_fourcc('P', 'C', '1', 'R') /* PiSP 8-bit mode 1 compressed RGGB bayer */
> > +#define V4L2_PIX_FMT_PISP_COMP1_GRBG v4l2_fourcc('P', 'C', '1', 'G') /* PiSP 8-bit mode 1 compressed GRBG bayer */
> > +#define V4L2_PIX_FMT_PISP_COMP1_GBRG v4l2_fourcc('P', 'C', '1', 'g') /* PiSP 8-bit mode 1 compressed GBRG bayer */
> > +#define V4L2_PIX_FMT_PISP_COMP1_BGGR v4l2_fourcc('P', 'C', '1', 'B') /* PiSP 8-bit mode 1 compressed BGGR bayer */
> > +#define V4L2_PIX_FMT_PISP_COMP1_MONO v4l2_fourcc('P', 'C', '1', 'M') /* PiSP 8-bit mode 1 compressed monochrome */
> > +#define V4L2_PIX_FMT_PISP_COMP2_RGGB v4l2_fourcc('P', 'C', '2', 'R') /* PiSP 8-bit mode 2 compressed RGGB bayer */
> > +#define V4L2_PIX_FMT_PISP_COMP2_GRBG v4l2_fourcc('P', 'C', '2', 'G') /* PiSP 8-bit mode 2 compressed GRBG bayer */
> > +#define V4L2_PIX_FMT_PISP_COMP2_GBRG v4l2_fourcc('P', 'C', '2', 'g') /* PiSP 8-bit mode 2 compressed GBRG bayer */
> > +#define V4L2_PIX_FMT_PISP_COMP2_BGGR v4l2_fourcc('P', 'C', '2', 'B') /* PiSP 8-bit mode 2 compressed BGGR bayer */
> > +#define V4L2_PIX_FMT_PISP_COMP2_MONO v4l2_fourcc('P', 'C', '2', 'M') /* PiSP 8-bit mode 2 compressed monochrome */
>
> The COMP2 formats are not used below. Do you plan to use them later ?

They are part of the uapi that we upstreamed, but I don't expect to
ever use them from within libcamera, so I did not include them below.

Thanks,
Naush

>
> > +
> >  /* SDR formats - used only for Software Defined Radio devices */
> >  #define V4L2_SDR_FMT_CU8          v4l2_fourcc('C', 'U', '0', '8') /* IQ u8 */
> >  #define V4L2_SDR_FMT_CU16LE       v4l2_fourcc('C', 'U', '1', '6') /* IQ u16le */
> > @@ -816,6 +828,15 @@ 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 */
> >
> > +/* The metadata format identifier for BE configuration buffers. */
> > +#define V4L2_META_FMT_RPI_BE_CFG v4l2_fourcc('R', 'P', 'B', 'C')
> > +
> > +/* The metadata format identifier for FE configuration buffers. */
> > +#define V4L2_META_FMT_RPI_FE_CFG v4l2_fourcc('R', 'P', 'F', 'C')
> > +
> > +/* The metadata format identifier for FE stats buffers. */
> > +#define V4L2_META_FMT_RPI_FE_STATS v4l2_fourcc('R', 'P', 'F', 'S')
> > +
> >  /* priv field value to indicates that subsequent fields are valid. */
> >  #define V4L2_PIX_FMT_PRIV_MAGIC              0xfeedcafe
> >
> > diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp
> > index 20aedfa6d925..ed6f7d62a7a3 100644
> > --- a/src/libcamera/bayer_format.cpp
> > +++ b/src/libcamera/bayer_format.cpp
> > @@ -164,6 +164,14 @@ const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{
> >               { formats::SGRBG16, V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16) } },
> >       { { BayerFormat::RGGB, 16, BayerFormat::Packing::None },
> >               { formats::SRGGB16, V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) } },
> > +     { { BayerFormat::BGGR, 16, BayerFormat::Packing::PISP1 },
> > +             { formats::BGGR_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR) } },
> > +     { { BayerFormat::GBRG, 16, BayerFormat::Packing::PISP1 },
> > +             { formats::GBRG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG) } },
> > +     { { BayerFormat::GRBG, 16, BayerFormat::Packing::PISP1 },
> > +             { formats::GRBG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG) } },
> > +     { { BayerFormat::RGGB, 16, BayerFormat::Packing::PISP1 },
> > +             { formats::RGGB_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB) } },
> >       { { BayerFormat::MONO, 8, BayerFormat::Packing::None },
> >               { formats::R8, V4L2PixelFormat(V4L2_PIX_FMT_GREY) } },
> >       { { BayerFormat::MONO, 10, BayerFormat::Packing::None },
> > @@ -174,6 +182,8 @@ const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{
> >               { formats::R12, V4L2PixelFormat(V4L2_PIX_FMT_Y12) } },
> >       { { BayerFormat::MONO, 16, BayerFormat::Packing::None },
> >               { formats::R16, V4L2PixelFormat(V4L2_PIX_FMT_Y16) } },
> > +     { { BayerFormat::MONO, 16, BayerFormat::Packing::PISP1 },
> > +             { formats::MONO_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO) } },
> >  };
> >
> >  const std::unordered_map<unsigned int, BayerFormat> mbusCodeToBayer{
> > @@ -303,6 +313,10 @@ std::ostream &operator<<(std::ostream &out, const BayerFormat &f)
> >               out << "-CSI2P";
> >       else if (f.packing == BayerFormat::Packing::IPU3)
> >               out << "-IPU3P";
> > +     else if (f.packing == BayerFormat::Packing::PISP1)
> > +             out << "-PISP1";
> > +     else if (f.packing == BayerFormat::Packing::PISP2)
> > +             out << "-PISP2";
> >
> >       return out;
> >  }
> > diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
> > index 21a7719e84c4..2e2c33075fab 100644
> > --- a/src/libcamera/formats.cpp
> > +++ b/src/libcamera/formats.cpp
> > @@ -547,6 +547,16 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
> >               .pixelsPerGroup = 1,
> >               .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
> >       } },
> > +     { formats::MONO_PISP_COMP1, {
> > +             .name = "MONO_PISP_COMP1",
> > +             .format = formats::MONO_PISP_COMP1,
> > +             .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO), },
> > +             .bitsPerPixel = 8,
> > +             .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
> > +             .packed = true,
> > +             .pixelsPerGroup = 1,
> > +             .planes = {{ { 1, 1 }, { 0, 0 }, { 0, 0 } }},
> > +     } },
> >
> >       /* Bayer formats. */
> >       { formats::SBGGR8, {
> > @@ -910,7 +920,46 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
> >               .pixelsPerGroup = 25,
> >               .planes = {{ { 32, 1 }, { 0, 0 }, { 0, 0 } }},
> >       } },
> > -
> > +     { formats::BGGR_PISP_COMP1, {
> > +             .name = "BGGR_PISP_COMP1",
> > +             .format = formats::BGGR_PISP_COMP1,
> > +             .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR), },
> > +             .bitsPerPixel = 8,
> > +             .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
> > +             .packed = true,
> > +             .pixelsPerGroup = 2,
> > +             .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
> > +     } },
> > +     { formats::GBRG_PISP_COMP1, {
> > +             .name = "GBRG_PISP_COMP1",
> > +             .format = formats::GBRG_PISP_COMP1,
> > +             .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG), },
> > +             .bitsPerPixel = 8,
> > +             .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
> > +             .packed = true,
> > +             .pixelsPerGroup = 2,
> > +             .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
> > +     } },
> > +     { formats::GRBG_PISP_COMP1, {
> > +             .name = "GRBG_PISP_COMP1",
> > +             .format = formats::GRBG_PISP_COMP1,
> > +             .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG), },
> > +             .bitsPerPixel = 8,
> > +             .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
> > +             .packed = true,
> > +             .pixelsPerGroup = 2,
> > +             .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
> > +     } },
> > +     { formats::RGGB_PISP_COMP1, {
> > +             .name = "RGGB_PISP_COMP1",
> > +             .format = formats::RGGB_PISP_COMP1,
> > +             .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB), },
> > +             .bitsPerPixel = 8,
> > +             .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
> > +             .packed = true,
> > +             .pixelsPerGroup = 2,
> > +             .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
> > +     } },
> >       /* Compressed formats. */
> >       { formats::MJPEG, {
> >               .name = "MJPEG",
> > diff --git a/src/libcamera/formats.yaml b/src/libcamera/formats.yaml
> > index bde2cc803b98..fe027a7cce70 100644
> > --- a/src/libcamera/formats.yaml
> > +++ b/src/libcamera/formats.yaml
> > @@ -190,4 +190,20 @@ formats:
> >    - SBGGR10_IPU3:
> >        fourcc: DRM_FORMAT_SBGGR10
> >        mod: IPU3_FORMAT_MOD_PACKED
> > +
> > +  - RGGB_PISP_COMP1:
> > +      fourcc: DRM_FORMAT_SRGGB16
> > +      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
> > +  - GRBG_PISP_COMP1:
> > +      fourcc: DRM_FORMAT_SGRBG16
> > +      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
> > +  - GBRG_PISP_COMP1:
> > +      fourcc: DRM_FORMAT_SGBRG16
> > +      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
> > +  - BGGR_PISP_COMP1:
> > +      fourcc: DRM_FORMAT_SBGGR16
> > +      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
> > +  - MONO_PISP_COMP1:
> > +      fourcc: DRM_FORMAT_R16
> > +      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
> >  ...
> > diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp
> > index efb6f2940235..977ae5834017 100644
> > --- a/src/libcamera/v4l2_pixelformat.cpp
> > +++ b/src/libcamera/v4l2_pixelformat.cpp
> > @@ -207,6 +207,16 @@ const std::map<V4L2PixelFormat, V4L2PixelFormat::Info> vpf2pf{
> >               { formats::SGRBG16, "16-bit Bayer GRGR/BGBG" } },
> >       { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16),
> >               { formats::SRGGB16, "16-bit Bayer RGRG/GBGB" } },
> > +     { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR),
> > +             { formats::BGGR_PISP_COMP1, "16-bit Bayer BGBG/GRGR PiSP Compress Mode 1" } },
> > +     { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG),
> > +             { formats::GBRG_PISP_COMP1, "16-bit Bayer GBGB/RGRG PiSP Compress Mode 1" } },
> > +     { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG),
> > +             { formats::GRBG_PISP_COMP1, "16-bit Bayer GRGR/BGBG PiSP Compress Mode 1" } },
> > +     { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB),
> > +             { formats::RGGB_PISP_COMP1, "16-bit Bayer RGRG/GBGB PiSP Compress Mode 1" } },
> > +     { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO),
> > +             { formats::MONO_PISP_COMP1, "16-bit Mono PiSP Compress Mode 1" } },
> >
> >       /* Compressed formats. */
> >       { V4L2PixelFormat(V4L2_PIX_FMT_MJPEG),
>
> --
> Regards,
>
> Laurent Pinchart

Patch
diff mbox series

diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h
index 78ba3969913d..164743f7e9f6 100644
--- a/include/libcamera/internal/bayer_format.h
+++ b/include/libcamera/internal/bayer_format.h
@@ -34,6 +34,8 @@  public:
 		None = 0,
 		CSI2 = 1,
 		IPU3 = 2,
+		PISP1 = 3,
+		PISP2 = 4,
 	};
 
 	constexpr BayerFormat()
diff --git a/include/linux/drm_fourcc.h b/include/linux/drm_fourcc.h
index 5133a6551a34..927095c4e0df 100644
--- a/include/linux/drm_fourcc.h
+++ b/include/linux/drm_fourcc.h
@@ -490,6 +490,7 @@  extern "C" {
 #define DRM_FORMAT_MOD_VENDOR_ALLWINNER 0x09
 #define DRM_FORMAT_MOD_VENDOR_AMLOGIC 0x0a
 #define DRM_FORMAT_MOD_VENDOR_MIPI 0x0b
+#define DRM_FORMAT_MOD_VENDOR_RPI 0x0c
 
 /* add more to the end as needed */
 
@@ -1670,6 +1671,10 @@  drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
  */
 #define MIPI_FORMAT_MOD_CSI2_PACKED fourcc_mod_code(MIPI, 1)
 
+#define PISP_FORMAT_MOD_COMPRESS_MODE1 fourcc_mod_code(RPI, 1)
+#define PISP_FORMAT_MOD_COMPRESS_MODE2 fourcc_mod_code(RPI, 2)
+#define PISP_FORMAT_MOD_VERIFICATION fourcc_mod_code(RPI, 3)
+
 #if defined(__cplusplus)
 }
 #endif
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
index 4fdd91494041..0b5482a07ae4 100644
--- a/include/linux/videodev2.h
+++ b/include/linux/videodev2.h
@@ -787,6 +787,18 @@  struct v4l2_pix_format {
 #define V4L2_PIX_FMT_IPU3_SGRBG10	v4l2_fourcc('i', 'p', '3', 'G') /* IPU3 packed 10-bit GRBG bayer */
 #define V4L2_PIX_FMT_IPU3_SRGGB10	v4l2_fourcc('i', 'p', '3', 'r') /* IPU3 packed 10-bit RGGB bayer */
 
+/* Raspberry Pi PiSP compressed formats. */
+#define V4L2_PIX_FMT_PISP_COMP1_RGGB	v4l2_fourcc('P', 'C', '1', 'R') /* PiSP 8-bit mode 1 compressed RGGB bayer */
+#define V4L2_PIX_FMT_PISP_COMP1_GRBG	v4l2_fourcc('P', 'C', '1', 'G') /* PiSP 8-bit mode 1 compressed GRBG bayer */
+#define V4L2_PIX_FMT_PISP_COMP1_GBRG	v4l2_fourcc('P', 'C', '1', 'g') /* PiSP 8-bit mode 1 compressed GBRG bayer */
+#define V4L2_PIX_FMT_PISP_COMP1_BGGR	v4l2_fourcc('P', 'C', '1', 'B') /* PiSP 8-bit mode 1 compressed BGGR bayer */
+#define V4L2_PIX_FMT_PISP_COMP1_MONO	v4l2_fourcc('P', 'C', '1', 'M') /* PiSP 8-bit mode 1 compressed monochrome */
+#define V4L2_PIX_FMT_PISP_COMP2_RGGB	v4l2_fourcc('P', 'C', '2', 'R') /* PiSP 8-bit mode 2 compressed RGGB bayer */
+#define V4L2_PIX_FMT_PISP_COMP2_GRBG	v4l2_fourcc('P', 'C', '2', 'G') /* PiSP 8-bit mode 2 compressed GRBG bayer */
+#define V4L2_PIX_FMT_PISP_COMP2_GBRG	v4l2_fourcc('P', 'C', '2', 'g') /* PiSP 8-bit mode 2 compressed GBRG bayer */
+#define V4L2_PIX_FMT_PISP_COMP2_BGGR	v4l2_fourcc('P', 'C', '2', 'B') /* PiSP 8-bit mode 2 compressed BGGR bayer */
+#define V4L2_PIX_FMT_PISP_COMP2_MONO	v4l2_fourcc('P', 'C', '2', 'M') /* PiSP 8-bit mode 2 compressed monochrome */
+
 /* SDR formats - used only for Software Defined Radio devices */
 #define V4L2_SDR_FMT_CU8          v4l2_fourcc('C', 'U', '0', '8') /* IQ u8 */
 #define V4L2_SDR_FMT_CU16LE       v4l2_fourcc('C', 'U', '1', '6') /* IQ u16le */
@@ -816,6 +828,15 @@  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 */
 
+/* The metadata format identifier for BE configuration buffers. */
+#define V4L2_META_FMT_RPI_BE_CFG v4l2_fourcc('R', 'P', 'B', 'C')
+
+/* The metadata format identifier for FE configuration buffers. */
+#define V4L2_META_FMT_RPI_FE_CFG v4l2_fourcc('R', 'P', 'F', 'C')
+
+/* The metadata format identifier for FE stats buffers. */
+#define V4L2_META_FMT_RPI_FE_STATS v4l2_fourcc('R', 'P', 'F', 'S')
+
 /* priv field value to indicates that subsequent fields are valid. */
 #define V4L2_PIX_FMT_PRIV_MAGIC		0xfeedcafe
 
diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp
index 20aedfa6d925..ed6f7d62a7a3 100644
--- a/src/libcamera/bayer_format.cpp
+++ b/src/libcamera/bayer_format.cpp
@@ -164,6 +164,14 @@  const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{
 		{ formats::SGRBG16, V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16) } },
 	{ { BayerFormat::RGGB, 16, BayerFormat::Packing::None },
 		{ formats::SRGGB16, V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) } },
+	{ { BayerFormat::BGGR, 16, BayerFormat::Packing::PISP1 },
+		{ formats::BGGR_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR) } },
+	{ { BayerFormat::GBRG, 16, BayerFormat::Packing::PISP1 },
+		{ formats::GBRG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG) } },
+	{ { BayerFormat::GRBG, 16, BayerFormat::Packing::PISP1 },
+		{ formats::GRBG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG) } },
+	{ { BayerFormat::RGGB, 16, BayerFormat::Packing::PISP1 },
+		{ formats::RGGB_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB) } },
 	{ { BayerFormat::MONO, 8, BayerFormat::Packing::None },
 		{ formats::R8, V4L2PixelFormat(V4L2_PIX_FMT_GREY) } },
 	{ { BayerFormat::MONO, 10, BayerFormat::Packing::None },
@@ -174,6 +182,8 @@  const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{
 		{ formats::R12, V4L2PixelFormat(V4L2_PIX_FMT_Y12) } },
 	{ { BayerFormat::MONO, 16, BayerFormat::Packing::None },
 		{ formats::R16, V4L2PixelFormat(V4L2_PIX_FMT_Y16) } },
+	{ { BayerFormat::MONO, 16, BayerFormat::Packing::PISP1 },
+		{ formats::MONO_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO) } },
 };
 
 const std::unordered_map<unsigned int, BayerFormat> mbusCodeToBayer{
@@ -303,6 +313,10 @@  std::ostream &operator<<(std::ostream &out, const BayerFormat &f)
 		out << "-CSI2P";
 	else if (f.packing == BayerFormat::Packing::IPU3)
 		out << "-IPU3P";
+	else if (f.packing == BayerFormat::Packing::PISP1)
+		out << "-PISP1";
+	else if (f.packing == BayerFormat::Packing::PISP2)
+		out << "-PISP2";
 
 	return out;
 }
diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
index 21a7719e84c4..2e2c33075fab 100644
--- a/src/libcamera/formats.cpp
+++ b/src/libcamera/formats.cpp
@@ -547,6 +547,16 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 		.pixelsPerGroup = 1,
 		.planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
 	} },
+	{ formats::MONO_PISP_COMP1, {
+		.name = "MONO_PISP_COMP1",
+		.format = formats::MONO_PISP_COMP1,
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO), },
+		.bitsPerPixel = 8,
+		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+		.packed = true,
+		.pixelsPerGroup = 1,
+		.planes = {{ { 1, 1 }, { 0, 0 }, { 0, 0 } }},
+	} },
 
 	/* Bayer formats. */
 	{ formats::SBGGR8, {
@@ -910,7 +920,46 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 		.pixelsPerGroup = 25,
 		.planes = {{ { 32, 1 }, { 0, 0 }, { 0, 0 } }},
 	} },
-
+	{ formats::BGGR_PISP_COMP1, {
+		.name = "BGGR_PISP_COMP1",
+		.format = formats::BGGR_PISP_COMP1,
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR), },
+		.bitsPerPixel = 8,
+		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+		.packed = true,
+		.pixelsPerGroup = 2,
+		.planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
+	} },
+	{ formats::GBRG_PISP_COMP1, {
+		.name = "GBRG_PISP_COMP1",
+		.format = formats::GBRG_PISP_COMP1,
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG), },
+		.bitsPerPixel = 8,
+		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+		.packed = true,
+		.pixelsPerGroup = 2,
+		.planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
+	} },
+	{ formats::GRBG_PISP_COMP1, {
+		.name = "GRBG_PISP_COMP1",
+		.format = formats::GRBG_PISP_COMP1,
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG), },
+		.bitsPerPixel = 8,
+		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+		.packed = true,
+		.pixelsPerGroup = 2,
+		.planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
+	} },
+	{ formats::RGGB_PISP_COMP1, {
+		.name = "RGGB_PISP_COMP1",
+		.format = formats::RGGB_PISP_COMP1,
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB), },
+		.bitsPerPixel = 8,
+		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+		.packed = true,
+		.pixelsPerGroup = 2,
+		.planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }},
+	} },
 	/* Compressed formats. */
 	{ formats::MJPEG, {
 		.name = "MJPEG",
diff --git a/src/libcamera/formats.yaml b/src/libcamera/formats.yaml
index bde2cc803b98..fe027a7cce70 100644
--- a/src/libcamera/formats.yaml
+++ b/src/libcamera/formats.yaml
@@ -190,4 +190,20 @@  formats:
   - SBGGR10_IPU3:
       fourcc: DRM_FORMAT_SBGGR10
       mod: IPU3_FORMAT_MOD_PACKED
+
+  - RGGB_PISP_COMP1:
+      fourcc: DRM_FORMAT_SRGGB16
+      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
+  - GRBG_PISP_COMP1:
+      fourcc: DRM_FORMAT_SGRBG16
+      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
+  - GBRG_PISP_COMP1:
+      fourcc: DRM_FORMAT_SGBRG16
+      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
+  - BGGR_PISP_COMP1:
+      fourcc: DRM_FORMAT_SBGGR16
+      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
+  - MONO_PISP_COMP1:
+      fourcc: DRM_FORMAT_R16
+      mod: PISP_FORMAT_MOD_COMPRESS_MODE1
 ...
diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp
index efb6f2940235..977ae5834017 100644
--- a/src/libcamera/v4l2_pixelformat.cpp
+++ b/src/libcamera/v4l2_pixelformat.cpp
@@ -207,6 +207,16 @@  const std::map<V4L2PixelFormat, V4L2PixelFormat::Info> vpf2pf{
 		{ formats::SGRBG16, "16-bit Bayer GRGR/BGBG" } },
 	{ V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16),
 		{ formats::SRGGB16, "16-bit Bayer RGRG/GBGB" } },
+	{ V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR),
+		{ formats::BGGR_PISP_COMP1, "16-bit Bayer BGBG/GRGR PiSP Compress Mode 1" } },
+	{ V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG),
+		{ formats::GBRG_PISP_COMP1, "16-bit Bayer GBGB/RGRG PiSP Compress Mode 1" } },
+	{ V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG),
+		{ formats::GRBG_PISP_COMP1, "16-bit Bayer GRGR/BGBG PiSP Compress Mode 1" } },
+	{ V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB),
+		{ formats::RGGB_PISP_COMP1, "16-bit Bayer RGRG/GBGB PiSP Compress Mode 1" } },
+	{ V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO),
+		{ formats::MONO_PISP_COMP1, "16-bit Mono PiSP Compress Mode 1" } },
 
 	/* Compressed formats. */
 	{ V4L2PixelFormat(V4L2_PIX_FMT_MJPEG),