root/drivers/media/platform/raspberrypi/pisp_be/pisp_be_formats.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * PiSP Back End driver image format definitions.
 *
 * Copyright (c) 2021-2024 Raspberry Pi Ltd
 */

#ifndef _PISP_BE_FORMATS_
#define _PISP_BE_FORMATS_

#include <linux/bits.h>
#include <linux/videodev2.h>

#define PISPBE_MAX_PLANES       3
#define P3(x)                   ((x) * 8)

struct pisp_be_format {
        unsigned int fourcc;
        unsigned int align;
        unsigned int bit_depth;
        /* 0P3 factor for plane sizing */
        unsigned int plane_factor[PISPBE_MAX_PLANES];
        unsigned int num_planes;
        unsigned int colorspace_mask;
        enum v4l2_colorspace colorspace_default;
};

#define V4L2_COLORSPACE_MASK(colorspace) BIT(colorspace)

#define V4L2_COLORSPACE_MASK_JPEG       \
        V4L2_COLORSPACE_MASK(V4L2_COLORSPACE_JPEG)
#define V4L2_COLORSPACE_MASK_SMPTE170M  \
        V4L2_COLORSPACE_MASK(V4L2_COLORSPACE_SMPTE170M)
#define V4L2_COLORSPACE_MASK_REC709     \
        V4L2_COLORSPACE_MASK(V4L2_COLORSPACE_REC709)
#define V4L2_COLORSPACE_MASK_SRGB       \
        V4L2_COLORSPACE_MASK(V4L2_COLORSPACE_SRGB)
#define V4L2_COLORSPACE_MASK_RAW        \
        V4L2_COLORSPACE_MASK(V4L2_COLORSPACE_RAW)

/*
 * All three colour spaces SRGB, SMPTE170M and REC709 are fundamentally sRGB
 * underneath (as near as makes no difference to us), just with different YCbCr
 * encodings. Therefore the ISP can generate sRGB on its main output and any of
 * the others on its low resolution output. Applications should, when using both
 * outputs, program the colour spaces on them to be the same, matching whatever
 * is requested for the low resolution output, even if the main output is
 * producing an RGB format. In turn this requires us to allow all these colour
 * spaces for every YUV/RGB output format.
 */
#define V4L2_COLORSPACE_MASK_ALL_SRGB (V4L2_COLORSPACE_MASK_JPEG        | \
                                       V4L2_COLORSPACE_MASK_SRGB        | \
                                       V4L2_COLORSPACE_MASK_SMPTE170M   | \
                                       V4L2_COLORSPACE_MASK_REC709)

static const struct pisp_be_format supported_formats[] = {
        /* Single plane YUV formats */
        {
                .fourcc             = V4L2_PIX_FMT_YUV420,
                /* 128 alignment to ensure U/V planes are 64 byte aligned. */
                .align              = 128,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(0.25), P3(0.25) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_YVU420,
                /* 128 alignment to ensure U/V planes are 64 byte aligned. */
                .align              = 128,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(0.25), P3(0.25) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_NV12,
                .align              = 32,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(0.5) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_NV21,
                .align              = 32,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(0.5) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_YUYV,
                .align              = 64,
                .bit_depth          = 16,
                .plane_factor       = { P3(1) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_UYVY,
                .align              = 64,
                .bit_depth          = 16,
                .plane_factor       = { P3(1) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_YVYU,
                .align              = 64,
                .bit_depth          = 16,
                .plane_factor       = { P3(1) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_VYUY,
                .align              = 64,
                .bit_depth          = 16,
                .plane_factor       = { P3(1) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        /* Multiplane YUV formats */
        {
                .fourcc             = V4L2_PIX_FMT_YUV420M,
                .align              = 64,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(0.25), P3(0.25) },
                .num_planes         = 3,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_NV12M,
                .align              = 32,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(0.5) },
                .num_planes         = 2,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_NV21M,
                .align              = 32,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(0.5) },
                .num_planes         = 2,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_YVU420M,
                .align              = 64,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(0.25), P3(0.25) },
                .num_planes         = 3,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_YUV422M,
                .align              = 64,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(0.5), P3(0.5) },
                .num_planes         = 3,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_YVU422M,
                .align              = 64,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(0.5), P3(0.5) },
                .num_planes         = 3,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_YUV444M,
                .align              = 64,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(1), P3(1) },
                .num_planes         = 3,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        {
                .fourcc             = V4L2_PIX_FMT_YVU444M,
                .align              = 64,
                .bit_depth          = 8,
                .plane_factor       = { P3(1), P3(1), P3(1) },
                .num_planes         = 3,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SMPTE170M,
        },
        /* RGB formats */
        {
                .fourcc             = V4L2_PIX_FMT_RGB24,
                .align              = 32,
                .bit_depth          = 24,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SRGB,
        },
        {
                .fourcc             = V4L2_PIX_FMT_BGR24,
                .align              = 32,
                .bit_depth          = 24,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SRGB,
        },
        {
                .fourcc             = V4L2_PIX_FMT_XBGR32,
                .align              = 64,
                .bit_depth          = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SRGB,
        },
        {
                .fourcc             = V4L2_PIX_FMT_RGBX32,
                .align              = 64,
                .bit_depth          = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SRGB,
        },
        {
                .fourcc             = V4L2_PIX_FMT_RGB48,
                .align              = 64,
                .bit_depth          = 48,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SRGB,
        },
        {
                .fourcc             = V4L2_PIX_FMT_BGR48,
                .align              = 64,
                .bit_depth          = 48,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_ALL_SRGB,
                .colorspace_default = V4L2_COLORSPACE_SRGB,
        },
        /* Bayer formats - 8-bit */
        {
                .fourcc             = V4L2_PIX_FMT_SRGGB8,
                .bit_depth          = 8,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SBGGR8,
                .bit_depth          = 8,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SGRBG8,
                .bit_depth          = 8,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SGBRG8,
                .bit_depth          = 8,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        /* Bayer formats - 16-bit */
        {
                .fourcc             = V4L2_PIX_FMT_SRGGB16,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SBGGR16,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SGRBG16,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SGBRG16,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                /* Bayer formats unpacked to 16bpp */
                /* 10 bit */
                .fourcc             = V4L2_PIX_FMT_SRGGB10,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SBGGR10,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SGRBG10,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SGBRG10,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                /* 12 bit */
                .fourcc             = V4L2_PIX_FMT_SRGGB12,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SBGGR12,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SGRBG12,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SGBRG12,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                /* 14 bit */
                .fourcc             = V4L2_PIX_FMT_SRGGB14,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SBGGR14,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SGRBG14,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_SGBRG14,
                .bit_depth          = 16,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        /* Bayer formats - 16-bit PiSP Compressed */
        {
                .fourcc             = V4L2_PIX_FMT_PISP_COMP1_BGGR,
                .bit_depth          = 8,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_PISP_COMP1_RGGB,
                .bit_depth          = 8,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_PISP_COMP1_GRBG,
                .bit_depth          = 8,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc             = V4L2_PIX_FMT_PISP_COMP1_GBRG,
                .bit_depth          = 8,
                .align              = 32,
                .plane_factor       = { P3(1.0) },
                .num_planes         = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        /* Greyscale Formats */
        {
                .fourcc         = V4L2_PIX_FMT_GREY,
                .bit_depth      = 8,
                .align          = 32,
                .num_planes     = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc         = V4L2_PIX_FMT_Y16,
                .bit_depth      = 16,
                .align          = 32,
                .plane_factor   = { P3(1.0) },
                .num_planes     = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
        {
                .fourcc         = V4L2_PIX_FMT_PISP_COMP1_MONO,
                .bit_depth      = 8,
                .align          = 32,
                .plane_factor   = { P3(1.0) },
                .num_planes     = 1,
                .colorspace_mask    = V4L2_COLORSPACE_MASK_RAW,
                .colorspace_default = V4L2_COLORSPACE_RAW,
        },
};

static const struct pisp_be_format meta_out_supported_formats[] = {
        /* Configuration buffer format. */
        {
                .fourcc             = V4L2_META_FMT_RPI_BE_CFG,
        },
};

#endif /* _PISP_BE_FORMATS_ */