File Index
Files and directories
Sign in
FILE

intel-ipu3.h

File preview with syntax highlighting.

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