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