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