• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2 /* Copyright (C) 2017 - 2018 Intel Corporation */
3 
4 #ifndef __IPU3_UAPI_H
5 #define __IPU3_UAPI_H
6 
7 #include <linux/types.h>
8 
9 /* from /drivers/staging/media/ipu3/include/videodev2.h */
10 
11 /* Vendor specific - used for IPU3 camera sub-system */
12 /* IPU3 processing parameters */
13 #define V4L2_META_FMT_IPU3_PARAMS	v4l2_fourcc('i', 'p', '3', 'p')
14 /* IPU3 3A statistics */
15 #define V4L2_META_FMT_IPU3_STAT_3A	v4l2_fourcc('i', 'p', '3', 's')
16 
17 /* from include/uapi/linux/v4l2-controls.h */
18 #define V4L2_CID_INTEL_IPU3_BASE	(V4L2_CID_USER_BASE + 0x10c0)
19 #define V4L2_CID_INTEL_IPU3_MODE	(V4L2_CID_INTEL_IPU3_BASE + 1)
20 
21 /******************* ipu3_uapi_stats_3a *******************/
22 
23 #define IPU3_UAPI_MAX_STRIPES				2
24 #define IPU3_UAPI_MAX_BUBBLE_SIZE			10
25 
26 #define IPU3_UAPI_GRID_START_MASK			((1 << 12) - 1)
27 #define IPU3_UAPI_GRID_Y_START_EN			(1 << 15)
28 
29 /* controls generation of meta_data (like FF enable/disable) */
30 #define IPU3_UAPI_AWB_RGBS_THR_B_EN			(1 << 14)
31 #define IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT		(1 << 15)
32 
33 /**
34  * struct ipu3_uapi_grid_config - Grid plane config
35  *
36  * @width:	Grid horizontal dimensions, in number of grid blocks(cells).
37  * @height:	Grid vertical dimensions, in number of grid cells.
38  * @block_width_log2:	Log2 of the width of each cell in pixels.
39  *			for (2^3, 2^4, 2^5, 2^6, 2^7), values [3, 7].
40  * @block_height_log2:	Log2 of the height of each cell in pixels.
41  *			for (2^3, 2^4, 2^5, 2^6, 2^7), values [3, 7].
42  * @height_per_slice:	The number of blocks in vertical axis per slice.
43  *			Default 2.
44  * @x_start: X value of top left corner of Region of Interest(ROI).
45  * @y_start: Y value of top left corner of ROI
46  * @x_end: X value of bottom right corner of ROI
47  * @y_end: Y value of bottom right corner of ROI
48  *
49  * Due to the size of total amount of collected data, most statistics
50  * create a grid-based output, and the data is then divided into "slices".
51  */
52 struct ipu3_uapi_grid_config {
53 	__u8 width;
54 	__u8 height;
55 	__u16 block_width_log2:3;
56 	__u16 block_height_log2:3;
57 	__u16 height_per_slice:8;
58 	__u16 x_start;
59 	__u16 y_start;
60 	__u16 x_end;
61 	__u16 y_end;
62 } __packed;
63 
64 /*
65  * The grid based data is divided into "slices" called set, each slice of setX
66  * refers to ipu3_uapi_grid_config width * height_per_slice.
67  */
68 #define IPU3_UAPI_AWB_MAX_SETS				60
69 /* Based on grid size 80 * 60 and cell size 16 x 16 */
70 #define IPU3_UAPI_AWB_SET_SIZE				1280
71 #define IPU3_UAPI_AWB_MD_ITEM_SIZE			8
72 #define IPU3_UAPI_AWB_SPARE_FOR_BUBBLES \
73 	(IPU3_UAPI_MAX_BUBBLE_SIZE * IPU3_UAPI_MAX_STRIPES * \
74 	 IPU3_UAPI_AWB_MD_ITEM_SIZE)
75 #define IPU3_UAPI_AWB_MAX_BUFFER_SIZE \
76 	(IPU3_UAPI_AWB_MAX_SETS * \
77 	 (IPU3_UAPI_AWB_SET_SIZE + IPU3_UAPI_AWB_SPARE_FOR_BUBBLES))
78 
79 /**
80  * struct ipu3_uapi_awb_raw_buffer - AWB raw buffer
81  *
82  * @meta_data: buffer to hold auto white balance meta data which is
83  *		the average values for each color channel.
84  */
85 struct ipu3_uapi_awb_raw_buffer {
86 	__u8 meta_data[IPU3_UAPI_AWB_MAX_BUFFER_SIZE]
87 		__attribute__((aligned(32)));
88 } __packed;
89 
90 /**
91  * struct ipu3_uapi_awb_config_s - AWB config
92  *
93  * @rgbs_thr_gr: gr threshold value.
94  * @rgbs_thr_r: Red threshold value.
95  * @rgbs_thr_gb: gb threshold value.
96  * @rgbs_thr_b: Blue threshold value.
97  * @grid: &ipu3_uapi_grid_config, the default grid resolution is 16x16 cells.
98  *
99  * The threshold is a saturation measure range [0, 8191], 8191 is default.
100  * Values over threshold may be optionally rejected for averaging.
101  */
102 struct ipu3_uapi_awb_config_s {
103 	__u16 rgbs_thr_gr;
104 	__u16 rgbs_thr_r;
105 	__u16 rgbs_thr_gb;
106 	__u16 rgbs_thr_b;
107 	struct ipu3_uapi_grid_config grid;
108 } __attribute__((aligned(32))) __packed;
109 
110 /**
111  * struct ipu3_uapi_awb_config - AWB config wrapper
112  *
113  * @config: config for auto white balance as defined by &ipu3_uapi_awb_config_s
114  */
115 struct ipu3_uapi_awb_config {
116 	struct ipu3_uapi_awb_config_s config __attribute__((aligned(32)));
117 } __packed;
118 
119 #define IPU3_UAPI_AE_COLORS				4	/* R, G, B, Y */
120 #define IPU3_UAPI_AE_BINS				256
121 #define IPU3_UAPI_AE_WEIGHTS				96
122 
123 /**
124  * struct ipu3_uapi_ae_raw_buffer - AE global weighted histogram
125  *
126  * @vals: Sum of IPU3_UAPI_AE_COLORS in cell
127  *
128  * Each histogram contains IPU3_UAPI_AE_BINS bins. Each bin has 24 bit unsigned
129  * for counting the number of the pixel.
130  */
131 struct ipu3_uapi_ae_raw_buffer {
132 	__u32 vals[IPU3_UAPI_AE_BINS * IPU3_UAPI_AE_COLORS];
133 } __packed;
134 
135 /**
136  * struct ipu3_uapi_ae_raw_buffer_aligned - AE raw buffer
137  *
138  * @buff: &ipu3_uapi_ae_raw_buffer to hold full frame meta data.
139  */
140 struct ipu3_uapi_ae_raw_buffer_aligned {
141 	struct ipu3_uapi_ae_raw_buffer buff __attribute__((aligned(32)));
142 } __packed;
143 
144 /**
145  * struct ipu3_uapi_ae_grid_config - AE weight grid
146  *
147  * @width: Grid horizontal dimensions. Value: [16, 32], default 16.
148  * @height: Grid vertical dimensions. Value: [16, 24], default 16.
149  * @block_width_log2: Log2 of the width of the grid cell, value: [3, 7].
150  * @block_height_log2: Log2 of the height of the grid cell, value: [3, 7].
151  *			default is 3 (cell size 8x8), 4 cell per grid.
152  * @reserved0: reserved
153  * @ae_en: 0: does not write to &ipu3_uapi_ae_raw_buffer_aligned array,
154  *		1: write normally.
155  * @rst_hist_array: write 1 to trigger histogram array reset.
156  * @done_rst_hist_array: flag for histogram array reset done.
157  * @x_start: X value of top left corner of ROI, default 0.
158  * @y_start: Y value of top left corner of ROI, default 0.
159  * @x_end: X value of bottom right corner of ROI
160  * @y_end: Y value of bottom right corner of ROI
161  *
162  * The AE block accumulates 4 global weighted histograms(R, G, B, Y) over
163  * a defined ROI within the frame. The contribution of each pixel into the
164  * histogram, defined by &ipu3_uapi_ae_weight_elem LUT, is indexed by a grid.
165  */
166 struct ipu3_uapi_ae_grid_config {
167 	__u8 width;
168 	__u8 height;
169 	__u8 block_width_log2:4;
170 	__u8 block_height_log2:4;
171 	__u8 reserved0:5;
172 	__u8 ae_en:1;
173 	__u8 rst_hist_array:1;
174 	__u8 done_rst_hist_array:1;
175 	__u16 x_start;
176 	__u16 y_start;
177 	__u16 x_end;
178 	__u16 y_end;
179 } __packed;
180 
181 /**
182  * struct ipu3_uapi_ae_weight_elem - AE weights LUT
183  *
184  * @cell0: weighted histogram grid value.
185  * @cell1: weighted histogram grid value.
186  * @cell2: weighted histogram grid value.
187  * @cell3: weighted histogram grid value.
188  * @cell4: weighted histogram grid value.
189  * @cell5: weighted histogram grid value.
190  * @cell6: weighted histogram grid value.
191  * @cell7: weighted histogram grid value.
192  *
193  * Use weighted grid value to give a different contribution factor to each cell.
194  * Precision u4, range [0, 15].
195  */
196 struct ipu3_uapi_ae_weight_elem {
197 	__u32 cell0:4;
198 	__u32 cell1:4;
199 	__u32 cell2:4;
200 	__u32 cell3:4;
201 	__u32 cell4:4;
202 	__u32 cell5:4;
203 	__u32 cell6:4;
204 	__u32 cell7:4;
205 } __packed;
206 
207 /**
208  * struct ipu3_uapi_ae_ccm - AE coefficients for WB and CCM
209  *
210  * @gain_gr: WB gain factor for the gr channels. Default 256.
211  * @gain_r: WB gain factor for the r channel. Default 256.
212  * @gain_b: WB gain factor for the b channel. Default 256.
213  * @gain_gb: WB gain factor for the gb channels. Default 256.
214  * @mat: 4x4 matrix that transforms Bayer quad output from WB to RGB+Y.
215  *
216  * Default:
217  *	128, 0, 0, 0,
218  *	0, 128, 0, 0,
219  *	0, 0, 128, 0,
220  *	0, 0, 0, 128,
221  *
222  * As part of the raw frame pre-process stage, the WB and color conversion need
223  * to be applied to expose the impact of these gain operations.
224  */
225 struct ipu3_uapi_ae_ccm {
226 	__u16 gain_gr;
227 	__u16 gain_r;
228 	__u16 gain_b;
229 	__u16 gain_gb;
230 	__s16 mat[16];
231 } __packed;
232 
233 /**
234  * struct ipu3_uapi_ae_config - AE config
235  *
236  * @grid_cfg:	config for auto exposure statistics grid. See struct
237  *		&ipu3_uapi_ae_grid_config
238  * @weights:	&IPU3_UAPI_AE_WEIGHTS is based on 32x24 blocks in the grid.
239  *		Each grid cell has a corresponding value in weights LUT called
240  *		grid value, global histogram is updated based on grid value and
241  *		pixel value.
242  * @ae_ccm:	Color convert matrix pre-processing block.
243  *
244  * Calculate AE grid from image resolution, resample ae weights.
245  */
246 struct ipu3_uapi_ae_config {
247 	struct ipu3_uapi_ae_grid_config grid_cfg __attribute__((aligned(32)));
248 	struct ipu3_uapi_ae_weight_elem weights[IPU3_UAPI_AE_WEIGHTS]
249 						__attribute__((aligned(32)));
250 	struct ipu3_uapi_ae_ccm ae_ccm __attribute__((aligned(32)));
251 } __packed;
252 
253 /**
254  * struct ipu3_uapi_af_filter_config - AF 2D filter for contrast measurements
255  *
256  * @y1_coeff_0:	filter Y1, structure: 3x11, support both symmetry and
257  *		anti-symmetry type. A12 is center, A1-A11 are neighbours.
258  *		for analyzing low frequency content, used to calculate sum
259  *		of gradients in x direction.
260  * @y1_coeff_0.a1:	filter1 coefficients A1, u8, default 0.
261  * @y1_coeff_0.a2:	filter1 coefficients A2, u8, default 0.
262  * @y1_coeff_0.a3:	filter1 coefficients A3, u8, default 0.
263  * @y1_coeff_0.a4:	filter1 coefficients A4, u8, default 0.
264  * @y1_coeff_1:		Struct
265  * @y1_coeff_1.a5:	filter1 coefficients A5, u8, default 0.
266  * @y1_coeff_1.a6:	filter1 coefficients A6, u8, default 0.
267  * @y1_coeff_1.a7:	filter1 coefficients A7, u8, default 0.
268  * @y1_coeff_1.a8:	filter1 coefficients A8, u8, default 0.
269  * @y1_coeff_2:		Struct
270  * @y1_coeff_2.a9:	filter1 coefficients A9, u8, default 0.
271  * @y1_coeff_2.a10:	filter1 coefficients A10, u8, default 0.
272  * @y1_coeff_2.a11:	filter1 coefficients A11, u8, default 0.
273  * @y1_coeff_2.a12:	filter1 coefficients A12, u8, default 128.
274  * @y1_sign_vec:	Each bit corresponds to one coefficient sign bit,
275  *			0: positive, 1: negative, default 0.
276  * @y2_coeff_0:	Y2, same structure as Y1. For analyzing high frequency content.
277  * @y2_coeff_0.a1:	filter2 coefficients A1, u8, default 0.
278  * @y2_coeff_0.a2:	filter2 coefficients A2, u8, default 0.
279  * @y2_coeff_0.a3:	filter2 coefficients A3, u8, default 0.
280  * @y2_coeff_0.a4:	filter2 coefficients A4, u8, default 0.
281  * @y2_coeff_1:	Struct
282  * @y2_coeff_1.a5:	filter2 coefficients A5, u8, default 0.
283  * @y2_coeff_1.a6:	filter2 coefficients A6, u8, default 0.
284  * @y2_coeff_1.a7:	filter2 coefficients A7, u8, default 0.
285  * @y2_coeff_1.a8:	filter2 coefficients A8, u8, default 0.
286  * @y2_coeff_2:	Struct
287  * @y2_coeff_2.a9:	filter1 coefficients A9, u8, default 0.
288  * @y2_coeff_2.a10:	filter1 coefficients A10, u8, default 0.
289  * @y2_coeff_2.a11:	filter1 coefficients A11, u8, default 0.
290  * @y2_coeff_2.a12:	filter1 coefficients A12, u8, default 128.
291  * @y2_sign_vec:	Each bit corresponds to one coefficient sign bit,
292  *			0: positive, 1: negative, default 0.
293  * @y_calc:	Pre-processing that converts Bayer quad to RGB+Y values to be
294  *		used for building histogram. Range [0, 32], default 8.
295  * Rule:
296  *		y_gen_rate_gr + y_gen_rate_r + y_gen_rate_b + y_gen_rate_gb = 32
297  *		A single Y is calculated based on sum of Gr/R/B/Gb based on
298  *		their contribution ratio.
299  * @y_calc.y_gen_rate_gr:	Contribution ratio Gr for Y
300  * @y_calc.y_gen_rate_r:	Contribution ratio R for Y
301  * @y_calc.y_gen_rate_b:	Contribution ratio B for Y
302  * @y_calc.y_gen_rate_gb:	Contribution ratio Gb for Y
303  * @nf:	The shift right value that should be applied during the Y1/Y2 filter to
304  *	make sure the total memory needed is 2 bytes per grid cell.
305  * @nf.reserved0:	reserved
306  * @nf.y1_nf:	Normalization factor for the convolution coeffs of y1,
307  *		should be log2 of the sum of the abs values of the filter
308  *		coeffs, default 7 (2^7 = 128).
309  * @nf.reserved1:	reserved
310  * @nf.y2_nf:	Normalization factor for y2, should be log2 of the sum of the
311  *		abs values of the filter coeffs.
312  * @nf.reserved2:	reserved
313  */
314 struct ipu3_uapi_af_filter_config {
315 	struct {
316 		__u8 a1;
317 		__u8 a2;
318 		__u8 a3;
319 		__u8 a4;
320 	} y1_coeff_0;
321 	struct {
322 		__u8 a5;
323 		__u8 a6;
324 		__u8 a7;
325 		__u8 a8;
326 	} y1_coeff_1;
327 	struct {
328 		__u8 a9;
329 		__u8 a10;
330 		__u8 a11;
331 		__u8 a12;
332 	} y1_coeff_2;
333 
334 	__u32 y1_sign_vec;
335 
336 	struct {
337 		__u8 a1;
338 		__u8 a2;
339 		__u8 a3;
340 		__u8 a4;
341 	} y2_coeff_0;
342 	struct {
343 		__u8 a5;
344 		__u8 a6;
345 		__u8 a7;
346 		__u8 a8;
347 	} y2_coeff_1;
348 	struct {
349 		__u8 a9;
350 		__u8 a10;
351 		__u8 a11;
352 		__u8 a12;
353 	} y2_coeff_2;
354 
355 	__u32 y2_sign_vec;
356 
357 	struct {
358 		__u8 y_gen_rate_gr;
359 		__u8 y_gen_rate_r;
360 		__u8 y_gen_rate_b;
361 		__u8 y_gen_rate_gb;
362 	} y_calc;
363 
364 	struct {
365 		__u32 reserved0:8;
366 		__u32 y1_nf:4;
367 		__u32 reserved1:4;
368 		__u32 y2_nf:4;
369 		__u32 reserved2:12;
370 	} nf;
371 } __packed;
372 
373 #define IPU3_UAPI_AF_MAX_SETS				24
374 #define IPU3_UAPI_AF_MD_ITEM_SIZE			4
375 #define IPU3_UAPI_AF_SPARE_FOR_BUBBLES \
376 	(IPU3_UAPI_MAX_BUBBLE_SIZE * IPU3_UAPI_MAX_STRIPES * \
377 	 IPU3_UAPI_AF_MD_ITEM_SIZE)
378 #define IPU3_UAPI_AF_Y_TABLE_SET_SIZE			128
379 #define IPU3_UAPI_AF_Y_TABLE_MAX_SIZE \
380 	(IPU3_UAPI_AF_MAX_SETS * \
381 	 (IPU3_UAPI_AF_Y_TABLE_SET_SIZE + IPU3_UAPI_AF_SPARE_FOR_BUBBLES) * \
382 	 IPU3_UAPI_MAX_STRIPES)
383 
384 /**
385  * struct ipu3_uapi_af_raw_buffer - AF meta data
386  *
387  * @y_table:	Each color component will be convolved separately with filter1
388  *		and filter2 and the result will be summed out and averaged for
389  *		each cell.
390  */
391 struct ipu3_uapi_af_raw_buffer {
392 	__u8 y_table[IPU3_UAPI_AF_Y_TABLE_MAX_SIZE] __attribute__((aligned(32)));
393 } __packed;
394 
395 /**
396  * struct ipu3_uapi_af_config_s - AF config
397  *
398  * @filter_config: AF uses Y1 and Y2 filters as configured in
399  *		   &ipu3_uapi_af_filter_config
400  * @padding: paddings
401  * @grid_cfg: See &ipu3_uapi_grid_config, default resolution 16x16. Use large
402  *	      grid size for large image and vice versa.
403  */
404 struct ipu3_uapi_af_config_s {
405 	struct ipu3_uapi_af_filter_config filter_config __attribute__((aligned(32)));
406 	__u8 padding[4];
407 	struct ipu3_uapi_grid_config grid_cfg __attribute__((aligned(32)));
408 } __packed;
409 
410 #define IPU3_UAPI_AWB_FR_MAX_SETS			24
411 #define IPU3_UAPI_AWB_FR_MD_ITEM_SIZE			8
412 #define IPU3_UAPI_AWB_FR_BAYER_TBL_SIZE			256
413 #define IPU3_UAPI_AWB_FR_SPARE_FOR_BUBBLES \
414 	(IPU3_UAPI_MAX_BUBBLE_SIZE * IPU3_UAPI_MAX_STRIPES * \
415 	 IPU3_UAPI_AWB_FR_MD_ITEM_SIZE)
416 #define IPU3_UAPI_AWB_FR_BAYER_TABLE_MAX_SIZE \
417 	(IPU3_UAPI_AWB_FR_MAX_SETS * \
418 	(IPU3_UAPI_AWB_FR_BAYER_TBL_SIZE + \
419 	 IPU3_UAPI_AWB_FR_SPARE_FOR_BUBBLES) * IPU3_UAPI_MAX_STRIPES)
420 
421 /**
422  * struct ipu3_uapi_awb_fr_raw_buffer - AWB filter response meta data
423  *
424  * @meta_data: Statistics output on the grid after convolving with 1D filter.
425  */
426 struct ipu3_uapi_awb_fr_raw_buffer {
427 	__u8 meta_data[IPU3_UAPI_AWB_FR_BAYER_TABLE_MAX_SIZE]
428 		__attribute__((aligned(32)));
429 } __packed;
430 
431 /**
432  * struct ipu3_uapi_awb_fr_config_s - AWB filter response config
433  *
434  * @grid_cfg:	grid config, default 16x16.
435  * @bayer_coeff:	1D Filter 1x11 center symmetry/anti-symmetry.
436  *			coefficients defaults { 0, 0, 0, 0, 0, 128 }.
437  *			Applied on whole image for each Bayer channel separately
438  *			by a weighted sum of its 11x1 neighbors.
439  * @reserved1:	reserved
440  * @bayer_sign:	sign of filter coefficients, default 0.
441  * @bayer_nf:	normalization factor for the convolution coeffs, to make sure
442  *		total memory needed is within pre-determined range.
443  *		NF should be the log2 of the sum of the abs values of the
444  *		filter coeffs, range [7, 14], default 7.
445  * @reserved2:	reserved
446  */
447 struct ipu3_uapi_awb_fr_config_s {
448 	struct ipu3_uapi_grid_config grid_cfg;
449 	__u8 bayer_coeff[6];
450 	__u16 reserved1;
451 	__u32 bayer_sign;
452 	__u8 bayer_nf;
453 	__u8 reserved2[7];
454 } __packed;
455 
456 /**
457  * struct ipu3_uapi_4a_config - 4A config
458  *
459  * @awb_config: &ipu3_uapi_awb_config_s, default resolution 16x16
460  * @ae_grd_config: auto exposure statistics &ipu3_uapi_ae_grid_config
461  * @padding: paddings
462  * @af_config: auto focus config &ipu3_uapi_af_config_s
463  * @awb_fr_config: &ipu3_uapi_awb_fr_config_s, default resolution 16x16
464  */
465 struct ipu3_uapi_4a_config {
466 	struct ipu3_uapi_awb_config_s awb_config __attribute__((aligned(32)));
467 	struct ipu3_uapi_ae_grid_config ae_grd_config;
468 	__u8 padding[20];
469 	struct ipu3_uapi_af_config_s af_config;
470 	struct ipu3_uapi_awb_fr_config_s awb_fr_config
471 		__attribute__((aligned(32)));
472 } __packed;
473 
474 /**
475  * struct ipu3_uapi_bubble_info - Bubble info for host side debugging
476  *
477  * @num_of_stripes: A single frame is divided into several parts called stripes
478  *		    due to limitation on line buffer memory.
479  *		    The separation between the stripes is vertical. Each such
480  *		    stripe is processed as a single frame by the ISP pipe.
481  * @padding: padding bytes.
482  * @num_sets: number of sets.
483  * @padding1: padding bytes.
484  * @size_of_set: set size.
485  * @padding2: padding bytes.
486  * @bubble_size: is the amount of padding in the bubble expressed in "sets".
487  * @padding3: padding bytes.
488  */
489 struct ipu3_uapi_bubble_info {
490 	__u32 num_of_stripes __attribute__((aligned(32)));
491 	__u8 padding[28];
492 	__u32 num_sets;
493 	__u8 padding1[28];
494 	__u32 size_of_set;
495 	__u8 padding2[28];
496 	__u32 bubble_size;
497 	__u8 padding3[28];
498 } __packed;
499 
500 /*
501  * struct ipu3_uapi_stats_3a_bubble_info_per_stripe
502  */
503 struct ipu3_uapi_stats_3a_bubble_info_per_stripe {
504 	struct ipu3_uapi_bubble_info awb[IPU3_UAPI_MAX_STRIPES];
505 	struct ipu3_uapi_bubble_info af[IPU3_UAPI_MAX_STRIPES];
506 	struct ipu3_uapi_bubble_info awb_fr[IPU3_UAPI_MAX_STRIPES];
507 } __packed;
508 
509 /**
510  * struct ipu3_uapi_ff_status - Enable bits for each 3A fixed function
511  *
512  * @awb_en: auto white balance enable
513  * @padding: padding config
514  * @ae_en: auto exposure enable
515  * @padding1: padding config
516  * @af_en: auto focus enable
517  * @padding2: padding config
518  * @awb_fr_en: awb filter response enable bit
519  * @padding3: padding config
520  */
521 struct ipu3_uapi_ff_status {
522 	__u32 awb_en __attribute__((aligned(32)));
523 	__u8 padding[28];
524 	__u32 ae_en;
525 	__u8 padding1[28];
526 	__u32 af_en;
527 	__u8 padding2[28];
528 	__u32 awb_fr_en;
529 	__u8 padding3[28];
530 } __packed;
531 
532 /**
533  * struct ipu3_uapi_stats_3a - 3A statistics
534  *
535  * @awb_raw_buffer: auto white balance meta data &ipu3_uapi_awb_raw_buffer
536  * @ae_raw_buffer: auto exposure raw data &ipu3_uapi_ae_raw_buffer_aligned
537  * @af_raw_buffer: &ipu3_uapi_af_raw_buffer for auto focus meta data
538  * @awb_fr_raw_buffer: value as specified by &ipu3_uapi_awb_fr_raw_buffer
539  * @stats_4a_config: 4a statistics config as defined by &ipu3_uapi_4a_config.
540  * @ae_join_buffers: 1 to use ae_raw_buffer.
541  * @padding: padding config
542  * @stats_3a_bubble_per_stripe: a &ipu3_uapi_stats_3a_bubble_info_per_stripe
543  * @stats_3a_status: 3a statistics status set in &ipu3_uapi_ff_status
544  */
545 struct ipu3_uapi_stats_3a {
546 	struct ipu3_uapi_awb_raw_buffer awb_raw_buffer;
547 	struct ipu3_uapi_ae_raw_buffer_aligned
548 			ae_raw_buffer[IPU3_UAPI_MAX_STRIPES];
549 	struct ipu3_uapi_af_raw_buffer af_raw_buffer;
550 	struct ipu3_uapi_awb_fr_raw_buffer awb_fr_raw_buffer;
551 	struct ipu3_uapi_4a_config stats_4a_config;
552 	__u32 ae_join_buffers;
553 	__u8 padding[28];
554 	struct ipu3_uapi_stats_3a_bubble_info_per_stripe
555 			stats_3a_bubble_per_stripe;
556 	struct ipu3_uapi_ff_status stats_3a_status;
557 } __packed;
558 
559 /******************* ipu3_uapi_acc_param *******************/
560 
561 #define IPU3_UAPI_ISP_VEC_ELEMS				64
562 #define IPU3_UAPI_ISP_TNR3_VMEM_LEN			9
563 
564 #define IPU3_UAPI_BNR_LUT_SIZE				32
565 
566 /* number of elements in gamma correction LUT */
567 #define IPU3_UAPI_GAMMA_CORR_LUT_ENTRIES		256
568 
569 /* largest grid is 73x56, for grid_height_per_slice of 2, 73x2 = 146 */
570 #define IPU3_UAPI_SHD_MAX_CELLS_PER_SET			146
571 #define IPU3_UAPI_SHD_MAX_CFG_SETS			28
572 /* Normalization shift aka nf */
573 #define IPU3_UAPI_SHD_BLGR_NF_SHIFT			13
574 #define IPU3_UAPI_SHD_BLGR_NF_MASK			7
575 
576 #define IPU3_UAPI_YUVP2_TCC_MACC_TABLE_ELEMENTS		16
577 #define IPU3_UAPI_YUVP2_TCC_INV_Y_LUT_ELEMENTS		14
578 #define IPU3_UAPI_YUVP2_TCC_GAIN_PCWL_LUT_ELEMENTS	258
579 #define IPU3_UAPI_YUVP2_TCC_R_SQR_LUT_ELEMENTS		24
580 
581 #define IPU3_UAPI_ANR_LUT_SIZE				26
582 #define IPU3_UAPI_ANR_PYRAMID_SIZE			22
583 
584 #define IPU3_UAPI_LIN_LUT_SIZE				64
585 
586 /* Bayer Noise Reduction related structs */
587 
588 /**
589  * struct ipu3_uapi_bnr_static_config_wb_gains_config - White balance gains
590  *
591  * @gr:	white balance gain for Gr channel.
592  * @r:	white balance gain for R channel.
593  * @b:	white balance gain for B channel.
594  * @gb:	white balance gain for Gb channel.
595  *
596  * Precision u3.13, range [0, 8). White balance correction is done by applying
597  * a multiplicative gain to each color channels prior to BNR.
598  */
599 struct ipu3_uapi_bnr_static_config_wb_gains_config {
600 	__u16 gr;
601 	__u16 r;
602 	__u16 b;
603 	__u16 gb;
604 } __packed;
605 
606 /**
607  * struct ipu3_uapi_bnr_static_config_wb_gains_thr_config - Threshold config
608  *
609  * @gr:	white balance threshold gain for Gr channel.
610  * @r:	white balance threshold gain for R channel.
611  * @b:	white balance threshold gain for B channel.
612  * @gb:	white balance threshold gain for Gb channel.
613  *
614  * Defines the threshold that specifies how different a defect pixel can be from
615  * its neighbors.(used by dynamic defect pixel correction sub block)
616  * Precision u4.4 range [0, 8].
617  */
618 struct ipu3_uapi_bnr_static_config_wb_gains_thr_config {
619 	__u8 gr;
620 	__u8 r;
621 	__u8 b;
622 	__u8 gb;
623 } __packed;
624 
625 /**
626  * struct ipu3_uapi_bnr_static_config_thr_coeffs_config - Noise model
627  *				coefficients that controls noise threshold
628  *
629  * @cf:	Free coefficient for threshold calculation, range [0, 8191], default 0.
630  * @reserved0:	reserved
631  * @cg:	Gain coefficient for threshold calculation, [0, 31], default 8.
632  * @ci:	Intensity coefficient for threshold calculation. range [0, 0x1f]
633  *	default 6.
634  *	format: u3.2 (3 most significant bits represent whole number,
635  *	2 least significant bits represent the fractional part
636  *	with each count representing 0.25)
637  *	e.g. 6 in binary format is 00110, that translates to 1.5
638  * @reserved1:	reserved
639  * @r_nf:	Normalization shift value for r^2 calculation, range [12, 20]
640  *		where r is a radius of pixel [row, col] from centor of sensor.
641  *		default 14.
642  *
643  * Threshold used to distinguish between noise and details.
644  */
645 struct ipu3_uapi_bnr_static_config_thr_coeffs_config {
646 	__u32 cf:13;
647 	__u32 reserved0:3;
648 	__u32 cg:5;
649 	__u32 ci:5;
650 	__u32 reserved1:1;
651 	__u32 r_nf:5;
652 } __packed;
653 
654 /**
655  * struct ipu3_uapi_bnr_static_config_thr_ctrl_shd_config - Shading config
656  *
657  * @gr:	Coefficient defines lens shading gain approximation for gr channel
658  * @r:	Coefficient defines lens shading gain approximation for r channel
659  * @b:	Coefficient defines lens shading gain approximation for b channel
660  * @gb:	Coefficient defines lens shading gain approximation for gb channel
661  *
662  * Parameters for noise model (NM) adaptation of BNR due to shading correction.
663  * All above have precision of u3.3, default to 0.
664  */
665 struct ipu3_uapi_bnr_static_config_thr_ctrl_shd_config {
666 	__u8 gr;
667 	__u8 r;
668 	__u8 b;
669 	__u8 gb;
670 } __packed;
671 
672 /**
673  * struct ipu3_uapi_bnr_static_config_opt_center_config - Optical center config
674  *
675  * @x_reset:	Reset value of X (col start - X center). Precision s12.0.
676  * @reserved0:	reserved
677  * @y_reset:	Reset value of Y (row start - Y center). Precision s12.0.
678  * @reserved2:	reserved
679  *
680  * Distance from corner to optical center for NM adaptation due to shading
681  * correction (should be calculated based on shading tables)
682  */
683 struct ipu3_uapi_bnr_static_config_opt_center_config {
684 	__s32 x_reset:13;
685 	__u32 reserved0:3;
686 	__s32 y_reset:13;
687 	__u32 reserved2:3;
688 } __packed;
689 
690 /**
691  * struct ipu3_uapi_bnr_static_config_lut_config - BNR square root lookup table
692  *
693  * @values: pre-calculated values of square root function.
694  *
695  * LUT implementation of square root operation.
696  */
697 struct ipu3_uapi_bnr_static_config_lut_config {
698 	__u8 values[IPU3_UAPI_BNR_LUT_SIZE];
699 } __packed;
700 
701 /**
702  * struct ipu3_uapi_bnr_static_config_bp_ctrl_config - Detect bad pixels (bp)
703  *
704  * @bp_thr_gain:	Defines the threshold that specifies how different a
705  *			defect pixel can be from its neighbors. Threshold is
706  *			dependent on de-noise threshold calculated by algorithm.
707  *			Range [4, 31], default 4.
708  * @reserved0:	reserved
709  * @defect_mode:	Mode of addressed defect pixels,
710  *			0 - single defect pixel is expected,
711  *			1 - 2 adjacent defect pixels are expected, default 1.
712  * @bp_gain:	Defines how 2nd derivation that passes through a defect pixel
713  *		is different from 2nd derivations that pass through
714  *		neighbor pixels. u4.2, range [0, 256], default 8.
715  * @reserved1:	reserved
716  * @w0_coeff:	Blending coefficient of defect pixel correction.
717  *		Precision u4, range [0, 8], default 8.
718  * @reserved2:	reserved
719  * @w1_coeff:	Enable influence of incorrect defect pixel correction to be
720  *		avoided. Precision u4, range [1, 8], default 8.
721  * @reserved3:	reserved
722  */
723 struct ipu3_uapi_bnr_static_config_bp_ctrl_config {
724 	__u32 bp_thr_gain:5;
725 	__u32 reserved0:2;
726 	__u32 defect_mode:1;
727 	__u32 bp_gain:6;
728 	__u32 reserved1:18;
729 	__u32 w0_coeff:4;
730 	__u32 reserved2:4;
731 	__u32 w1_coeff:4;
732 	__u32 reserved3:20;
733 } __packed;
734 
735 /**
736  * struct ipu3_uapi_bnr_static_config_dn_detect_ctrl_config - Denoising config
737  *
738  * @alpha:	Weight of central element of smoothing filter.
739  * @beta:	Weight of peripheral elements of smoothing filter, default 4.
740  * @gamma:	Weight of diagonal elements of smoothing filter, default 4.
741  *
742  * beta and gamma parameter define the strength of the noise removal filter.
743  *		All above has precision u0.4, range [0, 0xf]
744  *		format: u0.4 (no / zero bits represent whole number,
745  *		4 bits represent the fractional part
746  *		with each count representing 0.0625)
747  *		e.g. 0xf translates to 0.0625x15 = 0.9375
748  *
749  * @reserved0:	reserved
750  * @max_inf:	Maximum increase of peripheral or diagonal element influence
751  *		relative to the pre-defined value range: [0x5, 0xa]
752  * @reserved1:	reserved
753  * @gd_enable:	Green disparity enable control, 0 - disable, 1 - enable.
754  * @bpc_enable:	Bad pixel correction enable control, 0 - disable, 1 - enable.
755  * @bnr_enable:	Bayer noise removal enable control, 0 - disable, 1 - enable.
756  * @ff_enable:	Fixed function enable, 0 - disable, 1 - enable.
757  * @reserved2:	reserved
758  */
759 struct ipu3_uapi_bnr_static_config_dn_detect_ctrl_config {
760 	__u32 alpha:4;
761 	__u32 beta:4;
762 	__u32 gamma:4;
763 	__u32 reserved0:4;
764 	__u32 max_inf:4;
765 	__u32 reserved1:7;
766 	__u32 gd_enable:1;
767 	__u32 bpc_enable:1;
768 	__u32 bnr_enable:1;
769 	__u32 ff_enable:1;
770 	__u32 reserved2:1;
771 } __packed;
772 
773 /**
774  * struct ipu3_uapi_bnr_static_config_opt_center_sqr_config - BNR optical square
775  *
776  * @x_sqr_reset: Reset value of X^2.
777  * @y_sqr_reset: Reset value of Y^2.
778  *
779  * Please note:
780  *
781  *    #. X and Y ref to
782  *       &ipu3_uapi_bnr_static_config_opt_center_config
783  *    #. Both structs are used in threshold formula to calculate r^2, where r
784  *       is a radius of pixel [row, col] from centor of sensor.
785  */
786 struct ipu3_uapi_bnr_static_config_opt_center_sqr_config {
787 	__u32 x_sqr_reset;
788 	__u32 y_sqr_reset;
789 } __packed;
790 
791 /**
792  * struct ipu3_uapi_bnr_static_config - BNR static config
793  *
794  * @wb_gains:	white balance gains &ipu3_uapi_bnr_static_config_wb_gains_config
795  * @wb_gains_thr:	white balance gains threshold as defined by
796  *			&ipu3_uapi_bnr_static_config_wb_gains_thr_config
797  * @thr_coeffs:	coefficients of threshold
798  *		&ipu3_uapi_bnr_static_config_thr_coeffs_config
799  * @thr_ctrl_shd:	control of shading threshold
800  *			&ipu3_uapi_bnr_static_config_thr_ctrl_shd_config
801  * @opt_center:	optical center &ipu3_uapi_bnr_static_config_opt_center_config
802  *
803  * Above parameters and opt_center_sqr are used for white balance and shading.
804  *
805  * @lut:	lookup table &ipu3_uapi_bnr_static_config_lut_config
806  * @bp_ctrl:	detect and remove bad pixels as defined in struct
807  *		&ipu3_uapi_bnr_static_config_bp_ctrl_config
808  * @dn_detect_ctrl:	detect and remove noise.
809  *			&ipu3_uapi_bnr_static_config_dn_detect_ctrl_config
810  * @column_size:	The number of pixels in column.
811  * @opt_center_sqr:	Reset value of r^2 to optical center, see
812  *			&ipu3_uapi_bnr_static_config_opt_center_sqr_config.
813  */
814 struct ipu3_uapi_bnr_static_config {
815 	struct ipu3_uapi_bnr_static_config_wb_gains_config wb_gains;
816 	struct ipu3_uapi_bnr_static_config_wb_gains_thr_config wb_gains_thr;
817 	struct ipu3_uapi_bnr_static_config_thr_coeffs_config thr_coeffs;
818 	struct ipu3_uapi_bnr_static_config_thr_ctrl_shd_config thr_ctrl_shd;
819 	struct ipu3_uapi_bnr_static_config_opt_center_config opt_center;
820 	struct ipu3_uapi_bnr_static_config_lut_config lut;
821 	struct ipu3_uapi_bnr_static_config_bp_ctrl_config bp_ctrl;
822 	struct ipu3_uapi_bnr_static_config_dn_detect_ctrl_config dn_detect_ctrl;
823 	__u32 column_size;
824 	struct ipu3_uapi_bnr_static_config_opt_center_sqr_config opt_center_sqr;
825 } __packed;
826 
827 /**
828  * struct ipu3_uapi_bnr_static_config_green_disparity - Correct green disparity
829  *
830  * @gd_red:	Shading gain coeff for gr disparity level in bright red region.
831  *		Precision u0.6, default 4(0.0625).
832  * @reserved0:	reserved
833  * @gd_green:	Shading gain coeff for gr disparity level in bright green
834  *		region. Precision u0.6, default 4(0.0625).
835  * @reserved1:	reserved
836  * @gd_blue:	Shading gain coeff for gr disparity level in bright blue region.
837  *		Precision u0.6, default 4(0.0625).
838  * @reserved2:	reserved
839  * @gd_black:	Maximal green disparity level in dark region (stronger disparity
840  *		assumed to be image detail). Precision u14, default 80.
841  * @reserved3:	reserved
842  * @gd_shading:	Change maximal green disparity level according to square
843  *		distance from image center.
844  * @reserved4:	reserved
845  * @gd_support:	Lower bound for the number of second green color pixels in
846  *		current pixel neighborhood with less than threshold difference
847  *		from it.
848  *
849  * The shading gain coeff of red, green, blue and black are used to calculate
850  * threshold given a pixel's color value and its coordinates in the image.
851  *
852  * @reserved5:	reserved
853  * @gd_clip:	Turn green disparity clip on/off, [0, 1], default 1.
854  * @gd_central_weight:	Central pixel weight in 9 pixels weighted sum.
855  */
856 struct ipu3_uapi_bnr_static_config_green_disparity {
857 	__u32 gd_red:6;
858 	__u32 reserved0:2;
859 	__u32 gd_green:6;
860 	__u32 reserved1:2;
861 	__u32 gd_blue:6;
862 	__u32 reserved2:10;
863 	__u32 gd_black:14;
864 	__u32 reserved3:2;
865 	__u32 gd_shading:7;
866 	__u32 reserved4:1;
867 	__u32 gd_support:2;
868 	__u32 reserved5:1;
869 	__u32 gd_clip:1;
870 	__u32 gd_central_weight:4;
871 } __packed;
872 
873 /**
874  * struct ipu3_uapi_dm_config - De-mosaic parameters
875  *
876  * @dm_en:	de-mosaic enable.
877  * @ch_ar_en:	Checker artifacts removal enable flag. Default 0.
878  * @fcc_en:	False color correction (FCC) enable flag. Default 0.
879  * @reserved0:	reserved
880  * @frame_width:	do not care
881  * @gamma_sc:	Sharpening coefficient (coefficient of 2-d derivation of
882  *		complementary color in Hamilton-Adams interpolation).
883  *		u5, range [0, 31], default 8.
884  * @reserved1:	reserved
885  * @lc_ctrl:	Parameter that controls weights of Chroma Homogeneity metric
886  *		in calculation of final homogeneity metric.
887  *		u5, range [0, 31], default 7.
888  * @reserved2:	reserved
889  * @cr_param1:	First parameter that defines Checker artifact removal
890  *		feature gain. Precision u5, range [0, 31], default 8.
891  * @reserved3:	reserved
892  * @cr_param2:	Second parameter that defines Checker artifact removal
893  *		feature gain. Precision u5, range [0, 31], default 8.
894  * @reserved4:	reserved
895  * @coring_param:	Defines power of false color correction operation.
896  *			low for preserving edge colors, high for preserving gray
897  *			edge artifacts.
898  *			Precision u1.4, range [0, 1.9375], default 4 (0.25).
899  * @reserved5:	reserved
900  *
901  * The demosaic fixed function block is responsible to covert Bayer(mosaiced)
902  * images into color images based on demosaicing algorithm.
903  */
904 struct ipu3_uapi_dm_config {
905 	__u32 dm_en:1;
906 	__u32 ch_ar_en:1;
907 	__u32 fcc_en:1;
908 	__u32 reserved0:13;
909 	__u32 frame_width:16;
910 
911 	__u32 gamma_sc:5;
912 	__u32 reserved1:3;
913 	__u32 lc_ctrl:5;
914 	__u32 reserved2:3;
915 	__u32 cr_param1:5;
916 	__u32 reserved3:3;
917 	__u32 cr_param2:5;
918 	__u32 reserved4:3;
919 
920 	__u32 coring_param:5;
921 	__u32 reserved5:27;
922 } __packed;
923 
924 /**
925  * struct ipu3_uapi_ccm_mat_config - Color correction matrix
926  *
927  * @coeff_m11: CCM 3x3 coefficient, range [-65536, 65535]
928  * @coeff_m12: CCM 3x3 coefficient, range [-8192, 8191]
929  * @coeff_m13: CCM 3x3 coefficient, range [-32768, 32767]
930  * @coeff_o_r: Bias 3x1 coefficient, range [-8191, 8181]
931  * @coeff_m21: CCM 3x3 coefficient, range [-32767, 32767]
932  * @coeff_m22: CCM 3x3 coefficient, range [-8192, 8191]
933  * @coeff_m23: CCM 3x3 coefficient, range [-32768, 32767]
934  * @coeff_o_g: Bias 3x1 coefficient, range [-8191, 8181]
935  * @coeff_m31: CCM 3x3 coefficient, range [-32768, 32767]
936  * @coeff_m32: CCM 3x3 coefficient, range [-8192, 8191]
937  * @coeff_m33: CCM 3x3 coefficient, range [-32768, 32767]
938  * @coeff_o_b: Bias 3x1 coefficient, range [-8191, 8181]
939  *
940  * Transform sensor specific color space to standard sRGB by applying 3x3 matrix
941  * and adding a bias vector O. The transformation is basically a rotation and
942  * translation in the 3-dimensional color spaces. Here are the defaults:
943  *
944  *	9775,	-2671,	1087,	0
945  *	-1071,	8303,	815,	0
946  *	-23,	-7887,	16103,	0
947  */
948 struct ipu3_uapi_ccm_mat_config {
949 	__s16 coeff_m11;
950 	__s16 coeff_m12;
951 	__s16 coeff_m13;
952 	__s16 coeff_o_r;
953 	__s16 coeff_m21;
954 	__s16 coeff_m22;
955 	__s16 coeff_m23;
956 	__s16 coeff_o_g;
957 	__s16 coeff_m31;
958 	__s16 coeff_m32;
959 	__s16 coeff_m33;
960 	__s16 coeff_o_b;
961 } __packed;
962 
963 /**
964  * struct ipu3_uapi_gamma_corr_ctrl - Gamma correction
965  *
966  * @enable: gamma correction enable.
967  * @reserved: reserved
968  */
969 struct ipu3_uapi_gamma_corr_ctrl {
970 	__u32 enable:1;
971 	__u32 reserved:31;
972 } __packed;
973 
974 /**
975  * struct ipu3_uapi_gamma_corr_lut - Per-pixel tone mapping implemented as LUT.
976  *
977  * @lut:	256 tabulated values of the gamma function. LUT[1].. LUT[256]
978  *		format u13.0, range [0, 8191].
979  *
980  * The tone mapping operation is done by a Piece wise linear graph
981  * that is implemented as a lookup table(LUT). The pixel component input
982  * intensity is the X-axis of the graph which is the table entry.
983  */
984 struct ipu3_uapi_gamma_corr_lut {
985 	__u16 lut[IPU3_UAPI_GAMMA_CORR_LUT_ENTRIES];
986 } __packed;
987 
988 /**
989  * struct ipu3_uapi_gamma_config - Gamma config
990  *
991  * @gc_ctrl: control of gamma correction &ipu3_uapi_gamma_corr_ctrl
992  * @gc_lut: lookup table of gamma correction &ipu3_uapi_gamma_corr_lut
993  */
994 struct ipu3_uapi_gamma_config {
995 	struct ipu3_uapi_gamma_corr_ctrl gc_ctrl __attribute__((aligned(32)));
996 	struct ipu3_uapi_gamma_corr_lut gc_lut __attribute__((aligned(32)));
997 } __packed;
998 
999 /**
1000  * struct ipu3_uapi_csc_mat_config - Color space conversion matrix config
1001  *
1002  * @coeff_c11:	Conversion matrix value, format s0.14, range [-16384, 16383].
1003  * @coeff_c12:	Conversion matrix value, format s0.14, range [-8192, 8191].
1004  * @coeff_c13:	Conversion matrix value, format s0.14, range [-16384, 16383].
1005  * @coeff_b1:	Bias 3x1 coefficient, s13.0 range [-8192, 8191].
1006  * @coeff_c21:	Conversion matrix value, format s0.14, range [-16384, 16383].
1007  * @coeff_c22:	Conversion matrix value, format s0.14, range [-8192, 8191].
1008  * @coeff_c23:	Conversion matrix value, format s0.14, range [-16384, 16383].
1009  * @coeff_b2:	Bias 3x1 coefficient, s13.0 range [-8192, 8191].
1010  * @coeff_c31:	Conversion matrix value, format s0.14, range [-16384, 16383].
1011  * @coeff_c32:	Conversion matrix value, format s0.14, range [-8192, 8191].
1012  * @coeff_c33:	Conversion matrix value, format s0.14, range [-16384, 16383].
1013  * @coeff_b3:	Bias 3x1 coefficient, s13.0 range [-8192, 8191].
1014  *
1015  * To transform each pixel from RGB to YUV (Y - brightness/luminance,
1016  * UV -chroma) by applying the pixel's values by a 3x3 matrix and adding an
1017  * optional bias 3x1 vector. Here are the default values for the matrix:
1018  *
1019  *	4898,   9617,  1867, 0,
1020  *	-2410, -4732,  7143, 0,
1021  *	10076, -8437, -1638, 0,
1022  *
1023  *	(i.e. for real number 0.299, 0.299 * 2^14 becomes 4898.)
1024  */
1025 struct ipu3_uapi_csc_mat_config {
1026 	__s16 coeff_c11;
1027 	__s16 coeff_c12;
1028 	__s16 coeff_c13;
1029 	__s16 coeff_b1;
1030 	__s16 coeff_c21;
1031 	__s16 coeff_c22;
1032 	__s16 coeff_c23;
1033 	__s16 coeff_b2;
1034 	__s16 coeff_c31;
1035 	__s16 coeff_c32;
1036 	__s16 coeff_c33;
1037 	__s16 coeff_b3;
1038 } __packed;
1039 
1040 /**
1041  * struct ipu3_uapi_cds_params - Chroma down-scaling
1042  *
1043  * @ds_c00:	range [0, 3]
1044  * @ds_c01:	range [0, 3]
1045  * @ds_c02:	range [0, 3]
1046  * @ds_c03:	range [0, 3]
1047  * @ds_c10:	range [0, 3]
1048  * @ds_c11:	range [0, 3]
1049  * @ds_c12:	range [0, 3]
1050  * @ds_c13:	range [0, 3]
1051  *
1052  * In case user does not provide, above 4x2 filter will use following defaults:
1053  *	1, 3, 3, 1,
1054  *	1, 3, 3, 1,
1055  *
1056  * @ds_nf:	Normalization factor for Chroma output downscaling filter,
1057  *		range 0,4, default 2.
1058  * @reserved0:	reserved
1059  * @csc_en:	Color space conversion enable
1060  * @uv_bin_output:	0: output YUV 4.2.0, 1: output YUV 4.2.2(default).
1061  * @reserved1:	reserved
1062  */
1063 struct ipu3_uapi_cds_params {
1064 	__u32 ds_c00:2;
1065 	__u32 ds_c01:2;
1066 	__u32 ds_c02:2;
1067 	__u32 ds_c03:2;
1068 	__u32 ds_c10:2;
1069 	__u32 ds_c11:2;
1070 	__u32 ds_c12:2;
1071 	__u32 ds_c13:2;
1072 	__u32 ds_nf:5;
1073 	__u32 reserved0:3;
1074 	__u32 csc_en:1;
1075 	__u32 uv_bin_output:1;
1076 	__u32 reserved1:6;
1077 } __packed;
1078 
1079 /**
1080  * struct ipu3_uapi_shd_grid_config - Bayer shading(darkening) correction
1081  *
1082  * @width:	Grid horizontal dimensions, u8, [8, 128], default 73
1083  * @height:	Grid vertical dimensions, u8, [8, 128], default 56
1084  * @block_width_log2:	Log2 of the width of the grid cell in pixel count
1085  *			u4, [0, 15], default value 5.
1086  * @reserved0:	reserved
1087  * @block_height_log2:	Log2 of the height of the grid cell in pixel count
1088  *			u4, [0, 15], default value 6.
1089  * @reserved1:	reserved
1090  * @grid_height_per_slice:	SHD_MAX_CELLS_PER_SET/width.
1091  *				(with SHD_MAX_CELLS_PER_SET = 146).
1092  * @x_start:	X value of top left corner of sensor relative to ROI
1093  *		s13, [-4096, 0], default 0, only negative values.
1094  * @y_start:	Y value of top left corner of sensor relative to ROI
1095  *		s13, [-4096, 0], default 0, only negative values.
1096  */
1097 struct ipu3_uapi_shd_grid_config {
1098 	/* reg 0 */
1099 	__u8 width;
1100 	__u8 height;
1101 	__u8 block_width_log2:3;
1102 	__u8 reserved0:1;
1103 	__u8 block_height_log2:3;
1104 	__u8 reserved1:1;
1105 	__u8 grid_height_per_slice;
1106 	/* reg 1 */
1107 	__s16 x_start;
1108 	__s16 y_start;
1109 } __packed;
1110 
1111 /**
1112  * struct ipu3_uapi_shd_general_config - Shading general config
1113  *
1114  * @init_set_vrt_offst_ul: set vertical offset,
1115  *			y_start >> block_height_log2 % grid_height_per_slice.
1116  * @shd_enable: shading enable.
1117  * @gain_factor: Gain factor. Shift calculated anti shading value. Precision u2.
1118  *		0x0 - gain factor [1, 5], means no shift interpolated value.
1119  *		0x1 - gain factor [1, 9], means shift interpolated by 1.
1120  *		0x2 - gain factor [1, 17], means shift interpolated by 2.
1121  * @reserved: reserved
1122  *
1123  * Correction is performed by multiplying a gain factor for each of the 4 Bayer
1124  * channels as a function of the pixel location in the sensor.
1125  */
1126 struct ipu3_uapi_shd_general_config {
1127 	__u32 init_set_vrt_offst_ul:8;
1128 	__u32 shd_enable:1;
1129 	__u32 gain_factor:2;
1130 	__u32 reserved:21;
1131 } __packed;
1132 
1133 /**
1134  * struct ipu3_uapi_shd_black_level_config - Black level correction
1135  *
1136  * @bl_r:	Bios values for green red. s11 range [-2048, 2047].
1137  * @bl_gr:	Bios values for green blue. s11 range [-2048, 2047].
1138  * @bl_gb:	Bios values for red. s11 range [-2048, 2047].
1139  * @bl_b:	Bios values for blue. s11 range [-2048, 2047].
1140  */
1141 struct ipu3_uapi_shd_black_level_config {
1142 	__s16 bl_r;
1143 	__s16 bl_gr;
1144 	__s16 bl_gb;
1145 	__s16 bl_b;
1146 } __packed;
1147 
1148 /**
1149  * struct ipu3_uapi_shd_config_static - Shading config static
1150  *
1151  * @grid:	shading grid config &ipu3_uapi_shd_grid_config
1152  * @general:	shading general config &ipu3_uapi_shd_general_config
1153  * @black_level:	black level config for shading correction as defined by
1154  *			&ipu3_uapi_shd_black_level_config
1155  */
1156 struct ipu3_uapi_shd_config_static {
1157 	struct ipu3_uapi_shd_grid_config grid;
1158 	struct ipu3_uapi_shd_general_config general;
1159 	struct ipu3_uapi_shd_black_level_config black_level;
1160 } __packed;
1161 
1162 /**
1163  * struct ipu3_uapi_shd_lut - Shading gain factor lookup table.
1164  *
1165  * @sets: array
1166  * @sets.r_and_gr: Red and GreenR Lookup table.
1167  * @sets.r_and_gr.r: Red shading factor.
1168  * @sets.r_and_gr.gr: GreenR shading factor.
1169  * @sets.reserved1: reserved
1170  * @sets.gb_and_b: GreenB and Blue Lookup table.
1171  * @sets.gb_and_b.gb: GreenB shading factor.
1172  * @sets.gb_and_b.b: Blue shading factor.
1173  * @sets.reserved2: reserved
1174  *
1175  * Map to shading correction LUT register set.
1176  */
1177 struct ipu3_uapi_shd_lut {
1178 	struct {
1179 		struct {
1180 			__u16 r;
1181 			__u16 gr;
1182 		} r_and_gr[IPU3_UAPI_SHD_MAX_CELLS_PER_SET];
1183 		__u8 reserved1[24];
1184 		struct {
1185 			__u16 gb;
1186 			__u16 b;
1187 		} gb_and_b[IPU3_UAPI_SHD_MAX_CELLS_PER_SET];
1188 		__u8 reserved2[24];
1189 	} sets[IPU3_UAPI_SHD_MAX_CFG_SETS];
1190 } __packed;
1191 
1192 /**
1193  * struct ipu3_uapi_shd_config - Shading config
1194  *
1195  * @shd:	shading static config, see &ipu3_uapi_shd_config_static
1196  * @shd_lut:	shading lookup table &ipu3_uapi_shd_lut
1197  */
1198 struct ipu3_uapi_shd_config {
1199 	struct ipu3_uapi_shd_config_static shd __attribute__((aligned(32)));
1200 	struct ipu3_uapi_shd_lut shd_lut __attribute__((aligned(32)));
1201 } __packed;
1202 
1203 /* Image Enhancement Filter directed */
1204 
1205 /**
1206  * struct ipu3_uapi_iefd_cux2 - IEFd Config Unit 2 parameters
1207  *
1208  * @x0:		X0 point of Config Unit, u9.0, default 0.
1209  * @x1:		X1 point of Config Unit, u9.0, default 0.
1210  * @a01:	Slope A of Config Unit, s4.4, default 0.
1211  * @b01:	Slope B, always 0.
1212  *
1213  * Calculate weight for blending directed and non-directed denoise elements
1214  *
1215  * Note:
1216  * Each instance of Config Unit needs X coordinate of n points and
1217  * slope A factor between points calculated by driver based on calibration
1218  * parameters.
1219  *
1220  * All CU inputs are unsigned, they will be converted to signed when written
1221  * to register, i.e. a01 will be written to 9 bit register in s4.4 format.
1222  * The data precision s4.4 means 4 bits for integer parts and 4 bits for the
1223  * fractional part, the first bit indicates positive or negative value.
1224  * For userspace software (commonly the imaging library), the computation for
1225  * the CU slope values should be based on the slope resolution 1/16 (binary
1226  * 0.0001 - the minimal interval value), the slope value range is [-256, +255].
1227  * This applies to &ipu3_uapi_iefd_cux6_ed, &ipu3_uapi_iefd_cux2_1,
1228  * &ipu3_uapi_iefd_cux2_1, &ipu3_uapi_iefd_cux4 and &ipu3_uapi_iefd_cux6_rad.
1229  */
1230 struct ipu3_uapi_iefd_cux2 {
1231 	__u32 x0:9;
1232 	__u32 x1:9;
1233 	__u32 a01:9;
1234 	__u32 b01:5;
1235 } __packed;
1236 
1237 /**
1238  * struct ipu3_uapi_iefd_cux6_ed - Calculate power of non-directed sharpening
1239  *				   element, Config Unit 6 for edge detail (ED).
1240  *
1241  * @x0:	X coordinate of point 0, u9.0, default 0.
1242  * @x1:	X coordinate of point 1, u9.0, default 0.
1243  * @x2:	X coordinate of point 2, u9.0, default 0.
1244  * @reserved0:	reserved
1245  * @x3:	X coordinate of point 3, u9.0, default 0.
1246  * @x4:	X coordinate of point 4, u9.0, default 0.
1247  * @x5:	X coordinate of point 5, u9.0, default 0.
1248  * @reserved1:	reserved
1249  * @a01:	slope A points 01, s4.4, default 0.
1250  * @a12:	slope A points 12, s4.4, default 0.
1251  * @a23:	slope A points 23, s4.4, default 0.
1252  * @reserved2:	reserved
1253  * @a34:	slope A points 34, s4.4, default 0.
1254  * @a45:	slope A points 45, s4.4, default 0.
1255  * @reserved3:	reserved
1256  * @b01:	slope B points 01, s4.4, default 0.
1257  * @b12:	slope B points 12, s4.4, default 0.
1258  * @b23:	slope B points 23, s4.4, default 0.
1259  * @reserved4:	reserved
1260  * @b34:	slope B points 34, s4.4, default 0.
1261  * @b45:	slope B points 45, s4.4, default 0.
1262  * @reserved5:	reserved.
1263  */
1264 struct ipu3_uapi_iefd_cux6_ed {
1265 	__u32 x0:9;
1266 	__u32 x1:9;
1267 	__u32 x2:9;
1268 	__u32 reserved0:5;
1269 
1270 	__u32 x3:9;
1271 	__u32 x4:9;
1272 	__u32 x5:9;
1273 	__u32 reserved1:5;
1274 
1275 	__u32 a01:9;
1276 	__u32 a12:9;
1277 	__u32 a23:9;
1278 	__u32 reserved2:5;
1279 
1280 	__u32 a34:9;
1281 	__u32 a45:9;
1282 	__u32 reserved3:14;
1283 
1284 	__u32 b01:9;
1285 	__u32 b12:9;
1286 	__u32 b23:9;
1287 	__u32 reserved4:5;
1288 
1289 	__u32 b34:9;
1290 	__u32 b45:9;
1291 	__u32 reserved5:14;
1292 } __packed;
1293 
1294 /**
1295  * struct ipu3_uapi_iefd_cux2_1 - Calculate power of non-directed denoise
1296  *				  element apply.
1297  * @x0: X0 point of Config Unit, u9.0, default 0.
1298  * @x1: X1 point of Config Unit, u9.0, default 0.
1299  * @a01: Slope A of Config Unit, s4.4, default 0.
1300  * @reserved1: reserved
1301  * @b01: offset B0 of Config Unit, u7.0, default 0.
1302  * @reserved2: reserved
1303  */
1304 struct ipu3_uapi_iefd_cux2_1 {
1305 	__u32 x0:9;
1306 	__u32 x1:9;
1307 	__u32 a01:9;
1308 	__u32 reserved1:5;
1309 
1310 	__u32 b01:8;
1311 	__u32 reserved2:24;
1312 } __packed;
1313 
1314 /**
1315  * struct ipu3_uapi_iefd_cux4 - Calculate power of non-directed sharpening
1316  *				element.
1317  *
1318  * @x0:	X0 point of Config Unit, u9.0, default 0.
1319  * @x1:	X1 point of Config Unit, u9.0, default 0.
1320  * @x2:	X2 point of Config Unit, u9.0, default 0.
1321  * @reserved0:	reserved
1322  * @x3:	X3 point of Config Unit, u9.0, default 0.
1323  * @a01:	Slope A0 of Config Unit, s4.4, default 0.
1324  * @a12:	Slope A1 of Config Unit, s4.4, default 0.
1325  * @reserved1:	reserved
1326  * @a23:	Slope A2 of Config Unit, s4.4, default 0.
1327  * @b01:	Offset B0 of Config Unit, s7.0, default 0.
1328  * @b12:	Offset B1 of Config Unit, s7.0, default 0.
1329  * @reserved2:	reserved
1330  * @b23:	Offset B2 of Config Unit, s7.0, default 0.
1331  * @reserved3: reserved
1332  */
1333 struct ipu3_uapi_iefd_cux4 {
1334 	__u32 x0:9;
1335 	__u32 x1:9;
1336 	__u32 x2:9;
1337 	__u32 reserved0:5;
1338 
1339 	__u32 x3:9;
1340 	__u32 a01:9;
1341 	__u32 a12:9;
1342 	__u32 reserved1:5;
1343 
1344 	__u32 a23:9;
1345 	__u32 b01:8;
1346 	__u32 b12:8;
1347 	__u32 reserved2:7;
1348 
1349 	__u32 b23:8;
1350 	__u32 reserved3:24;
1351 } __packed;
1352 
1353 /**
1354  * struct ipu3_uapi_iefd_cux6_rad - Radial Config Unit (CU)
1355  *
1356  * @x0:	x0 points of Config Unit radial, u8.0
1357  * @x1:	x1 points of Config Unit radial, u8.0
1358  * @x2:	x2 points of Config Unit radial, u8.0
1359  * @x3:	x3 points of Config Unit radial, u8.0
1360  * @x4:	x4 points of Config Unit radial, u8.0
1361  * @x5:	x5 points of Config Unit radial, u8.0
1362  * @reserved1: reserved
1363  * @a01:	Slope A of Config Unit radial, s7.8
1364  * @a12:	Slope A of Config Unit radial, s7.8
1365  * @a23:	Slope A of Config Unit radial, s7.8
1366  * @a34:	Slope A of Config Unit radial, s7.8
1367  * @a45:	Slope A of Config Unit radial, s7.8
1368  * @reserved2: reserved
1369  * @b01:	Slope B of Config Unit radial, s9.0
1370  * @b12:	Slope B of Config Unit radial, s9.0
1371  * @b23:	Slope B of Config Unit radial, s9.0
1372  * @reserved4: reserved
1373  * @b34:	Slope B of Config Unit radial, s9.0
1374  * @b45:	Slope B of Config Unit radial, s9.0
1375  * @reserved5: reserved
1376  */
1377 struct ipu3_uapi_iefd_cux6_rad {
1378 	__u32 x0:8;
1379 	__u32 x1:8;
1380 	__u32 x2:8;
1381 	__u32 x3:8;
1382 
1383 	__u32 x4:8;
1384 	__u32 x5:8;
1385 	__u32 reserved1:16;
1386 
1387 	__u32 a01:16;
1388 	__u32 a12:16;
1389 
1390 	__u32 a23:16;
1391 	__u32 a34:16;
1392 
1393 	__u32 a45:16;
1394 	__u32 reserved2:16;
1395 
1396 	__u32 b01:10;
1397 	__u32 b12:10;
1398 	__u32 b23:10;
1399 	__u32 reserved4:2;
1400 
1401 	__u32 b34:10;
1402 	__u32 b45:10;
1403 	__u32 reserved5:12;
1404 } __packed;
1405 
1406 /**
1407  * struct ipu3_uapi_yuvp1_iefd_cfg_units - IEFd Config Units parameters
1408  *
1409  * @cu_1: calculate weight for blending directed and
1410  *	  non-directed denoise elements. See &ipu3_uapi_iefd_cux2
1411  * @cu_ed: calculate power of non-directed sharpening element, see
1412  *	   &ipu3_uapi_iefd_cux6_ed
1413  * @cu_3: calculate weight for blending directed and
1414  *	  non-directed denoise elements. A &ipu3_uapi_iefd_cux2
1415  * @cu_5: calculate power of non-directed denoise element apply, use
1416  *	  &ipu3_uapi_iefd_cux2_1
1417  * @cu_6: calculate power of non-directed sharpening element. See
1418  *	  &ipu3_uapi_iefd_cux4
1419  * @cu_7: calculate weight for blending directed and
1420  *	  non-directed denoise elements. Use &ipu3_uapi_iefd_cux2
1421  * @cu_unsharp: Config Unit of unsharp &ipu3_uapi_iefd_cux4
1422  * @cu_radial: Config Unit of radial &ipu3_uapi_iefd_cux6_rad
1423  * @cu_vssnlm: Config Unit of vssnlm &ipu3_uapi_iefd_cux2
1424  */
1425 struct ipu3_uapi_yuvp1_iefd_cfg_units {
1426 	struct ipu3_uapi_iefd_cux2 cu_1;
1427 	struct ipu3_uapi_iefd_cux6_ed cu_ed;
1428 	struct ipu3_uapi_iefd_cux2 cu_3;
1429 	struct ipu3_uapi_iefd_cux2_1 cu_5;
1430 	struct ipu3_uapi_iefd_cux4 cu_6;
1431 	struct ipu3_uapi_iefd_cux2 cu_7;
1432 	struct ipu3_uapi_iefd_cux4 cu_unsharp;
1433 	struct ipu3_uapi_iefd_cux6_rad cu_radial;
1434 	struct ipu3_uapi_iefd_cux2 cu_vssnlm;
1435 } __packed;
1436 
1437 /**
1438  * struct ipu3_uapi_yuvp1_iefd_config_s - IEFd config
1439  *
1440  * @horver_diag_coeff: Gradient compensation. Compared with vertical /
1441  *		       horizontal (0 / 90 degree), coefficient of diagonal (45 /
1442  *		       135 degree) direction should be corrected by approx.
1443  *		       1/sqrt(2).
1444  * @reserved0: reserved
1445  * @clamp_stitch: Slope to stitch between clamped and unclamped edge values
1446  * @reserved1: reserved
1447  * @direct_metric_update: Update coeff for direction metric
1448  * @reserved2: reserved
1449  * @ed_horver_diag_coeff: Radial Coefficient that compensates for
1450  *			  different distance for vertical/horizontal and
1451  *			  diagonal gradient calculation (approx. 1/sqrt(2))
1452  * @reserved3: reserved
1453  */
1454 struct ipu3_uapi_yuvp1_iefd_config_s {
1455 	__u32 horver_diag_coeff:7;
1456 	__u32 reserved0:1;
1457 	__u32 clamp_stitch:6;
1458 	__u32 reserved1:2;
1459 	__u32 direct_metric_update:5;
1460 	__u32 reserved2:3;
1461 	__u32 ed_horver_diag_coeff:7;
1462 	__u32 reserved3:1;
1463 } __packed;
1464 
1465 /**
1466  * struct ipu3_uapi_yuvp1_iefd_control - IEFd control
1467  *
1468  * @iefd_en:	Enable IEFd
1469  * @denoise_en:	Enable denoise
1470  * @direct_smooth_en:	Enable directional smooth
1471  * @rad_en:	Enable radial update
1472  * @vssnlm_en:	Enable VSSNLM output filter
1473  * @reserved:	reserved
1474  */
1475 struct ipu3_uapi_yuvp1_iefd_control {
1476 	__u32 iefd_en:1;
1477 	__u32 denoise_en:1;
1478 	__u32 direct_smooth_en:1;
1479 	__u32 rad_en:1;
1480 	__u32 vssnlm_en:1;
1481 	__u32 reserved:27;
1482 } __packed;
1483 
1484 /**
1485  * struct ipu3_uapi_sharp_cfg - Sharpening config
1486  *
1487  * @nega_lmt_txt: Sharpening limit for negative overshoots for texture.
1488  * @reserved0: reserved
1489  * @posi_lmt_txt: Sharpening limit for positive overshoots for texture.
1490  * @reserved1: reserved
1491  * @nega_lmt_dir: Sharpening limit for negative overshoots for direction (edge).
1492  * @reserved2: reserved
1493  * @posi_lmt_dir: Sharpening limit for positive overshoots for direction (edge).
1494  * @reserved3: reserved
1495  *
1496  * Fixed point type u13.0, range [0, 8191].
1497  */
1498 struct ipu3_uapi_sharp_cfg {
1499 	__u32 nega_lmt_txt:13;
1500 	__u32 reserved0:19;
1501 	__u32 posi_lmt_txt:13;
1502 	__u32 reserved1:19;
1503 	__u32 nega_lmt_dir:13;
1504 	__u32 reserved2:19;
1505 	__u32 posi_lmt_dir:13;
1506 	__u32 reserved3:19;
1507 } __packed;
1508 
1509 /**
1510  * struct ipu3_uapi_far_w - Sharpening config for far sub-group
1511  *
1512  * @dir_shrp:	Weight of wide direct sharpening, u1.6, range [0, 64], default 64.
1513  * @reserved0:	reserved
1514  * @dir_dns:	Weight of wide direct denoising, u1.6, range [0, 64], default 0.
1515  * @reserved1:	reserved
1516  * @ndir_dns_powr:	Power of non-direct denoising,
1517  *			Precision u1.6, range [0, 64], default 64.
1518  * @reserved2:	reserved
1519  */
1520 struct ipu3_uapi_far_w {
1521 	__u32 dir_shrp:7;
1522 	__u32 reserved0:1;
1523 	__u32 dir_dns:7;
1524 	__u32 reserved1:1;
1525 	__u32 ndir_dns_powr:7;
1526 	__u32 reserved2:9;
1527 } __packed;
1528 
1529 /**
1530  * struct ipu3_uapi_unsharp_cfg - Unsharp config
1531  *
1532  * @unsharp_weight: Unsharp mask blending weight.
1533  *		    u1.6, range [0, 64], default 16.
1534  *		    0 - disabled, 64 - use only unsharp.
1535  * @reserved0: reserved
1536  * @unsharp_amount: Unsharp mask amount, u4.5, range [0, 511], default 0.
1537  * @reserved1: reserved
1538  */
1539 struct ipu3_uapi_unsharp_cfg {
1540 	__u32 unsharp_weight:7;
1541 	__u32 reserved0:1;
1542 	__u32 unsharp_amount:9;
1543 	__u32 reserved1:15;
1544 } __packed;
1545 
1546 /**
1547  * struct ipu3_uapi_yuvp1_iefd_shrp_cfg - IEFd sharpness config
1548  *
1549  * @cfg: sharpness config &ipu3_uapi_sharp_cfg
1550  * @far_w: wide range config, value as specified by &ipu3_uapi_far_w:
1551  *	The 5x5 environment is separated into 2 sub-groups, the 3x3 nearest
1552  *	neighbors (8 pixels called Near), and the second order neighborhood
1553  *	around them (16 pixels called Far).
1554  * @unshrp_cfg: unsharpness config. &ipu3_uapi_unsharp_cfg
1555  */
1556 struct ipu3_uapi_yuvp1_iefd_shrp_cfg {
1557 	struct ipu3_uapi_sharp_cfg cfg;
1558 	struct ipu3_uapi_far_w far_w;
1559 	struct ipu3_uapi_unsharp_cfg unshrp_cfg;
1560 } __packed;
1561 
1562 /**
1563  * struct ipu3_uapi_unsharp_coef0 - Unsharp mask coefficients
1564  *
1565  * @c00: Coeff11, s0.8, range [-255, 255], default 1.
1566  * @c01: Coeff12, s0.8, range [-255, 255], default 5.
1567  * @c02: Coeff13, s0.8, range [-255, 255], default 9.
1568  * @reserved: reserved
1569  *
1570  * Configurable registers for common sharpening support.
1571  */
1572 struct ipu3_uapi_unsharp_coef0 {
1573 	__u32 c00:9;
1574 	__u32 c01:9;
1575 	__u32 c02:9;
1576 	__u32 reserved:5;
1577 } __packed;
1578 
1579 /**
1580  * struct ipu3_uapi_unsharp_coef1 - Unsharp mask coefficients
1581  *
1582  * @c11: Coeff22, s0.8, range [-255, 255], default 29.
1583  * @c12: Coeff23, s0.8, range [-255, 255], default 55.
1584  * @c22: Coeff33, s0.8, range [-255, 255], default 96.
1585  * @reserved: reserved
1586  */
1587 struct ipu3_uapi_unsharp_coef1 {
1588 	__u32 c11:9;
1589 	__u32 c12:9;
1590 	__u32 c22:9;
1591 	__u32 reserved:5;
1592 } __packed;
1593 
1594 /**
1595  * struct ipu3_uapi_yuvp1_iefd_unshrp_cfg - Unsharp mask config
1596  *
1597  * @unsharp_coef0: unsharp coefficient 0 config. See &ipu3_uapi_unsharp_coef0
1598  * @unsharp_coef1: unsharp coefficient 1 config. See &ipu3_uapi_unsharp_coef1
1599  */
1600 struct ipu3_uapi_yuvp1_iefd_unshrp_cfg {
1601 	struct ipu3_uapi_unsharp_coef0 unsharp_coef0;
1602 	struct ipu3_uapi_unsharp_coef1 unsharp_coef1;
1603 } __packed;
1604 
1605 /**
1606  * struct ipu3_uapi_radial_reset_xy - Radial coordinate reset
1607  *
1608  * @x:	Radial reset of x coordinate. Precision s12, [-4095, 4095], default 0.
1609  * @reserved0:	reserved
1610  * @y:	Radial center y coordinate. Precision s12, [-4095, 4095], default 0.
1611  * @reserved1:	reserved
1612  */
1613 struct ipu3_uapi_radial_reset_xy {
1614 	__s32 x:13;
1615 	__u32 reserved0:3;
1616 	__s32 y:13;
1617 	__u32 reserved1:3;
1618 } __packed;
1619 
1620 /**
1621  * struct ipu3_uapi_radial_reset_x2 - Radial X^2 reset
1622  *
1623  * @x2:	Radial reset of x^2 coordinate. Precision u24, default 0.
1624  * @reserved:	reserved
1625  */
1626 struct ipu3_uapi_radial_reset_x2 {
1627 	__u32 x2:24;
1628 	__u32 reserved:8;
1629 } __packed;
1630 
1631 /**
1632  * struct ipu3_uapi_radial_reset_y2 - Radial Y^2 reset
1633  *
1634  * @y2:	Radial reset of y^2 coordinate. Precision u24, default 0.
1635  * @reserved:	reserved
1636  */
1637 struct ipu3_uapi_radial_reset_y2 {
1638 	__u32 y2:24;
1639 	__u32 reserved:8;
1640 } __packed;
1641 
1642 /**
1643  * struct ipu3_uapi_radial_cfg - Radial config
1644  *
1645  * @rad_nf: Radial. R^2 normalization factor is scale down by 2^ - (15 + scale)
1646  * @reserved0: reserved
1647  * @rad_inv_r2: Radial R^-2 normelized to (0.5..1).
1648  *		Precision u7, range [0, 127].
1649  * @reserved1: reserved
1650  */
1651 struct ipu3_uapi_radial_cfg {
1652 	__u32 rad_nf:4;
1653 	__u32 reserved0:4;
1654 	__u32 rad_inv_r2:7;
1655 	__u32 reserved1:17;
1656 } __packed;
1657 
1658 /**
1659  * struct ipu3_uapi_rad_far_w - Radial FAR sub-group
1660  *
1661  * @rad_dir_far_sharp_w: Weight of wide direct sharpening, u1.6, range [0, 64],
1662  *			 default 64.
1663  * @rad_dir_far_dns_w: Weight of wide direct denoising, u1.6, range [0, 64],
1664  *			 default 0.
1665  * @rad_ndir_far_dns_power: power of non-direct sharpening, u1.6, range [0, 64],
1666  *			 default 0.
1667  * @reserved: reserved
1668  */
1669 struct ipu3_uapi_rad_far_w {
1670 	__u32 rad_dir_far_sharp_w:8;
1671 	__u32 rad_dir_far_dns_w:8;
1672 	__u32 rad_ndir_far_dns_power:8;
1673 	__u32 reserved:8;
1674 } __packed;
1675 
1676 /**
1677  * struct ipu3_uapi_cu_cfg0 - Radius Config Unit cfg0 register
1678  *
1679  * @cu6_pow: Power of CU6. Power of non-direct sharpening, u3.4.
1680  * @reserved0: reserved
1681  * @cu_unsharp_pow: Power of unsharp mask, u2.4.
1682  * @reserved1: reserved
1683  * @rad_cu6_pow: Radial/corner CU6. Directed sharpening power, u3.4.
1684  * @reserved2: reserved
1685  * @rad_cu_unsharp_pow: Radial power of unsharp mask, u2.4.
1686  * @reserved3: reserved
1687  */
1688 struct ipu3_uapi_cu_cfg0 {
1689 	__u32 cu6_pow:7;
1690 	__u32 reserved0:1;
1691 	__u32 cu_unsharp_pow:7;
1692 	__u32 reserved1:1;
1693 	__u32 rad_cu6_pow:7;
1694 	__u32 reserved2:1;
1695 	__u32 rad_cu_unsharp_pow:6;
1696 	__u32 reserved3:2;
1697 } __packed;
1698 
1699 /**
1700  * struct ipu3_uapi_cu_cfg1 - Radius Config Unit cfg1 register
1701  *
1702  * @rad_cu6_x1: X1 point of Config Unit 6, precision u9.0.
1703  * @reserved0: reserved
1704  * @rad_cu_unsharp_x1: X1 point for Config Unit unsharp for radial/corner point
1705  *			precision u9.0.
1706  * @reserved1: reserved
1707  */
1708 struct ipu3_uapi_cu_cfg1 {
1709 	__u32 rad_cu6_x1:9;
1710 	__u32 reserved0:1;
1711 	__u32 rad_cu_unsharp_x1:9;
1712 	__u32 reserved1:13;
1713 } __packed;
1714 
1715 /**
1716  * struct ipu3_uapi_yuvp1_iefd_rad_cfg - IEFd parameters changed radially over
1717  *					 the picture plane.
1718  *
1719  * @reset_xy: reset xy value in radial calculation. &ipu3_uapi_radial_reset_xy
1720  * @reset_x2: reset x square value in radial calculation. See struct
1721  *	      &ipu3_uapi_radial_reset_x2
1722  * @reset_y2: reset y square value in radial calculation. See struct
1723  *	      &ipu3_uapi_radial_reset_y2
1724  * @cfg: radial config defined in &ipu3_uapi_radial_cfg
1725  * @rad_far_w: weight for wide range radial. &ipu3_uapi_rad_far_w
1726  * @cu_cfg0: configuration unit 0. See &ipu3_uapi_cu_cfg0
1727  * @cu_cfg1: configuration unit 1. See &ipu3_uapi_cu_cfg1
1728  */
1729 struct ipu3_uapi_yuvp1_iefd_rad_cfg {
1730 	struct ipu3_uapi_radial_reset_xy reset_xy;
1731 	struct ipu3_uapi_radial_reset_x2 reset_x2;
1732 	struct ipu3_uapi_radial_reset_y2 reset_y2;
1733 	struct ipu3_uapi_radial_cfg cfg;
1734 	struct ipu3_uapi_rad_far_w rad_far_w;
1735 	struct ipu3_uapi_cu_cfg0 cu_cfg0;
1736 	struct ipu3_uapi_cu_cfg1 cu_cfg1;
1737 } __packed;
1738 
1739 /* Vssnlm - Very small scale non-local mean algorithm */
1740 
1741 /**
1742  * struct ipu3_uapi_vss_lut_x - Vssnlm LUT x0/x1/x2
1743  *
1744  * @vs_x0: Vssnlm LUT x0, precision u8, range [0, 255], default 16.
1745  * @vs_x1: Vssnlm LUT x1, precision u8, range [0, 255], default 32.
1746  * @vs_x2: Vssnlm LUT x2, precision u8, range [0, 255], default 64.
1747  * @reserved2: reserved
1748  */
1749 struct ipu3_uapi_vss_lut_x {
1750 	__u32 vs_x0:8;
1751 	__u32 vs_x1:8;
1752 	__u32 vs_x2:8;
1753 	__u32 reserved2:8;
1754 } __packed;
1755 
1756 /**
1757  * struct ipu3_uapi_vss_lut_y - Vssnlm LUT y0/y1/y2
1758  *
1759  * @vs_y1: Vssnlm LUT y1, precision u4, range [0, 8], default 1.
1760  * @reserved0: reserved
1761  * @vs_y2: Vssnlm LUT y2, precision u4, range [0, 8], default 3.
1762  * @reserved1: reserved
1763  * @vs_y3: Vssnlm LUT y3, precision u4, range [0, 8], default 8.
1764  * @reserved2: reserved
1765  */
1766 struct ipu3_uapi_vss_lut_y {
1767 	__u32 vs_y1:4;
1768 	__u32 reserved0:4;
1769 	__u32 vs_y2:4;
1770 	__u32 reserved1:4;
1771 	__u32 vs_y3:4;
1772 	__u32 reserved2:12;
1773 } __packed;
1774 
1775 /**
1776  * struct ipu3_uapi_yuvp1_iefd_vssnlm_cfg - IEFd Vssnlm Lookup table
1777  *
1778  * @vss_lut_x: vss lookup table. See &ipu3_uapi_vss_lut_x description
1779  * @vss_lut_y: vss lookup table. See &ipu3_uapi_vss_lut_y description
1780  */
1781 struct ipu3_uapi_yuvp1_iefd_vssnlm_cfg {
1782 	struct ipu3_uapi_vss_lut_x vss_lut_x;
1783 	struct ipu3_uapi_vss_lut_y vss_lut_y;
1784 } __packed;
1785 
1786 /**
1787  * struct ipu3_uapi_yuvp1_iefd_config - IEFd config
1788  *
1789  * @units: configuration unit setting, &ipu3_uapi_yuvp1_iefd_cfg_units
1790  * @config: configuration, as defined by &ipu3_uapi_yuvp1_iefd_config_s
1791  * @control: control setting, as defined by &ipu3_uapi_yuvp1_iefd_control
1792  * @sharp: sharpness setting, as defined by &ipu3_uapi_yuvp1_iefd_shrp_cfg
1793  * @unsharp: unsharpness setting, as defined by &ipu3_uapi_yuvp1_iefd_unshrp_cfg
1794  * @rad: radial setting, as defined by &ipu3_uapi_yuvp1_iefd_rad_cfg
1795  * @vsslnm: vsslnm setting, as defined by &ipu3_uapi_yuvp1_iefd_vssnlm_cfg
1796  */
1797 struct ipu3_uapi_yuvp1_iefd_config {
1798 	struct ipu3_uapi_yuvp1_iefd_cfg_units units;
1799 	struct ipu3_uapi_yuvp1_iefd_config_s config;
1800 	struct ipu3_uapi_yuvp1_iefd_control control;
1801 	struct ipu3_uapi_yuvp1_iefd_shrp_cfg sharp;
1802 	struct ipu3_uapi_yuvp1_iefd_unshrp_cfg unsharp;
1803 	struct ipu3_uapi_yuvp1_iefd_rad_cfg rad;
1804 	struct ipu3_uapi_yuvp1_iefd_vssnlm_cfg vsslnm;
1805 } __packed;
1806 
1807 /**
1808  * struct ipu3_uapi_yuvp1_yds_config - Y Down-Sampling config
1809  *
1810  * @c00: range [0, 3], default 0x0
1811  * @c01: range [0, 3], default 0x1
1812  * @c02: range [0, 3], default 0x1
1813  * @c03: range [0, 3], default 0x0
1814  * @c10: range [0, 3], default 0x0
1815  * @c11: range [0, 3], default 0x1
1816  * @c12: range [0, 3], default 0x1
1817  * @c13: range [0, 3], default 0x0
1818  *
1819  * Above are 4x2 filter coefficients for chroma output downscaling.
1820  *
1821  * @norm_factor: Normalization factor, range [0, 4], default 2
1822  *		0 - divide by 1
1823  *		1 - divide by 2
1824  *		2 - divide by 4
1825  *		3 - divide by 8
1826  *		4 - divide by 16
1827  * @reserved0: reserved
1828  * @bin_output: Down sampling on Luma channel in two optional modes
1829  *		0 - Bin output 4.2.0 (default), 1 output 4.2.2.
1830  * @reserved1: reserved
1831  */
1832 struct ipu3_uapi_yuvp1_yds_config {
1833 	__u32 c00:2;
1834 	__u32 c01:2;
1835 	__u32 c02:2;
1836 	__u32 c03:2;
1837 	__u32 c10:2;
1838 	__u32 c11:2;
1839 	__u32 c12:2;
1840 	__u32 c13:2;
1841 	__u32 norm_factor:5;
1842 	__u32 reserved0:4;
1843 	__u32 bin_output:1;
1844 	__u32 reserved1:6;
1845 } __packed;
1846 
1847 /* Chroma Noise Reduction */
1848 
1849 /**
1850  * struct ipu3_uapi_yuvp1_chnr_enable_config - Chroma noise reduction enable
1851  *
1852  * @enable: enable/disable chroma noise reduction
1853  * @yuv_mode: 0 - YUV420, 1 - YUV422
1854  * @reserved0: reserved
1855  * @col_size: number of columns in the frame, max width is 2560
1856  * @reserved1: reserved
1857  */
1858 struct ipu3_uapi_yuvp1_chnr_enable_config {
1859 	__u32 enable:1;
1860 	__u32 yuv_mode:1;
1861 	__u32 reserved0:14;
1862 	__u32 col_size:12;
1863 	__u32 reserved1:4;
1864 } __packed;
1865 
1866 /**
1867  * struct ipu3_uapi_yuvp1_chnr_coring_config - Coring thresholds for UV
1868  *
1869  * @u: U coring level, u0.13, range [0.0, 1.0], default 0.0
1870  * @reserved0: reserved
1871  * @v: V coring level, u0.13, range [0.0, 1.0], default 0.0
1872  * @reserved1: reserved
1873  */
1874 struct ipu3_uapi_yuvp1_chnr_coring_config {
1875 	__u32 u:13;
1876 	__u32 reserved0:3;
1877 	__u32 v:13;
1878 	__u32 reserved1:3;
1879 } __packed;
1880 
1881 /**
1882  * struct ipu3_uapi_yuvp1_chnr_sense_gain_config - Chroma noise reduction gains
1883  *
1884  * All sensitivity gain parameters have precision u13.0, range [0, 8191].
1885  *
1886  * @vy: Sensitivity of horizontal edge of Y, default 100
1887  * @vu: Sensitivity of horizontal edge of U, default 100
1888  * @vv: Sensitivity of horizontal edge of V, default 100
1889  * @reserved0: reserved
1890  * @hy: Sensitivity of vertical edge of Y, default 50
1891  * @hu: Sensitivity of vertical edge of U, default 50
1892  * @hv: Sensitivity of vertical edge of V, default 50
1893  * @reserved1: reserved
1894  */
1895 struct ipu3_uapi_yuvp1_chnr_sense_gain_config {
1896 	__u32 vy:8;
1897 	__u32 vu:8;
1898 	__u32 vv:8;
1899 	__u32 reserved0:8;
1900 
1901 	__u32 hy:8;
1902 	__u32 hu:8;
1903 	__u32 hv:8;
1904 	__u32 reserved1:8;
1905 } __packed;
1906 
1907 /**
1908  * struct ipu3_uapi_yuvp1_chnr_iir_fir_config - Chroma IIR/FIR filter config
1909  *
1910  * @fir_0h: Value of center tap in horizontal FIR, range [0, 32], default 8.
1911  * @reserved0: reserved
1912  * @fir_1h: Value of distance 1 in horizontal FIR, range [0, 32], default 12.
1913  * @reserved1: reserved
1914  * @fir_2h: Value of distance 2 tap in horizontal FIR, range [0, 32], default 0.
1915  * @dalpha_clip_val: weight for previous row in IIR, range [1, 256], default 0.
1916  * @reserved2: reserved
1917  */
1918 struct ipu3_uapi_yuvp1_chnr_iir_fir_config {
1919 	__u32 fir_0h:6;
1920 	__u32 reserved0:2;
1921 	__u32 fir_1h:6;
1922 	__u32 reserved1:2;
1923 	__u32 fir_2h:6;
1924 	__u32 dalpha_clip_val:9;
1925 	__u32 reserved2:1;
1926 } __packed;
1927 
1928 /**
1929  * struct ipu3_uapi_yuvp1_chnr_config - Chroma noise reduction config
1930  *
1931  * @enable: chroma noise reduction enable, see
1932  *	    &ipu3_uapi_yuvp1_chnr_enable_config
1933  * @coring: coring config for chroma noise reduction, see
1934  *	    &ipu3_uapi_yuvp1_chnr_coring_config
1935  * @sense_gain: sensitivity config for chroma noise reduction, see
1936  *		ipu3_uapi_yuvp1_chnr_sense_gain_config
1937  * @iir_fir: iir and fir config for chroma noise reduction, see
1938  *	     ipu3_uapi_yuvp1_chnr_iir_fir_config
1939  */
1940 struct ipu3_uapi_yuvp1_chnr_config {
1941 	struct ipu3_uapi_yuvp1_chnr_enable_config enable;
1942 	struct ipu3_uapi_yuvp1_chnr_coring_config coring;
1943 	struct ipu3_uapi_yuvp1_chnr_sense_gain_config sense_gain;
1944 	struct ipu3_uapi_yuvp1_chnr_iir_fir_config iir_fir;
1945 } __packed;
1946 
1947 /* Edge Enhancement and Noise Reduction */
1948 
1949 /**
1950  * struct ipu3_uapi_yuvp1_y_ee_nr_lpf_config - Luma(Y) edge enhancement low-pass
1951  *					       filter coefficients
1952  *
1953  * @a_diag: Smoothing diagonal coefficient, u5.0.
1954  * @reserved0: reserved
1955  * @a_periph: Image smoothing perpherial, u5.0.
1956  * @reserved1: reserved
1957  * @a_cent: Image Smoothing center coefficient, u5.0.
1958  * @reserved2: reserved
1959  * @enable: 0: Y_EE_NR disabled, output = input; 1: Y_EE_NR enabled.
1960  */
1961 struct ipu3_uapi_yuvp1_y_ee_nr_lpf_config {
1962 	__u32 a_diag:5;
1963 	__u32 reserved0:3;
1964 	__u32 a_periph:5;
1965 	__u32 reserved1:3;
1966 	__u32 a_cent:5;
1967 	__u32 reserved2:9;
1968 	__u32 enable:1;
1969 } __packed;
1970 
1971 /**
1972  * struct ipu3_uapi_yuvp1_y_ee_nr_sense_config - Luma(Y) edge enhancement
1973  *					noise reduction sensitivity gains
1974  *
1975  * @edge_sense_0: Sensitivity of edge in dark area. u13.0, default 8191.
1976  * @reserved0: reserved
1977  * @delta_edge_sense: Difference in the sensitivity of edges between
1978  *		      the bright and dark areas. u13.0, default 0.
1979  * @reserved1: reserved
1980  * @corner_sense_0: Sensitivity of corner in dark area. u13.0, default 0.
1981  * @reserved2: reserved
1982  * @delta_corner_sense: Difference in the sensitivity of corners between
1983  *			the bright and dark areas. u13.0, default 8191.
1984  * @reserved3: reserved
1985  */
1986 struct ipu3_uapi_yuvp1_y_ee_nr_sense_config {
1987 	__u32 edge_sense_0:13;
1988 	__u32 reserved0:3;
1989 	__u32 delta_edge_sense:13;
1990 	__u32 reserved1:3;
1991 	__u32 corner_sense_0:13;
1992 	__u32 reserved2:3;
1993 	__u32 delta_corner_sense:13;
1994 	__u32 reserved3:3;
1995 } __packed;
1996 
1997 /**
1998  * struct ipu3_uapi_yuvp1_y_ee_nr_gain_config - Luma(Y) edge enhancement
1999  *						noise reduction gain config
2000  *
2001  * @gain_pos_0: Gain for positive edge in dark area. u5.0, [0, 16], default 2.
2002  * @reserved0: reserved
2003  * @delta_gain_posi: Difference in the gain of edges between the bright and
2004  *		     dark areas for positive edges. u5.0, [0, 16], default 0.
2005  * @reserved1: reserved
2006  * @gain_neg_0: Gain for negative edge in dark area. u5.0, [0, 16], default 8.
2007  * @reserved2: reserved
2008  * @delta_gain_neg: Difference in the gain of edges between the bright and
2009  *		    dark areas for negative edges. u5.0, [0, 16], default 0.
2010  * @reserved3: reserved
2011  */
2012 struct ipu3_uapi_yuvp1_y_ee_nr_gain_config {
2013 	__u32 gain_pos_0:5;
2014 	__u32 reserved0:3;
2015 	__u32 delta_gain_posi:5;
2016 	__u32 reserved1:3;
2017 	__u32 gain_neg_0:5;
2018 	__u32 reserved2:3;
2019 	__u32 delta_gain_neg:5;
2020 	__u32 reserved3:3;
2021 } __packed;
2022 
2023 /**
2024  * struct ipu3_uapi_yuvp1_y_ee_nr_clip_config - Luma(Y) edge enhancement
2025  *					noise reduction clipping config
2026  *
2027  * @clip_pos_0: Limit of positive edge in dark area
2028  *		u5, value [0, 16], default 8.
2029  * @reserved0: reserved
2030  * @delta_clip_posi: Difference in the limit of edges between the bright
2031  *		     and dark areas for positive edges.
2032  *		     u5, value [0, 16], default 8.
2033  * @reserved1: reserved
2034  * @clip_neg_0: Limit of negative edge in dark area
2035  *		u5, value [0, 16], default 8.
2036  * @reserved2: reserved
2037  * @delta_clip_neg: Difference in the limit of edges between the bright
2038  *		    and dark areas for negative edges.
2039  *		    u5, value [0, 16], default 8.
2040  * @reserved3: reserved
2041  */
2042 struct ipu3_uapi_yuvp1_y_ee_nr_clip_config {
2043 	__u32 clip_pos_0:5;
2044 	__u32 reserved0:3;
2045 	__u32 delta_clip_posi:5;
2046 	__u32 reserved1:3;
2047 	__u32 clip_neg_0:5;
2048 	__u32 reserved2:3;
2049 	__u32 delta_clip_neg:5;
2050 	__u32 reserved3:3;
2051 } __packed;
2052 
2053 /**
2054  * struct ipu3_uapi_yuvp1_y_ee_nr_frng_config - Luma(Y) edge enhancement
2055  *						noise reduction fringe config
2056  *
2057  * @gain_exp: Common exponent of gains, u4, [0, 8], default 2.
2058  * @reserved0: reserved
2059  * @min_edge: Threshold for edge and smooth stitching, u13.
2060  * @reserved1: reserved
2061  * @lin_seg_param: Power of LinSeg, u4.
2062  * @reserved2: reserved
2063  * @t1: Parameter for enabling/disabling the edge enhancement, u1.0, [0, 1],
2064  *	default 1.
2065  * @t2: Parameter for enabling/disabling the smoothing, u1.0, [0, 1],
2066  *	default 1.
2067  * @reserved3: reserved
2068  */
2069 struct ipu3_uapi_yuvp1_y_ee_nr_frng_config {
2070 	__u32 gain_exp:4;
2071 	__u32 reserved0:28;
2072 	__u32 min_edge:13;
2073 	__u32 reserved1:3;
2074 	__u32 lin_seg_param:4;
2075 	__u32 reserved2:4;
2076 	__u32 t1:1;
2077 	__u32 t2:1;
2078 	__u32 reserved3:6;
2079 } __packed;
2080 
2081 /**
2082  * struct ipu3_uapi_yuvp1_y_ee_nr_diag_config - Luma(Y) edge enhancement
2083  *					noise reduction diagonal config
2084  *
2085  * @diag_disc_g: Coefficient that prioritize diagonal edge direction on
2086  *		 horizontal or vertical for final enhancement.
2087  *		 u4.0, [1, 15], default 1.
2088  * @reserved0: reserved
2089  * @hvw_hor: Weight of horizontal/vertical edge enhancement for hv edge.
2090  *		u2.2, [1, 15], default 4.
2091  * @dw_hor: Weight of diagonal edge enhancement for hv edge.
2092  *		u2.2, [1, 15], default 1.
2093  * @hvw_diag: Weight of horizontal/vertical edge enhancement for diagonal edge.
2094  *		u2.2, [1, 15], default 1.
2095  * @dw_diag: Weight of diagonal edge enhancement for diagonal edge.
2096  *		u2.2, [1, 15], default 4.
2097  * @reserved1: reserved
2098  */
2099 struct ipu3_uapi_yuvp1_y_ee_nr_diag_config {
2100 	__u32 diag_disc_g:4;
2101 	__u32 reserved0:4;
2102 	__u32 hvw_hor:4;
2103 	__u32 dw_hor:4;
2104 	__u32 hvw_diag:4;
2105 	__u32 dw_diag:4;
2106 	__u32 reserved1:8;
2107 } __packed;
2108 
2109 /**
2110  * struct ipu3_uapi_yuvp1_y_ee_nr_fc_coring_config - Luma(Y) edge enhancement
2111  *		noise reduction false color correction (FCC) coring config
2112  *
2113  * @pos_0: Gain for positive edge in dark, u13.0, [0, 16], default 0.
2114  * @reserved0: reserved
2115  * @pos_delta: Gain for positive edge in bright, value: pos_0 + pos_delta <=16
2116  *		u13.0, default 0.
2117  * @reserved1: reserved
2118  * @neg_0: Gain for negative edge in dark area, u13.0, range [0, 16], default 0.
2119  * @reserved2: reserved
2120  * @neg_delta: Gain for negative edge in bright area. neg_0 + neg_delta <=16
2121  *		u13.0, default 0.
2122  * @reserved3: reserved
2123  *
2124  * Coring is a simple soft thresholding technique.
2125  */
2126 struct ipu3_uapi_yuvp1_y_ee_nr_fc_coring_config {
2127 	__u32 pos_0:13;
2128 	__u32 reserved0:3;
2129 	__u32 pos_delta:13;
2130 	__u32 reserved1:3;
2131 	__u32 neg_0:13;
2132 	__u32 reserved2:3;
2133 	__u32 neg_delta:13;
2134 	__u32 reserved3:3;
2135 } __packed;
2136 
2137 /**
2138  * struct ipu3_uapi_yuvp1_y_ee_nr_config - Edge enhancement and noise reduction
2139  *
2140  * @lpf: low-pass filter config. See &ipu3_uapi_yuvp1_y_ee_nr_lpf_config
2141  * @sense: sensitivity config. See &ipu3_uapi_yuvp1_y_ee_nr_sense_config
2142  * @gain: gain config as defined in &ipu3_uapi_yuvp1_y_ee_nr_gain_config
2143  * @clip: clip config as defined in &ipu3_uapi_yuvp1_y_ee_nr_clip_config
2144  * @frng: fringe config as defined in &ipu3_uapi_yuvp1_y_ee_nr_frng_config
2145  * @diag: diagonal edge config. See &ipu3_uapi_yuvp1_y_ee_nr_diag_config
2146  * @fc_coring: coring config for fringe control. See
2147  *	       &ipu3_uapi_yuvp1_y_ee_nr_fc_coring_config
2148  */
2149 struct ipu3_uapi_yuvp1_y_ee_nr_config {
2150 	struct ipu3_uapi_yuvp1_y_ee_nr_lpf_config lpf;
2151 	struct ipu3_uapi_yuvp1_y_ee_nr_sense_config sense;
2152 	struct ipu3_uapi_yuvp1_y_ee_nr_gain_config gain;
2153 	struct ipu3_uapi_yuvp1_y_ee_nr_clip_config clip;
2154 	struct ipu3_uapi_yuvp1_y_ee_nr_frng_config frng;
2155 	struct ipu3_uapi_yuvp1_y_ee_nr_diag_config diag;
2156 	struct ipu3_uapi_yuvp1_y_ee_nr_fc_coring_config fc_coring;
2157 } __packed;
2158 
2159 /* Total Color Correction */
2160 
2161 /**
2162  * struct ipu3_uapi_yuvp2_tcc_gen_control_static_config - Total color correction
2163  *				general control config
2164  *
2165  * @en:	0 - TCC disabled. Output = input 1 - TCC enabled.
2166  * @blend_shift:	blend shift, Range[3, 4], default NA.
2167  * @gain_according_to_y_only:	0: Gain is calculated according to YUV,
2168  *				1: Gain is calculated according to Y only
2169  * @reserved0: reserved
2170  * @gamma:	Final blending coefficients. Values[-16, 16], default NA.
2171  * @reserved1: reserved
2172  * @delta:	Final blending coefficients. Values[-16, 16], default NA.
2173  * @reserved2: reserved
2174  */
2175 struct ipu3_uapi_yuvp2_tcc_gen_control_static_config {
2176 	__u32 en:1;
2177 	__u32 blend_shift:3;
2178 	__u32 gain_according_to_y_only:1;
2179 	__u32 reserved0:11;
2180 	__s32 gamma:5;
2181 	__u32 reserved1:3;
2182 	__s32 delta:5;
2183 	__u32 reserved2:3;
2184 } __packed;
2185 
2186 /**
2187  * struct ipu3_uapi_yuvp2_tcc_macc_elem_static_config - Total color correction
2188  *				multi-axis color control (MACC) config
2189  *
2190  * @a: a coefficient for 2x2 MACC conversion matrix.
2191  * @reserved0: reserved
2192  * @b: b coefficient  2x2 MACC conversion matrix.
2193  * @reserved1: reserved
2194  * @c: c coefficient for 2x2 MACC conversion matrix.
2195  * @reserved2: reserved
2196  * @d: d coefficient for 2x2 MACC conversion matrix.
2197  * @reserved3: reserved
2198  */
2199 struct ipu3_uapi_yuvp2_tcc_macc_elem_static_config {
2200 	__s32 a:12;
2201 	__u32 reserved0:4;
2202 	__s32 b:12;
2203 	__u32 reserved1:4;
2204 	__s32 c:12;
2205 	__u32 reserved2:4;
2206 	__s32 d:12;
2207 	__u32 reserved3:4;
2208 } __packed;
2209 
2210 /**
2211  * struct ipu3_uapi_yuvp2_tcc_macc_table_static_config - Total color correction
2212  *				multi-axis color control (MACC) table array
2213  *
2214  * @entries: config for multi axis color correction, as specified by
2215  *	     &ipu3_uapi_yuvp2_tcc_macc_elem_static_config
2216  */
2217 struct ipu3_uapi_yuvp2_tcc_macc_table_static_config {
2218 	struct ipu3_uapi_yuvp2_tcc_macc_elem_static_config
2219 		entries[IPU3_UAPI_YUVP2_TCC_MACC_TABLE_ELEMENTS];
2220 } __packed;
2221 
2222 /**
2223  * struct ipu3_uapi_yuvp2_tcc_inv_y_lut_static_config - Total color correction
2224  *				inverse y lookup table
2225  *
2226  * @entries: lookup table for inverse y estimation, and use it to estimate the
2227  *	     ratio between luma and chroma. Chroma by approximate the absolute
2228  *	     value of the radius on the chroma plane (R = sqrt(u^2+v^2) ) and
2229  *	     luma by approximate by 1/Y.
2230  */
2231 struct ipu3_uapi_yuvp2_tcc_inv_y_lut_static_config {
2232 	__u16 entries[IPU3_UAPI_YUVP2_TCC_INV_Y_LUT_ELEMENTS];
2233 } __packed;
2234 
2235 /**
2236  * struct ipu3_uapi_yuvp2_tcc_gain_pcwl_lut_static_config - Total color
2237  *					correction lookup table for PCWL
2238  *
2239  * @entries: lookup table for gain piece wise linear transformation (PCWL)
2240  */
2241 struct ipu3_uapi_yuvp2_tcc_gain_pcwl_lut_static_config {
2242 	__u16 entries[IPU3_UAPI_YUVP2_TCC_GAIN_PCWL_LUT_ELEMENTS];
2243 } __packed;
2244 
2245 /**
2246  * struct ipu3_uapi_yuvp2_tcc_r_sqr_lut_static_config - Total color correction
2247  *				lookup table for r square root
2248  *
2249  * @entries: lookup table for r square root estimation
2250  */
2251 struct ipu3_uapi_yuvp2_tcc_r_sqr_lut_static_config {
2252 	__s16 entries[IPU3_UAPI_YUVP2_TCC_R_SQR_LUT_ELEMENTS];
2253 } __packed;
2254 
2255 /**
2256  * struct ipu3_uapi_yuvp2_tcc_static_config- Total color correction static
2257  *
2258  * @gen_control: general config for Total Color Correction
2259  * @macc_table: config for multi axis color correction
2260  * @inv_y_lut: lookup table for inverse y estimation
2261  * @gain_pcwl: lookup table for gain PCWL
2262  * @r_sqr_lut: lookup table for r square root estimation.
2263  */
2264 struct ipu3_uapi_yuvp2_tcc_static_config {
2265 	struct ipu3_uapi_yuvp2_tcc_gen_control_static_config gen_control;
2266 	struct ipu3_uapi_yuvp2_tcc_macc_table_static_config macc_table;
2267 	struct ipu3_uapi_yuvp2_tcc_inv_y_lut_static_config inv_y_lut;
2268 	struct ipu3_uapi_yuvp2_tcc_gain_pcwl_lut_static_config gain_pcwl;
2269 	struct ipu3_uapi_yuvp2_tcc_r_sqr_lut_static_config r_sqr_lut;
2270 } __packed;
2271 
2272 /* Advanced Noise Reduction related structs */
2273 
2274 /*
2275  * struct ipu3_uapi_anr_alpha - Advanced noise reduction alpha
2276  *
2277  * Tunable parameters that are subject to modification according to the
2278  * total gain used.
2279  */
2280 struct ipu3_uapi_anr_alpha {
2281 	__u16 gr;
2282 	__u16 r;
2283 	__u16 b;
2284 	__u16 gb;
2285 	__u16 dc_gr;
2286 	__u16 dc_r;
2287 	__u16 dc_b;
2288 	__u16 dc_gb;
2289 } __packed;
2290 
2291 /*
2292  * struct ipu3_uapi_anr_beta - Advanced noise reduction beta
2293  *
2294  * Tunable parameters that are subject to modification according to the
2295  * total gain used.
2296  */
2297 struct ipu3_uapi_anr_beta {
2298 	__u16 beta_gr;
2299 	__u16 beta_r;
2300 	__u16 beta_b;
2301 	__u16 beta_gb;
2302 } __packed;
2303 
2304 /*
2305  * struct ipu3_uapi_anr_plane_color - Advanced noise reduction per plane R, Gr,
2306  *				      Gb and B register settings
2307  *
2308  * Tunable parameters that are subject to modification according to the
2309  * total gain used.
2310  */
2311 struct ipu3_uapi_anr_plane_color {
2312 	__u16 reg_w_gr[16];
2313 	__u16 reg_w_r[16];
2314 	__u16 reg_w_b[16];
2315 	__u16 reg_w_gb[16];
2316 } __packed;
2317 
2318 /**
2319  * struct ipu3_uapi_anr_transform_config - Advanced noise reduction transform
2320  *
2321  * @enable: advanced noise reduction enabled.
2322  * @adaptive_treshhold_en: On IPU3, adaptive threshold is always enabled.
2323  * @reserved1: reserved
2324  * @reserved2: reserved
2325  * @alpha: using following defaults:
2326  *		13, 13, 13, 13, 0, 0, 0, 0
2327  *		11, 11, 11, 11, 0, 0, 0, 0
2328  *		14,  14, 14, 14, 0, 0, 0, 0
2329  * @beta: use following defaults:
2330  *		24, 24, 24, 24
2331  *		21, 20, 20, 21
2332  *		25, 25, 25, 25
2333  * @color: use defaults defined in driver/media/pci/intel/ipu3-tables.c
2334  * @sqrt_lut: 11 bits per element, values =
2335  *					[724 768 810 849 887
2336  *					923 958 991 1024 1056
2337  *					1116 1145 1173 1201 1086
2338  *					1228 1254 1280 1305 1330
2339  *					1355 1379 1402 1425 1448]
2340  * @xreset: Reset value of X for r^2 calculation Value: col_start-X_center
2341  *	Constraint: Xreset + FrameWdith=4095 Xreset= -4095, default -1632.
2342  * @reserved3: reserved
2343  * @yreset: Reset value of Y for r^2 calculation Value: row_start-Y_center
2344  *	 Constraint: Yreset + FrameHeight=4095 Yreset= -4095, default -1224.
2345  * @reserved4: reserved
2346  * @x_sqr_reset: Reset value of X^2 for r^2 calculation Value = (Xreset)^2
2347  * @r_normfactor: Normalization factor for R. Default 14.
2348  * @reserved5: reserved
2349  * @y_sqr_reset: Reset value of Y^2 for r^2 calculation Value = (Yreset)^2
2350  * @gain_scale: Parameter describing shading gain as a function of distance
2351  *		from the image center.
2352  *		A single value per frame, loaded by the driver. Default 115.
2353  */
2354 struct ipu3_uapi_anr_transform_config {
2355 	__u32 enable:1;			/* 0 or 1, disabled or enabled */
2356 	__u32 adaptive_treshhold_en:1;	/* On IPU3, always enabled */
2357 
2358 	__u32 reserved1:30;
2359 	__u8 reserved2[44];
2360 
2361 	struct ipu3_uapi_anr_alpha alpha[3];
2362 	struct ipu3_uapi_anr_beta beta[3];
2363 	struct ipu3_uapi_anr_plane_color color[3];
2364 
2365 	__u16 sqrt_lut[IPU3_UAPI_ANR_LUT_SIZE];	/* 11 bits per element */
2366 
2367 	__s16 xreset:13;
2368 	__u16 reserved3:3;
2369 	__s16 yreset:13;
2370 	__u16 reserved4:3;
2371 
2372 	__u32 x_sqr_reset:24;
2373 	__u32 r_normfactor:5;
2374 	__u32 reserved5:3;
2375 
2376 	__u32 y_sqr_reset:24;
2377 	__u32 gain_scale:8;
2378 } __packed;
2379 
2380 /**
2381  * struct ipu3_uapi_anr_stitch_pyramid - ANR stitch pyramid
2382  *
2383  * @entry0: pyramid LUT entry0, range [0x0, 0x3f]
2384  * @entry1: pyramid LUT entry1, range [0x0, 0x3f]
2385  * @entry2: pyramid LUT entry2, range [0x0, 0x3f]
2386  * @reserved: reserved
2387  */
2388 struct ipu3_uapi_anr_stitch_pyramid {
2389 	__u32 entry0:6;
2390 	__u32 entry1:6;
2391 	__u32 entry2:6;
2392 	__u32 reserved:14;
2393 } __packed;
2394 
2395 /**
2396  * struct ipu3_uapi_anr_stitch_config - ANR stitch config
2397  *
2398  * @anr_stitch_en: enable stitch. Enabled with 1.
2399  * @reserved: reserved
2400  * @pyramid: pyramid table as defined by &ipu3_uapi_anr_stitch_pyramid
2401  *		default values:
2402  *		{ 1, 3, 5 }, { 7, 7, 5 }, { 3, 1, 3 },
2403  *		{ 9, 15, 21 }, { 21, 15, 9 }, { 3, 5, 15 },
2404  *		{ 25, 35, 35 }, { 25, 15, 5 }, { 7, 21, 35 },
2405  *		{ 49, 49, 35 }, { 21, 7, 7 }, { 21, 35, 49 },
2406  *		{ 49, 35, 21 }, { 7, 5, 15 }, { 25, 35, 35 },
2407  *		{ 25, 15, 5 }, { 3, 9, 15 }, { 21, 21, 15 },
2408  *		{ 9, 3, 1 }, { 3, 5, 7 }, { 7, 5, 3}, { 1 }
2409  */
2410 struct ipu3_uapi_anr_stitch_config {
2411 	__u32 anr_stitch_en;
2412 	__u8 reserved[44];
2413 	struct ipu3_uapi_anr_stitch_pyramid pyramid[IPU3_UAPI_ANR_PYRAMID_SIZE];
2414 } __packed;
2415 
2416 /**
2417  * struct ipu3_uapi_anr_config - ANR config
2418  *
2419  * @transform:	advanced noise reduction transform config as specified by
2420  *		&ipu3_uapi_anr_transform_config
2421  * @stitch: create 4x4 patch from 4 surrounding 8x8 patches.
2422  */
2423 struct ipu3_uapi_anr_config {
2424 	struct ipu3_uapi_anr_transform_config transform __attribute__((aligned(32)));
2425 	struct ipu3_uapi_anr_stitch_config stitch __attribute__((aligned(32)));
2426 } __packed;
2427 
2428 /**
2429  * struct ipu3_uapi_acc_param - Accelerator cluster parameters
2430  *
2431  * ACC refers to the HW cluster containing all Fixed Functions (FFs). Each FF
2432  * implements a specific algorithm.
2433  *
2434  * @bnr:	parameters for bayer noise reduction static config. See
2435  *		&ipu3_uapi_bnr_static_config
2436  * @green_disparity:	disparity static config between gr and gb channel.
2437  *			See &ipu3_uapi_bnr_static_config_green_disparity
2438  * @dm:	de-mosaic config. See &ipu3_uapi_dm_config
2439  * @ccm:	color correction matrix. See &ipu3_uapi_ccm_mat_config
2440  * @gamma:	gamma correction config. See &ipu3_uapi_gamma_config
2441  * @csc:	color space conversion matrix. See &ipu3_uapi_csc_mat_config
2442  * @cds:	color down sample config. See &ipu3_uapi_cds_params
2443  * @shd:	lens shading correction config. See &ipu3_uapi_shd_config
2444  * @iefd:	Image enhancement filter and denoise config.
2445  *		&ipu3_uapi_yuvp1_iefd_config
2446  * @yds_c0:	y down scaler config. &ipu3_uapi_yuvp1_yds_config
2447  * @chnr_c0:	chroma noise reduction config. &ipu3_uapi_yuvp1_chnr_config
2448  * @y_ee_nr:	y edge enhancement and noise reduction config.
2449  *		&ipu3_uapi_yuvp1_y_ee_nr_config
2450  * @yds:	y down scaler config. See &ipu3_uapi_yuvp1_yds_config
2451  * @chnr:	chroma noise reduction config. See &ipu3_uapi_yuvp1_chnr_config
2452  * @reserved1: reserved
2453  * @yds2:	y channel down scaler config. See &ipu3_uapi_yuvp1_yds_config
2454  * @tcc:	total color correction config as defined in struct
2455  *		&ipu3_uapi_yuvp2_tcc_static_config
2456  * @reserved2: reserved
2457  * @anr:	advanced noise reduction config.See &ipu3_uapi_anr_config
2458  * @awb_fr:	AWB filter response config. See ipu3_uapi_awb_fr_config
2459  * @ae:	auto exposure config  As specified by &ipu3_uapi_ae_config
2460  * @af:	auto focus config. As specified by &ipu3_uapi_af_config
2461  * @awb:	auto white balance config. As specified by &ipu3_uapi_awb_config
2462  */
2463 struct ipu3_uapi_acc_param {
2464 	struct ipu3_uapi_bnr_static_config bnr;
2465 	struct ipu3_uapi_bnr_static_config_green_disparity
2466 				green_disparity __attribute__((aligned(32)));
2467 	struct ipu3_uapi_dm_config dm __attribute__((aligned(32)));
2468 	struct ipu3_uapi_ccm_mat_config ccm __attribute__((aligned(32)));
2469 	struct ipu3_uapi_gamma_config gamma __attribute__((aligned(32)));
2470 	struct ipu3_uapi_csc_mat_config csc __attribute__((aligned(32)));
2471 	struct ipu3_uapi_cds_params cds __attribute__((aligned(32)));
2472 	struct ipu3_uapi_shd_config shd __attribute__((aligned(32)));
2473 	struct ipu3_uapi_yuvp1_iefd_config iefd __attribute__((aligned(32)));
2474 	struct ipu3_uapi_yuvp1_yds_config yds_c0 __attribute__((aligned(32)));
2475 	struct ipu3_uapi_yuvp1_chnr_config chnr_c0 __attribute__((aligned(32)));
2476 	struct ipu3_uapi_yuvp1_y_ee_nr_config y_ee_nr __attribute__((aligned(32)));
2477 	struct ipu3_uapi_yuvp1_yds_config yds __attribute__((aligned(32)));
2478 	struct ipu3_uapi_yuvp1_chnr_config chnr __attribute__((aligned(32)));
2479 	struct ipu3_uapi_yuvp1_yds_config yds2 __attribute__((aligned(32)));
2480 	struct ipu3_uapi_yuvp2_tcc_static_config tcc __attribute__((aligned(32)));
2481 	struct ipu3_uapi_anr_config anr;
2482 	struct ipu3_uapi_awb_fr_config_s awb_fr;
2483 	struct ipu3_uapi_ae_config ae;
2484 	struct ipu3_uapi_af_config_s af;
2485 	struct ipu3_uapi_awb_config awb;
2486 } __packed;
2487 
2488 /**
2489  * struct ipu3_uapi_isp_lin_vmem_params - Linearization parameters
2490  *
2491  * @lin_lutlow_gr: linearization look-up table for GR channel interpolation.
2492  * @lin_lutlow_r: linearization look-up table for R channel interpolation.
2493  * @lin_lutlow_b: linearization look-up table for B channel interpolation.
2494  * @lin_lutlow_gb: linearization look-up table for GB channel interpolation.
2495  *			lin_lutlow_gr / lin_lutlow_r / lin_lutlow_b /
2496  *			lin_lutlow_gb <= LIN_MAX_VALUE - 1.
2497  * @lin_lutdif_gr:	lin_lutlow_gr[i+1] - lin_lutlow_gr[i].
2498  * @lin_lutdif_r:	lin_lutlow_r[i+1] - lin_lutlow_r[i].
2499  * @lin_lutdif_b:	lin_lutlow_b[i+1] - lin_lutlow_b[i].
2500  * @lin_lutdif_gb:	lin_lutlow_gb[i+1] - lin_lutlow_gb[i].
2501  */
2502 struct ipu3_uapi_isp_lin_vmem_params {
2503 	__s16 lin_lutlow_gr[IPU3_UAPI_LIN_LUT_SIZE];
2504 	__s16 lin_lutlow_r[IPU3_UAPI_LIN_LUT_SIZE];
2505 	__s16 lin_lutlow_b[IPU3_UAPI_LIN_LUT_SIZE];
2506 	__s16 lin_lutlow_gb[IPU3_UAPI_LIN_LUT_SIZE];
2507 	__s16 lin_lutdif_gr[IPU3_UAPI_LIN_LUT_SIZE];
2508 	__s16 lin_lutdif_r[IPU3_UAPI_LIN_LUT_SIZE];
2509 	__s16 lin_lutdif_b[IPU3_UAPI_LIN_LUT_SIZE];
2510 	__s16 lin_lutdif_gb[IPU3_UAPI_LIN_LUT_SIZE];
2511 } __packed;
2512 
2513 /* Temporal Noise Reduction */
2514 
2515 /**
2516  * struct ipu3_uapi_isp_tnr3_vmem_params - Temporal noise reduction vector
2517  *					   memory parameters
2518  *
2519  * @slope: slope setting in interpolation curve for temporal noise reduction.
2520  * @reserved1: reserved
2521  * @sigma: knee point setting in interpolation curve for temporal
2522  *	   noise reduction.
2523  * @reserved2: reserved
2524  */
2525 struct ipu3_uapi_isp_tnr3_vmem_params {
2526 	__u16 slope[IPU3_UAPI_ISP_TNR3_VMEM_LEN];
2527 	__u16 reserved1[IPU3_UAPI_ISP_VEC_ELEMS
2528 						- IPU3_UAPI_ISP_TNR3_VMEM_LEN];
2529 	__u16 sigma[IPU3_UAPI_ISP_TNR3_VMEM_LEN];
2530 	__u16 reserved2[IPU3_UAPI_ISP_VEC_ELEMS
2531 						- IPU3_UAPI_ISP_TNR3_VMEM_LEN];
2532 } __packed;
2533 
2534 /**
2535  * struct ipu3_uapi_isp_tnr3_params - Temporal noise reduction v3 parameters
2536  *
2537  * @knee_y1: Knee point TNR3 assumes standard deviation of Y,U and
2538  *	V at Y1 are TnrY1_Sigma_Y, U and V.
2539  * @knee_y2: Knee point TNR3 assumes standard deviation of Y,U and
2540  *		V at Y2 are TnrY2_Sigma_Y, U and V.
2541  * @maxfb_y: Max feedback gain for Y
2542  * @maxfb_u: Max feedback gain for U
2543  * @maxfb_v: Max feedback gain for V
2544  * @round_adj_y: rounding Adjust for Y
2545  * @round_adj_u: rounding Adjust for U
2546  * @round_adj_v: rounding Adjust for V
2547  * @ref_buf_select: selection of the reference frame buffer to be used.
2548  */
2549 struct ipu3_uapi_isp_tnr3_params {
2550 	__u32 knee_y1;
2551 	__u32 knee_y2;
2552 	__u32 maxfb_y;
2553 	__u32 maxfb_u;
2554 	__u32 maxfb_v;
2555 	__u32 round_adj_y;
2556 	__u32 round_adj_u;
2557 	__u32 round_adj_v;
2558 	__u32 ref_buf_select;
2559 } __packed;
2560 
2561 /* Extreme Noise Reduction version 3 */
2562 
2563 /**
2564  * struct ipu3_uapi_isp_xnr3_vmem_params - Extreme noise reduction v3
2565  *					   vector memory parameters
2566  *
2567  * @x: xnr3 parameters.
2568  * @a: xnr3 parameters.
2569  * @b: xnr3 parameters.
2570  * @c: xnr3 parameters.
2571  */
2572 struct ipu3_uapi_isp_xnr3_vmem_params {
2573 	__u16 x[IPU3_UAPI_ISP_VEC_ELEMS];
2574 	__u16 a[IPU3_UAPI_ISP_VEC_ELEMS];
2575 	__u16 b[IPU3_UAPI_ISP_VEC_ELEMS];
2576 	__u16 c[IPU3_UAPI_ISP_VEC_ELEMS];
2577 } __packed;
2578 
2579 /**
2580  * struct ipu3_uapi_xnr3_alpha_params - Extreme noise reduction v3
2581  *					alpha tuning parameters
2582  *
2583  * @y0: Sigma for Y range similarity in dark area.
2584  * @u0: Sigma for U range similarity in dark area.
2585  * @v0: Sigma for V range similarity in dark area.
2586  * @ydiff: Sigma difference for Y between bright area and dark area.
2587  * @udiff: Sigma difference for U between bright area and dark area.
2588  * @vdiff: Sigma difference for V between bright area and dark area.
2589  */
2590 struct ipu3_uapi_xnr3_alpha_params {
2591 	__u32 y0;
2592 	__u32 u0;
2593 	__u32 v0;
2594 	__u32 ydiff;
2595 	__u32 udiff;
2596 	__u32 vdiff;
2597 } __packed;
2598 
2599 /**
2600  * struct ipu3_uapi_xnr3_coring_params - Extreme noise reduction v3
2601  *					 coring parameters
2602  *
2603  * @u0: Coring Threshold of U channel in dark area.
2604  * @v0: Coring Threshold of V channel in dark area.
2605  * @udiff: Threshold difference of U channel between bright and dark area.
2606  * @vdiff: Threshold difference of V channel between bright and dark area.
2607  */
2608 struct ipu3_uapi_xnr3_coring_params {
2609 	__u32 u0;
2610 	__u32 v0;
2611 	__u32 udiff;
2612 	__u32 vdiff;
2613 } __packed;
2614 
2615 /**
2616  * struct ipu3_uapi_xnr3_blending_params - Blending factor
2617  *
2618  * @strength: The factor for blending output with input. This is tuning
2619  *	      parameterHigher values lead to more aggressive XNR operation.
2620  */
2621 struct ipu3_uapi_xnr3_blending_params {
2622 	__u32 strength;
2623 } __packed;
2624 
2625 /**
2626  * struct ipu3_uapi_isp_xnr3_params - Extreme noise reduction v3 parameters
2627  *
2628  * @alpha: parameters for xnr3 alpha. See &ipu3_uapi_xnr3_alpha_params
2629  * @coring: parameters for xnr3 coring. See &ipu3_uapi_xnr3_coring_params
2630  * @blending: parameters for xnr3 blending. See &ipu3_uapi_xnr3_blending_params
2631  */
2632 struct ipu3_uapi_isp_xnr3_params {
2633 	struct ipu3_uapi_xnr3_alpha_params alpha;
2634 	struct ipu3_uapi_xnr3_coring_params coring;
2635 	struct ipu3_uapi_xnr3_blending_params blending;
2636 } __packed;
2637 
2638 /***** Obgrid (optical black level compensation) table entry *****/
2639 
2640 /**
2641  * struct ipu3_uapi_obgrid_param - Optical black level compensation parameters
2642  *
2643  * @gr: Grid table values for color GR
2644  * @r: Grid table values for color R
2645  * @b: Grid table values for color B
2646  * @gb: Grid table values for color GB
2647  *
2648  * Black level is different for red, green, and blue channels. So black level
2649  * compensation is different per channel.
2650  */
2651 struct ipu3_uapi_obgrid_param {
2652 	__u16 gr;
2653 	__u16 r;
2654 	__u16 b;
2655 	__u16 gb;
2656 } __packed;
2657 
2658 /******************* V4L2_META_FMT_IPU3_PARAMS *******************/
2659 
2660 /**
2661  * struct ipu3_uapi_flags - bits to indicate which pipeline needs update
2662  *
2663  * @gdc: 0 = no update, 1 = update.
2664  * @obgrid: 0 = no update, 1 = update.
2665  * @reserved1: Not used.
2666  * @acc_bnr: 0 = no update, 1 = update.
2667  * @acc_green_disparity: 0 = no update, 1 = update.
2668  * @acc_dm: 0 = no update, 1 = update.
2669  * @acc_ccm: 0 = no update, 1 = update.
2670  * @acc_gamma: 0 = no update, 1 = update.
2671  * @acc_csc: 0 = no update, 1 = update.
2672  * @acc_cds: 0 = no update, 1 = update.
2673  * @acc_shd: 0 = no update, 1 = update.
2674  * @reserved2: Not used.
2675  * @acc_iefd: 0 = no update, 1 = update.
2676  * @acc_yds_c0: 0 = no update, 1 = update.
2677  * @acc_chnr_c0: 0 = no update, 1 = update.
2678  * @acc_y_ee_nr: 0 = no update, 1 = update.
2679  * @acc_yds: 0 = no update, 1 = update.
2680  * @acc_chnr: 0 = no update, 1 = update.
2681  * @acc_ytm: 0 = no update, 1 = update.
2682  * @acc_yds2: 0 = no update, 1 = update.
2683  * @acc_tcc: 0 = no update, 1 = update.
2684  * @acc_dpc: 0 = no update, 1 = update.
2685  * @acc_bds: 0 = no update, 1 = update.
2686  * @acc_anr: 0 = no update, 1 = update.
2687  * @acc_awb_fr: 0 = no update, 1 = update.
2688  * @acc_ae: 0 = no update, 1 = update.
2689  * @acc_af: 0 = no update, 1 = update.
2690  * @acc_awb: 0 = no update, 1 = update.
2691  * @__acc_osys: 0 = no update, 1 = update.
2692  * @reserved3: Not used.
2693  * @lin_vmem_params: 0 = no update, 1 = update.
2694  * @tnr3_vmem_params: 0 = no update, 1 = update.
2695  * @xnr3_vmem_params: 0 = no update, 1 = update.
2696  * @tnr3_dmem_params: 0 = no update, 1 = update.
2697  * @xnr3_dmem_params: 0 = no update, 1 = update.
2698  * @reserved4: Not used.
2699  * @obgrid_param: 0 = no update, 1 = update.
2700  * @reserved5: Not used.
2701  */
2702 struct ipu3_uapi_flags {
2703 	__u32 gdc:1;
2704 	__u32 obgrid:1;
2705 	__u32 reserved1:30;
2706 
2707 	__u32 acc_bnr:1;
2708 	__u32 acc_green_disparity:1;
2709 	__u32 acc_dm:1;
2710 	__u32 acc_ccm:1;
2711 	__u32 acc_gamma:1;
2712 	__u32 acc_csc:1;
2713 	__u32 acc_cds:1;
2714 	__u32 acc_shd:1;
2715 	__u32 reserved2:2;
2716 	__u32 acc_iefd:1;
2717 	__u32 acc_yds_c0:1;
2718 	__u32 acc_chnr_c0:1;
2719 	__u32 acc_y_ee_nr:1;
2720 	__u32 acc_yds:1;
2721 	__u32 acc_chnr:1;
2722 	__u32 acc_ytm:1;
2723 	__u32 acc_yds2:1;
2724 	__u32 acc_tcc:1;
2725 	__u32 acc_dpc:1;
2726 	__u32 acc_bds:1;
2727 	__u32 acc_anr:1;
2728 	__u32 acc_awb_fr:1;
2729 	__u32 acc_ae:1;
2730 	__u32 acc_af:1;
2731 	__u32 acc_awb:1;
2732 	__u32 reserved3:4;
2733 
2734 	__u32 lin_vmem_params:1;
2735 	__u32 tnr3_vmem_params:1;
2736 	__u32 xnr3_vmem_params:1;
2737 	__u32 tnr3_dmem_params:1;
2738 	__u32 xnr3_dmem_params:1;
2739 	__u32 reserved4:1;
2740 	__u32 obgrid_param:1;
2741 	__u32 reserved5:25;
2742 } __packed;
2743 
2744 /**
2745  * struct ipu3_uapi_params - V4L2_META_FMT_IPU3_PARAMS
2746  *
2747  * @use:	select which parameters to apply, see &ipu3_uapi_flags
2748  * @acc_param:	ACC parameters, as specified by &ipu3_uapi_acc_param
2749  * @lin_vmem_params:	linearization VMEM, as specified by
2750  *			&ipu3_uapi_isp_lin_vmem_params
2751  * @tnr3_vmem_params:	tnr3 VMEM as specified by
2752  *			&ipu3_uapi_isp_tnr3_vmem_params
2753  * @xnr3_vmem_params:	xnr3 VMEM as specified by
2754  *			&ipu3_uapi_isp_xnr3_vmem_params
2755  * @tnr3_dmem_params:	tnr3 DMEM as specified by &ipu3_uapi_isp_tnr3_params
2756  * @xnr3_dmem_params:	xnr3 DMEM as specified by &ipu3_uapi_isp_xnr3_params
2757  * @obgrid_param:	obgrid parameters as specified by
2758  *			&ipu3_uapi_obgrid_param
2759  *
2760  * The video queue "parameters" is of format V4L2_META_FMT_IPU3_PARAMS.
2761  * This is a "single plane" v4l2_meta_format using V4L2_BUF_TYPE_META_OUTPUT.
2762  *
2763  * struct ipu3_uapi_params as defined below contains a lot of parameters and
2764  * ipu3_uapi_flags selects which parameters to apply.
2765  */
2766 struct ipu3_uapi_params {
2767 	/* Flags which of the settings below are to be applied */
2768 	struct ipu3_uapi_flags use __attribute__((aligned(32)));
2769 
2770 	/* Accelerator cluster parameters */
2771 	struct ipu3_uapi_acc_param acc_param;
2772 
2773 	/* ISP vector address space parameters */
2774 	struct ipu3_uapi_isp_lin_vmem_params lin_vmem_params;
2775 	struct ipu3_uapi_isp_tnr3_vmem_params tnr3_vmem_params;
2776 	struct ipu3_uapi_isp_xnr3_vmem_params xnr3_vmem_params;
2777 
2778 	/* ISP data memory (DMEM) parameters */
2779 	struct ipu3_uapi_isp_tnr3_params tnr3_dmem_params;
2780 	struct ipu3_uapi_isp_xnr3_params xnr3_dmem_params;
2781 
2782 	/* Optical black level compensation */
2783 	struct ipu3_uapi_obgrid_param obgrid_param;
2784 } __packed;
2785 
2786 #endif /* __IPU3_UAPI_H */
2787