zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

pisp_be_config.h (31054B) - Raw


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