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