RE: [PATCH v4 04/12] intel-ipu3: Add user space ABI definitions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Sakari,

> -----Original Message-----
> From: Sakari Ailus [mailto:sakari.ailus@xxxxxx]
> Sent: Friday, October 20, 2017 2:30 AM
> To: Zhi, Yong <yong.zhi@xxxxxxxxx>
> Cc: linux-media@xxxxxxxxxxxxxxx; sakari.ailus@xxxxxxxxxxxxxxx; Zheng, Jian Xu
> <jian.xu.zheng@xxxxxxxxx>; Mani, Rajmohan <rajmohan.mani@xxxxxxxxx>;
> Toivonen, Tuukka <tuukka.toivonen@xxxxxxxxx>; Hu, Jerry W
> <jerry.w.hu@xxxxxxxxx>
> Subject: Re: [PATCH v4 04/12] intel-ipu3: Add user space ABI definitions
> 
> Hi Yong,
> 
> On Tue, Oct 17, 2017 at 10:54:49PM -0500, Yong Zhi wrote:
> > The UAPI header defines the structures and macros
> > to be used by user space.
> >
> > Signed-off-by: Rajmohan Mani <rajmohan.mani@xxxxxxxxx>
> > Signed-off-by: Yong Zhi <yong.zhi@xxxxxxxxx>
> > ---
> >  include/uapi/linux/intel-ipu3.h | 2199
> +++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 2199 insertions(+)
> >  create mode 100644 include/uapi/linux/intel-ipu3.h
> >
> > diff --git a/include/uapi/linux/intel-ipu3.h b/include/uapi/linux/intel-ipu3.h
> > new file mode 100644
> > index 000000000000..e27a449b4ec1
> > --- /dev/null
> > +++ b/include/uapi/linux/intel-ipu3.h
> > @@ -0,0 +1,2199 @@
> > +/*
> > + * Copyright (c) 2017 Intel Corporation.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License version
> > + * 2 as published by the Free Software Foundation.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + */
> > +
> > +#ifndef __IPU3_UAPI_H
> > +#define __IPU3_UAPI_H
> > +
> > +#include <linux/types.h>
> > +
> > +#define IPU3_UAPI_ISP_VEC_ELEMS				64
> > +
> > +#define IMGU_ABI_PAD	__aligned(IPU3_UAPI_ISP_WORD_BYTES)
> > +#define IPU3_ALIGN
> 	__attribute__((aligned(IPU3_UAPI_ISP_WORD_BYTES)))
> > +
> > +#define IPU3_UAPI_ISP_WORD_BYTES			32
> > +#define IPU3_UAPI_MAX_STRIPES				2
> > +
> > +/******************* ipu3_uapi_stats_3a *******************/
> > +
> > +#define IPU3_UAPI_MAX_BUBBLE_SIZE			10
> > +
> > +#define IPU3_UAPI_AE_COLORS				4
> > +#define IPU3_UAPI_AE_BINS				256
> > +
> > +#define IPU3_UAPI_AWB_MD_ITEM_SIZE			8
> > +#define IPU3_UAPI_AWB_MAX_SETS				60
> > +#define IPU3_UAPI_AWB_SET_SIZE				0x500
> > +#define IPU3_UAPI_AWB_SPARE_FOR_BUBBLES \
> > +		(IPU3_UAPI_MAX_BUBBLE_SIZE * IPU3_UAPI_MAX_STRIPES * \
> > +		 IPU3_UAPI_AWB_MD_ITEM_SIZE)
> > +#define IPU3_UAPI_AWB_MAX_BUFFER_SIZE \
> > +		(IPU3_UAPI_AWB_MAX_SETS * \
> > +		 (IPU3_UAPI_AWB_SET_SIZE +
> IPU3_UAPI_AWB_SPARE_FOR_BUBBLES))
> > +
> > +#define IPU3_UAPI_AF_MAX_SETS				24
> > +#define IPU3_UAPI_AF_MD_ITEM_SIZE			4
> > +#define IPU3_UAPI_AF_SPARE_FOR_BUBBLES \
> > +		(IPU3_UAPI_MAX_BUBBLE_SIZE * IPU3_UAPI_MAX_STRIPES * \
> > +		 IPU3_UAPI_AF_MD_ITEM_SIZE)
> > +#define IPU3_UAPI_AF_Y_TABLE_SET_SIZE			0x80
> > +#define IPU3_UAPI_AF_Y_TABLE_MAX_SIZE \
> > +	(IPU3_UAPI_AF_MAX_SETS * \
> > +	 (IPU3_UAPI_AF_Y_TABLE_SET_SIZE +
> IPU3_UAPI_AF_SPARE_FOR_BUBBLES) * \
> > +	 IPU3_UAPI_MAX_STRIPES)
> > +
> > +#define IPU3_UAPI_AWB_FR_MAX_SETS			24
> > +#define IPU3_UAPI_AWB_FR_MD_ITEM_SIZE			8
> > +#define IPU3_UAPI_AWB_FR_BAYER_TBL_SIZE			0x100
> > +#define IPU3_UAPI_AWB_FR_SPARE_FOR_BUBBLES \
> > +		(IPU3_UAPI_MAX_BUBBLE_SIZE * IPU3_UAPI_MAX_STRIPES * \
> > +		IPU3_UAPI_AWB_FR_MD_ITEM_SIZE)
> > +#define IPU3_UAPI_AWB_FR_BAYER_TABLE_MAX_SIZE \
> > +	(IPU3_UAPI_AWB_FR_MAX_SETS * \
> > +	(IPU3_UAPI_AWB_FR_BAYER_TBL_SIZE + \
> > +	 IPU3_UAPI_AWB_FR_SPARE_FOR_BUBBLES) * \
> > +	IPU3_UAPI_MAX_STRIPES)
> > +
> > +struct ipu3_uapi_grid_config {
> > +	__u8 width;				/* 6 or 7 (rgbs_grd_cfg) bits */
> > +	__u8 height;
> > +	__u16 block_width_log2:3;
> > +	__u16 block_height_log2:3;
> > +	__u16 height_per_slice:8;			/* default value 1 */
> > +	__u16 x_start;					/* 12 bits */
> > +	__u16 y_start;
> > +#define IPU3_UAPI_GRID_START_MASK			((1 << 12) - 1)
> > +#define IPU3_UAPI_GRID_Y_START_EN			(1 << 15)
> > +	__u16 x_end;					/* 12 bits */
> > +	__u16 y_end;
> > +} __packed;
> > +
> > +struct ipu3_uapi_awb_meta_data {
> > +	__u8 meta_data_buffer[IPU3_UAPI_AWB_MAX_BUFFER_SIZE];
> > +} __packed;
> > +
> > +struct ipu3_uapi_awb_raw_buffer {
> > +	struct ipu3_uapi_awb_meta_data meta_data;
> > +} __packed;
> > +
> > +struct IPU3_ALIGN ipu3_uapi_awb_config_s {
> > +	__u16 rgbs_thr_gr;
> > +	__u16 rgbs_thr_r;
> > +	__u16 rgbs_thr_gb;
> > +	__u16 rgbs_thr_b;
> > +/* controls generation of meta_data (like FF enable/disable) */
> > +#define IPU3_UAPI_AWB_RGBS_THR_B_EN		(1 << 14)
> > +#define IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT	(1 << 15)
> > +
> > +	struct ipu3_uapi_grid_config grid;
> > +} __packed;
> > +
> > +struct ipu3_uapi_ae_raw_buffer {
> > +	__u32 vals[IPU3_UAPI_AE_BINS * IPU3_UAPI_AE_COLORS];
> > +} __packed;
> > +
> > +struct ipu3_uapi_ae_raw_buffer_aligned {
> > +	struct ipu3_uapi_ae_raw_buffer buff IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_ae_grid_config {
> > +	__u8 width;
> > +	__u8 height;
> > +	__u8 block_width_log2:4;
> > +	__u8 block_height_log2:4;
> > +	__u8 __reserved0:5;
> > +	__u8 ae_en:1;
> > +	__u8 rst_hist_array:1;
> > +	__u8 done_rst_hist_array:1;
> > +	__u16 x_start;			/* 12 bits */
> > +	__u16 y_start;
> > +	__u16 x_end;
> > +	__u16 y_end;
> > +} __packed;
> > +
> > +struct ipu3_uapi_af_filter_config {
> > +	struct {
> > +		__u8 a1;
> > +		__u8 a2;
> > +		__u8 a3;
> > +		__u8 a4;
> > +	} y1_coeff_0;
> > +	struct {
> > +		__u8 a5;
> > +		__u8 a6;
> > +		__u8 a7;
> > +		__u8 a8;
> > +	} y1_coeff_1;
> > +	struct {
> > +		__u8 a9;
> > +		__u8 a10;
> > +		__u8 a11;
> > +		__u8 a12;
> > +	} y1_coeff_2;
> > +
> > +	__u32 y1_sign_vec;
> > +
> > +	struct {
> > +		__u8 a1;
> > +		__u8 a2;
> > +		__u8 a3;
> > +		__u8 a4;
> > +	} y2_coeff_0;
> > +	struct {
> > +		__u8 a5;
> > +		__u8 a6;
> > +		__u8 a7;
> > +		__u8 a8;
> > +	} y2_coeff_1;
> > +	struct {
> > +		__u8 a9;
> > +		__u8 a10;
> > +		__u8 a11;
> > +		__u8 a12;
> > +	} y2_coeff_2;
> > +
> > +	__u32 y2_sign_vec;
> > +
> > +	struct {
> > +		__u8 y_gen_rate_gr;	/* 6 bits */
> > +		__u8 y_gen_rate_r;
> > +		__u8 y_gen_rate_b;
> > +		__u8 y_gen_rate_gb;
> > +	} y_calc;
> > +
> > +	struct {
> > +		__u32 __reserved0:8;
> > +		__u32 y1_nf:4;
> > +		__u32 __reserved1:4;
> > +		__u32 y2_nf:4;
> > +		__u32 __reserved2:12;
> > +	} nf;
> > +} __packed;
> > +
> > +struct ipu3_uapi_af_meta_data {
> > +	__u8 y_table[IPU3_UAPI_AF_Y_TABLE_MAX_SIZE] IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_af_raw_buffer {
> > +	struct ipu3_uapi_af_meta_data meta_data IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_af_frame_size {
> > +	__u16 width;
> > +	__u16 height;
> > +} __packed;
> > +
> > +struct ipu3_uapi_af_config_s {
> > +	struct ipu3_uapi_af_filter_config filter_config IPU3_ALIGN;
> > +	struct ipu3_uapi_af_frame_size frame_size;
> > +	struct ipu3_uapi_grid_config grid_cfg IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_awb_fr_meta_data {
> > +	__u8 bayer_table[IPU3_UAPI_AWB_FR_BAYER_TABLE_MAX_SIZE]
> IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_awb_fr_raw_buffer {
> > +	struct ipu3_uapi_awb_fr_meta_data meta_data;
> > +} __packed;
> > +
> > +struct IPU3_ALIGN ipu3_uapi_awb_fr_config_s {
> > +	struct ipu3_uapi_grid_config grid_cfg;
> > +	__u8 bayer_coeff[6];
> > +	__u16 __reserved1;
> > +	__u32 bayer_sign;		/* 11 bits */
> > +	__u8 bayer_nf;			/* 4 bits */
> > +	__u8 __reserved2[3];
> > +} __packed;
> > +
> > +struct ipu3_uapi_4a_config {
> > +	struct ipu3_uapi_awb_config_s awb_config IPU3_ALIGN;
> > +	struct ipu3_uapi_ae_grid_config ae_grd_config IPU3_ALIGN;
> > +	__u8 padding[20];
> > +	struct ipu3_uapi_af_config_s af_config IPU3_ALIGN;
> > +	struct ipu3_uapi_awb_fr_config_s awb_fr_config IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bubble_info {
> > +	__u32 num_of_stripes IPU3_ALIGN;
> > +	__u8 padding[28];
> > +	__u32 num_sets IPU3_ALIGN;
> > +	__u8 padding1[28];
> > +	__u32 size_of_set IPU3_ALIGN;
> > +	__u8 padding2[28];
> > +	__u32 bubble_size IPU3_ALIGN;
> > +	__u8 padding3[28];
> > +} __packed;
> > +
> > +struct ipu3_uapi_stats_3a_bubble_info_per_stripe {
> > +	struct ipu3_uapi_bubble_info awb[IPU3_UAPI_MAX_STRIPES];
> > +	struct ipu3_uapi_bubble_info af[IPU3_UAPI_MAX_STRIPES];
> > +	struct ipu3_uapi_bubble_info awb_fr[IPU3_UAPI_MAX_STRIPES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_ff_status {
> > +	__u32 awb_en IPU3_ALIGN;
> > +	__u8 padding[28];
> > +	__u32 ae_en IPU3_ALIGN;
> > +	__u8 padding1[28];
> > +	__u32 af_en IPU3_ALIGN;
> > +	__u8 padding2[28];
> > +	__u32 awb_fr_en IPU3_ALIGN;
> > +	__u8 padding3[28];
> > +} __packed;
> > +
> > +struct ipu3_uapi_stats_3a {
> > +	struct ipu3_uapi_awb_raw_buffer awb_raw_buffer IPU3_ALIGN;
> > +	struct ipu3_uapi_ae_raw_buffer_aligned
> > +			ae_raw_buffer[IPU3_UAPI_MAX_STRIPES]
> IPU3_ALIGN;
> > +	struct ipu3_uapi_af_raw_buffer af_raw_buffer IPU3_ALIGN;
> > +	struct ipu3_uapi_awb_fr_raw_buffer awb_fr_raw_buffer IPU3_ALIGN;
> > +	struct ipu3_uapi_4a_config stats_4a_config IPU3_ALIGN;
> > +	__u32 ae_join_buffers IPU3_ALIGN;
> > +	__u8 padding[28];
> > +	struct ipu3_uapi_stats_3a_bubble_info_per_stripe
> > +			stats_3a_bubble_per_stripe IPU3_ALIGN;
> > +	struct ipu3_uapi_ff_status stats_3a_status IPU3_ALIGN;
> > +} __packed;
> > +
> > +/******************* ipu3_uapi_stats_dvs *******************/
> > +
> > +#define IPU3_UAPI_DVS_STAT_LEVELS			3
> > +#define IPU3_UAPI_DVS_STAT_L0_MV_VEC_PER_SET		12
> > +#define IPU3_UAPI_DVS_STAT_L1_MV_VEC_PER_SET		11
> > +#define IPU3_UAPI_DVS_STAT_L2_MV_VEC_PER_SET		9
> > +#define IPU3_UAPI_DVS_STAT_STRIPE_ALIGN_GAP
> 	IPU3_UAPI_MAX_STRIPES
> > +#define IPU3_UAPI_DVS_STAT_MAX_VERTICAL_FEATURES		16
> > +
> > +struct ipu3_uapi_dvs_stat_mv {
> > +	__u16 vec_fe_x_pos;		/* 12 bits */
> > +	__u16 vec_fe_y_pos;
> > +	__u16 vec_fm_x_pos;		/* 12 bits */
> > +	__u16 vec_fm_y_pos;
> > +	__u32 harris_grade;		/* 28 bits */
> > +	__u16 match_grade;		/* 15 bits */
> > +	__u16 level;			/* 3 bits */
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_mv_single_set_l0 {
> > +	struct ipu3_uapi_dvs_stat_mv
> > +		mv_entry[IPU3_UAPI_DVS_STAT_L0_MV_VEC_PER_SET +
> > +		IPU3_UAPI_DVS_STAT_STRIPE_ALIGN_GAP] IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_mv_single_set_l1 {
> > +	struct ipu3_uapi_dvs_stat_mv
> > +		mv_entry[IPU3_UAPI_DVS_STAT_L1_MV_VEC_PER_SET +
> > +		IPU3_UAPI_DVS_STAT_STRIPE_ALIGN_GAP] IPU3_ALIGN;
> > +	__u8 padding[16];
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_mv_single_set_l2 {
> > +	struct ipu3_uapi_dvs_stat_mv
> > +		mv_entry[IPU3_UAPI_DVS_STAT_L2_MV_VEC_PER_SET +
> > +		IPU3_UAPI_DVS_STAT_STRIPE_ALIGN_GAP] IPU3_ALIGN;
> > +	__u8 padding[16];
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_motion_vec {
> > +	struct ipu3_uapi_dvs_stat_mv_single_set_l0
> > +
> 	dvs_mv_output_l0[IPU3_UAPI_DVS_STAT_MAX_VERTICAL_FEATURES]
> > +		IPU3_ALIGN;
> > +	struct ipu3_uapi_dvs_stat_mv_single_set_l1
> > +
> 	dvs_mv_output_l1[IPU3_UAPI_DVS_STAT_MAX_VERTICAL_FEATURES]
> > +		IPU3_ALIGN;
> > +	struct ipu3_uapi_dvs_stat_mv_single_set_l2
> > +
> 	dvs_mv_output_l2[IPU3_UAPI_DVS_STAT_MAX_VERTICAL_FEATURES]
> > +		IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_stripe_data {
> > +	__u8
> grid_width[IPU3_UAPI_MAX_STRIPES][IPU3_UAPI_DVS_STAT_LEVELS];
> > +	__u16 stripe_offset;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_gbl_config {
> > +	__u8 kappa;					/* 4 bits */
> > +	__u8 match_shift:4;
> > +	__u8 ybin_mode:1;
> > +	__u16 __reserved1;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_grd_config {
> > +	__u8 grid_width;				/* 5 bits */
> > +	__u8 grid_height;
> > +	__u8 block_width;				/* 8 bits */
> > +	__u8 block_height;
> > +	__u16 x_start;					/* 12 bits */
> > +	__u16 y_start;
> > +	__u16 enable;
> > +	__u16 x_end;					/* 12 bits */
> > +	__u16 y_end;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_fe_roi_cfg {
> > +	__u8 x_start;
> > +	__u8 y_start;
> > +	__u8 x_end;
> > +	__u8 y_end;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_cfg {
> > +	struct ipu3_uapi_dvs_stat_gbl_config gbl_cfg;
> > +	struct ipu3_uapi_dvs_stat_grd_config
> > +
> 	grd_config[IPU3_UAPI_DVS_STAT_LEVELS];
> > +	struct ipu3_uapi_dvs_stat_fe_roi_cfg
> > +
> 	fe_roi_cfg[IPU3_UAPI_DVS_STAT_LEVELS];
> > +	__u8 __reserved[IPU3_UAPI_ISP_WORD_BYTES -
> > +		 (sizeof(struct ipu3_uapi_dvs_stat_gbl_config) +
> > +		  (sizeof(struct ipu3_uapi_dvs_stat_grd_config) +
> > +		   sizeof(struct ipu3_uapi_dvs_stat_fe_roi_cfg)) *
> > +		  IPU3_UAPI_DVS_STAT_LEVELS) %
> IPU3_UAPI_ISP_WORD_BYTES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_stats_dvs {
> > +	struct ipu3_uapi_dvs_stat_motion_vec motion_vec IPU3_ALIGN;
> > +	struct ipu3_uapi_dvs_stat_cfg cfg IPU3_ALIGN;
> > +	struct ipu3_uapi_dvs_stat_stripe_data stripe_data IPU3_ALIGN;
> > +} __packed;
> > +
> > +/******************* ipu3_uapi_stats_lace *******************/
> > +
> > +#define IPU3_UAPI_LACE_STAT_REGS_PER_SET		320
> > +#define IPU3_UAPI_LACE_STAT_MAX_OPERATIONS		41
> > +
> > +struct ipu3_uapi_lace_stat_stats_regs {
> > +	__u8 bin[4];					/* the bins 0-3 */
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_hist_single_set {
> > +	struct ipu3_uapi_lace_stat_stats_regs
> > +		lace_hist_set[IPU3_UAPI_LACE_STAT_REGS_PER_SET]
> IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_hist_vec {
> > +	struct ipu3_uapi_lace_stat_hist_single_set
> > +	       lace_hist_output[IPU3_UAPI_LACE_STAT_MAX_OPERATIONS]
> IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_gbl_cfg {
> > +	__u32 lh_mode:3;
> > +	__u32 __reserved:3;
> > +	__u32 y_ds_mode:2;
> > +	__u32 uv_ds_mode_unsupported:1;
> > +	__u32 uv_input_unsupported:1;
> > +	__u32 __reserved1:10;
> > +	__u32 rst_loc_hist:1;
> > +	__u32 done_rst_loc_hist:1;
> > +	__u32 __reserved2:10;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_y_grd_hor_cfg {
> > +	__u32 grid_width:6;
> > +	__u32 __reserved:10;
> > +	__u32 block_width:4;
> > +	__u32 __reserved1:12;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_y_grd_hor_roi {
> > +	__u32 x_start:12;
> > +	__u32 __reserved:4;
> > +	__u32 x_end:12;
> > +	__u32 __reserved1:4;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_uv_grd_hor_cfg {
> > +	__u32 not_supported;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_uv_grd_hor_roi {
> > +	__u32 not_supported;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_grd_vrt_cfg {
> > +	__u32 __reserved:8;
> > +	__u32 grid_h:6;
> > +	__u32 __reserved1:6;
> > +	__u32 block_h:4;
> > +	__u32 grid_h_per_slice:7;
> > +	__u32 __reserved2:1;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_grd_vrt_roi {
> > +	__u32 y_start:12;
> > +	__u32 __reserved:4;
> > +	__u32 y_end:12;
> > +	__u32 __reserved1:4;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_cfg {
> > +	struct ipu3_uapi_lace_stat_gbl_cfg lace_stat_gbl_cfg;
> > +	struct ipu3_uapi_lace_stat_y_grd_hor_cfg lace_stat_y_grd_hor_cfg;
> > +	struct ipu3_uapi_lace_stat_y_grd_hor_roi lace_stat_y_grd_hor_roi;
> > +	struct ipu3_uapi_lace_stat_uv_grd_hor_cfg lace_stat_uv_grd_hor_cfg;
> > +	struct ipu3_uapi_lace_stat_uv_grd_hor_roi lace_stat_uv_grd_hor_roi;
> > +	struct ipu3_uapi_lace_stat_grd_vrt_cfg lace_stat_grd_vrt_cfg;
> > +	struct ipu3_uapi_lace_stat_grd_vrt_roi lace_stat_grd_vrt_roi;
> > +} __packed;
> > +
> > +struct ipu3_uapi_stats_lace {
> > +	struct ipu3_uapi_lace_stat_hist_vec lace_hist_vec IPU3_ALIGN;
> > +	struct ipu3_uapi_lace_stat_cfg lace_stat_cfg IPU3_ALIGN;
> > +	__u8 padding[4];
> > +} __packed;
> > +
> > +/******************* ipu3_uapi_acc_param *******************/
> > +
> > +#define IPU3_UAPI_BNR_LUT_SIZE				32
> > +
> > +/* number of elements in gamma correction LUT */
> > +#define IPU3_UAPI_GAMMA_CORR_LUT_ENTRIES		256
> > +
> > +#define IPU3_UAPI_SHD_MAX_OPERATIONS \
> > +		(IPU3_UAPI_SHD_MAX_PROCESS_LINES +
> IPU3_UAPI_SHD_MAX_TRANSFERS)
> > +#define IPU3_UAPI_SHD_MAX_PROCESS_LINES			31
> > +#define IPU3_UAPI_SHD_MAX_TRANSFERS			31
> > +#define IPU3_UAPI_SHD_MAX_CELLS_PER_SET			146
> > +/* largest grid is 73x56 */
> > +#define IPU3_UAPI_SHD_MAX_CFG_SETS			28
> > +
> > +#define IPU3_UAPI_DVS_STAT_L0_MD_ENTRIES		84
> > +#define IPU3_UAPI_DVS_STAT_PARTS_IN_MD_ENTRY		10
> > +#define IPU3_UAPI_DVS_STAT_L1_MD_ENTRIES		66
> > +#define IPU3_UAPI_DVS_STAT_L2_MD_ENTRIES		45
> > +#define IPU3_UAPI_DVS_STAT_MAX_OPERATIONS		100
> > +#define IPU3_UAPI_DVS_STAT_MAX_PROCESS_LINES		52
> > +#define IPU3_UAPI_DVS_STAT_MAX_TRANSFERS		52
> > +
> > +#define IPU3_UAPI_YUVP2_YTM_LUT_ENTRIES			256
> > +#define IPU3_UAPI_YUVP2_TCC_MACC_TABLE_ELEMENTS		16
> > +#define IPU3_UAPI_YUVP2_TCC_INV_Y_LUT_ELEMENTS		14
> > +#define IPU3_UAPI_YUVP2_TCC_GAIN_PCWL_LUT_ELEMENTS	258
> > +#define IPU3_UAPI_YUVP2_TCC_R_SQR_LUT_ELEMENTS		24
> > +
> > +#define IPU3_UAPI_DPC_COMMANDS_PER_TRANSFER		2
> > +#define IPU3_UAPI_DPC_MAX_SUPPORTED_HEIGHT		3840
> > +#define IPU3_UAPI_DPC_STRIPE_SIZE			50
> > +#define IPU3_UAPI_DPC_MAX_OPERATIONS \
> > +	(IPU3_UAPI_DPC_COMMANDS_PER_TRANSFER *
> IPU3_UAPI_DPC_MAX_CFG_SETS)
> > +#define IPU3_UAPI_DPC_MAX_PROCESS_LINES
> 	IPU3_UAPI_DPC_MAX_CFG_SETS
> > +#define IPU3_UAPI_DPC_MAX_TRANSFERS
> 	IPU3_UAPI_DPC_MAX_CFG_SETS
> > +#define IPU3_UAPI_DPC_MAX_DP_FIRST_LINES_PAIR		70
> > +#define IPU3_UAPI_DPC_MAX_DP_PER_SET			192
> > +#define IPU3_UAPI_DPC_MAX_CFG_SETS \
> > +	((IPU3_UAPI_DPC_MAX_SUPPORTED_HEIGHT +
> IPU3_UAPI_DPC_STRIPE_SIZE - 1) \
> > +	/ IPU3_UAPI_DPC_STRIPE_SIZE)
> > +
> > +#define IPU3_UAPI_BDS_SAMPLE_PATTERN_ARRAY_SIZE		8
> > +#define IPU3_UAPI_BDS_PHASE_COEFFS_ARRAY_SIZE		32
> > +
> > +#define IPU3_UAPI_ANR_LUT_SIZE				26
> > +#define IPU3_UAPI_ANR_PYRAMID_SIZE			22
> > +
> > +#define IPU3_UAPI_AWB_FR_MAX_TRANSFERS			30
> > +#define IPU3_UAPI_AWB_FR_MAX_PROCESS_LINES		30
> > +#define IPU3_UAPI_AWB_FR_MAX_OPERATIONS \
> > +	(IPU3_UAPI_AWB_FR_MAX_TRANSFERS +
> IPU3_UAPI_AWB_FR_MAX_PROCESS_LINES)
> > +
> > +#define IPU3_UAPI_AE_WEIGHTS				96
> > +
> > +#define IPU3_UAPI_AF_MAX_TRANSFERS			30
> > +#define IPU3_UAPI_AF_MAX_PROCESS_LINES			30
> > +#define IPU3_UAPI_AF_MAX_OPERATIONS \
> > +		(IPU3_UAPI_AF_MAX_TRANSFERS +
> IPU3_UAPI_AF_MAX_PROCESS_LINES)
> > +
> > +#define IPU3_UAPI_AWB_MAX_PROCESS_LINES			68
> > +#define IPU3_UAPI_AWB_MAX_TRANSFERS			68
> > +#define IPU3_UAPI_AWB_MAX_OPERATIONS \
> > +		(IPU3_UAPI_AWB_MAX_PROCESS_LINES +
> IPU3_UAPI_AWB_MAX_TRANSFERS)
> > +
> > +#define IPU3_UAPI_OSYS_PIN_VF				0
> > +#define IPU3_UAPI_OSYS_PIN_OUT				1
> > +#define IPU3_UAPI_OSYS_PINS				2
> > +
> > +typedef __u32 imgu_addr_t;
> > +
> > +struct ipu3_uapi_stripe_input_frame_resolution {
> > +	__u16 width;
> > +	__u16 height;
> > +	__u32 bayer_order;		/* enum ipu3_uapi_bayer_order */
> > +	__u32 raw_bit_depth;
> > +} __packed;
> > +
> > +struct ipu3_uapi_acc_operation {
> > +	/*
> > +	 * zero means on init,
> > +	 * others mean upon receiving an ack signal from the BC acc.
> > +	 */
> > +	__u8 op_indicator;
> > +	__u8 op_type;
> > +} __packed;
> > +
> > +struct ipu3_uapi_acc_process_lines_cmd_data {
> > +	__u16 lines;
> > +	__u8 cfg_set;
> > +	__u8 __reserved;		/* Align to 4 bytes */
> > +} __packed;
> > +
> > +struct ipu3_uapi_stripes {
> > +	/* offset from start of frame - measured in pixels */
> > +	__u16 offset;
> > +	/* stripe width - measured in pixels */
> > +	__u16 width;
> > +	/* stripe width - measured in pixels */
> > +	__u16 height;
> > +} __packed;
> > +
> > +struct ipu3_uapi_stripe_data {
> > +	/*
> > +	 * number of stripes for current processing source
> > +	 * - VLIW binary parameter we currently support 1 or 2 stripes
> > +	 */
> > +	__u16 num_of_stripes;
> > +
> > +	__u8 padding[2];
> > +
> > +	/*
> > +	 * the following data is derived from resolution-related
> > +	 * pipe config and from num_of_stripes
> > +	 */
> > +
> > +	/*
> > +	 *'input-stripes' - before input cropping
> > +	 * used by input feeder
> > +	 */
> > +	struct ipu3_uapi_stripe_input_frame_resolution input_frame;
> > +
> > +	/*'effective-stripes' - after input cropping used dpc, bds */
> > +	struct ipu3_uapi_stripes effective_stripes[IPU3_UAPI_MAX_STRIPES];
> > +
> > +	/* 'down-scaled-stripes' - after down-scaling ONLY. used by BDS */
> > +	struct ipu3_uapi_stripes
> down_scaled_stripes[IPU3_UAPI_MAX_STRIPES];
> > +
> > +	/*
> > +	 *'bds-out-stripes' - after bayer down-scaling and padding.
> > +	 * used by all algos starting with norm up to the ref-frame for GDC
> > +	 * (currently up to the output kernel)
> > +	 */
> > +	struct ipu3_uapi_stripes bds_out_stripes[IPU3_UAPI_MAX_STRIPES];
> > +
> > +	/* 'bds-out-stripes (no overlap)' - used for ref kernel */
> > +	struct ipu3_uapi_stripes
> > +
> 	bds_out_stripes_no_overlap[IPU3_UAPI_MAX_STRIPES];
> > +
> > +	/*
> > +	 * input resolution for output system (equal to bds_out - envelope)
> > +	 * output-system input frame width as configured by user
> > +	 */
> > +	__u16 output_system_in_frame_width;
> > +	/* output-system input frame height as configured by user */
> > +	__u16 output_system_in_frame_height;
> > +
> > +	/*
> > +	 * 'output-stripes' - accounts for stiching on the output (no overlap)
> > +	 * used by the output kernel
> > +	 */
> > +	struct ipu3_uapi_stripes output_stripes[IPU3_UAPI_MAX_STRIPES];
> > +
> > +	/*
> > +	 * 'block-stripes' - accounts for stiching by the output system
> > +	 * (1 or more blocks overlap)
> > +	 * used by DVS, TNR and the output system kernel
> > +	 */
> > +	struct ipu3_uapi_stripes block_stripes[IPU3_UAPI_MAX_STRIPES];
> > +
> > +	__u16 effective_frame_width;	/* Needed for vertical cropping */
> > +	__u16 bds_frame_width;
> > +	__u16 out_frame_width;	/* Output frame width as configured
> by user */
> > +	__u16 out_frame_height;	/* Output frame height as configured
> by user */
> > +
> > +	/* GDC in buffer (A.K.A delay frame,ref buffer) info */
> > +	__u16 gdc_in_buffer_width;	/* GDC in buffer width  */
> > +	__u16 gdc_in_buffer_height;	/* GDC in buffer height */
> > +	/* GDC in buffer first valid pixel x offset */
> > +	__u16 gdc_in_buffer_offset_x;
> > +	/* GDC in buffer first valid pixel y offset */
> > +	__u16 gdc_in_buffer_offset_y;
> > +
> > +	/* Display frame width as configured by user */
> > +	__u16 display_frame_width;
> > +	/* Display frame height as configured by user */
> > +	__u16 display_frame_height;
> > +	__u16 bds_aligned_frame_width;
> > +	/* Number of vectors to left-crop when writing stripes (not stripe 0) */
> > +	__u16 half_overlap_vectors;
> > +	/* Decimate ISP and fixed func resolutions after BDS (ir_extraction) */
> > +	__u16 ir_ext_decimation;
> > +	__u8 padding1[2];
> > +} __packed;
> > +
> > +struct ipu3_uapi_input_feeder_data {
> > +	__u32 row_stride;				/* row stride */
> > +	__u32 start_row_address;			/* start row address */
> > +	__u32 start_pixel;				/* start pixel */
> > +} __packed;
> > +
> > +struct ipu3_uapi_input_feeder_data_aligned {
> > +	struct ipu3_uapi_input_feeder_data data IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_input_feeder_data_per_stripe {
> > +	struct ipu3_uapi_input_feeder_data_aligned
> > +		input_feeder_data[IPU3_UAPI_MAX_STRIPES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_input_feeder_config {
> > +	struct ipu3_uapi_input_feeder_data data;
> > +	struct ipu3_uapi_input_feeder_data_per_stripe data_per_stripe
> > +		IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config_wb_gains_config {
> > +	__u16 gr;
> > +	__u16 r;
> > +	__u16 b;
> > +	__u16 gb;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config_wb_gains_thr_config {
> > +	__u8 gr;
> > +	__u8 r;
> > +	__u8 b;
> > +	__u8 gb;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config_thr_coeffs_config {
> > +	__u32 cf:13;
> > +	__u32 __reserved0:3;
> > +	__u32 cg:5;
> > +	__u32 ci:5;
> > +	__u32 __reserved1:1;
> > +	__u32 r_nf:5;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config_thr_ctrl_shd_config {
> > +	__u8 gr;
> > +	__u8 r;
> > +	__u8 b;
> > +	__u8 gb;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config_opt_center_config {
> > +	__s32 x_reset:13;
> > +	__u32 __reserved0:3;
> > +	__s32 y_reset:13;
> > +	__u32 __reserved2:3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config_lut_config {
> > +	__u8 values[IPU3_UAPI_BNR_LUT_SIZE];
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config_bp_ctrl_config {
> > +	__u32 bp_thr_gain:5;
> > +	__u32 __reserved0:2;
> > +	__u32 defect_mode:1;
> > +	__u32 bp_gain:6;
> > +	__u32 __reserved1:18;
> > +	__u32 w0_coeff:4;
> > +	__u32 __reserved2:4;
> > +	__u32 w1_coeff:4;
> > +	__u32 __reserved3:20;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config_dn_detect_ctrl_config {
> > +	__u32 alpha:4;
> > +	__u32 beta:4;
> > +	__u32 gamma:4;
> > +	__u32 __reserved0:4;
> > +	__u32 max_inf:4;
> > +	__u32 __reserved1:7;
> > +	/* aka 'green disparity enable' */
> > +	__u32 gd_enable:1;
> > +	__u32 bpc_enable:1;
> > +	__u32 bnr_enable:1;
> > +	__u32 ff_enable:1;
> > +	__u32 __reserved2:1;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config_opt_center_sqr_config {
> > +	__u32 x_sqr_reset;
> > +	__u32 y_sqr_reset;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config {
> > +	struct ipu3_uapi_bnr_static_config_wb_gains_config wb_gains;
> > +	struct ipu3_uapi_bnr_static_config_wb_gains_thr_config
> wb_gains_thr;
> > +	struct ipu3_uapi_bnr_static_config_thr_coeffs_config thr_coeffs;
> > +	struct ipu3_uapi_bnr_static_config_thr_ctrl_shd_config thr_ctrl_shd;
> > +	struct ipu3_uapi_bnr_static_config_opt_center_config opt_center;
> > +	struct ipu3_uapi_bnr_static_config_lut_config lut;
> > +	struct ipu3_uapi_bnr_static_config_bp_ctrl_config bp_ctrl;
> > +	struct ipu3_uapi_bnr_static_config_dn_detect_ctrl_config
> dn_detect_ctrl;
> > +	__u32 column_size;				/* 0x44 */
> > +	struct ipu3_uapi_bnr_static_config_opt_center_sqr_config
> opt_center_sqr;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bnr_static_config_green_disparity {
> > +	__u32 gd_red:6;
> > +	__u32 __reserved0:2;
> > +	__u32 gd_green:6;
> > +	__u32 __reserved1:2;
> > +	__u32 gd_blue:6;
> > +	__u32 __reserved2:10;
> > +	__u32 gd_black:14;
> > +	__u32 __reserved3:2;
> > +	__u32 gd_shading:7;
> > +	__u32 __reserved4:1;
> > +	__u32 gd_support:2;
> > +	__u32 __reserved5:1;
> > +	__u32 gd_clip:1;			/* central weights variables */
> > +	__u32 gd_central_weight:4;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dm_config {
> > +	/* DWORD0 */
> > +	__u32 dm_en:1;
> > +	__u32 ch_ar_en:1;
> > +	__u32 fcc_en:1;
> > +	__u32 __reserved0:13;
> > +	__u32 frame_width:16;
> > +
> > +	/* DWORD1 */
> > +	__u32 gamma_sc:5;
> > +	__u32 __reserved1:3;
> > +	__u32 lc_ctrl:5;
> > +	__u32 __reserved2:3;
> > +	__u32 cr_param1:5;
> > +	__u32 __reserved3:3;
> > +	__u32 cr_param2:5;
> > +	__u32 __reserved4:3;
> > +
> > +	/* DWORD2 */
> > +	__u32 coring_param:5;
> > +	__u32 __reserved5:27;
> > +} __packed;
> > +
> > +struct ipu3_uapi_ccm_mat_config {
> > +	__s16 coeff_m11;
> > +	__s16 coeff_m12;
> > +	__s16 coeff_m13;
> > +	__s16 coeff_o_r;
> > +	__s16 coeff_m21;
> > +	__s16 coeff_m22;
> > +	__s16 coeff_m23;
> > +	__s16 coeff_o_g;
> > +	__s16 coeff_m31;
> > +	__s16 coeff_m32;
> > +	__s16 coeff_m33;
> > +	__s16 coeff_o_b;
> > +} __packed;
> > +
> > +struct ipu3_uapi_gamma_corr_ctrl {
> > +	__u32 enable:1;
> > +	__u32 __reserved:31;
> > +} __packed;
> > +
> > +struct ipu3_uapi_gamma_corr_lut {
> > +	__u16 lut[IPU3_UAPI_GAMMA_CORR_LUT_ENTRIES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_gamma_config {
> > +	struct ipu3_uapi_gamma_corr_ctrl gc_ctrl IPU3_ALIGN;
> > +	struct ipu3_uapi_gamma_corr_lut gc_lut IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_csc_mat_config {
> > +	__s16 coeff_c11;
> > +	__s16 coeff_c12;
> > +	__s16 coeff_c13;
> > +	__s16 coeff_b1;
> > +	__s16 coeff_c21;
> > +	__s16 coeff_c22;
> > +	__s16 coeff_c23;
> > +	__s16 coeff_b2;
> > +	__s16 coeff_c31;
> > +	__s16 coeff_c32;
> > +	__s16 coeff_c33;
> > +	__s16 coeff_b3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_cds_params {
> > +	__u32 ds_c00:2;
> > +	__u32 ds_c01:2;
> > +	__u32 ds_c02:2;
> > +	__u32 ds_c03:2;
> > +	__u32 ds_c10:2;
> > +	__u32 ds_c11:2;
> > +	__u32 ds_c12:2;
> > +	__u32 ds_c13:2;
> > +	__u32 ds_nf:5;
> > +	__u32 __reserved0:3;
> > +	__u32 csc_en:1;
> > +	__u32 uv_bin_output:1;
> > +	__u32 __reserved1:6;
> > +} __packed;
> > +
> > +struct ipu3_uapi_shd_grid_config {
> > +	/* reg 0 */
> > +	__u8 width;
> > +	__u8 height;
> > +	__u8 block_width_log2:3;
> > +	__u8 __reserved0:1;
> > +	__u8 block_height_log2:3;
> > +	__u8 __reserved1:1;
> > +	__u8 grid_height_per_slice;
> > +	/* reg 1 */
> > +	__s16 x_start;			/* 13 bits */
> > +	__s16 y_start;
> > +} __packed;
> > +
> > +struct ipu3_uapi_shd_general_config {
> > +	__u32 init_set_vrt_offst_ul:8;
> > +	__u32 shd_enable:1;
> > +	/* aka 'gf' */
> > +	__u32 gain_factor:2;
> > +	__u32 __reserved:21;
> > +} __packed;
> > +
> > +struct ipu3_uapi_shd_black_level_config {
> > +	__s16 bl_r;			/* 12 bits */
> > +	__s16 bl_gr;
> > +#define IPU3_UAPI_SHD_BLGR_NF_SHIFT	13	/* Normalization shift
> aka nf */
> > +#define IPU3_UAPI_SHD_BLGR_NF_MASK	0x7
> > +	__s16 bl_gb;			/* 12 bits */
> > +	__s16 bl_b;
> > +} __packed;
> > +
> > +struct ipu3_uapi_shd_config_static {
> > +	/* B0: Fixed order: one transfer to GAC */
> > +	struct ipu3_uapi_shd_grid_config grid;
> > +	struct ipu3_uapi_shd_general_config general;
> > +	struct ipu3_uapi_shd_black_level_config black_level;
> > +} __packed;
> > +
> > +struct ipu3_uapi_shd_transfer_luts_set_data {
> > +	__u8 set_number;
> > +	__u8 padding[3];
> > +	imgu_addr_t rg_lut_ddr_addr;
> > +	imgu_addr_t bg_lut_ddr_addr;
> > +	__u32 align_dummy;
> > +} __packed;
> > +
> > +struct ipu3_uapi_shd_intra_frame_operations_data {
> > +	struct ipu3_uapi_acc_operation
> > +		operation_list[IPU3_UAPI_SHD_MAX_OPERATIONS]
> IPU3_ALIGN;
> > +	struct ipu3_uapi_acc_process_lines_cmd_data
> > +		process_lines_data[IPU3_UAPI_SHD_MAX_PROCESS_LINES]
> IPU3_ALIGN;
> > +	struct ipu3_uapi_shd_transfer_luts_set_data
> > +		transfer_data[IPU3_UAPI_SHD_MAX_TRANSFERS]
> IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_shd_lut {
> > +	struct {
> > +		struct {
> > +			__u16 r;
> > +			__u16 gr;
> > +		} r_and_gr[IPU3_UAPI_SHD_MAX_CELLS_PER_SET];
> > +		__u8 __reserved1[24];
> > +		struct {
> > +			__u16 gb;
> > +			__u16 b;
> > +		} gb_and_b[IPU3_UAPI_SHD_MAX_CELLS_PER_SET];
> > +		__u8 __reserved2[24];
> > +	} sets[IPU3_UAPI_SHD_MAX_CFG_SETS];
> > +} __packed;
> > +
> > +struct ipu3_uapi_shd_config {
> > +	struct ipu3_uapi_shd_config_static shd IPU3_ALIGN;
> > +	struct ipu3_uapi_shd_intra_frame_operations_data shd_ops
> IPU3_ALIGN;
> > +	struct ipu3_uapi_shd_lut shd_lut IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_stripe_cfg {
> > +	struct ipu3_uapi_dvs_stat_cfg stripe_cfg[IPU3_UAPI_MAX_STRIPES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_transfer_op_data {
> > +	__u8 set_number;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_intra_frame_operations_data {
> > +	struct ipu3_uapi_acc_operation
> > +		ops[IPU3_UAPI_DVS_STAT_MAX_OPERATIONS] IPU3_ALIGN;
> > +	struct ipu3_uapi_acc_process_lines_cmd_data
> > +
> 	process_lines_data[IPU3_UAPI_DVS_STAT_MAX_PROCESS_LINES]
> > +		IPU3_ALIGN;
> > +	struct ipu3_uapi_dvs_stat_transfer_op_data
> > +		transfer_data[IPU3_UAPI_DVS_STAT_MAX_TRANSFERS]
> IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_meta_data_align_p {
> > +	imgu_addr_t p_meta_data IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dvs_stat_config {
> > +	struct ipu3_uapi_dvs_stat_cfg cfg IPU3_ALIGN;
> > +	struct ipu3_uapi_dvs_stat_stripe_cfg stripe IPU3_ALIGN;
> > +	struct ipu3_uapi_dvs_stat_intra_frame_operations_data
> > +		operations_data IPU3_ALIGN;
> > +	struct ipu3_uapi_dvs_stat_meta_data_align_p
> > +		meta_data[IPU3_UAPI_MAX_STRIPES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_operation {
> > +	__u8 op_indicator;
> > +	__u8 padding;
> > +	__u16 lines;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_intra_frame_op_data {
> > +	struct ipu3_uapi_lace_stat_operation
> > +		ops[IPU3_UAPI_LACE_STAT_MAX_OPERATIONS] IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_lace_stat_config {
> > +	struct ipu3_uapi_lace_stat_cfg lace_stat_cfg IPU3_ALIGN;
> > +	struct ipu3_uapi_lace_stat_intra_frame_op_data operations_data
> > +		IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_iefd_cux2 {
> > +	__u32 x0:9;
> > +	__u32 x1:9;
> > +	__u32 a01:9;
> > +	__u32 b01:5;				/* NOTE: hardcoded to zero */
> > +} __packed;
> > +
> > +struct ipu3_uapi_iefd_cux6_ed {
> > +	__u32 x0:9;
> > +	__u32 x1:9;
> > +	__u32 x2:9;
> > +	__u32 __reserved0:5;
> > +
> > +	__u32 x3:9;
> > +	__u32 x4:9;
> > +	__u32 x5:9;
> > +	__u32 __reserved1:5;
> > +
> > +	__u32 a01:9;
> > +	__u32 a12:9;
> > +	__u32 a23:9;
> > +	__u32 __reserved2:5;
> > +
> > +	__u32 a34:9;
> > +	__u32 a45:9;
> > +	__u32 __reserved3:14;
> > +
> > +	__u32 b01:9;
> > +	__u32 b12:9;
> > +	__u32 b23:9;
> > +	__u32 __reserved4:5;
> > +
> > +	__u32 b34:9;
> > +	__u32 b45:9;
> > +	__u32 __reserved5:14;
> > +} __packed;
> > +
> > +struct ipu3_uapi_iefd_cux2_1 {
> > +	__u32 x0:9;
> > +	__u32 x1:9;
> > +	__u32 a01:9;
> > +	__u32 __reserved1:5;
> > +
> > +	__u32 b01:8;
> > +	__u32 __reserved2:24;
> > +} __packed;
> > +
> > +struct ipu3_uapi_iefd_cux4 {
> > +	__u32 x0:9;
> > +	__u32 x1:9;
> > +	__u32 x2:9;
> > +	__u32 __reserved0:5;
> > +
> > +	__u32 x3:9;
> > +	__u32 a01:9;
> > +	__u32 a12:9;
> > +	__u32 __reserved1:5;
> > +
> > +	__u32 a23:9;
> > +	__u32 b01:8;
> > +	__u32 b12:8;
> > +	__u32 __reserved2:7;
> > +
> > +	__u32 b23:8;
> > +	__u32 __reserved3:24;
> > +} __packed;
> > +
> > +struct ipu3_uapi_iefd_cux6_rad {
> > +	__u32 x0:8;
> > +	__u32 x1:8;
> > +	__u32 x2:8;
> > +	__u32 x3:8;
> > +
> > +	__u32 x4:8;
> > +	__u32 x5:8;
> > +	__u32 __reserved1:16;
> > +
> > +	__u32 a01:16;
> > +	__u32 a12:16;
> > +
> > +	__u32 a23:16;
> > +	__u32 a34:16;
> > +
> > +	__u32 a45:16;
> > +	__u32 __reserved2:16;
> > +
> > +	__u32 b01:10;
> > +	__u32 b12:10;
> > +	__u32 b23:10;
> > +	__u32 __reserved4:2;
> > +
> > +	__u32 b34:10;
> > +	__u32 b45:10;
> > +	__u32 __reserved5:12;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_iefd_cfg_units {
> > +	struct ipu3_uapi_iefd_cux2 cu_1;
> > +	struct ipu3_uapi_iefd_cux6_ed cu_ed;
> > +	struct ipu3_uapi_iefd_cux2 cu_3;
> > +	struct ipu3_uapi_iefd_cux2_1 cu_5;
> > +	struct ipu3_uapi_iefd_cux4 cu_6;
> > +	struct ipu3_uapi_iefd_cux2 cu_7;
> > +	struct ipu3_uapi_iefd_cux4 cu_unsharp;
> > +	struct ipu3_uapi_iefd_cux6_rad cu_radial;
> > +	struct ipu3_uapi_iefd_cux2 cu_vssnlm;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_iefd_config_s {
> > +	__u32 horver_diag_coeff:7;	/* Gradiant compensation */
> > +	__u32 __reserved0:1;
> > +	__u32 clamp_stitch:6;		/* Slope to stitch edge */
> > +	__u32 __reserved1:2;
> > +	__u32 direct_metric_update:5;	/* Update coeff for direction metric */
> > +	__u32 __reserved2:3;
> > +	__u32 ed_horver_diag_coeff:7;
> > +	__u32 __reserved3:1;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_iefd_control {
> > +	__u32 iefd_en:1;		/* Enable IEFD */
> > +	__u32 denoise_en:1;		/* Enable denoise */
> > +	__u32 direct_smooth_en:1;	/* Enable directional smooth */
> > +	__u32 rad_en:1;			/* Enable radial update */
> > +	__u32 vssnlm_en:1;		/* Enable VSSNLM output filter */
> > +	__u32 __reserved:27;
> > +} __packed;
> > +
> > +struct ipu3_uapi_sharp_cfg {
> > +	__u32 nega_lmt_txt:13;
> > +	__u32 __reserved0:19;
> > +	__u32 posi_lmt_txt:13;
> > +	__u32 __reserved1:19;
> > +	__u32 nega_lmt_dir:13;
> > +	__u32 __reserved2:19;
> > +	__u32 posi_lmt_dir:13;
> > +	__u32 __reserved3:19;
> > +} __packed;
> > +
> > +struct ipu3_uapi_far_w {
> > +	__u32 dir_shrp:7;
> > +	__u32 __reserved0:1;
> > +	__u32 dir_dns:7;
> > +	__u32 __reserved1:1;
> > +	__u32 ndir_dns_powr:7;
> > +	__u32 __reserved2:9;
> > +} __packed;
> > +
> > +struct ipu3_uapi_unsharp_cfg {
> > +	__u32 unsharp_weight:7;
> > +	__u32 __reserved0:1;
> > +	__u32 unsharp_amount:9;
> > +	__u32 __reserved1:15;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_iefd_shrp_cfg {
> > +	struct ipu3_uapi_sharp_cfg cfg;
> > +	struct ipu3_uapi_far_w far_w;
> > +	struct ipu3_uapi_unsharp_cfg unshrp_cfg;
> > +} __packed;
> > +
> > +struct ipu3_uapi_unsharp_coef0 {
> > +	__u32 c00:9;			/* Coeff11 */
> > +	__u32 c01:9;			/* Coeff12 */
> > +	__u32 c02:9;			/* Coeff13 */
> > +	__u32 __reserved:5;
> > +} __packed;
> > +
> > +struct ipu3_uapi_unsharp_coef1 {
> > +	__u32 c11:9;			/* Coeff22 */
> > +	__u32 c12:9;			/* Coeff23 */
> > +	__u32 c22:9;			/* Coeff33 */
> > +	__u32 __reserved:5;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_iefd_unshrp_cfg {
> > +	struct ipu3_uapi_unsharp_coef0 unsharp_coef0;
> > +	struct ipu3_uapi_unsharp_coef1 unsharp_coef1;
> > +} __packed;
> > +
> > +struct ipu3_uapi_radial_reset_xy {
> > +	__s32 x:13;
> > +	__u32 __reserved0:3;
> > +	__s32 y:13;
> > +	__u32 __reserved1:3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_radial_reset_x2 {
> > +	__u32 x2:24;
> > +	__u32 __reserved:8;
> > +} __packed;
> > +
> > +struct ipu3_uapi_radial_reset_y2 {
> > +	__u32 y2:24;
> > +	__u32 __reserved:8;
> > +} __packed;
> > +
> > +struct ipu3_uapi_radial_cfg {
> > +	__u32 rad_nf:4;
> > +	__u32 __reserved0:4;
> > +	__u32 rad_inv_r2:7;
> > +	__u32 __reserved1:17;
> > +} __packed;
> > +
> > +struct ipu3_uapi_rad_far_w {
> > +	__u32 rad_dir_far_sharp_w:8;
> > +	__u32 rad_dir_far_dns_w:8;
> > +	__u32 rad_ndir_far_dns_power:8;
> > +	__u32 __reserved:8;
> > +} __packed;
> > +
> > +struct ipu3_uapi_cu_cfg0 {
> > +	__u32 cu6_pow:7;
> > +	__u32 __reserved0:1;
> > +	__u32 cu_unsharp_pow:7;
> > +	__u32 __reserved1:1;
> > +	__u32 rad_cu6_pow:7;
> > +	__u32 __reserved2:1;
> > +	__u32 rad_cu_unsharp_pow:6;
> > +	__u32 __reserved3:2;
> > +} __packed;
> > +
> > +struct ipu3_uapi_cu_cfg1 {
> > +	__u32 rad_cu6_x1:9;
> > +	__u32 __reserved0:1;
> > +	__u32 rad_cu_unsharp_x1:9;
> > +	__u32 __reserved1:13;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_iefd_rad_cfg {
> > +	struct ipu3_uapi_radial_reset_xy reset_xy;
> > +	struct ipu3_uapi_radial_reset_x2 reset_x2;
> > +	struct ipu3_uapi_radial_reset_y2 reset_y2;
> > +	struct ipu3_uapi_radial_cfg cfg;
> > +	struct ipu3_uapi_rad_far_w rad_far_w;
> > +	struct ipu3_uapi_cu_cfg0 cu_cfg0;
> > +	struct ipu3_uapi_cu_cfg1 cu_cfg1;
> > +} __packed;
> > +
> > +struct ipu3_uapi_vss_lut_x {
> > +	__u32 vs_x0:8;
> > +	__u32 vs_x1:8;
> > +	__u32 vs_x2:8;
> > +	__u32 __reserved2:8;
> > +} __packed;
> > +
> > +struct ipu3_uapi_vss_lut_y {
> > +	__u32 vs_y1:4;
> > +	__u32 __reserved0:4;
> > +	__u32 vs_y2:4;
> > +	__u32 __reserved1:4;
> > +	__u32 vs_y3:4;
> > +	__u32 __reserved2:12;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_iefd_vssnlm_cfg {
> > +	struct ipu3_uapi_vss_lut_x vss_lut_x;
> > +	struct ipu3_uapi_vss_lut_y vss_lut_y;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_iefd_config {
> > +	struct ipu3_uapi_yuvp1_iefd_cfg_units units;
> > +	struct ipu3_uapi_yuvp1_iefd_config_s config;
> > +	struct ipu3_uapi_yuvp1_iefd_control control;
> > +	struct ipu3_uapi_yuvp1_iefd_shrp_cfg sharp;
> > +	struct ipu3_uapi_yuvp1_iefd_unshrp_cfg unsharp;
> > +	struct ipu3_uapi_yuvp1_iefd_rad_cfg rad;
> > +	struct ipu3_uapi_yuvp1_iefd_vssnlm_cfg vsslnm;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_yds_config {
> > +	__u32 c00:2;
> > +	__u32 c01:2;
> > +	__u32 c02:2;
> > +	__u32 c03:2;
> > +	__u32 c10:2;
> > +	__u32 c11:2;
> > +	__u32 c12:2;
> > +	__u32 c13:2;
> > +	__u32 norm_factor:5;
> > +	__u32 __reserved0:4;
> > +	__u32 bin_output:1;
> > +	__u32 __reserved1:6;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_chnr_enable_config {
> > +	__u32 enable:1;
> > +	__u32 yuv_mode:1;
> > +	__u32 __reserved0:14;
> > +	__u32 col_size:12;
> > +	__u32 __reserved1:4;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_chnr_coring_config {
> > +	__u32 u:13;
> > +	__u32 __reserved0:3;
> > +	__u32 v:13;
> > +	__u32 __reserved1:3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_chnr_sense_gain_config {
> > +	__u32 vy:8;
> > +	__u32 vu:8;
> > +	__u32 vv:8;
> > +	__u32 __reserved0:8;
> > +
> > +	__u32 hy:8;
> > +	__u32 hu:8;
> > +	__u32 hv:8;
> > +	__u32 __reserved1:8;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_chnr_iir_fir_config {
> > +	__u32 fir_0h:6;
> > +	__u32 __reserved0:2;
> > +	__u32 fir_1h:6;
> > +	__u32 __reserved1:2;
> > +	__u32 fir_2h:6;
> > +	__u32 dalpha_clip_val:9;
> > +	__u32 __reserved2:1;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_chnr_config {
> > +	struct ipu3_uapi_yuvp1_chnr_enable_config enable;
> > +	struct ipu3_uapi_yuvp1_chnr_coring_config coring;
> > +	struct ipu3_uapi_yuvp1_chnr_sense_gain_config sense_gain;
> > +	struct ipu3_uapi_yuvp1_chnr_iir_fir_config iir_fir;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_y_ee_nr_lpf_config {
> > +	__u32 a_diag:5;
> > +	__u32 __reserved0:3;
> > +	__u32 a_periph:5;
> > +	__u32 __reserved1:3;
> > +	__u32 a_cent:5;
> > +	__u32 __reserved2:9;
> > +	__u32 enable:1;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_y_ee_nr_sense_config {
> > +	__u32 edge_sense_0:13;
> > +	__u32 __reserved0:3;
> > +	__u32 delta_edge_sense:13;
> > +	__u32 __reserved1:3;
> > +	__u32 corner_sense_0:13;
> > +	__u32 __reserved2:3;
> > +	__u32 delta_corner_sense:13;
> > +	__u32 __reserved3:3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_y_ee_nr_gain_config {
> > +	__u32 gain_pos_0:5;
> > +	__u32 __reserved0:3;
> > +	__u32 delta_gain_posi:5;
> > +	__u32 __reserved1:3;
> > +	__u32 gain_neg_0:5;
> > +	__u32 __reserved2:3;
> > +	__u32 delta_gain_neg:5;
> > +	__u32 __reserved3:3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_y_ee_nr_clip_config {
> > +	__u32 clip_pos_0:5;
> > +	__u32 __reserved0:3;
> > +	__u32 delta_clip_posi:5;
> > +	__u32 __reserved1:3;
> > +	__u32 clip_neg_0:5;
> > +	__u32 __reserved2:3;
> > +	__u32 delta_clip_neg:5;
> > +	__u32 __reserved3:3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_y_ee_nr_frng_config {
> > +	__u32 gain_exp:4;
> > +	__u32 __reserved0:28;
> > +	__u32 min_edge:13;
> > +	__u32 __reserved1:3;
> > +	__u32 lin_seg_param:4;
> > +	__u32 __reserved2:4;
> > +	__u32 t1:1;
> > +	__u32 t2:1;
> > +	__u32 __reserved3:6;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_y_ee_nr_diag_config {
> > +	__u32 diag_disc_g:4;
> > +	__u32 __reserved0:4;
> > +	__u32 hvw_hor:4;
> > +	__u32 dw_hor:4;
> > +	__u32 hvw_diag:4;
> > +	__u32 dw_diag:4;
> > +	__u32 __reserved1:8;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_y_ee_nr_fc_coring_config {
> > +	__u32 pos_0:13;
> > +	__u32 __reserved0:3;
> > +	__u32 pos_delta:13;
> > +	__u32 __reserved1:3;
> > +	__u32 neg_0:13;
> > +	__u32 __reserved2:3;
> > +	__u32 neg_delta:13;
> > +	__u32 __reserved3:3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp1_y_ee_nr_config {
> > +	struct ipu3_uapi_yuvp1_y_ee_nr_lpf_config lpf;
> > +	struct ipu3_uapi_yuvp1_y_ee_nr_sense_config sense;
> > +	struct ipu3_uapi_yuvp1_y_ee_nr_gain_config gain;
> > +	struct ipu3_uapi_yuvp1_y_ee_nr_clip_config clip;
> > +	struct ipu3_uapi_yuvp1_y_ee_nr_frng_config frng;
> > +	struct ipu3_uapi_yuvp1_y_ee_nr_diag_config diag;
> > +	struct ipu3_uapi_yuvp1_y_ee_nr_fc_coring_config fc_coring;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp2_y_tm_lut_static_config {
> > +	__u16 entries[IPU3_UAPI_YUVP2_YTM_LUT_ENTRIES]; /* 13
> significand bits*/
> > +	__u32 enable;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp2_tcc_gen_control_static_config {
> > +	__u32 en:1;
> > +	__u32 blend_shift:3;
> > +	__u32 gain_according_to_y_only:1;
> > +	__u32 __reserved0:11;
> > +	__s32 gamma:5;
> > +	__u32 __reserved1:3;
> > +	__s32 delta:5;
> > +	__u32 __reserved2:3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp2_tcc_macc_elem_static_config {
> > +	__s32 a:12;
> > +	__u32 __reserved0:4;
> > +	__s32 b:12;
> > +	__u32 __reserved1:4;
> > +	__s32 c:12;
> > +	__u32 __reserved2:4;
> > +	__s32 d:12;
> > +	__u32 __reserved3:4;
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp2_tcc_macc_table_static_config {
> > +	struct ipu3_uapi_yuvp2_tcc_macc_elem_static_config
> > +		entries[IPU3_UAPI_YUVP2_TCC_MACC_TABLE_ELEMENTS];
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp2_tcc_inv_y_lut_static_config {
> > +	__u16 entries[IPU3_UAPI_YUVP2_TCC_INV_Y_LUT_ELEMENTS];	/* 10
> bits */
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp2_tcc_gain_pcwl_lut_static_config {
> > +	__u16
> entries[IPU3_UAPI_YUVP2_TCC_GAIN_PCWL_LUT_ELEMENTS];/* 12 bits */
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp2_tcc_r_sqr_lut_static_config {
> > +	__s16 entries[IPU3_UAPI_YUVP2_TCC_R_SQR_LUT_ELEMENTS];	/* 11
> bits */
> > +} __packed;
> > +
> > +struct ipu3_uapi_yuvp2_tcc_static_config {
> > +	struct ipu3_uapi_yuvp2_tcc_gen_control_static_config gen_control;
> > +	struct ipu3_uapi_yuvp2_tcc_macc_table_static_config macc_table;
> > +	struct ipu3_uapi_yuvp2_tcc_inv_y_lut_static_config inv_y_lut;
> > +	struct ipu3_uapi_yuvp2_tcc_gain_pcwl_lut_static_config gain_pcwl;
> > +	struct ipu3_uapi_yuvp2_tcc_r_sqr_lut_static_config r_sqr_lut;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_num_of_dp {
> > +	__u8 dp_gr;
> > +	__u8 dp_bg;
> > +	__u16 __reserved;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_params {
> > +	__u16 enable;
> > +	__u16 grad_threshold;		/* 13 bits */
> > +	struct ipu3_uapi_dpc_num_of_dp set[2];
> > +	struct ipu3_uapi_dpc_num_of_dp first_line_pair;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_transfer_luts_set_data {
> > +	__u8 set_number;
> > +	__u8 num_of_dp_gr;
> > +	__u8 num_of_dp_bg;
> > +	__u8 align_dummy;
> > +
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_intra_frame_operations_data {
> > +	struct ipu3_uapi_acc_operation
> > +		operation_list[IPU3_UAPI_DPC_MAX_OPERATIONS]
> IPU3_ALIGN;
> > +	struct ipu3_uapi_acc_process_lines_cmd_data
> > +		process_lines_data[IPU3_UAPI_DPC_MAX_PROCESS_LINES]
> IPU3_ALIGN;
> > +	struct ipu3_uapi_dpc_transfer_luts_set_data
> > +		transfer_data[IPU3_UAPI_DPC_MAX_TRANSFERS]
> IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_1st_pair_of_lines_lut_elem {
> > +	__u32 column:13;
> > +	__u32 nghbr_sts:5;
> > +	__u32 p0:14;
> > +	__u32 p1:14;
> > +	__u32 __reserved0:2;
> > +	__u32 p2:14;
> > +	__u32 nghbr_order:1;
> > +	__u32 __reserved1:1;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_1st_pair_of_lines_lut {
> > +	struct ipu3_uapi_dpc_1st_pair_of_lines_lut_elem
> > +		entries[IPU3_UAPI_DPC_MAX_DP_FIRST_LINES_PAIR];
> > +
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_lut_elem {
> > +	__u32 nghbr_sts:5;
> > +	__u32 skip:1;
> > +	__u32 nghbr_order:1;
> > +	__u32 column:13;
> > +	__u32 row_pair_delta:4;
> > +	__u32 __reserved0:8;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_lut_set {
> > +	struct ipu3_uapi_dpc_lut_elem
> > +		elems[IPU3_UAPI_DPC_MAX_DP_PER_SET] IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_lut {
> > +	struct ipu3_uapi_dpc_lut_set sets[IPU3_UAPI_DPC_MAX_CFG_SETS];
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_stripe_config {
> > +	struct ipu3_uapi_dpc_params params IPU3_ALIGN;
> > +	struct ipu3_uapi_dpc_intra_frame_operations_data ops IPU3_ALIGN;
> > +	struct ipu3_uapi_dpc_1st_pair_of_lines_lut first_lines_lut_gr
> > +		IPU3_ALIGN;
> > +	struct ipu3_uapi_dpc_1st_pair_of_lines_lut first_lines_lut_bg
> > +		IPU3_ALIGN;
> > +	struct ipu3_uapi_dpc_lut lut_bg IPU3_ALIGN;
> > +	struct ipu3_uapi_dpc_lut lut_gr IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_config_per_stripe {
> > +	struct ipu3_uapi_dpc_stripe_config
> > +		dpc_config[IPU3_UAPI_MAX_STRIPES] IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_dpc_config {
> > +	struct ipu3_uapi_dpc_config_per_stripe config_per_stripe
> > +		IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_hor_ctrl0 {
> > +	__u32 sample_patrn_length:9;
> > +	__u32 __reserved0:3;
> > +	__u32 hor_ds_en:1;
> > +	__u32 min_clip_val:1;
> > +	__u32 max_clip_val:2;
> > +	__u32 out_frame_width:13;
> > +	__u32 __reserved1:3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_ptrn_arr {
> > +	__u32 elems[IPU3_UAPI_BDS_SAMPLE_PATTERN_ARRAY_SIZE];
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_phase_entry {
> > +	__s8 coeff_min2;
> > +	__s8 coeff_min1;
> > +	__s8 coeff_0;
> > +	__s8 nf;
> > +	__s8 coeff_pls1;
> > +	__s8 coeff_pls2;
> > +	__s8 coeff_pls3;
> > +	__u8 __reserved;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_phase_arr {
> > +	struct ipu3_uapi_bds_phase_entry
> > +		even[IPU3_UAPI_BDS_PHASE_COEFFS_ARRAY_SIZE];
> > +	struct ipu3_uapi_bds_phase_entry
> > +		odd[IPU3_UAPI_BDS_PHASE_COEFFS_ARRAY_SIZE];
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_hor_ctrl1 {
> > +	__u32 hor_crop_start:13;
> > +	__u32 __reserved0:3;
> > +	__u32 hor_crop_end:13;
> > +	__u32 __reserved1:1;
> > +	__u32 hor_crop_en:1;
> > +	__u32 __reserved2:1;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_hor_ctrl2 {
> > +	__u32 input_frame_height:13;
> > +	__u32 __reserved0:19;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_hor {
> > +	struct ipu3_uapi_bds_hor_ctrl0 hor_ctrl0;
> > +	struct ipu3_uapi_bds_ptrn_arr hor_ptrn_arr;
> > +	struct ipu3_uapi_bds_phase_arr hor_phase_arr;
> > +	struct ipu3_uapi_bds_hor_ctrl1 hor_ctrl1;
> > +	struct ipu3_uapi_bds_hor_ctrl2 hor_ctrl2;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_ver_ctrl0 {
> > +	__u32 sample_patrn_length:9;
> > +	__u32 __reserved0:3;
> > +	__u32 ver_ds_en:1;
> > +	__u32 min_clip_val:1;
> > +	__u32 max_clip_val:2;
> > +	__u32 __reserved1:16;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_ver_ctrl1 {
> > +	__u32 out_frame_width:13;
> > +	__u32 __reserved0:3;
> > +	__u32 out_frame_height:13;
> > +	__u32 __reserved1:3;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_ver {
> > +	struct ipu3_uapi_bds_ver_ctrl0 ver_ctrl0;
> > +	struct ipu3_uapi_bds_ptrn_arr ver_ptrn_arr;
> > +	struct ipu3_uapi_bds_phase_arr ver_phase_arr;
> > +	struct ipu3_uapi_bds_ver_ctrl1 ver_ctrl1;
> > +
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_per_stripe_data {
> > +	struct ipu3_uapi_bds_hor_ctrl0 hor_ctrl0;
> > +	struct ipu3_uapi_bds_ver_ctrl1 ver_ctrl1;
> > +	struct ipu3_uapi_bds_hor_ctrl1 crop;
> > +} __packed;
> > +
> > +struct ipu3_uapi_ipu3_uapi_bds_per_stripe_data_aligned {
> > +	struct ipu3_uapi_bds_per_stripe_data data IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_per_stripe {
> > +	struct ipu3_uapi_ipu3_uapi_bds_per_stripe_data_aligned
> > +		aligned_data[IPU3_UAPI_MAX_STRIPES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_bds_config {
> > +	struct ipu3_uapi_bds_hor hor IPU3_ALIGN;
> > +	struct ipu3_uapi_bds_ver ver IPU3_ALIGN;
> > +	struct ipu3_uapi_bds_per_stripe per_stripe IPU3_ALIGN;
> > +	__u32 enabled;
> > +} __packed;
> > +
> > +struct ipu3_uapi_anr_search_config {
> > +	__u32 enable;
> > +	__u16 frame_width;
> > +	__u16 frame_height;
> > +} __packed;
> > +
> > +struct ipu3_uapi_anr_alpha {
> > +	__u16 gr;					/* 9 bits */
> > +	__u16 r;
> > +	__u16 b;
> > +	__u16 gb;
> > +	__u16 dc_gr;
> > +	__u16 dc_r;
> > +	__u16 dc_b;
> > +	__u16 dc_gb;
> > +} __packed;
> > +
> > +struct ipu3_uapi_anr_beta {
> > +	__u16 beta_gr;					/* 11 bits */
> > +	__u16 beta_r;
> > +	__u16 beta_b;
> > +	__u16 beta_gb;
> > +} __packed;
> > +
> > +struct ipu3_uapi_anr_plain_color {
> > +	__u16 reg_w_gr[16];				/* 12 bits */
> > +	__u16 reg_w_r[16];
> > +	__u16 reg_w_b[16];
> > +	__u16 reg_w_gb[16];
> > +} __packed;
> > +
> > +struct ipu3_uapi_anr_transform_config {
> > +	__u32 enable:1;			/* 0 or 1, disabled or enabled
> */
> > +	__u32 adaptive_treshhold_en:1;	/* On IPU3, always enabled */
> > +
> > +	__u32 __reserved1:30;
> > +	__u8 __reserved2[40+4];
> > +
> > +	struct ipu3_uapi_anr_alpha alpha[3];
> > +	struct ipu3_uapi_anr_beta beta[3];
> > +	struct ipu3_uapi_anr_plain_color color[3];
> > +
> > +	__u16 sqrt_lut[IPU3_UAPI_ANR_LUT_SIZE];	/* 11 bits per element
> */
> > +
> > +	__s16 xreset:13;
> > +#define IPU3_UAPI_ANR_MAX_XRESET		((1 << 12) - 1)
> > +	__u16 __reserved3:3;
> > +	__s16 yreset:13;
> > +	__u16 __reserved4:3;
> > +
> > +	__u32 x_sqr_reset:24;
> > +	__u32 r_normfactor:5;
> > +	__u32 __reserved5:3;
> > +
> > +	__u32 y_sqr_reset:24;
> > +	__u32 gain_scale:8;
> > +} __packed;
> > +
> > +struct ipu3_uapi_anr_stitch_pyramid {
> > +	__u32 entry0:6;
> > +	__u32 entry1:6;
> > +	__u32 entry2:6;
> > +	__u32 __reserved:14;
> > +} __packed;
> > +
> > +struct ipu3_uapi_anr_stitch_config {
> > +	__u32 anr_stitch_en;
> > +	__u16 frame_width;
> > +	__u16 frame_height;
> > +	__u8 __reserved[40];
> > +	struct ipu3_uapi_anr_stitch_pyramid
> pyramid[IPU3_UAPI_ANR_PYRAMID_SIZE];
> > +} __packed;
> > +
> > +struct ipu3_uapi_anr_tile2strm_config {
> > +	__u32 enable;
> > +	__u16 frame_width;
> > +	__u16 frame_height;
> > +} __packed;
> > +
> > +struct ipu3_uapi_anr_config {
> > +	struct ipu3_uapi_anr_search_config search IPU3_ALIGN;
> > +	struct ipu3_uapi_anr_transform_config transform IPU3_ALIGN;
> > +	struct ipu3_uapi_anr_stitch_config stitch IPU3_ALIGN;
> > +	struct ipu3_uapi_anr_tile2strm_config tile2strm IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_awb_fr_intra_frame_operations_data {
> > +	struct ipu3_uapi_acc_operation
> ops[IPU3_UAPI_AWB_FR_MAX_OPERATIONS]
> > +								IPU3_ALIGN;
> > +	struct ipu3_uapi_acc_process_lines_cmd_data
> > +	      process_lines_data[IPU3_UAPI_AWB_FR_MAX_PROCESS_LINES]
> IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_awb_fr_config {
> > +	struct ipu3_uapi_awb_fr_config_s config;
> > +	struct ipu3_uapi_awb_fr_intra_frame_operations_data
> operations_data;
> > +	struct ipu3_uapi_awb_fr_config_s stripes[IPU3_UAPI_MAX_STRIPES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_ae_weight_elem {
> > +	__u32 cell0:4;
> > +	__u32 cell1:4;
> > +	__u32 cell2:4;
> > +	__u32 cell3:4;
> > +	__u32 cell4:4;
> > +	__u32 cell5:4;
> > +	__u32 cell6:4;
> > +	__u32 cell7:4;
> > +} __packed;
> > +
> > +struct ipu3_uapi_ae_ccm {
> > +	__u16 gain_gr;			/* 11 bits */
> > +	__u16 gain_r;
> > +	__u16 gain_b;
> > +	__u16 gain_gb;
> > +	__s16 mat[16];
> > +} __packed;
> > +
> > +struct ipu3_uapi_ae_config {
> > +	struct ipu3_uapi_ae_grid_config grid_cfg IPU3_ALIGN;
> > +	struct ipu3_uapi_ae_weight_elem weights[IPU3_UAPI_AE_WEIGHTS]
> > +								IPU3_ALIGN;
> > +	struct ipu3_uapi_ae_ccm ae_ccm IPU3_ALIGN;
> > +	struct {
> > +		struct ipu3_uapi_ae_grid_config grid IPU3_ALIGN;
> > +	} stripes[IPU3_UAPI_MAX_STRIPES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_af_intra_frame_operations_data {
> > +	struct ipu3_uapi_acc_operation
> ops[IPU3_UAPI_AF_MAX_OPERATIONS]
> > +		IPU3_ALIGN;
> > +	struct ipu3_uapi_acc_process_lines_cmd_data
> > +		process_lines_data[IPU3_UAPI_AF_MAX_PROCESS_LINES]
> IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_af_stripe_config {
> > +	struct ipu3_uapi_af_frame_size frame_size IPU3_ALIGN;
> > +	struct ipu3_uapi_grid_config grid_cfg IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_af_config {
> > +	struct ipu3_uapi_af_config_s config;
> > +	struct ipu3_uapi_af_intra_frame_operations_data operations_data;
> > +	struct ipu3_uapi_af_stripe_config stripes[IPU3_UAPI_MAX_STRIPES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_acc_transfer_op_data {
> > +	__u8 set_number;
> > +} __packed;
> > +
> > +struct IPU3_ALIGN ipu3_uapi_awb_intra_frame_operations_data {
> > +	struct ipu3_uapi_acc_operation
> ops[IPU3_UAPI_AWB_MAX_OPERATIONS]
> > +		IPU3_ALIGN;
> > +	struct ipu3_uapi_acc_process_lines_cmd_data
> > +		process_lines_data[IPU3_UAPI_AWB_MAX_PROCESS_LINES]
> IPU3_ALIGN;
> > +	struct ipu3_uapi_acc_transfer_op_data
> > +		transfer_data[IPU3_UAPI_AWB_MAX_TRANSFERS]
> IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_awb_config {
> > +	struct ipu3_uapi_awb_config_s config IPU3_ALIGN;
> > +	struct ipu3_uapi_awb_intra_frame_operations_data operations_data;
> > +	struct ipu3_uapi_awb_config_s stripes[IPU3_UAPI_MAX_STRIPES];
> > +} __packed;
> > +
> > +struct ipu3_uapi_osys_formatter_params {
> > +	__u32 format;
> > +	__u32 flip;
> > +	__u32 mirror;
> > +	__u32 tiling;
> > +	__u32 reduce_range;
> > +	__u32 alpha_blending;	/* FIXME: To figure out the unknown register
> */
> > +	__u32 release_inp_addr;
> > +	__u32 release_inp_en;
> > +	__u32 process_out_buf_addr;
> > +	__u32 image_width_vecs;
> > +	__u32 image_height_lines;
> > +	__u32 inp_buff_y_st_addr;
> > +	__u32 inp_buff_y_line_stride;
> > +	__u32 inp_buff_y_buffer_stride;
> > +	__u32 int_buff_u_st_addr;
> > +	__u32 int_buff_v_st_addr;
> > +	__u32 inp_buff_uv_line_stride;
> > +	__u32 inp_buff_uv_buffer_stride;
> > +	__u32 out_buff_level;
> > +	__u32 out_buff_nr_y_lines;
> > +	__u32 out_buff_u_st_offset;
> > +	__u32 out_buff_v_st_offset;
> > +	__u32 out_buff_y_line_stride;
> > +	__u32 out_buff_uv_line_stride;
> > +	__u32 hist_buff_st_addr;
> > +	__u32 hist_buff_line_stride;
> > +	__u32 hist_buff_nr_lines;
> > +} __packed;
> > +
> > +struct ipu3_uapi_osys_formatter {
> > +	struct ipu3_uapi_osys_formatter_params param IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_osys_scaler_params {
> > +	__u32 inp_buf_y_st_addr;
> > +	__u32 inp_buf_y_line_stride;
> > +	__u32 inp_buf_y_buffer_stride;
> > +	__u32 inp_buf_u_st_addr;
> > +	__u32 inp_buf_v_st_addr;
> > +	__u32 inp_buf_uv_line_stride;
> > +	__u32 inp_buf_uv_buffer_stride;
> > +	__u32 inp_buf_chunk_width;
> > +	__u32 inp_buf_nr_buffers;
> > +	/* Output buffers */
> > +	__u32 out_buf_y_st_addr;
> > +	__u32 out_buf_y_line_stride;
> > +	__u32 out_buf_y_buffer_stride;
> > +	__u32 out_buf_u_st_addr;
> > +	__u32 out_buf_v_st_addr;
> > +	__u32 out_buf_uv_line_stride;
> > +	__u32 out_buf_uv_buffer_stride;
> > +	__u32 out_buf_nr_buffers;
> > +	/* Intermediate buffers */
> > +	__u32 int_buf_y_st_addr;
> > +	__u32 int_buf_y_line_stride;
> > +	__u32 int_buf_u_st_addr;
> > +	__u32 int_buf_v_st_addr;
> > +	__u32 int_buf_uv_line_stride;
> > +	__u32 int_buf_height;
> > +	__u32 int_buf_chunk_width;
> > +	__u32 int_buf_chunk_height;
> > +	/* Context buffers */
> > +	__u32 ctx_buf_hor_y_st_addr;
> > +	__u32 ctx_buf_hor_u_st_addr;
> > +	__u32 ctx_buf_hor_v_st_addr;
> > +	__u32 ctx_buf_ver_y_st_addr;
> > +	__u32 ctx_buf_ver_u_st_addr;
> > +	__u32 ctx_buf_ver_v_st_addr;
> > +	/* Addresses for release-input and process-output tokens */
> > +	__u32 release_inp_buf_addr;
> > +	__u32 release_inp_buf_en;
> > +	__u32 release_out_buf_en;
> > +	__u32 process_out_buf_addr;
> > +	/* Settings dimensions, padding, cropping */
> > +	__u32 input_image_y_width;
> > +	__u32 input_image_y_height;
> > +	__u32 input_image_y_start_column;
> > +	__u32 input_image_uv_start_column;
> > +	__u32 input_image_y_left_pad;
> > +	__u32 input_image_uv_left_pad;
> > +	__u32 input_image_y_right_pad;
> > +	__u32 input_image_uv_right_pad;
> > +	__u32 input_image_y_top_pad;
> > +	__u32 input_image_uv_top_pad;
> > +	__u32 input_image_y_bottom_pad;
> > +	__u32 input_image_uv_bottom_pad;
> > +	__u32 processing_mode;
> > +#define IPU3_UAPI_OSYS_PROCMODE_BYPASS		0
> > +#define IPU3_UAPI_OSYS_PROCMODE_UPSCALE		1
> > +#define IPU3_UAPI_OSYS_PROCMODE_DOWNSCALE	2
> > +	__u32 scaling_ratio;
> > +	__u32 y_left_phase_init;
> > +	__u32 uv_left_phase_init;
> > +	__u32 y_top_phase_init;
> > +	__u32 uv_top_phase_init;
> > +	__u32 coeffs_exp_shift;
> > +	__u32 out_y_left_crop;
> > +	__u32 out_uv_left_crop;
> > +	__u32 out_y_top_crop;
> > +	__u32 out_uv_top_crop;
> > +} __packed;
> > +
> > +struct ipu3_uapi_osys_scaler {
> > +	struct ipu3_uapi_osys_scaler_params param IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_osys_frame_params {
> > +	/* Output pins */
> > +	__u32 enable;
> > +	__u32 format;			/* enum ipu3_uapi_osys_format */
> > +	__u32 flip;
> > +	__u32 mirror;
> > +	__u32 tiling;			/* enum ipu3_uapi_osys_tiling */
> > +	__u32 width;
> > +	__u32 height;
> > +	__u32 stride;
> > +	__u32 scaled;
> > +} __packed;
> > +
> > +struct ipu3_uapi_osys_frame {
> > +	struct ipu3_uapi_osys_frame_params param IPU3_ALIGN;
> > +} __packed;
> > +
> > +struct ipu3_uapi_osys_stripe {
> > +	/* Input resolution */
> > +	__u32 input_width;
> > +	__u32 input_height;
> > +	/* Output Stripe */
> > +	__u32 output_width[IPU3_UAPI_OSYS_PINS];
> > +	__u32 output_height[IPU3_UAPI_OSYS_PINS];
> > +	__u32 output_offset[IPU3_UAPI_OSYS_PINS];
> > +	__u32 buf_stride[IPU3_UAPI_OSYS_PINS];
> > +	/* Scaler params */
> > +	__u32 block_width;
> > +	__u32 block_height;
> > +	/* Output Crop factor */
> > +	__u32 crop_top[IPU3_UAPI_OSYS_PINS];
> > +	__u32 crop_left[IPU3_UAPI_OSYS_PINS];
> > +} __packed;
> > +
> > +struct ipu3_uapi_osys_config {
> > +	struct ipu3_uapi_osys_formatter
> > +		formatter[IPU3_UAPI_MAX_STRIPES][IPU3_UAPI_OSYS_PINS];
> > +	struct ipu3_uapi_osys_scaler scaler[IPU3_UAPI_MAX_STRIPES];
> > +	struct ipu3_uapi_osys_frame frame[IPU3_UAPI_OSYS_PINS];
> > +	struct ipu3_uapi_osys_stripe stripe[IPU3_UAPI_MAX_STRIPES];
> > +	/* 32 packed coefficients for luma and chroma */
> > +	__s8 scaler_coeffs_chroma[128];
> > +	__s8 scaler_coeffs_luma[128];
> > +} __packed;
> > +
> > +struct ipu3_uapi_acc_param {
> > +	struct ipu3_uapi_stripe_data stripe;
> > +	__u8 padding[8];
> > +	struct ipu3_uapi_input_feeder_config input_feeder;
> > +	struct ipu3_uapi_bnr_static_config bnr;
> > +	struct ipu3_uapi_bnr_static_config_green_disparity green_disparity
> > +		IPU3_ALIGN;
> > +	struct ipu3_uapi_dm_config dm IPU3_ALIGN;
> > +	struct ipu3_uapi_ccm_mat_config ccm IPU3_ALIGN;
> > +	struct ipu3_uapi_gamma_config gamma IPU3_ALIGN;
> > +	struct ipu3_uapi_csc_mat_config csc IPU3_ALIGN;
> > +	struct ipu3_uapi_cds_params cds IPU3_ALIGN;
> > +	struct ipu3_uapi_shd_config shd IPU3_ALIGN;
> > +	struct ipu3_uapi_dvs_stat_config dvs_stat IPU3_ALIGN;
> > +	struct ipu3_uapi_lace_stat_config lace_stat IPU3_ALIGN;
> > +	struct ipu3_uapi_yuvp1_iefd_config iefd IPU3_ALIGN;
> > +	struct ipu3_uapi_yuvp1_yds_config yds_c0 IPU3_ALIGN;
> > +	struct ipu3_uapi_yuvp1_chnr_config chnr_c0 IPU3_ALIGN;
> > +	struct ipu3_uapi_yuvp1_y_ee_nr_config y_ee_nr IPU3_ALIGN;
> > +	struct ipu3_uapi_yuvp1_yds_config yds IPU3_ALIGN;
> > +	struct ipu3_uapi_yuvp1_chnr_config chnr IPU3_ALIGN;
> > +	struct ipu3_uapi_yuvp2_y_tm_lut_static_config ytm IPU3_ALIGN;
> > +	struct ipu3_uapi_yuvp1_yds_config yds2 IPU3_ALIGN;
> > +	struct ipu3_uapi_yuvp2_tcc_static_config tcc IPU3_ALIGN;
> > +	struct ipu3_uapi_dpc_config dpc IPU3_ALIGN;
> > +	struct ipu3_uapi_bds_config bds IPU3_ALIGN;
> > +	struct ipu3_uapi_anr_config anr IPU3_ALIGN;
> > +	struct ipu3_uapi_awb_fr_config awb_fr IPU3_ALIGN;
> > +	struct ipu3_uapi_ae_config ae IPU3_ALIGN;
> > +	struct ipu3_uapi_af_config af IPU3_ALIGN;
> > +	struct ipu3_uapi_awb_config awb IPU3_ALIGN;
> > +	struct ipu3_uapi_osys_config osys IPU3_ALIGN;
> > +} __packed;
> > +
> > +/* Linearization parameters */
> > +
> > +#define IPU3_UAPI_LIN_LUT_SIZE			64
> > +
> > +struct ipu3_uapi_isp_lin_vmem_params {
> > +	__s16 lin_lutlow_gr[IPU3_UAPI_LIN_LUT_SIZE];
> > +	__s16 lin_lutlow_r[IPU3_UAPI_LIN_LUT_SIZE];
> > +	__s16 lin_lutlow_b[IPU3_UAPI_LIN_LUT_SIZE];
> > +	__s16 lin_lutlow_gb[IPU3_UAPI_LIN_LUT_SIZE];
> > +	__s16 lin_lutdif_gr[IPU3_UAPI_LIN_LUT_SIZE];
> > +	__s16 lin_lutdif_r[IPU3_UAPI_LIN_LUT_SIZE];
> > +	__s16 lin_lutdif_b[IPU3_UAPI_LIN_LUT_SIZE];
> > +	__s16 lin_lutdif_gb[IPU3_UAPI_LIN_LUT_SIZE];
> > +} __packed;
> > +
> > +/* TNR3 VMEM parameters */
> > +
> > +#define IPU3_UAPI_ISP_TNR3_VMEM_LEN	9
> > +
> > +struct ipu3_uapi_isp_tnr3_vmem_params {
> > +	__u16 slope[IPU3_UAPI_ISP_TNR3_VMEM_LEN];
> > +	__u16 __reserved1[IPU3_UAPI_ISP_VEC_ELEMS
> > +						-
> IPU3_UAPI_ISP_TNR3_VMEM_LEN];
> > +	__u16 sigma[IPU3_UAPI_ISP_TNR3_VMEM_LEN];
> > +	__u16 __reserved2[IPU3_UAPI_ISP_VEC_ELEMS
> > +						-
> IPU3_UAPI_ISP_TNR3_VMEM_LEN];
> > +} __packed;
> > +
> > +/* XNR3 VMEM parameters */
> > +
> > +struct ipu3_uapi_isp_xnr3_vmem_params {
> > +	__u16 x[IPU3_UAPI_ISP_VEC_ELEMS];
> > +	__u16 a[IPU3_UAPI_ISP_VEC_ELEMS];
> > +	__u16 b[IPU3_UAPI_ISP_VEC_ELEMS];
> > +	__u16 c[IPU3_UAPI_ISP_VEC_ELEMS];
> > +} __packed;
> > +
> > +/* TNR3 DMEM parameters */
> > +
> > +struct ipu3_uapi_isp_tnr3_params {
> > +	__u32 knee_y1;
> > +	__u32 knee_y2;
> > +	__u32 maxfb_y;
> > +	__u32 maxfb_u;
> > +	__u32 maxfb_v;
> > +	__u32 round_adj_y;
> > +	__u32 round_adj_u;
> > +	__u32 round_adj_v;
> > +	__u32 ref_buf_select;
> > +} __packed;
> > +
> > +/* XNR3 DMEM parameters */
> > +
> > +struct ipu3_uapi_xnr3_alpha_params {
> > +	__u32 y0;
> > +	__u32 u0;
> > +	__u32 v0;
> > +	__u32 ydiff;
> > +	__u32 udiff;
> > +	__u32 vdiff;
> > +} __packed;
> > +
> > +struct ipu3_uapi_xnr3_coring_params {
> > +	__u32 u0;
> > +	__u32 v0;
> > +	__u32 udiff;
> > +	__u32 vdiff;
> > +} __packed;
> > +
> > +struct ipu3_uapi_xnr3_blending_params {
> > +	__u32 strength;
> > +} __packed;
> > +
> > +struct ipu3_uapi_isp_xnr3_params {
> > +	struct ipu3_uapi_xnr3_alpha_params alpha;
> > +	struct ipu3_uapi_xnr3_coring_params coring;
> > +	struct ipu3_uapi_xnr3_blending_params blending;
> > +} __packed;
> > +
> > +/* RGBIR DMEM parameters */
> > +
> > +#define IPU3_UAPI_RGBIR_LUT_WIDTH	17
> > +#define IPU3_UAPI_RGBIR_LUT_HEIGHT	10
> > +#define IPU3_UAPI_RGBIR_LUT_SIZE	(IPU3_UAPI_RGBIR_LUT_WIDTH * \
> > +					 IPU3_UAPI_RGBIR_LUT_HEIGHT)
> > +
> > +struct ipu3_uapi_isp_rgbir_params {
> > +	__u16 ob;					/* optical black
> level*/
> > +	__u16 ir_height;				/* lut table height */
> > +	__u16 ir_width;					/* lut table width */
> > +	__u16 ir_weights_r[IPU3_UAPI_RGBIR_LUT_SIZE];	/* lut values
> for red */
> > +	__u16 ir_weights_g[IPU3_UAPI_RGBIR_LUT_SIZE];	/* lut for
> green */
> > +	__u16 ir_weights_b[IPU3_UAPI_RGBIR_LUT_SIZE];	/* lut for blue
> */
> > +	__u16 ir_gain;					/* digital gain */
> > +} __packed;
> > +
> > +/***** Morphing table entry *****/
> > +
> > +#define IPU3_UAPI_GDC_FRAC_BITS		8
> > +
> > +struct ipu3_uapi_gdc_warp_param {
> > +	__u32 origin_x;
> > +	__u32 origin_y;
> > +	__u32 in_addr_offset;
> > +	__u32 in_block_width;
> > +	__u32 in_block_height;
> > +	__u32 p0_x;
> > +	__u32 p0_y;
> > +	__u32 p1_x;
> > +	__u32 p1_y;
> > +	__u32 p2_x;
> > +	__u32 p2_y;
> > +	__u32 p3_x;
> > +	__u32 p3_y;
> > +	__u32 in_block_width_a;
> > +	__u32 in_block_width_b;
> > +	__u32 padding;			/* struct size multiple of DDR word */
> > +} __packed;
> > +
> > +/***** Obgrid (optical black level compensation) table entry *****/
> > +
> > +struct ipu3_uapi_obgrid_param {
> > +	__u16 gr;
> > +	__u16 r;
> > +	__u16 b;
> > +	__u16 gb;
> > +} __packed;
> > +
> > +/******************* V4L2_PIX_FMT_IPU3_PARAMS
> *******************/
> > +
> > +/*
> > + * The video queue "parameters" is of format
> V4L2_PIX_FMT_IPU3_PARAMS.
> > + * It is a multiplanar output queue with three planes and type
> > + * V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE. User may also configure the
> > + * video queue as V4L2_BUF_TYPE_VIDEO_OUTPUT with a single plane, in
> which
> > + * case GDC and Obgrid tables can not be set.
> > + *
> > + * Plane 0: Defined below in struct ipu3_params, size 288064 bytes.
> > + *          This contains a lot of parameters and flags selecting which
> > + *          parameters to apply. Its size and resolution (1x1) are fixed.
> > + *
> > + * Plane 1: Contains geometric distortion correction grid coordinates.
> > + *          Each entry in the grid is defined in
> > + *          struct ipu3_uapi_gdc_warp_param.
> > + *          The plane size is the grid entry size times the number of entries,
> > + *          which depends on the main output image resolution and block size.
> > + *
> > + * Plane 2: Contains Obgrid grid. Each entry in the grid is 8 bytes.
> > + *          The plane size depends on user parameters (internally, on chosen
> > + *          firmware binary which depends on user parameters).
> > + */
> > +
> > +struct ipu3_uapi_flags {
> > +	/* Flags which of the settings below are to be applied */
> > +	__u32 gdc:1;		/* Whether to apply GDC and */
> > +	__u32 obgrid:1;		/* Obgrid planes */
> > +	__u32 __reserved1:30;
> > +
> > +	__u32 __acc_stripe:1;	/* Whether to apply these fields from */
> > +	__u32 __acc_input_feeder:1;	/* acc_param. Fields beginning with
> */
> > +	__u32 acc_bnr:1;		/* two underscores are reserved and
> */
> > +	__u32 acc_green_disparity:1;/* must not be enabled */
> > +	__u32 acc_dm:1;
> > +	__u32 acc_ccm:1;
> > +	__u32 acc_gamma:1;
> > +	__u32 acc_csc:1;
> > +	__u32 acc_cds:1;
> > +	__u32 acc_shd:1;
> > +	__u32 acc_dvs_stat:1;
> > +	__u32 acc_lace_stat:1;
> > +	__u32 acc_iefd:1;
> > +	__u32 acc_yds_c0:1;
> > +	__u32 acc_chnr_c0:1;
> > +	__u32 acc_y_ee_nr:1;
> > +	__u32 acc_yds:1;
> > +	__u32 acc_chnr:1;
> > +	__u32 acc_ytm:1;
> > +	__u32 acc_yds2:1;
> > +	__u32 acc_tcc:1;
> > +	__u32 acc_dpc:1;
> > +	__u32 acc_bds:1;
> > +	__u32 acc_anr:1;
> > +	__u32 acc_awb_fr:1;
> > +	__u32 acc_ae:1;
> > +	__u32 acc_af:1;
> > +	__u32 acc_awb:1;
> > +	__u32 __acc_osys:1;
> > +	__u32 __reserved2:3;
> > +
> > +	__u32 lin_vmem_params:1;	/* Whether to apply these structs */
> > +	__u32 tnr3_vmem_params:1;
> > +	__u32 xnr3_vmem_params:1;
> > +	__u32 tnr3_dmem_params:1;
> > +	__u32 xnr3_dmem_params:1;
> > +	__u32 __rgbir_dmem_params:1;
> > +	__u32 obgrid_param:1;
> > +	__u32 __reserved3:25;
> > +} __packed;
> > +
> > +struct ipu3_uapi_params {
> > +	__u32 fourcc;			/* V4L2_PIX_FMT_IPU3_PARAMS */
> > +	__u32 version;			/* Must be 0x100 */
> 
> These were called padding1 and padding2 in the previous version. What
> happened?
> 
> I'd just call them reserved, and maybe also make the use field the first
> member of the struct.
> 

These fields were repurposed after v3 of this patch series. Please see the user space code that uses these fields.
https://chromium.googlesource.com/chromiumos/platform/arc-camera/+/master/hal/intel/psl/ipu3/workers/IPU3AicToFwEncoder.cpp

> > +
> > +	struct ipu3_uapi_flags use;
> > +
> > +	__u8 __reserved4[32 - 4 * 5];	/* Must be zero */
> 
> 32 - sizeof(struct ipu3_uapi_flags) - sizeof(__u32) * 2
> 
> ?

Ack

> 
> > +
> > +	/* Acceleration cluster parameters */
> > +	struct ipu3_uapi_acc_param acc_param;
> > +
> > +	/* VMEM parameters */
> > +	struct ipu3_uapi_isp_lin_vmem_params lin_vmem_params;
> > +	struct ipu3_uapi_isp_tnr3_vmem_params tnr3_vmem_params;
> > +	struct ipu3_uapi_isp_xnr3_vmem_params xnr3_vmem_params;
> > +
> > +	/* DMEM parameters */
> > +	struct ipu3_uapi_isp_tnr3_params tnr3_dmem_params;
> > +	struct ipu3_uapi_isp_xnr3_params xnr3_dmem_params;
> > +	struct ipu3_uapi_isp_rgbir_params rgbir_dmem_params;
> > +
> > +	struct ipu3_uapi_obgrid_param obgrid_param;
> > +	__u8 padding[4];
> > +} __packed;
> 
> Good to see everything is __packed now. How much there is currently actual
> need for IPU3_ALIGN? Could you remover that as well?
> 

IPU3_ALIGN (32 byte alignment) is needed for data structures that are used by the ImgU for DMA accesses.

However, I can remove IPU3_ALIGN for fields where it is redundant (which are already 32 byte aligned).

> > +
> > +#endif
> 
> --
> Regards,
> 
> Sakari Ailus
> e-mail: sakari.ailus@xxxxxx




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux