1c6c49bacSJacopo Mondi /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ 2c6c49bacSJacopo Mondi /* 3c6c49bacSJacopo Mondi * RP1 PiSP common definitions. 4c6c49bacSJacopo Mondi * 5c6c49bacSJacopo Mondi * Copyright (C) 2021 - Raspberry Pi Ltd. 6c6c49bacSJacopo Mondi * 7c6c49bacSJacopo Mondi */ 8c6c49bacSJacopo Mondi #ifndef _UAPI_PISP_COMMON_H_ 9c6c49bacSJacopo Mondi #define _UAPI_PISP_COMMON_H_ 10c6c49bacSJacopo Mondi 11c6c49bacSJacopo Mondi #include <linux/types.h> 12c6c49bacSJacopo Mondi 13c6c49bacSJacopo Mondi struct pisp_image_format_config { 14c6c49bacSJacopo Mondi /* size in pixels */ 15c6c49bacSJacopo Mondi __u16 width; 16c6c49bacSJacopo Mondi __u16 height; 17c6c49bacSJacopo Mondi /* must match struct pisp_image_format below */ 18c6c49bacSJacopo Mondi __u32 format; 19c6c49bacSJacopo Mondi __s32 stride; 20c6c49bacSJacopo Mondi /* some planar image formats will need a second stride */ 21c6c49bacSJacopo Mondi __s32 stride2; 22c6c49bacSJacopo Mondi } __attribute__((packed)); 23c6c49bacSJacopo Mondi 24c6c49bacSJacopo Mondi enum pisp_bayer_order { 25c6c49bacSJacopo Mondi /* 26c6c49bacSJacopo Mondi * Note how bayer_order&1 tells you if G is on the even pixels of the 27c6c49bacSJacopo Mondi * checkerboard or not, and bayer_order&2 tells you if R is on the even 28c6c49bacSJacopo Mondi * rows or is swapped with B. Note that if the top (of the 8) bits is 29c6c49bacSJacopo Mondi * set, this denotes a monochrome or greyscale image, and the lower bits 30c6c49bacSJacopo Mondi * should all be ignored. 31c6c49bacSJacopo Mondi */ 32c6c49bacSJacopo Mondi PISP_BAYER_ORDER_RGGB = 0, 33c6c49bacSJacopo Mondi PISP_BAYER_ORDER_GBRG = 1, 34c6c49bacSJacopo Mondi PISP_BAYER_ORDER_BGGR = 2, 35c6c49bacSJacopo Mondi PISP_BAYER_ORDER_GRBG = 3, 36c6c49bacSJacopo Mondi PISP_BAYER_ORDER_GREYSCALE = 128 37c6c49bacSJacopo Mondi }; 38c6c49bacSJacopo Mondi 39c6c49bacSJacopo Mondi enum pisp_image_format { 40c6c49bacSJacopo Mondi /* 41c6c49bacSJacopo Mondi * Precise values are mostly tbd. Generally these will be portmanteau 42c6c49bacSJacopo Mondi * values comprising bit fields and flags. This format must be shared 43c6c49bacSJacopo Mondi * throughout the PiSP. 44c6c49bacSJacopo Mondi */ 45c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_BPS_8 = 0x00000000, 46c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_BPS_10 = 0x00000001, 47c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_BPS_12 = 0x00000002, 48c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_BPS_16 = 0x00000003, 49c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_BPS_MASK = 0x00000003, 50c6c49bacSJacopo Mondi 51c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_PLANARITY_INTERLEAVED = 0x00000000, 52c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_PLANARITY_SEMI_PLANAR = 0x00000010, 53c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_PLANARITY_PLANAR = 0x00000020, 54c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_PLANARITY_MASK = 0x00000030, 55c6c49bacSJacopo Mondi 56c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SAMPLING_444 = 0x00000000, 57c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SAMPLING_422 = 0x00000100, 58c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SAMPLING_420 = 0x00000200, 59c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SAMPLING_MASK = 0x00000300, 60c6c49bacSJacopo Mondi 61c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_ORDER_NORMAL = 0x00000000, 62c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_ORDER_SWAPPED = 0x00001000, 63c6c49bacSJacopo Mondi 64c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SHIFT_0 = 0x00000000, 65c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SHIFT_1 = 0x00010000, 66c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SHIFT_2 = 0x00020000, 67c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SHIFT_3 = 0x00030000, 68c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SHIFT_4 = 0x00040000, 69c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SHIFT_5 = 0x00050000, 70c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SHIFT_6 = 0x00060000, 71c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SHIFT_7 = 0x00070000, 72c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SHIFT_8 = 0x00080000, 73c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SHIFT_MASK = 0x000f0000, 74c6c49bacSJacopo Mondi 751991a09eSJacopo Mondi PISP_IMAGE_FORMAT_BPP_32 = 0x00100000, 761991a09eSJacopo Mondi 77c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_UNCOMPRESSED = 0x00000000, 78c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_COMPRESSION_MODE_1 = 0x01000000, 79c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_COMPRESSION_MODE_2 = 0x02000000, 80c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_COMPRESSION_MODE_3 = 0x03000000, 81c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_COMPRESSION_MASK = 0x03000000, 82c6c49bacSJacopo Mondi 83c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_HOG_SIGNED = 0x04000000, 84c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_HOG_UNSIGNED = 0x08000000, 85c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_INTEGRAL_IMAGE = 0x10000000, 86c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_WALLPAPER_ROLL = 0x20000000, 87c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_THREE_CHANNEL = 0x40000000, 88c6c49bacSJacopo Mondi 89c6c49bacSJacopo Mondi /* Lastly a few specific instantiations of the above. */ 90c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SINGLE_16 = PISP_IMAGE_FORMAT_BPS_16, 91c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_THREE_16 = PISP_IMAGE_FORMAT_BPS_16 | 92c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_THREE_CHANNEL 93c6c49bacSJacopo Mondi }; 94c6c49bacSJacopo Mondi 95*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_BPS_8(fmt) \ 96c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_BPS_MASK) == PISP_IMAGE_FORMAT_BPS_8) 97*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_BPS_10(fmt) \ 98c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_BPS_MASK) == PISP_IMAGE_FORMAT_BPS_10) 99*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_BPS_12(fmt) \ 100c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_BPS_MASK) == PISP_IMAGE_FORMAT_BPS_12) 101*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_BPS_16(fmt) \ 102c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_BPS_MASK) == PISP_IMAGE_FORMAT_BPS_16) 103*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_BPS(fmt) \ 104c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_BPS_MASK) ? \ 105c6c49bacSJacopo Mondi 8 + (2 << (((fmt) & PISP_IMAGE_FORMAT_BPS_MASK) - 1)) : 8) 106*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_SHIFT(fmt) \ 107c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_SHIFT_MASK) / PISP_IMAGE_FORMAT_SHIFT_1) 108*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_THREE_CHANNEL(fmt) \ 109c6c49bacSJacopo Mondi ((fmt) & PISP_IMAGE_FORMAT_THREE_CHANNEL) 110*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_SINGLE_CHANNEL(fmt) \ 111c6c49bacSJacopo Mondi (!((fmt) & PISP_IMAGE_FORMAT_THREE_CHANNEL)) 112*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_COMPRESSED(fmt) \ 113c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_COMPRESSION_MASK) != \ 114c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_UNCOMPRESSED) 115*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_SAMPLING_444(fmt) \ 116c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_SAMPLING_MASK) == \ 117c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SAMPLING_444) 118*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_SAMPLING_422(fmt) \ 119c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_SAMPLING_MASK) == \ 120c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SAMPLING_422) 121*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_SAMPLING_420(fmt) \ 122c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_SAMPLING_MASK) == \ 123c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_SAMPLING_420) 124*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_ORDER_NORMAL(fmt) \ 125c6c49bacSJacopo Mondi (!((fmt) & PISP_IMAGE_FORMAT_ORDER_SWAPPED)) 126*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_ORDER_SWAPPED(fmt) \ 127c6c49bacSJacopo Mondi ((fmt) & PISP_IMAGE_FORMAT_ORDER_SWAPPED) 128*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_INTERLEAVED(fmt) \ 129c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_PLANARITY_MASK) == \ 130c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_PLANARITY_INTERLEAVED) 131*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_SEMIPLANAR(fmt) \ 132c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_PLANARITY_MASK) == \ 133c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_PLANARITY_SEMI_PLANAR) 134*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_PLANAR(fmt) \ 135c6c49bacSJacopo Mondi (((fmt) & PISP_IMAGE_FORMAT_PLANARITY_MASK) == \ 136c6c49bacSJacopo Mondi PISP_IMAGE_FORMAT_PLANARITY_PLANAR) 137*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_WALLPAPER(fmt) \ 138c6c49bacSJacopo Mondi ((fmt) & PISP_IMAGE_FORMAT_WALLPAPER_ROLL) 139*f5cee94fSJacopo Mondi #define PISP_IMAGE_FORMAT_BPP_32(fmt) ((fmt) & PISP_IMAGE_FORMAT_BPP_32) 140c6c49bacSJacopo Mondi #define PISP_IMAGE_FORMAT_HOG(fmt) \ 141c6c49bacSJacopo Mondi ((fmt) & \ 142c6c49bacSJacopo Mondi (PISP_IMAGE_FORMAT_HOG_SIGNED | PISP_IMAGE_FORMAT_HOG_UNSIGNED)) 143c6c49bacSJacopo Mondi 144c6c49bacSJacopo Mondi #define PISP_WALLPAPER_WIDTH 128 /* in bytes */ 145c6c49bacSJacopo Mondi 146c6c49bacSJacopo Mondi struct pisp_bla_config { 147c6c49bacSJacopo Mondi __u16 black_level_r; 148c6c49bacSJacopo Mondi __u16 black_level_gr; 149c6c49bacSJacopo Mondi __u16 black_level_gb; 150c6c49bacSJacopo Mondi __u16 black_level_b; 151c6c49bacSJacopo Mondi __u16 output_black_level; 152c6c49bacSJacopo Mondi __u8 pad[2]; 153c6c49bacSJacopo Mondi } __attribute__((packed)); 154c6c49bacSJacopo Mondi 155c6c49bacSJacopo Mondi struct pisp_wbg_config { 156c6c49bacSJacopo Mondi __u16 gain_r; 157c6c49bacSJacopo Mondi __u16 gain_g; 158c6c49bacSJacopo Mondi __u16 gain_b; 159c6c49bacSJacopo Mondi __u8 pad[2]; 160c6c49bacSJacopo Mondi } __attribute__((packed)); 161c6c49bacSJacopo Mondi 162c6c49bacSJacopo Mondi struct pisp_compress_config { 163c6c49bacSJacopo Mondi /* value subtracted from incoming data */ 164c6c49bacSJacopo Mondi __u16 offset; 165c6c49bacSJacopo Mondi __u8 pad; 166c6c49bacSJacopo Mondi /* 1 => Companding; 2 => Delta (recommended); 3 => Combined (for HDR) */ 167c6c49bacSJacopo Mondi __u8 mode; 168c6c49bacSJacopo Mondi } __attribute__((packed)); 169c6c49bacSJacopo Mondi 170c6c49bacSJacopo Mondi struct pisp_decompress_config { 171c6c49bacSJacopo Mondi /* value added to reconstructed data */ 172c6c49bacSJacopo Mondi __u16 offset; 173c6c49bacSJacopo Mondi __u8 pad; 174c6c49bacSJacopo Mondi /* 1 => Companding; 2 => Delta (recommended); 3 => Combined (for HDR) */ 175c6c49bacSJacopo Mondi __u8 mode; 176c6c49bacSJacopo Mondi } __attribute__((packed)); 177c6c49bacSJacopo Mondi 178c6c49bacSJacopo Mondi enum pisp_axi_flags { 179c6c49bacSJacopo Mondi /* 180c6c49bacSJacopo Mondi * round down bursts to end at a 32-byte boundary, to align following 181c6c49bacSJacopo Mondi * bursts 182c6c49bacSJacopo Mondi */ 183c6c49bacSJacopo Mondi PISP_AXI_FLAG_ALIGN = 128, 184c6c49bacSJacopo Mondi /* for FE writer: force WSTRB high, to pad output to 16-byte boundary */ 185c6c49bacSJacopo Mondi PISP_AXI_FLAG_PAD = 64, 186c6c49bacSJacopo Mondi /* for FE writer: Use Output FIFO level to trigger "panic" */ 187c6c49bacSJacopo Mondi PISP_AXI_FLAG_PANIC = 32, 188c6c49bacSJacopo Mondi }; 189c6c49bacSJacopo Mondi 190c6c49bacSJacopo Mondi struct pisp_axi_config { 191c6c49bacSJacopo Mondi /* 192c6c49bacSJacopo Mondi * burst length minus one, which must be in the range 0:15; OR'd with 193c6c49bacSJacopo Mondi * flags 194c6c49bacSJacopo Mondi */ 195c6c49bacSJacopo Mondi __u8 maxlen_flags; 196c6c49bacSJacopo Mondi /* { prot[2:0], cache[3:0] } fields, echoed on AXI bus */ 197c6c49bacSJacopo Mondi __u8 cache_prot; 198c6c49bacSJacopo Mondi /* QoS field(s) (4x4 bits for FE writer; 4 bits for other masters) */ 199c6c49bacSJacopo Mondi __u16 qos; 200c6c49bacSJacopo Mondi } __attribute__((packed)); 201c6c49bacSJacopo Mondi 202c6c49bacSJacopo Mondi #endif /* _UAPI_PISP_COMMON_H_ */ 203