1  /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
2  /*
3   * PiSP Back End configuration definitions.
4   *
5   * Copyright (C) 2021 - Raspberry Pi Ltd
6   *
7   */
8  #ifndef _UAPI_PISP_BE_CONFIG_H_
9  #define _UAPI_PISP_BE_CONFIG_H_
10  
11  #include <linux/types.h>
12  
13  #include "pisp_common.h"
14  
15  /* byte alignment for inputs */
16  #define PISP_BACK_END_INPUT_ALIGN 4u
17  /* alignment for compressed inputs */
18  #define PISP_BACK_END_COMPRESSED_ALIGN 8u
19  /* minimum required byte alignment for outputs */
20  #define PISP_BACK_END_OUTPUT_MIN_ALIGN 16u
21  /* preferred byte alignment for outputs */
22  #define PISP_BACK_END_OUTPUT_MAX_ALIGN 64u
23  
24  /* minimum allowed tile width anywhere in the pipeline */
25  #define PISP_BACK_END_MIN_TILE_WIDTH 16u
26  /* minimum allowed tile width anywhere in the pipeline */
27  #define PISP_BACK_END_MIN_TILE_HEIGHT 16u
28  
29  #define PISP_BACK_END_NUM_OUTPUTS 2
30  #define PISP_BACK_END_HOG_OUTPUT 1
31  
32  #define PISP_BACK_END_NUM_TILES 64
33  
34  enum pisp_be_bayer_enable {
35  	PISP_BE_BAYER_ENABLE_INPUT = 0x000001,
36  	PISP_BE_BAYER_ENABLE_DECOMPRESS = 0x000002,
37  	PISP_BE_BAYER_ENABLE_DPC = 0x000004,
38  	PISP_BE_BAYER_ENABLE_GEQ = 0x000008,
39  	PISP_BE_BAYER_ENABLE_TDN_INPUT = 0x000010,
40  	PISP_BE_BAYER_ENABLE_TDN_DECOMPRESS = 0x000020,
41  	PISP_BE_BAYER_ENABLE_TDN = 0x000040,
42  	PISP_BE_BAYER_ENABLE_TDN_COMPRESS = 0x000080,
43  	PISP_BE_BAYER_ENABLE_TDN_OUTPUT = 0x000100,
44  	PISP_BE_BAYER_ENABLE_SDN = 0x000200,
45  	PISP_BE_BAYER_ENABLE_BLC = 0x000400,
46  	PISP_BE_BAYER_ENABLE_STITCH_INPUT = 0x000800,
47  	PISP_BE_BAYER_ENABLE_STITCH_DECOMPRESS = 0x001000,
48  	PISP_BE_BAYER_ENABLE_STITCH = 0x002000,
49  	PISP_BE_BAYER_ENABLE_STITCH_COMPRESS = 0x004000,
50  	PISP_BE_BAYER_ENABLE_STITCH_OUTPUT = 0x008000,
51  	PISP_BE_BAYER_ENABLE_WBG = 0x010000,
52  	PISP_BE_BAYER_ENABLE_CDN = 0x020000,
53  	PISP_BE_BAYER_ENABLE_LSC = 0x040000,
54  	PISP_BE_BAYER_ENABLE_TONEMAP = 0x080000,
55  	PISP_BE_BAYER_ENABLE_CAC = 0x100000,
56  	PISP_BE_BAYER_ENABLE_DEBIN = 0x200000,
57  	PISP_BE_BAYER_ENABLE_DEMOSAIC = 0x400000,
58  };
59  
60  enum pisp_be_rgb_enable {
61  	PISP_BE_RGB_ENABLE_INPUT = 0x000001,
62  	PISP_BE_RGB_ENABLE_CCM = 0x000002,
63  	PISP_BE_RGB_ENABLE_SAT_CONTROL = 0x000004,
64  	PISP_BE_RGB_ENABLE_YCBCR = 0x000008,
65  	PISP_BE_RGB_ENABLE_FALSE_COLOUR = 0x000010,
66  	PISP_BE_RGB_ENABLE_SHARPEN = 0x000020,
67  	/* Preferred colours would occupy 0x000040 */
68  	PISP_BE_RGB_ENABLE_YCBCR_INVERSE = 0x000080,
69  	PISP_BE_RGB_ENABLE_GAMMA = 0x000100,
70  	PISP_BE_RGB_ENABLE_CSC0 = 0x000200,
71  	PISP_BE_RGB_ENABLE_CSC1 = 0x000400,
72  	PISP_BE_RGB_ENABLE_DOWNSCALE0 = 0x001000,
73  	PISP_BE_RGB_ENABLE_DOWNSCALE1 = 0x002000,
74  	PISP_BE_RGB_ENABLE_RESAMPLE0 = 0x008000,
75  	PISP_BE_RGB_ENABLE_RESAMPLE1 = 0x010000,
76  	PISP_BE_RGB_ENABLE_OUTPUT0 = 0x040000,
77  	PISP_BE_RGB_ENABLE_OUTPUT1 = 0x080000,
78  	PISP_BE_RGB_ENABLE_HOG = 0x200000
79  };
80  
81  #define PISP_BE_RGB_ENABLE_CSC(i) (PISP_BE_RGB_ENABLE_CSC0 << (i))
82  #define PISP_BE_RGB_ENABLE_DOWNSCALE(i) (PISP_BE_RGB_ENABLE_DOWNSCALE0 << (i))
83  #define PISP_BE_RGB_ENABLE_RESAMPLE(i) (PISP_BE_RGB_ENABLE_RESAMPLE0 << (i))
84  #define PISP_BE_RGB_ENABLE_OUTPUT(i) (PISP_BE_RGB_ENABLE_OUTPUT0 << (i))
85  
86  /*
87   * We use the enable flags to show when blocks are "dirty", but we need some
88   * extra ones too.
89   */
90  enum pisp_be_dirty {
91  	PISP_BE_DIRTY_GLOBAL = 0x0001,
92  	PISP_BE_DIRTY_SH_FC_COMBINE = 0x0002,
93  	PISP_BE_DIRTY_CROP = 0x0004
94  };
95  
96  /**
97   * struct pisp_be_global_config - PiSP global enable bitmaps
98   * @bayer_enables:	Bayer input enable flags
99   * @rgb_enables:	RGB output enable flags
100   * @bayer_order:	Bayer input format ordering
101   * @pad:		Padding bytes
102   */
103  struct pisp_be_global_config {
104  	__u32 bayer_enables;
105  	__u32 rgb_enables;
106  	__u8 bayer_order;
107  	__u8 pad[3];
108  } __attribute__((packed));
109  
110  /**
111   * struct pisp_be_input_buffer_config - PiSP Back End input buffer
112   * @addr:		Input buffer address
113   */
114  struct pisp_be_input_buffer_config {
115  	/* low 32 bits followed by high 32 bits (for each of up to 3 planes) */
116  	__u32 addr[3][2];
117  } __attribute__((packed));
118  
119  /**
120   * struct pisp_be_dpc_config - PiSP Back End DPC config
121   *
122   * Defective Pixel Correction configuration
123   *
124   * @coeff_level:	Coefficient for the darkest neighbouring pixel value
125   * @coeff_range:	Coefficient for the range of pixels for this Bayer channel
126   * @pad:		Padding byte
127   * @flags:		DPC configuration flags
128   */
129  struct pisp_be_dpc_config {
130  	__u8 coeff_level;
131  	__u8 coeff_range;
132  	__u8 pad;
133  #define PISP_BE_DPC_FLAG_FOLDBACK 1
134  	__u8 flags;
135  } __attribute__((packed));
136  
137  /**
138   * struct pisp_be_geq_config - PiSP Back End GEQ config
139   *
140   * Green Equalisation configuration
141   *
142   * @offset:		Offset value for threshold calculation
143   * @slope_sharper:	Slope/Sharper configuration
144   * @min:		Minimum value the threshold may have
145   * @max:		Maximum value the threshold may have
146   */
147  struct pisp_be_geq_config {
148  	__u16 offset;
149  #define PISP_BE_GEQ_SHARPER (1U << 15)
150  #define PISP_BE_GEQ_SLOPE ((1 << 10) - 1)
151  	/* top bit is the "sharper" flag, slope value is bottom 10 bits */
152  	__u16 slope_sharper;
153  	__u16 min;
154  	__u16 max;
155  } __attribute__((packed));
156  
157  /**
158   * struct pisp_be_tdn_input_buffer_config - PiSP Back End TDN input buffer
159   * @addr:		TDN input buffer address
160   */
161  struct pisp_be_tdn_input_buffer_config {
162  	/* low 32 bits followed by high 32 bits */
163  	__u32 addr[2];
164  } __attribute__((packed));
165  
166  /**
167   * struct pisp_be_tdn_config - PiSP Back End TDN config
168   *
169   * Temporal Denoise configuration
170   *
171   * @black_level:	Black level value subtracted from pixels
172   * @ratio:		Multiplier for the LTA input frame
173   * @noise_constant:	Constant offset value used in noise estimation
174   * @noise_slope:	Noise estimation multiplier
175   * @threshold:		Threshold for TDN operations
176   * @reset:		Disable TDN operations
177   * @pad:		Padding byte
178   */
179  struct pisp_be_tdn_config {
180  	__u16 black_level;
181  	__u16 ratio;
182  	__u16 noise_constant;
183  	__u16 noise_slope;
184  	__u16 threshold;
185  	__u8 reset;
186  	__u8 pad;
187  } __attribute__((packed));
188  
189  /**
190   * struct pisp_be_tdn_output_buffer_config - PiSP Back End TDN output buffer
191   * @addr:		TDN output buffer address
192   */
193  struct pisp_be_tdn_output_buffer_config {
194  	/* low 32 bits followed by high 32 bits */
195  	__u32 addr[2];
196  } __attribute__((packed));
197  
198  /**
199   * struct pisp_be_sdn_config - PiSP Back End SDN config
200   *
201   * Spatial Denoise configuration
202   *
203   * @black_level:	Black level subtracted from pixel for noise estimation
204   * @leakage:		Proportion of the original undenoised value to mix in
205   *			denoised output
206   * @pad:		Padding byte
207   * @noise_constant:	Noise constant used for noise estimation
208   * @noise_slope:	Noise slope value used for noise estimation
209   * @noise_constant2:	Second noise constant used for noise estimation
210   * @noise_slope2:	Second slope value used for noise estimation
211   */
212  struct pisp_be_sdn_config {
213  	__u16 black_level;
214  	__u8 leakage;
215  	__u8 pad;
216  	__u16 noise_constant;
217  	__u16 noise_slope;
218  	__u16 noise_constant2;
219  	__u16 noise_slope2;
220  } __attribute__((packed));
221  
222  /**
223   * struct pisp_be_stitch_input_buffer_config - PiSP Back End Stitch input
224   * @addr:		Stitch input buffer address
225   */
226  struct pisp_be_stitch_input_buffer_config {
227  	/* low 32 bits followed by high 32 bits */
228  	__u32 addr[2];
229  } __attribute__((packed));
230  
231  #define PISP_BE_STITCH_STREAMING_LONG 0x8000
232  #define PISP_BE_STITCH_EXPOSURE_RATIO_MASK 0x7fff
233  
234  /**
235   * struct pisp_be_stitch_config - PiSP Back End Stitch config
236   *
237   * Stitch block configuration
238   *
239   * @threshold_lo:		Low threshold value
240   * @threshold_diff_power:	Low and high threshold difference
241   * @pad:			Padding bytes
242   * @exposure_ratio:		Multiplier to convert long exposure pixels into
243   *				short exposure pixels
244   * @motion_threshold_256:	Motion threshold above which short exposure
245   *				pixels are used
246   * @motion_threshold_recip:	Reciprocal of motion_threshold_256 value
247   */
248  struct pisp_be_stitch_config {
249  	__u16 threshold_lo;
250  	__u8 threshold_diff_power;
251  	__u8 pad;
252  
253  	/* top bit indicates whether streaming input is the long exposure */
254  	__u16 exposure_ratio;
255  
256  	__u8 motion_threshold_256;
257  	__u8 motion_threshold_recip;
258  } __attribute__((packed));
259  
260  /**
261   * struct pisp_be_stitch_output_buffer_config - PiSP Back End Stitch output
262   * @addr:		Stitch input buffer address
263   */
264  struct pisp_be_stitch_output_buffer_config {
265  	/* low 32 bits followed by high 32 bits */
266  	__u32 addr[2];
267  } __attribute__((packed));
268  
269  /**
270   * struct pisp_be_cdn_config - PiSP Back End CDN config
271   *
272   * Colour Denoise configuration
273   *
274   * @thresh:		Constant for noise estimation
275   * @iir_strength:	Relative strength of the IIR part of the filter
276   * @g_adjust:		Proportion of the change assigned to the G channel
277   */
278  struct pisp_be_cdn_config {
279  	__u16 thresh;
280  	__u8 iir_strength;
281  	__u8 g_adjust;
282  } __attribute__((packed));
283  
284  #define PISP_BE_LSC_LOG_GRID_SIZE 5
285  #define PISP_BE_LSC_GRID_SIZE (1 << PISP_BE_LSC_LOG_GRID_SIZE)
286  #define PISP_BE_LSC_STEP_PRECISION 18
287  
288  /**
289   * struct pisp_be_lsc_config - PiSP Back End LSC config
290   *
291   * Lens Shading Correction configuration
292   *
293   * @grid_step_x:	Reciprocal of cell size width
294   * @grid_step_y:	Reciprocal of cell size height
295   * @lut_packed:		Jointly-coded RGB gains for each LSC grid
296   */
297  struct pisp_be_lsc_config {
298  	/* (1<<18) / grid_cell_width */
299  	__u16 grid_step_x;
300  	/* (1<<18) / grid_cell_height */
301  	__u16 grid_step_y;
302  	/* RGB gains jointly encoded in 32 bits */
303  #define PISP_BE_LSC_LUT_SIZE	(PISP_BE_LSC_GRID_SIZE + 1)
304  	__u32 lut_packed[PISP_BE_LSC_LUT_SIZE][PISP_BE_LSC_LUT_SIZE];
305  } __attribute__((packed));
306  
307  /**
308   * struct pisp_be_lsc_extra - PiSP Back End LSC Extra config
309   * @offset_x:		Horizontal offset into the LSC table of this tile
310   * @offset_y:		Vertical offset into the LSC table of this tile
311   */
312  struct pisp_be_lsc_extra {
313  	__u16 offset_x;
314  	__u16 offset_y;
315  } __attribute__((packed));
316  
317  #define PISP_BE_CAC_LOG_GRID_SIZE 3
318  #define PISP_BE_CAC_GRID_SIZE (1 << PISP_BE_CAC_LOG_GRID_SIZE)
319  #define PISP_BE_CAC_STEP_PRECISION 20
320  
321  /**
322   * struct pisp_be_cac_config - PiSP Back End CAC config
323   *
324   * Chromatic Aberration Correction config
325   *
326   * @grid_step_x:	Reciprocal of cell size width
327   * @grid_step_y:	Reciprocal of cell size height
328   * @lut:		Pixel shift for the CAC grid
329   */
330  struct pisp_be_cac_config {
331  	/* (1<<20) / grid_cell_width */
332  	__u16 grid_step_x;
333  	/* (1<<20) / grid_cell_height */
334  	__u16 grid_step_y;
335  	/* [gridy][gridx][rb][xy] */
336  #define PISP_BE_CAC_LUT_SIZE		(PISP_BE_CAC_GRID_SIZE + 1)
337  	__s8 lut[PISP_BE_CAC_LUT_SIZE][PISP_BE_CAC_LUT_SIZE][2][2];
338  } __attribute__((packed));
339  
340  /**
341   * struct pisp_be_cac_extra - PiSP Back End CAC extra config
342   * @offset_x:		Horizontal offset into the CAC table of this tile
343   * @offset_y:		Horizontal offset into the CAC table of this tile
344   */
345  struct pisp_be_cac_extra {
346  	__u16 offset_x;
347  	__u16 offset_y;
348  } __attribute__((packed));
349  
350  #define PISP_BE_DEBIN_NUM_COEFFS 4
351  
352  /**
353   * struct pisp_be_debin_config - PiSP Back End Debin config
354   *
355   * Debinning configuration
356   *
357   * @coeffs:		Filter coefficients for debinning
358   * @h_enable:		Horizontal debinning enable
359   * @v_enable:		Vertical debinning enable
360   * @pad:		Padding bytes
361   */
362  struct pisp_be_debin_config {
363  	__s8 coeffs[PISP_BE_DEBIN_NUM_COEFFS];
364  	__s8 h_enable;
365  	__s8 v_enable;
366  	__s8 pad[2];
367  } __attribute__((packed));
368  
369  #define PISP_BE_TONEMAP_LUT_SIZE 64
370  
371  /**
372   * struct pisp_be_tonemap_config - PiSP Back End Tonemap config
373   *
374   * Tonemapping configuration
375   *
376   * @detail_constant:	Constant value for threshold calculation
377   * @detail_slope:	Slope value for threshold calculation
378   * @iir_strength:	Relative strength of the IIR fiter
379   * @strength:		Strength factor
380   * @lut:		Look-up table for tonemap curve
381   */
382  struct pisp_be_tonemap_config {
383  	__u16 detail_constant;
384  	__u16 detail_slope;
385  	__u16 iir_strength;
386  	__u16 strength;
387  	__u32 lut[PISP_BE_TONEMAP_LUT_SIZE];
388  } __attribute__((packed));
389  
390  /**
391   * struct pisp_be_demosaic_config - PiSP Back End Demosaic config
392   *
393   * Demosaic configuration
394   *
395   * @sharper:		Use other Bayer channels to increase sharpness
396   * @fc_mode:		Built-in false colour suppression mode
397   * @pad:		Padding bytes
398   */
399  struct pisp_be_demosaic_config {
400  	__u8 sharper;
401  	__u8 fc_mode;
402  	__u8 pad[2];
403  } __attribute__((packed));
404  
405  /**
406   * struct pisp_be_ccm_config - PiSP Back End CCM config
407   *
408   * Colour Correction Matrix configuration
409   *
410   * @coeffs:		Matrix coefficients
411   * @pad:		Padding bytes
412   * @offsets:		Offsets triplet
413   */
414  struct pisp_be_ccm_config {
415  	__s16 coeffs[9];
416  	__u8 pad[2];
417  	__s32 offsets[3];
418  } __attribute__((packed));
419  
420  /**
421   * struct pisp_be_sat_control_config - PiSP Back End SAT config
422   *
423   * Saturation Control configuration
424   *
425   * @shift_r:		Left shift for Red colour channel
426   * @shift_g:		Left shift for Green colour channel
427   * @shift_b:		Left shift for Blue colour channel
428   * @pad:		Padding byte
429   */
430  struct pisp_be_sat_control_config {
431  	__u8 shift_r;
432  	__u8 shift_g;
433  	__u8 shift_b;
434  	__u8 pad;
435  } __attribute__((packed));
436  
437  /**
438   * struct pisp_be_false_colour_config - PiSP Back End False Colour config
439   *
440   * False Colour configuration
441   *
442   * @distance:		Distance of neighbouring pixels, either 1 or 2
443   * @pad:		Padding bytes
444   */
445  struct pisp_be_false_colour_config {
446  	__u8 distance;
447  	__u8 pad[3];
448  } __attribute__((packed));
449  
450  #define PISP_BE_SHARPEN_SIZE 5
451  #define PISP_BE_SHARPEN_FUNC_NUM_POINTS 9
452  
453  /**
454   * struct pisp_be_sharpen_config - PiSP Back End Sharpening config
455   *
456   * Sharpening configuration
457   *
458   * @kernel0:		Coefficient for filter 0
459   * @pad0:		Padding byte
460   * @kernel1:		Coefficient for filter 1
461   * @pad1:		Padding byte
462   * @kernel2:		Coefficient for filter 2
463   * @pad2:		Padding byte
464   * @kernel3:		Coefficient for filter 3
465   * @pad3:		Padding byte
466   * @kernel4:		Coefficient for filter 4
467   * @pad4:		Padding byte
468   * @threshold_offset0:	Offset for filter 0 response calculation
469   * @threshold_slope0:	Slope multiplier for the filter 0 response calculation
470   * @scale0:		Scale factor for filter 0 response calculation
471   * @pad5:		Padding byte
472   * @threshold_offset1:	Offset for filter 0 response calculation
473   * @threshold_slope1:	Slope multiplier for the filter 0 response calculation
474   * @scale1:		Scale factor for filter 0 response calculation
475   * @pad6:		Padding byte
476   * @threshold_offset2:	Offset for filter 0 response calculation
477   * @threshold_slope2:	Slope multiplier for the filter 0 response calculation
478   * @scale2:		Scale factor for filter 0 response calculation
479   * @pad7:		Padding byte
480   * @threshold_offset3:	Offset for filter 0 response calculation
481   * @threshold_slope3:	Slope multiplier for the filter 0 response calculation
482   * @scale3:		Scale factor for filter 0 response calculation
483   * @pad8:		Padding byte
484   * @threshold_offset4:	Offset for filter 0 response calculation
485   * @threshold_slope4:	Slope multiplier for the filter 0 response calculation
486   * @scale4:		Scale factor for filter 0 response calculation
487   * @pad9:		Padding byte
488   * @positive_strength:	Factor to scale the positive sharpening strength
489   * @positive_pre_limit:	Maximum allowed possible positive sharpening value
490   * @positive_func:	Gain factor applied to positive sharpening response
491   * @positive_limit:	Final gain factor applied to positive sharpening
492   * @negative_strength:	Factor to scale the negative sharpening strength
493   * @negative_pre_limit:	Maximum allowed possible negative sharpening value
494   * @negative_func:	Gain factor applied to negative sharpening response
495   * @negative_limit:	Final gain factor applied to negative sharpening
496   * @enables:		Filter enable mask
497   * @white:		White output pixel filter mask
498   * @black:		Black output pixel filter mask
499   * @grey:		Grey output pixel filter mask
500   */
501  struct pisp_be_sharpen_config {
502  	__s8 kernel0[PISP_BE_SHARPEN_SIZE * PISP_BE_SHARPEN_SIZE];
503  	__s8 pad0[3];
504  	__s8 kernel1[PISP_BE_SHARPEN_SIZE * PISP_BE_SHARPEN_SIZE];
505  	__s8 pad1[3];
506  	__s8 kernel2[PISP_BE_SHARPEN_SIZE * PISP_BE_SHARPEN_SIZE];
507  	__s8 pad2[3];
508  	__s8 kernel3[PISP_BE_SHARPEN_SIZE * PISP_BE_SHARPEN_SIZE];
509  	__s8 pad3[3];
510  	__s8 kernel4[PISP_BE_SHARPEN_SIZE * PISP_BE_SHARPEN_SIZE];
511  	__s8 pad4[3];
512  	__u16 threshold_offset0;
513  	__u16 threshold_slope0;
514  	__u16 scale0;
515  	__u16 pad5;
516  	__u16 threshold_offset1;
517  	__u16 threshold_slope1;
518  	__u16 scale1;
519  	__u16 pad6;
520  	__u16 threshold_offset2;
521  	__u16 threshold_slope2;
522  	__u16 scale2;
523  	__u16 pad7;
524  	__u16 threshold_offset3;
525  	__u16 threshold_slope3;
526  	__u16 scale3;
527  	__u16 pad8;
528  	__u16 threshold_offset4;
529  	__u16 threshold_slope4;
530  	__u16 scale4;
531  	__u16 pad9;
532  	__u16 positive_strength;
533  	__u16 positive_pre_limit;
534  	__u16 positive_func[PISP_BE_SHARPEN_FUNC_NUM_POINTS];
535  	__u16 positive_limit;
536  	__u16 negative_strength;
537  	__u16 negative_pre_limit;
538  	__u16 negative_func[PISP_BE_SHARPEN_FUNC_NUM_POINTS];
539  	__u16 negative_limit;
540  	__u8 enables;
541  	__u8 white;
542  	__u8 black;
543  	__u8 grey;
544  } __attribute__((packed));
545  
546  /**
547   * struct pisp_be_sh_fc_combine_config - PiSP Back End Sharpening and
548   *					 False Colour config
549   *
550   * Sharpening and False Colour configuration
551   *
552   * @y_factor:		Control amount of desaturation of pixels being darkened
553   * @c1_factor:		Control amount of brightening of a pixel for the Cb
554   *			channel
555   * @c2_factor:		Control amount of brightening of a pixel for the Cr
556   *			channel
557   * @pad:		Padding byte
558   */
559  struct pisp_be_sh_fc_combine_config {
560  	__u8 y_factor;
561  	__u8 c1_factor;
562  	__u8 c2_factor;
563  	__u8 pad;
564  } __attribute__((packed));
565  
566  #define PISP_BE_GAMMA_LUT_SIZE 64
567  
568  /**
569   * struct pisp_be_gamma_config - PiSP Back End Gamma configuration
570   * @lut:		Gamma curve look-up table
571   */
572  struct pisp_be_gamma_config {
573  	__u32 lut[PISP_BE_GAMMA_LUT_SIZE];
574  } __attribute__((packed));
575  
576  /**
577   * struct pisp_be_crop_config - PiSP Back End Crop config
578   *
579   * Crop configuration
580   *
581   * @offset_x:		Number of pixels cropped from the left of the tile
582   * @offset_y:		Number of pixels cropped from the top of the tile
583   * @width:		Width of the cropped tile output
584   * @height:		Height of the cropped tile output
585   */
586  struct pisp_be_crop_config {
587  	__u16 offset_x, offset_y;
588  	__u16 width, height;
589  } __attribute__((packed));
590  
591  #define PISP_BE_RESAMPLE_FILTER_SIZE 96
592  
593  /**
594   * struct pisp_be_resample_config - PiSP Back End Resampling config
595   *
596   * Resample configuration
597   *
598   * @scale_factor_h:	Horizontal scale factor
599   * @scale_factor_v:	Vertical scale factor
600   * @coef:		Resample coefficients
601   */
602  struct pisp_be_resample_config {
603  	__u16 scale_factor_h, scale_factor_v;
604  	__s16 coef[PISP_BE_RESAMPLE_FILTER_SIZE];
605  } __attribute__((packed));
606  
607  /**
608   * struct pisp_be_resample_extra - PiSP Back End Resample config
609   *
610   * Resample configuration
611   *
612   * @scaled_width:	Width in pixels of the scaled output
613   * @scaled_height:	Height in pixels of the scaled output
614   * @initial_phase_h:	Initial horizontal phase
615   * @initial_phase_v:	Initial vertical phase
616   */
617  struct pisp_be_resample_extra {
618  	__u16 scaled_width;
619  	__u16 scaled_height;
620  	__s16 initial_phase_h[3];
621  	__s16 initial_phase_v[3];
622  } __attribute__((packed));
623  
624  /**
625   * struct pisp_be_downscale_config - PiSP Back End Downscale config
626   *
627   * Downscale configuration
628   *
629   * @scale_factor_h:	Horizontal scale factor
630   * @scale_factor_v:	Vertical scale factor
631   * @scale_recip_h:	Horizontal reciprocal factor
632   * @scale_recip_v:	Vertical reciprocal factor
633   */
634  struct pisp_be_downscale_config {
635  	__u16 scale_factor_h;
636  	__u16 scale_factor_v;
637  	__u16 scale_recip_h;
638  	__u16 scale_recip_v;
639  } __attribute__((packed));
640  
641  /**
642   * struct pisp_be_downscale_extra - PiSP Back End Downscale Extra config
643   * @scaled_width:	Scaled image width
644   * @scaled_height:	Scaled image height
645   */
646  struct pisp_be_downscale_extra {
647  	__u16 scaled_width;
648  	__u16 scaled_height;
649  } __attribute__((packed));
650  
651  /**
652   * struct pisp_be_hog_config - PiSP Back End HOG config
653   *
654   * Histogram of Oriented Gradients configuration
655   *
656   * @compute_signed:	Set 0 for unsigned gradients, 1 for signed
657   * @channel_mix:	Channels proportions to use
658   * @stride:		Stride in bytes between blocks directly below
659   */
660  struct pisp_be_hog_config {
661  	__u8 compute_signed;
662  	__u8 channel_mix[3];
663  	__u32 stride;
664  } __attribute__((packed));
665  
666  struct pisp_be_axi_config {
667  	__u8 r_qos; /* Read QoS */
668  	__u8 r_cache_prot; /* Read { prot[2:0], cache[3:0] } */
669  	__u8 w_qos; /* Write QoS */
670  	__u8 w_cache_prot; /* Write { prot[2:0], cache[3:0] } */
671  } __attribute__((packed));
672  
673  /**
674   * enum pisp_be_transform - PiSP Back End Transform flags
675   * @PISP_BE_TRANSFORM_NONE:	No transform
676   * @PISP_BE_TRANSFORM_HFLIP:	Horizontal flip
677   * @PISP_BE_TRANSFORM_VFLIP:	Vertical flip
678   * @PISP_BE_TRANSFORM_ROT180:	180 degress rotation
679   */
680  enum pisp_be_transform {
681  	PISP_BE_TRANSFORM_NONE = 0x0,
682  	PISP_BE_TRANSFORM_HFLIP = 0x1,
683  	PISP_BE_TRANSFORM_VFLIP = 0x2,
684  	PISP_BE_TRANSFORM_ROT180 =
685  		(PISP_BE_TRANSFORM_HFLIP | PISP_BE_TRANSFORM_VFLIP)
686  };
687  
688  struct pisp_be_output_format_config {
689  	struct pisp_image_format_config image;
690  	__u8 transform;
691  	__u8 pad[3];
692  	__u16 lo;
693  	__u16 hi;
694  	__u16 lo2;
695  	__u16 hi2;
696  } __attribute__((packed));
697  
698  /**
699   * struct pisp_be_output_buffer_config - PiSP Back End Output buffer
700   * @addr:		Output buffer address
701   */
702  struct pisp_be_output_buffer_config {
703  	/* low 32 bits followed by high 32 bits (for each of 3 planes) */
704  	__u32 addr[3][2];
705  } __attribute__((packed));
706  
707  /**
708   * struct pisp_be_hog_buffer_config - PiSP Back End HOG buffer
709   * @addr:		HOG buffer address
710   */
711  struct pisp_be_hog_buffer_config {
712  	/* low 32 bits followed by high 32 bits */
713  	__u32 addr[2];
714  } __attribute__((packed));
715  
716  /**
717   * struct pisp_be_config - RaspberryPi PiSP Back End Processing configuration
718   *
719   * @input_buffer:		Input buffer addresses
720   * @tdn_input_buffer:		TDN input buffer addresses
721   * @stitch_input_buffer:	Stitch input buffer addresses
722   * @tdn_output_buffer:		TDN output buffer addresses
723   * @stitch_output_buffer:	Stitch output buffer addresses
724   * @output_buffer:		Output buffers addresses
725   * @hog_buffer:			HOG buffer addresses
726   * @global:			Global PiSP configuration
727   * @input_format:		Input image format
728   * @decompress:			Decompress configuration
729   * @dpc:			Defective Pixel Correction configuration
730   * @geq:			Green Equalisation configuration
731   * @tdn_input_format:		Temporal Denoise input format
732   * @tdn_decompress:		Temporal Denoise decompress configuration
733   * @tdn:			Temporal Denoise configuration
734   * @tdn_compress:		Temporal Denoise compress configuration
735   * @tdn_output_format:		Temporal Denoise output format
736   * @sdn:			Spatial Denoise configuration
737   * @blc:			Black Level Correction configuration
738   * @stitch_compress:		Stitch compress configuration
739   * @stitch_output_format:	Stitch output format
740   * @stitch_input_format:	Stitch input format
741   * @stitch_decompress:		Stitch decompress configuration
742   * @stitch:			Stitch configuration
743   * @lsc:			Lens Shading Correction configuration
744   * @wbg:			White Balance Gain configuration
745   * @cdn:			Colour Denoise configuration
746   * @cac:			Colour Aberration Correction configuration
747   * @debin:			Debinning configuration
748   * @tonemap:			Tonemapping configuration
749   * @demosaic:			Demosaicing configuration
750   * @ccm:			Colour Correction Matrix configuration
751   * @sat_control:		Saturation Control configuration
752   * @ycbcr:			YCbCr colour correction configuration
753   * @sharpen:			Sharpening configuration
754   * @false_colour:		False colour correction
755   * @sh_fc_combine:		Sharpening and False Colour correction
756   * @ycbcr_inverse:		Inverse YCbCr colour correction
757   * @gamma:			Gamma curve configuration
758   * @csc:			Color Space Conversion configuration
759   * @downscale:			Downscale configuration
760   * @resample:			Resampling configuration
761   * @output_format:		Output format configuration
762   * @hog:			HOG configuration
763   * @axi:			AXI bus configuration
764   * @lsc_extra:			LSC extra info
765   * @cac_extra:			CAC extra info
766   * @downscale_extra:		Downscaler extra info
767   * @resample_extra:		Resample extra info
768   * @crop:			Crop configuration
769   * @hog_format:			HOG format info
770   * @dirty_flags_bayer:		Bayer enable dirty flags
771   *				(:c:type:`pisp_be_bayer_enable`)
772   * @dirty_flags_rgb:		RGB enable dirty flags
773   *				(:c:type:`pisp_be_rgb_enable`)
774   * @dirty_flags_extra:		Extra dirty flags
775   */
776  struct pisp_be_config {
777  	/* I/O configuration: */
778  	struct pisp_be_input_buffer_config input_buffer;
779  	struct pisp_be_tdn_input_buffer_config tdn_input_buffer;
780  	struct pisp_be_stitch_input_buffer_config stitch_input_buffer;
781  	struct pisp_be_tdn_output_buffer_config tdn_output_buffer;
782  	struct pisp_be_stitch_output_buffer_config stitch_output_buffer;
783  	struct pisp_be_output_buffer_config
784  				output_buffer[PISP_BACK_END_NUM_OUTPUTS];
785  	struct pisp_be_hog_buffer_config hog_buffer;
786  	/* Processing configuration: */
787  	struct pisp_be_global_config global;
788  	struct pisp_image_format_config input_format;
789  	struct pisp_decompress_config decompress;
790  	struct pisp_be_dpc_config dpc;
791  	struct pisp_be_geq_config geq;
792  	struct pisp_image_format_config tdn_input_format;
793  	struct pisp_decompress_config tdn_decompress;
794  	struct pisp_be_tdn_config tdn;
795  	struct pisp_compress_config tdn_compress;
796  	struct pisp_image_format_config tdn_output_format;
797  	struct pisp_be_sdn_config sdn;
798  	struct pisp_bla_config blc;
799  	struct pisp_compress_config stitch_compress;
800  	struct pisp_image_format_config stitch_output_format;
801  	struct pisp_image_format_config stitch_input_format;
802  	struct pisp_decompress_config stitch_decompress;
803  	struct pisp_be_stitch_config stitch;
804  	struct pisp_be_lsc_config lsc;
805  	struct pisp_wbg_config wbg;
806  	struct pisp_be_cdn_config cdn;
807  	struct pisp_be_cac_config cac;
808  	struct pisp_be_debin_config debin;
809  	struct pisp_be_tonemap_config tonemap;
810  	struct pisp_be_demosaic_config demosaic;
811  	struct pisp_be_ccm_config ccm;
812  	struct pisp_be_sat_control_config sat_control;
813  	struct pisp_be_ccm_config ycbcr;
814  	struct pisp_be_sharpen_config sharpen;
815  	struct pisp_be_false_colour_config false_colour;
816  	struct pisp_be_sh_fc_combine_config sh_fc_combine;
817  	struct pisp_be_ccm_config ycbcr_inverse;
818  	struct pisp_be_gamma_config gamma;
819  	struct pisp_be_ccm_config csc[PISP_BACK_END_NUM_OUTPUTS];
820  	struct pisp_be_downscale_config downscale[PISP_BACK_END_NUM_OUTPUTS];
821  	struct pisp_be_resample_config resample[PISP_BACK_END_NUM_OUTPUTS];
822  	struct pisp_be_output_format_config
823  				output_format[PISP_BACK_END_NUM_OUTPUTS];
824  	struct pisp_be_hog_config hog;
825  	struct pisp_be_axi_config axi;
826  	/* Non-register fields: */
827  	struct pisp_be_lsc_extra lsc_extra;
828  	struct pisp_be_cac_extra cac_extra;
829  	struct pisp_be_downscale_extra
830  				downscale_extra[PISP_BACK_END_NUM_OUTPUTS];
831  	struct pisp_be_resample_extra resample_extra[PISP_BACK_END_NUM_OUTPUTS];
832  	struct pisp_be_crop_config crop;
833  	struct pisp_image_format_config hog_format;
834  	__u32 dirty_flags_bayer; /* these use pisp_be_bayer_enable */
835  	__u32 dirty_flags_rgb; /* use pisp_be_rgb_enable */
836  	__u32 dirty_flags_extra; /* these use pisp_be_dirty_t */
837  } __attribute__((packed));
838  
839  /**
840   * enum pisp_tile_edge - PiSP Back End Tile position
841   * @PISP_LEFT_EDGE:		Left edge tile
842   * @PISP_RIGHT_EDGE:		Right edge tile
843   * @PISP_TOP_EDGE:		Top edge tile
844   * @PISP_BOTTOM_EDGE:		Bottom edge tile
845   */
846  enum pisp_tile_edge {
847  	PISP_LEFT_EDGE = (1 << 0),
848  	PISP_RIGHT_EDGE = (1 << 1),
849  	PISP_TOP_EDGE = (1 << 2),
850  	PISP_BOTTOM_EDGE = (1 << 3)
851  };
852  
853  /**
854   * struct pisp_tile - Raspberry Pi PiSP Back End tile configuration
855   *
856   * Tile parameters: each set of tile parameters is a 160-bytes block of data
857   * which contains the tile processing parameters.
858   *
859   * @edge:			Edge tile flag
860   * @pad0:			Padding bytes
861   * @input_addr_offset:		Top-left pixel offset, in bytes
862   * @input_addr_offset2:		Top-left pixel offset, in bytes for the second/
863   *				third image planes
864   * @input_offset_x:		Horizontal offset in pixels of this tile in the
865   *				input image
866   * @input_offset_y:		Vertical offset in pixels of this tile in the
867   *				input image
868   * @input_width:		Width in pixels of this tile
869   * @input_height:		Height in pixels of the this tile
870   * @tdn_input_addr_offset:	TDN input image offset, in bytes
871   * @tdn_output_addr_offset:	TDN output image offset, in bytes
872   * @stitch_input_addr_offset:	Stitch input image offset, in bytes
873   * @stitch_output_addr_offset:	Stitch output image offset, in bytes
874   * @lsc_grid_offset_x:		Horizontal offset in the LSC table for this tile
875   * @lsc_grid_offset_y:		Vertical offset in the LSC table for this tile
876   * @cac_grid_offset_x:		Horizontal offset in the CAC table for this tile
877   * @cac_grid_offset_y:		Horizontal offset in the CAC table for this tile
878   * @crop_x_start:		Number of pixels cropped from the left of the
879   *				tile
880   * @crop_x_end:			Number of pixels cropped from the right of the
881   *				tile
882   * @crop_y_start:		Number of pixels cropped from the top of the
883   *				tile
884   * @crop_y_end:			Number of pixels cropped from the bottom of the
885   *				tile
886   * @downscale_phase_x:		Initial horizontal phase in pixels
887   * @downscale_phase_y:		Initial vertical phase in pixels
888   * @resample_in_width:		Width in pixels of the tile entering the
889   *				Resample block
890   * @resample_in_height:		Height in pixels of the tile entering the
891   *				Resample block
892   * @resample_phase_x:		Initial horizontal phase for the Resample block
893   * @resample_phase_y:		Initial vertical phase for the Resample block
894   * @output_offset_x:		Horizontal offset in pixels where the tile will
895   *				be written into the output image
896   * @output_offset_y:		Vertical offset in pixels where the tile will be
897   *				written into the output image
898   * @output_width:		Width in pixels in the output image of this tile
899   * @output_height:		Height in pixels in the output image of this tile
900   * @output_addr_offset:		Offset in bytes into the output buffer
901   * @output_addr_offset2:	Offset in bytes into the output buffer for the
902   *				second and third plane
903   * @output_hog_addr_offset:	Offset in bytes into the HOG buffer where
904   *				results of this tile are to be written
905   */
906  struct pisp_tile {
907  	__u8 edge; /* enum pisp_tile_edge */
908  	__u8 pad0[3];
909  	/* 4 bytes */
910  	__u32 input_addr_offset;
911  	__u32 input_addr_offset2;
912  	__u16 input_offset_x;
913  	__u16 input_offset_y;
914  	__u16 input_width;
915  	__u16 input_height;
916  	/* 20 bytes */
917  	__u32 tdn_input_addr_offset;
918  	__u32 tdn_output_addr_offset;
919  	__u32 stitch_input_addr_offset;
920  	__u32 stitch_output_addr_offset;
921  	/* 36 bytes */
922  	__u32 lsc_grid_offset_x;
923  	__u32 lsc_grid_offset_y;
924  	/* 44 bytes */
925  	__u32 cac_grid_offset_x;
926  	__u32 cac_grid_offset_y;
927  	/* 52 bytes */
928  	__u16 crop_x_start[PISP_BACK_END_NUM_OUTPUTS];
929  	__u16 crop_x_end[PISP_BACK_END_NUM_OUTPUTS];
930  	__u16 crop_y_start[PISP_BACK_END_NUM_OUTPUTS];
931  	__u16 crop_y_end[PISP_BACK_END_NUM_OUTPUTS];
932  	/* 68 bytes */
933  	/* Ordering is planes then branches */
934  	__u16 downscale_phase_x[3 * PISP_BACK_END_NUM_OUTPUTS];
935  	__u16 downscale_phase_y[3 * PISP_BACK_END_NUM_OUTPUTS];
936  	/* 92 bytes */
937  	__u16 resample_in_width[PISP_BACK_END_NUM_OUTPUTS];
938  	__u16 resample_in_height[PISP_BACK_END_NUM_OUTPUTS];
939  	/* 100 bytes */
940  	/* Ordering is planes then branches */
941  	__u16 resample_phase_x[3 * PISP_BACK_END_NUM_OUTPUTS];
942  	__u16 resample_phase_y[3 * PISP_BACK_END_NUM_OUTPUTS];
943  	/* 124 bytes */
944  	__u16 output_offset_x[PISP_BACK_END_NUM_OUTPUTS];
945  	__u16 output_offset_y[PISP_BACK_END_NUM_OUTPUTS];
946  	__u16 output_width[PISP_BACK_END_NUM_OUTPUTS];
947  	__u16 output_height[PISP_BACK_END_NUM_OUTPUTS];
948  	/* 140 bytes */
949  	__u32 output_addr_offset[PISP_BACK_END_NUM_OUTPUTS];
950  	__u32 output_addr_offset2[PISP_BACK_END_NUM_OUTPUTS];
951  	/* 156 bytes */
952  	__u32 output_hog_addr_offset;
953  	/* 160 bytes */
954  } __attribute__((packed));
955  
956  /**
957   * struct pisp_be_tiles_config - Raspberry Pi PiSP Back End configuration
958   * @tiles:	Tile descriptors
959   * @num_tiles:	Number of tiles
960   * @config:	PiSP Back End configuration
961   */
962  struct pisp_be_tiles_config {
963  	struct pisp_be_config config;
964  	struct pisp_tile tiles[PISP_BACK_END_NUM_TILES];
965  	__u32 num_tiles;
966  } __attribute__((packed));
967  
968  #endif /* _UAPI_PISP_BE_CONFIG_H_ */
969