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_ */