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