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