1 /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
2 /*
3  * RP1 PiSP Front End Driver Configuration structures
4  *
5  * Copyright (C) 2021 - Raspberry Pi Ltd.
6  *
7  */
8 #ifndef _UAPI_PISP_FE_CONFIG_
9 #define _UAPI_PISP_FE_CONFIG_
10 
11 #include <linux/types.h>
12 
13 #include "pisp_common.h"
14 #include "pisp_fe_statistics.h"
15 
16 #define PISP_FE_NUM_OUTPUTS 2
17 
18 enum pisp_fe_enable {
19 	PISP_FE_ENABLE_INPUT = 0x000001,
20 	PISP_FE_ENABLE_DECOMPRESS = 0x000002,
21 	PISP_FE_ENABLE_DECOMPAND = 0x000004,
22 	PISP_FE_ENABLE_BLA = 0x000008,
23 	PISP_FE_ENABLE_DPC = 0x000010,
24 	PISP_FE_ENABLE_STATS_CROP = 0x000020,
25 	PISP_FE_ENABLE_DECIMATE = 0x000040,
26 	PISP_FE_ENABLE_BLC = 0x000080,
27 	PISP_FE_ENABLE_CDAF_STATS = 0x000100,
28 	PISP_FE_ENABLE_AWB_STATS = 0x000200,
29 	PISP_FE_ENABLE_RGBY = 0x000400,
30 	PISP_FE_ENABLE_LSC = 0x000800,
31 	PISP_FE_ENABLE_AGC_STATS = 0x001000,
32 	PISP_FE_ENABLE_CROP0 = 0x010000,
33 	PISP_FE_ENABLE_DOWNSCALE0 = 0x020000,
34 	PISP_FE_ENABLE_COMPRESS0 = 0x040000,
35 	PISP_FE_ENABLE_OUTPUT0 = 0x080000,
36 	PISP_FE_ENABLE_CROP1 = 0x100000,
37 	PISP_FE_ENABLE_DOWNSCALE1 = 0x200000,
38 	PISP_FE_ENABLE_COMPRESS1 = 0x400000,
39 	PISP_FE_ENABLE_OUTPUT1 = 0x800000
40 };
41 
42 #define PISP_FE_ENABLE_CROP(i) (PISP_FE_ENABLE_CROP0 << (4 * (i)))
43 #define PISP_FE_ENABLE_DOWNSCALE(i) (PISP_FE_ENABLE_DOWNSCALE0 << (4 * (i)))
44 #define PISP_FE_ENABLE_COMPRESS(i) (PISP_FE_ENABLE_COMPRESS0 << (4 * (i)))
45 #define PISP_FE_ENABLE_OUTPUT(i) (PISP_FE_ENABLE_OUTPUT0 << (4 * (i)))
46 
47 /*
48  * We use the enable flags to show when blocks are "dirty", but we need some
49  * extra ones too.
50  */
51 enum pisp_fe_dirty {
52 	PISP_FE_DIRTY_GLOBAL = 0x0001,
53 	PISP_FE_DIRTY_FLOATING = 0x0002,
54 	PISP_FE_DIRTY_OUTPUT_AXI = 0x0004
55 };
56 
57 struct pisp_fe_global_config {
58 	__u32 enables;
59 	__u8 bayer_order;
60 	__u8 pad[3];
61 } __attribute__((packed));
62 
63 struct pisp_fe_input_axi_config {
64 	/* burst length minus one, in the range 0..15; OR'd with flags */
65 	__u8 maxlen_flags;
66 	/* { prot[2:0], cache[3:0] } fields */
67 	__u8 cache_prot;
68 	/* QoS (only 4 LS bits are used) */
69 	__u16 qos;
70 } __attribute__((packed));
71 
72 struct pisp_fe_output_axi_config {
73 	/* burst length minus one, in the range 0..15; OR'd with flags */
74 	__u8 maxlen_flags;
75 	/* { prot[2:0], cache[3:0] } fields */
76 	__u8 cache_prot;
77 	/* QoS (4 bitfields of 4 bits each for different panic levels) */
78 	__u16 qos;
79 	/*  For Panic mode: Output FIFO panic threshold */
80 	__u16 thresh;
81 	/*  For Panic mode: Output FIFO statistics throttle threshold */
82 	__u16 throttle;
83 } __attribute__((packed));
84 
85 struct pisp_fe_input_config {
86 	__u8 streaming;
87 	__u8 pad[3];
88 	struct pisp_image_format_config format;
89 	struct pisp_fe_input_axi_config axi;
90 	/* Extra cycles delay before issuing each burst request */
91 	__u8 holdoff;
92 	__u8 pad2[3];
93 } __attribute__((packed));
94 
95 struct pisp_fe_output_config {
96 	struct pisp_image_format_config format;
97 	__u16 ilines;
98 	__u8 pad[2];
99 } __attribute__((packed));
100 
101 struct pisp_fe_input_buffer_config {
102 	__u32 addr_lo;
103 	__u32 addr_hi;
104 	__u16 frame_id;
105 	__u16 pad;
106 } __attribute__((packed));
107 
108 #define PISP_FE_DECOMPAND_LUT_SIZE 65
109 
110 struct pisp_fe_decompand_config {
111 	__u16 lut[PISP_FE_DECOMPAND_LUT_SIZE];
112 	__u16 pad;
113 } __attribute__((packed));
114 
115 struct pisp_fe_dpc_config {
116 	__u8 coeff_level;
117 	__u8 coeff_range;
118 	__u8 coeff_range2;
119 #define PISP_FE_DPC_FLAG_FOLDBACK 1
120 #define PISP_FE_DPC_FLAG_VFLAG 2
121 	__u8 flags;
122 } __attribute__((packed));
123 
124 #define PISP_FE_LSC_LUT_SIZE 16
125 
126 struct pisp_fe_lsc_config {
127 	__u8 shift;
128 	__u8 pad0;
129 	__u16 scale;
130 	__u16 centre_x;
131 	__u16 centre_y;
132 	__u16 lut[PISP_FE_LSC_LUT_SIZE];
133 } __attribute__((packed));
134 
135 struct pisp_fe_rgby_config {
136 	__u16 gain_r;
137 	__u16 gain_g;
138 	__u16 gain_b;
139 	__u8 maxflag;
140 	__u8 pad;
141 } __attribute__((packed));
142 
143 struct pisp_fe_agc_stats_config {
144 	__u16 offset_x;
145 	__u16 offset_y;
146 	__u16 size_x;
147 	__u16 size_y;
148 	/* each weight only 4 bits */
149 	__u8 weights[PISP_AGC_STATS_NUM_ZONES / 2];
150 	__u16 row_offset_x;
151 	__u16 row_offset_y;
152 	__u16 row_size_x;
153 	__u16 row_size_y;
154 	__u8 row_shift;
155 	__u8 float_shift;
156 	__u8 pad1[2];
157 } __attribute__((packed));
158 
159 struct pisp_fe_awb_stats_config {
160 	__u16 offset_x;
161 	__u16 offset_y;
162 	__u16 size_x;
163 	__u16 size_y;
164 	__u8 shift;
165 	__u8 pad[3];
166 	__u16 r_lo;
167 	__u16 r_hi;
168 	__u16 g_lo;
169 	__u16 g_hi;
170 	__u16 b_lo;
171 	__u16 b_hi;
172 } __attribute__((packed));
173 
174 struct pisp_fe_floating_stats_region {
175 	__u16 offset_x;
176 	__u16 offset_y;
177 	__u16 size_x;
178 	__u16 size_y;
179 } __attribute__((packed));
180 
181 struct pisp_fe_floating_stats_config {
182 	struct pisp_fe_floating_stats_region
183 		regions[PISP_FLOATING_STATS_NUM_ZONES];
184 } __attribute__((packed));
185 
186 #define PISP_FE_CDAF_NUM_WEIGHTS 8
187 
188 struct pisp_fe_cdaf_stats_config {
189 	__u16 noise_constant;
190 	__u16 noise_slope;
191 	__u16 offset_x;
192 	__u16 offset_y;
193 	__u16 size_x;
194 	__u16 size_y;
195 	__u16 skip_x;
196 	__u16 skip_y;
197 	__u32 mode;
198 } __attribute__((packed));
199 
200 struct pisp_fe_stats_buffer_config {
201 	__u32 addr_lo;
202 	__u32 addr_hi;
203 } __attribute__((packed));
204 
205 struct pisp_fe_crop_config {
206 	__u16 offset_x;
207 	__u16 offset_y;
208 	__u16 width;
209 	__u16 height;
210 } __attribute__((packed));
211 
212 enum pisp_fe_downscale_flags {
213 	/* downscale the four Bayer components independently... */
214 	DOWNSCALE_BAYER = 1,
215 	/* ...without trying to preserve their spatial relationship */
216 	DOWNSCALE_BIN = 2,
217 };
218 
219 struct pisp_fe_downscale_config {
220 	__u8 xin;
221 	__u8 xout;
222 	__u8 yin;
223 	__u8 yout;
224 	__u8 flags; /* enum pisp_fe_downscale_flags */
225 	__u8 pad[3];
226 	__u16 output_width;
227 	__u16 output_height;
228 } __attribute__((packed));
229 
230 struct pisp_fe_output_buffer_config {
231 	__u32 addr_lo;
232 	__u32 addr_hi;
233 } __attribute__((packed));
234 
235 /* Each of the two output channels/branches: */
236 struct pisp_fe_output_branch_config {
237 	struct pisp_fe_crop_config crop;
238 	struct pisp_fe_downscale_config downscale;
239 	struct pisp_compress_config compress;
240 	struct pisp_fe_output_config output;
241 	__u32 pad;
242 } __attribute__((packed));
243 
244 /* And finally one to rule them all: */
245 struct pisp_fe_config {
246 	/* I/O configuration: */
247 	struct pisp_fe_stats_buffer_config stats_buffer;
248 	struct pisp_fe_output_buffer_config output_buffer[PISP_FE_NUM_OUTPUTS];
249 	struct pisp_fe_input_buffer_config input_buffer;
250 	/* processing configuration: */
251 	struct pisp_fe_global_config global;
252 	struct pisp_fe_input_config input;
253 	struct pisp_decompress_config decompress;
254 	struct pisp_fe_decompand_config decompand;
255 	struct pisp_bla_config bla;
256 	struct pisp_fe_dpc_config dpc;
257 	struct pisp_fe_crop_config stats_crop;
258 	__u32 spare1; /* placeholder for future decimate configuration */
259 	struct pisp_bla_config blc;
260 	struct pisp_fe_rgby_config rgby;
261 	struct pisp_fe_lsc_config lsc;
262 	struct pisp_fe_agc_stats_config agc_stats;
263 	struct pisp_fe_awb_stats_config awb_stats;
264 	struct pisp_fe_cdaf_stats_config cdaf_stats;
265 	struct pisp_fe_floating_stats_config floating_stats;
266 	struct pisp_fe_output_axi_config output_axi;
267 	struct pisp_fe_output_branch_config ch[PISP_FE_NUM_OUTPUTS];
268 	/* non-register fields: */
269 	__u32 dirty_flags; /* these use pisp_fe_enable */
270 	__u32 dirty_flags_extra; /* these use pisp_fe_dirty */
271 } __attribute__((packed));
272 
273 #endif /* _UAPI_PISP_FE_CONFIG_ */
274