1f5fbb83fSMauro Carvalho Chehab // SPDX-License-Identifier: GPL-2.0
29d4fa1a1SMauro Carvalho Chehab /*
39d4fa1a1SMauro Carvalho Chehab  * Support for Intel Camera Imaging ISP subsystem.
49d4fa1a1SMauro Carvalho Chehab  * Copyright (c) 2015, Intel Corporation.
59d4fa1a1SMauro Carvalho Chehab  *
69d4fa1a1SMauro Carvalho Chehab  * This program is free software; you can redistribute it and/or modify it
79d4fa1a1SMauro Carvalho Chehab  * under the terms and conditions of the GNU General Public License,
89d4fa1a1SMauro Carvalho Chehab  * version 2, as published by the Free Software Foundation.
99d4fa1a1SMauro Carvalho Chehab  *
109d4fa1a1SMauro Carvalho Chehab  * This program is distributed in the hope it will be useful, but WITHOUT
119d4fa1a1SMauro Carvalho Chehab  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
129d4fa1a1SMauro Carvalho Chehab  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
139d4fa1a1SMauro Carvalho Chehab  * more details.
149d4fa1a1SMauro Carvalho Chehab  */
159d4fa1a1SMauro Carvalho Chehab 
169d4fa1a1SMauro Carvalho Chehab #include "gdc_device.h"		/* gdc_lut_store(), ... */
179d4fa1a1SMauro Carvalho Chehab #include "isp.h"			/* ISP_VEC_ELEMBITS */
189d4fa1a1SMauro Carvalho Chehab #include "vamem.h"
199d4fa1a1SMauro Carvalho Chehab #ifndef __INLINE_HMEM__
209d4fa1a1SMauro Carvalho Chehab #define __INLINE_HMEM__
219d4fa1a1SMauro Carvalho Chehab #endif
229d4fa1a1SMauro Carvalho Chehab #include "hmem.h"
239d4fa1a1SMauro Carvalho Chehab #define IA_CSS_INCLUDE_PARAMETERS
249d4fa1a1SMauro Carvalho Chehab #define IA_CSS_INCLUDE_ACC_PARAMETERS
259d4fa1a1SMauro Carvalho Chehab 
2608fef4faSMauro Carvalho Chehab #include "hmm.h"
279d4fa1a1SMauro Carvalho Chehab #include "sh_css_params.h"
289d4fa1a1SMauro Carvalho Chehab #include "ia_css_queue.h"
299d4fa1a1SMauro Carvalho Chehab #include "sw_event_global.h"		/* Event IDs */
309d4fa1a1SMauro Carvalho Chehab 
319d4fa1a1SMauro Carvalho Chehab #include "platform_support.h"
329d4fa1a1SMauro Carvalho Chehab #include "assert_support.h"
339d4fa1a1SMauro Carvalho Chehab #include "misc_support.h"	/* NOT_USED */
349d4fa1a1SMauro Carvalho Chehab #include "math_support.h"	/* max(), min()  EVEN_FLOOR()*/
359d4fa1a1SMauro Carvalho Chehab 
369d4fa1a1SMauro Carvalho Chehab #include "ia_css_stream.h"
379d4fa1a1SMauro Carvalho Chehab #include "sh_css_params_internal.h"
389d4fa1a1SMauro Carvalho Chehab #include "sh_css_param_shading.h"
399d4fa1a1SMauro Carvalho Chehab #include "sh_css_param_dvs.h"
409d4fa1a1SMauro Carvalho Chehab #include "ia_css_refcount.h"
419d4fa1a1SMauro Carvalho Chehab #include "sh_css_internal.h"
429d4fa1a1SMauro Carvalho Chehab #include "ia_css_control.h"
439d4fa1a1SMauro Carvalho Chehab #include "ia_css_shading.h"
449d4fa1a1SMauro Carvalho Chehab #include "sh_css_defs.h"
459d4fa1a1SMauro Carvalho Chehab #include "sh_css_sp.h"
469d4fa1a1SMauro Carvalho Chehab #include "ia_css_pipeline.h"
479d4fa1a1SMauro Carvalho Chehab #include "ia_css_debug.h"
48dc50fa18SMauro Carvalho Chehab 
499d4fa1a1SMauro Carvalho Chehab #include "ia_css_isp_param.h"
509d4fa1a1SMauro Carvalho Chehab #include "ia_css_isp_params.h"
519d4fa1a1SMauro Carvalho Chehab #include "ia_css_mipi.h"
529d4fa1a1SMauro Carvalho Chehab #include "ia_css_morph.h"
539d4fa1a1SMauro Carvalho Chehab #include "ia_css_host_data.h"
549d4fa1a1SMauro Carvalho Chehab #include "ia_css_pipe.h"
559d4fa1a1SMauro Carvalho Chehab #include "ia_css_pipe_binarydesc.h"
569d4fa1a1SMauro Carvalho Chehab 
579d4fa1a1SMauro Carvalho Chehab /* Include all kernel host interfaces for ISP1 */
589d4fa1a1SMauro Carvalho Chehab 
599d4fa1a1SMauro Carvalho Chehab #include "anr/anr_1.0/ia_css_anr.host.h"
609d4fa1a1SMauro Carvalho Chehab #include "cnr/cnr_1.0/ia_css_cnr.host.h"
619d4fa1a1SMauro Carvalho Chehab #include "csc/csc_1.0/ia_css_csc.host.h"
629d4fa1a1SMauro Carvalho Chehab #include "de/de_1.0/ia_css_de.host.h"
639d4fa1a1SMauro Carvalho Chehab #include "dp/dp_1.0/ia_css_dp.host.h"
649d4fa1a1SMauro Carvalho Chehab #include "bnr/bnr_1.0/ia_css_bnr.host.h"
659d4fa1a1SMauro Carvalho Chehab #include "dvs/dvs_1.0/ia_css_dvs.host.h"
669d4fa1a1SMauro Carvalho Chehab #include "fpn/fpn_1.0/ia_css_fpn.host.h"
679d4fa1a1SMauro Carvalho Chehab #include "gc/gc_1.0/ia_css_gc.host.h"
689d4fa1a1SMauro Carvalho Chehab #include "macc/macc_1.0/ia_css_macc.host.h"
699d4fa1a1SMauro Carvalho Chehab #include "ctc/ctc_1.0/ia_css_ctc.host.h"
709d4fa1a1SMauro Carvalho Chehab #include "ob/ob_1.0/ia_css_ob.host.h"
719d4fa1a1SMauro Carvalho Chehab #include "raw/raw_1.0/ia_css_raw.host.h"
729d4fa1a1SMauro Carvalho Chehab #include "fixedbds/fixedbds_1.0/ia_css_fixedbds_param.h"
739d4fa1a1SMauro Carvalho Chehab #include "s3a/s3a_1.0/ia_css_s3a.host.h"
749d4fa1a1SMauro Carvalho Chehab #include "sc/sc_1.0/ia_css_sc.host.h"
759d4fa1a1SMauro Carvalho Chehab #include "sdis/sdis_1.0/ia_css_sdis.host.h"
769d4fa1a1SMauro Carvalho Chehab #include "tnr/tnr_1.0/ia_css_tnr.host.h"
779d4fa1a1SMauro Carvalho Chehab #include "uds/uds_1.0/ia_css_uds_param.h"
789d4fa1a1SMauro Carvalho Chehab #include "wb/wb_1.0/ia_css_wb.host.h"
799d4fa1a1SMauro Carvalho Chehab #include "ynr/ynr_1.0/ia_css_ynr.host.h"
809d4fa1a1SMauro Carvalho Chehab #include "xnr/xnr_1.0/ia_css_xnr.host.h"
819d4fa1a1SMauro Carvalho Chehab 
829d4fa1a1SMauro Carvalho Chehab /* Include additional kernel host interfaces for ISP2 */
839d4fa1a1SMauro Carvalho Chehab 
849d4fa1a1SMauro Carvalho Chehab #include "aa/aa_2/ia_css_aa2.host.h"
859d4fa1a1SMauro Carvalho Chehab #include "anr/anr_2/ia_css_anr2.host.h"
869d4fa1a1SMauro Carvalho Chehab #include "bh/bh_2/ia_css_bh.host.h"
879d4fa1a1SMauro Carvalho Chehab #include "cnr/cnr_2/ia_css_cnr2.host.h"
889d4fa1a1SMauro Carvalho Chehab #include "ctc/ctc1_5/ia_css_ctc1_5.host.h"
899d4fa1a1SMauro Carvalho Chehab #include "de/de_2/ia_css_de2.host.h"
909d4fa1a1SMauro Carvalho Chehab #include "gc/gc_2/ia_css_gc2.host.h"
919d4fa1a1SMauro Carvalho Chehab #include "sdis/sdis_2/ia_css_sdis2.host.h"
929d4fa1a1SMauro Carvalho Chehab #include "ynr/ynr_2/ia_css_ynr2.host.h"
939d4fa1a1SMauro Carvalho Chehab #include "fc/fc_1.0/ia_css_formats.host.h"
949d4fa1a1SMauro Carvalho Chehab 
959d4fa1a1SMauro Carvalho Chehab #include "xnr/xnr_3.0/ia_css_xnr3.host.h"
969d4fa1a1SMauro Carvalho Chehab 
979d4fa1a1SMauro Carvalho Chehab 
989d4fa1a1SMauro Carvalho Chehab #include "sh_css_frac.h"
999d4fa1a1SMauro Carvalho Chehab #include "ia_css_bufq.h"
1009d4fa1a1SMauro Carvalho Chehab 
fpntbl_bytes(const struct ia_css_binary * binary)101*2e82f054SBrent Pappas static size_t fpntbl_bytes(const struct ia_css_binary *binary)
102*2e82f054SBrent Pappas {
103*2e82f054SBrent Pappas 	return array3_size(sizeof(char),
104*2e82f054SBrent Pappas 			   binary->in_frame_info.res.height,
105*2e82f054SBrent Pappas 			   binary->in_frame_info.padded_width);
106*2e82f054SBrent Pappas }
1079d4fa1a1SMauro Carvalho Chehab 
sctbl_bytes(const struct ia_css_binary * binary)108*2e82f054SBrent Pappas static size_t sctbl_bytes(const struct ia_css_binary *binary)
109*2e82f054SBrent Pappas {
110*2e82f054SBrent Pappas 	return size_mul(sizeof(unsigned short),
111*2e82f054SBrent Pappas 			array3_size(binary->sctbl_height,
112*2e82f054SBrent Pappas 				    binary->sctbl_aligned_width_per_color,
113*2e82f054SBrent Pappas 				    IA_CSS_SC_NUM_COLORS));
114*2e82f054SBrent Pappas }
1159d4fa1a1SMauro Carvalho Chehab 
morph_plane_bytes(const struct ia_css_binary * binary)116*2e82f054SBrent Pappas static size_t morph_plane_bytes(const struct ia_css_binary *binary)
117*2e82f054SBrent Pappas {
118*2e82f054SBrent Pappas 	return array3_size(SH_CSS_MORPH_TABLE_ELEM_BYTES,
119*2e82f054SBrent Pappas 			   binary->morph_tbl_aligned_width,
120*2e82f054SBrent Pappas 			   binary->morph_tbl_height);
121*2e82f054SBrent Pappas }
1229d4fa1a1SMauro Carvalho Chehab 
1239d4fa1a1SMauro Carvalho Chehab /* We keep a second copy of the ptr struct for the SP to access.
1249d4fa1a1SMauro Carvalho Chehab    Again, this would not be necessary on the chip. */
125100e8989SMauro Carvalho Chehab static ia_css_ptr sp_ddr_ptrs;
1269d4fa1a1SMauro Carvalho Chehab 
1279d4fa1a1SMauro Carvalho Chehab /* sp group address on DDR */
128100e8989SMauro Carvalho Chehab static ia_css_ptr xmem_sp_group_ptrs;
1299d4fa1a1SMauro Carvalho Chehab 
130100e8989SMauro Carvalho Chehab static ia_css_ptr xmem_sp_stage_ptrs[IA_CSS_PIPE_ID_NUM]
1319d4fa1a1SMauro Carvalho Chehab [SH_CSS_MAX_STAGES];
132100e8989SMauro Carvalho Chehab static ia_css_ptr xmem_isp_stage_ptrs[IA_CSS_PIPE_ID_NUM]
1339d4fa1a1SMauro Carvalho Chehab [SH_CSS_MAX_STAGES];
1349d4fa1a1SMauro Carvalho Chehab 
135100e8989SMauro Carvalho Chehab static ia_css_ptr default_gdc_lut;
1369d4fa1a1SMauro Carvalho Chehab static int interleaved_lut_temp[4][HRT_GDC_N];
1379d4fa1a1SMauro Carvalho Chehab 
1389d4fa1a1SMauro Carvalho Chehab /* END DO NOT MOVE INTO VIMALS_WORLD */
1399d4fa1a1SMauro Carvalho Chehab 
1409d4fa1a1SMauro Carvalho Chehab /* Digital Zoom lookup table. See documentation for more details about the
1419d4fa1a1SMauro Carvalho Chehab  * contents of this table.
1429d4fa1a1SMauro Carvalho Chehab  */
1439d4fa1a1SMauro Carvalho Chehab static const int zoom_table[4][HRT_GDC_N] = {
1449d4fa1a1SMauro Carvalho Chehab 	{
1459d4fa1a1SMauro Carvalho Chehab 		0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1469d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1479d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1489d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1499d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1509d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1519d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1529d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1539d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1549d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1559d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1569d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
1579d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
1589d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
1599d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
1609d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
1619d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
1629d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
1639d4fa1a1SMauro Carvalho Chehab 		  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,
1649d4fa1a1SMauro Carvalho Chehab 		  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,
1659d4fa1a1SMauro Carvalho Chehab 		  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,
1669d4fa1a1SMauro Carvalho Chehab 		  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,
1679d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
1689d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
1699d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
1709d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
1719d4fa1a1SMauro Carvalho Chehab 		  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,
1729d4fa1a1SMauro Carvalho Chehab 		  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,
1739d4fa1a1SMauro Carvalho Chehab 		  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,
1749d4fa1a1SMauro Carvalho Chehab 		  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,
1759d4fa1a1SMauro Carvalho Chehab 		  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,
1769d4fa1a1SMauro Carvalho Chehab 		  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,
1779d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
1789d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
1799d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
1809d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
1819d4fa1a1SMauro Carvalho Chehab 		  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,
1829d4fa1a1SMauro Carvalho Chehab 		  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,
1839d4fa1a1SMauro Carvalho Chehab 		  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,
1849d4fa1a1SMauro Carvalho Chehab 		  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,
1859d4fa1a1SMauro Carvalho Chehab 		  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,
1869d4fa1a1SMauro Carvalho Chehab 		  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,
1879d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
1889d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
1899d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
1909d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
1919d4fa1a1SMauro Carvalho Chehab 		  -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4,
1929d4fa1a1SMauro Carvalho Chehab 		  -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4,
1939d4fa1a1SMauro Carvalho Chehab 		  -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
1949d4fa1a1SMauro Carvalho Chehab 		  -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
1959d4fa1a1SMauro Carvalho Chehab 		  -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
1969d4fa1a1SMauro Carvalho Chehab 		  -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
1979d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
1989d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
1999d4fa1a1SMauro Carvalho Chehab 		  -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
2009d4fa1a1SMauro Carvalho Chehab 		  -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
2019d4fa1a1SMauro Carvalho Chehab 		  -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
2029d4fa1a1SMauro Carvalho Chehab 		  -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
2039d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
2049d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
2059d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
2069d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
2079d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
2089d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
2099d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
2109d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
2119d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
2129d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
2139d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
2149d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
2159d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
2169d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
2179d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
2189d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
2199d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2209d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2219d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2229d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2239d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2249d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2259d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2269d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2279d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2289d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2299d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2309d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2319d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2329d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2339d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2349d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2359d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2369d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2379d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2389d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2399d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2409d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2419d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2429d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
2439d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
2449d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
2459d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
2469d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
2479d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
2489d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
2499d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
2509d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
2519d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
2529d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
2539d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
2549d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
2559d4fa1a1SMauro Carvalho Chehab 		  -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
2569d4fa1a1SMauro Carvalho Chehab 		  -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
2579d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
2589d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
2599d4fa1a1SMauro Carvalho Chehab 		  -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
2609d4fa1a1SMauro Carvalho Chehab 		  -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
2619d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
2629d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
2639d4fa1a1SMauro Carvalho Chehab 		  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,
2649d4fa1a1SMauro Carvalho Chehab 		  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,
2659d4fa1a1SMauro Carvalho Chehab 		  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,
2669d4fa1a1SMauro Carvalho Chehab 		  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,  -7 << 4,
2679d4fa1a1SMauro Carvalho Chehab 		  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,
2689d4fa1a1SMauro Carvalho Chehab 		  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,
2699d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
2709d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
2719d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
2729d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4
2739d4fa1a1SMauro Carvalho Chehab 	},
2749d4fa1a1SMauro Carvalho Chehab 	{
2759d4fa1a1SMauro Carvalho Chehab 		0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
2769d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
2779d4fa1a1SMauro Carvalho Chehab 		  2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,
2789d4fa1a1SMauro Carvalho Chehab 		  2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,
2799d4fa1a1SMauro Carvalho Chehab 		  4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,
2809d4fa1a1SMauro Carvalho Chehab 		  4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,
2819d4fa1a1SMauro Carvalho Chehab 		  7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,
2829d4fa1a1SMauro Carvalho Chehab 		  7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,
2839d4fa1a1SMauro Carvalho Chehab 		  9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,
2849d4fa1a1SMauro Carvalho Chehab 		  9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,
2859d4fa1a1SMauro Carvalho Chehab 		  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,
2869d4fa1a1SMauro Carvalho Chehab 		  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,
2879d4fa1a1SMauro Carvalho Chehab 		  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,
2889d4fa1a1SMauro Carvalho Chehab 		  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,
2899d4fa1a1SMauro Carvalho Chehab 		  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,
2909d4fa1a1SMauro Carvalho Chehab 		  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,
2919d4fa1a1SMauro Carvalho Chehab 		  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,
2929d4fa1a1SMauro Carvalho Chehab 		  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,
2939d4fa1a1SMauro Carvalho Chehab 		  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,
2949d4fa1a1SMauro Carvalho Chehab 		  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,
2959d4fa1a1SMauro Carvalho Chehab 		  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,
2969d4fa1a1SMauro Carvalho Chehab 		  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,
2979d4fa1a1SMauro Carvalho Chehab 		  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,
2989d4fa1a1SMauro Carvalho Chehab 		  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,
2999d4fa1a1SMauro Carvalho Chehab 		  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,
3009d4fa1a1SMauro Carvalho Chehab 		  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,
3019d4fa1a1SMauro Carvalho Chehab 		  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,
3029d4fa1a1SMauro Carvalho Chehab 		  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,
3039d4fa1a1SMauro Carvalho Chehab 		  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,
3049d4fa1a1SMauro Carvalho Chehab 		  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,
3059d4fa1a1SMauro Carvalho Chehab 		  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,
3069d4fa1a1SMauro Carvalho Chehab 		  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,
3079d4fa1a1SMauro Carvalho Chehab 		  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,
3089d4fa1a1SMauro Carvalho Chehab 		  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,
3099d4fa1a1SMauro Carvalho Chehab 		  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,
3109d4fa1a1SMauro Carvalho Chehab 		  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,
3119d4fa1a1SMauro Carvalho Chehab 		  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,
3129d4fa1a1SMauro Carvalho Chehab 		  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,
3139d4fa1a1SMauro Carvalho Chehab 		  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,
3149d4fa1a1SMauro Carvalho Chehab 		  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,
3159d4fa1a1SMauro Carvalho Chehab 		  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,
3169d4fa1a1SMauro Carvalho Chehab 		  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,
3179d4fa1a1SMauro Carvalho Chehab 		  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,
3189d4fa1a1SMauro Carvalho Chehab 		  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,
3199d4fa1a1SMauro Carvalho Chehab 		  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,
3209d4fa1a1SMauro Carvalho Chehab 		  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,
3219d4fa1a1SMauro Carvalho Chehab 		  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,
3229d4fa1a1SMauro Carvalho Chehab 		  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,
3239d4fa1a1SMauro Carvalho Chehab 		  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,
3249d4fa1a1SMauro Carvalho Chehab 		  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,
3259d4fa1a1SMauro Carvalho Chehab 		  105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4,
3269d4fa1a1SMauro Carvalho Chehab 		  105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4,
3279d4fa1a1SMauro Carvalho Chehab 		  110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4,
3289d4fa1a1SMauro Carvalho Chehab 		  110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4,
3299d4fa1a1SMauro Carvalho Chehab 		  116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4,
3309d4fa1a1SMauro Carvalho Chehab 		  116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4,
3319d4fa1a1SMauro Carvalho Chehab 		  121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4,
3329d4fa1a1SMauro Carvalho Chehab 		  121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4,
3339d4fa1a1SMauro Carvalho Chehab 		  127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4,
3349d4fa1a1SMauro Carvalho Chehab 		  127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4,
3359d4fa1a1SMauro Carvalho Chehab 		  132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4,
3369d4fa1a1SMauro Carvalho Chehab 		  132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4,
3379d4fa1a1SMauro Carvalho Chehab 		  138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4,
3389d4fa1a1SMauro Carvalho Chehab 		  138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4,
3399d4fa1a1SMauro Carvalho Chehab 		  144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4,
3409d4fa1a1SMauro Carvalho Chehab 		  144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4,
3419d4fa1a1SMauro Carvalho Chehab 		  149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4,
3429d4fa1a1SMauro Carvalho Chehab 		  149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4,
3439d4fa1a1SMauro Carvalho Chehab 		  154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4,
3449d4fa1a1SMauro Carvalho Chehab 		  154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4,
3459d4fa1a1SMauro Carvalho Chehab 		  160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4,
3469d4fa1a1SMauro Carvalho Chehab 		  160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4,
3479d4fa1a1SMauro Carvalho Chehab 		  165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4,
3489d4fa1a1SMauro Carvalho Chehab 		  165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4,
3499d4fa1a1SMauro Carvalho Chehab 		  170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4,
3509d4fa1a1SMauro Carvalho Chehab 		  170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4,
3519d4fa1a1SMauro Carvalho Chehab 		  176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4,
3529d4fa1a1SMauro Carvalho Chehab 		  176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4,
3539d4fa1a1SMauro Carvalho Chehab 		  181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4,
3549d4fa1a1SMauro Carvalho Chehab 		  181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4,
3559d4fa1a1SMauro Carvalho Chehab 		  186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4,
3569d4fa1a1SMauro Carvalho Chehab 		  186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4,
3579d4fa1a1SMauro Carvalho Chehab 		  191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4,
3589d4fa1a1SMauro Carvalho Chehab 		  191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4,
3599d4fa1a1SMauro Carvalho Chehab 		  195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4,
3609d4fa1a1SMauro Carvalho Chehab 		  195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4,
3619d4fa1a1SMauro Carvalho Chehab 		  200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4,
3629d4fa1a1SMauro Carvalho Chehab 		  200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4,
3639d4fa1a1SMauro Carvalho Chehab 		  205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4,
3649d4fa1a1SMauro Carvalho Chehab 		  205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4,
3659d4fa1a1SMauro Carvalho Chehab 		  209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4,
3669d4fa1a1SMauro Carvalho Chehab 		  209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4,
3679d4fa1a1SMauro Carvalho Chehab 		  213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4,
3689d4fa1a1SMauro Carvalho Chehab 		  213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4,
3699d4fa1a1SMauro Carvalho Chehab 		  218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4,
3709d4fa1a1SMauro Carvalho Chehab 		  218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4,
3719d4fa1a1SMauro Carvalho Chehab 		  222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4,
3729d4fa1a1SMauro Carvalho Chehab 		  222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4,
3739d4fa1a1SMauro Carvalho Chehab 		  225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4,
3749d4fa1a1SMauro Carvalho Chehab 		  225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4,
3759d4fa1a1SMauro Carvalho Chehab 		  229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4,
3769d4fa1a1SMauro Carvalho Chehab 		  229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4,
3779d4fa1a1SMauro Carvalho Chehab 		  232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4,
3789d4fa1a1SMauro Carvalho Chehab 		  232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4,
3799d4fa1a1SMauro Carvalho Chehab 		  236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4,
3809d4fa1a1SMauro Carvalho Chehab 		  236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4,
3819d4fa1a1SMauro Carvalho Chehab 		  239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4,
3829d4fa1a1SMauro Carvalho Chehab 		  239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4,
3839d4fa1a1SMauro Carvalho Chehab 		  241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4,
3849d4fa1a1SMauro Carvalho Chehab 		  241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4,
3859d4fa1a1SMauro Carvalho Chehab 		  244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4,
3869d4fa1a1SMauro Carvalho Chehab 		  244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4,
3879d4fa1a1SMauro Carvalho Chehab 		  246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4,
3889d4fa1a1SMauro Carvalho Chehab 		  246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4,
3899d4fa1a1SMauro Carvalho Chehab 		  248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4,
3909d4fa1a1SMauro Carvalho Chehab 		  248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4,
3919d4fa1a1SMauro Carvalho Chehab 		  250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4,
3929d4fa1a1SMauro Carvalho Chehab 		  250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4,
3939d4fa1a1SMauro Carvalho Chehab 		  252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4,
3949d4fa1a1SMauro Carvalho Chehab 		  252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4,
3959d4fa1a1SMauro Carvalho Chehab 		  253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4,
3969d4fa1a1SMauro Carvalho Chehab 		  253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4,
3979d4fa1a1SMauro Carvalho Chehab 		  254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4,
3989d4fa1a1SMauro Carvalho Chehab 		  254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4,
3999d4fa1a1SMauro Carvalho Chehab 		  255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
4009d4fa1a1SMauro Carvalho Chehab 		  255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
4019d4fa1a1SMauro Carvalho Chehab 		  255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
4029d4fa1a1SMauro Carvalho Chehab 		  255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4
4039d4fa1a1SMauro Carvalho Chehab 	},
4049d4fa1a1SMauro Carvalho Chehab 	{
4059d4fa1a1SMauro Carvalho Chehab 		256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4,
4069d4fa1a1SMauro Carvalho Chehab 		    256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4,
4079d4fa1a1SMauro Carvalho Chehab 		    255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
4089d4fa1a1SMauro Carvalho Chehab 		    255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
4099d4fa1a1SMauro Carvalho Chehab 		    255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
4109d4fa1a1SMauro Carvalho Chehab 		    255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
4119d4fa1a1SMauro Carvalho Chehab 		    254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4,
4129d4fa1a1SMauro Carvalho Chehab 		    254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4,
4139d4fa1a1SMauro Carvalho Chehab 		    253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4,
4149d4fa1a1SMauro Carvalho Chehab 		    253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4,
4159d4fa1a1SMauro Carvalho Chehab 		    252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4,
4169d4fa1a1SMauro Carvalho Chehab 		    252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4,
4179d4fa1a1SMauro Carvalho Chehab 		    250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4,
4189d4fa1a1SMauro Carvalho Chehab 		    250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4,
4199d4fa1a1SMauro Carvalho Chehab 		    248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4,
4209d4fa1a1SMauro Carvalho Chehab 		    248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4,
4219d4fa1a1SMauro Carvalho Chehab 		    246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4,
4229d4fa1a1SMauro Carvalho Chehab 		    246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4,
4239d4fa1a1SMauro Carvalho Chehab 		    244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4,
4249d4fa1a1SMauro Carvalho Chehab 		    244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4,
4259d4fa1a1SMauro Carvalho Chehab 		    241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4,
4269d4fa1a1SMauro Carvalho Chehab 		    241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4,
4279d4fa1a1SMauro Carvalho Chehab 		    239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4,
4289d4fa1a1SMauro Carvalho Chehab 		    239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4,
4299d4fa1a1SMauro Carvalho Chehab 		    236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4,
4309d4fa1a1SMauro Carvalho Chehab 		    236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4,
4319d4fa1a1SMauro Carvalho Chehab 		    232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4,
4329d4fa1a1SMauro Carvalho Chehab 		    232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4,
4339d4fa1a1SMauro Carvalho Chehab 		    229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4,
4349d4fa1a1SMauro Carvalho Chehab 		    229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4,
4359d4fa1a1SMauro Carvalho Chehab 		    225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4,
4369d4fa1a1SMauro Carvalho Chehab 		    225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4,
4379d4fa1a1SMauro Carvalho Chehab 		    222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4,
4389d4fa1a1SMauro Carvalho Chehab 		    222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4,
4399d4fa1a1SMauro Carvalho Chehab 		    218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4,
4409d4fa1a1SMauro Carvalho Chehab 		    218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4,
4419d4fa1a1SMauro Carvalho Chehab 		    213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4,
4429d4fa1a1SMauro Carvalho Chehab 		    213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4,
4439d4fa1a1SMauro Carvalho Chehab 		    209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4,
4449d4fa1a1SMauro Carvalho Chehab 		    209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4,
4459d4fa1a1SMauro Carvalho Chehab 		    205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4,
4469d4fa1a1SMauro Carvalho Chehab 		    205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4,
4479d4fa1a1SMauro Carvalho Chehab 		    200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4,
4489d4fa1a1SMauro Carvalho Chehab 		    200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4,
4499d4fa1a1SMauro Carvalho Chehab 		    195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4,
4509d4fa1a1SMauro Carvalho Chehab 		    195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4,
4519d4fa1a1SMauro Carvalho Chehab 		    191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4,
4529d4fa1a1SMauro Carvalho Chehab 		    191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4,
4539d4fa1a1SMauro Carvalho Chehab 		    186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4,
4549d4fa1a1SMauro Carvalho Chehab 		    186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4,
4559d4fa1a1SMauro Carvalho Chehab 		    181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4,
4569d4fa1a1SMauro Carvalho Chehab 		    181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4,
4579d4fa1a1SMauro Carvalho Chehab 		    176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4,
4589d4fa1a1SMauro Carvalho Chehab 		    176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4,
4599d4fa1a1SMauro Carvalho Chehab 		    170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4,
4609d4fa1a1SMauro Carvalho Chehab 		    170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4,
4619d4fa1a1SMauro Carvalho Chehab 		    165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4,
4629d4fa1a1SMauro Carvalho Chehab 		    165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4,
4639d4fa1a1SMauro Carvalho Chehab 		    160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4,
4649d4fa1a1SMauro Carvalho Chehab 		    160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4,
4659d4fa1a1SMauro Carvalho Chehab 		    154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4,
4669d4fa1a1SMauro Carvalho Chehab 		    154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4,
4679d4fa1a1SMauro Carvalho Chehab 		    149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4,
4689d4fa1a1SMauro Carvalho Chehab 		    149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4,
4699d4fa1a1SMauro Carvalho Chehab 		    144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4,
4709d4fa1a1SMauro Carvalho Chehab 		    144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4,
4719d4fa1a1SMauro Carvalho Chehab 		    138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4,
4729d4fa1a1SMauro Carvalho Chehab 		    138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4,
4739d4fa1a1SMauro Carvalho Chehab 		    132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4,
4749d4fa1a1SMauro Carvalho Chehab 		    132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4,
4759d4fa1a1SMauro Carvalho Chehab 		    127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4,
4769d4fa1a1SMauro Carvalho Chehab 		    127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4,
4779d4fa1a1SMauro Carvalho Chehab 		    121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4,
4789d4fa1a1SMauro Carvalho Chehab 		    121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4,
4799d4fa1a1SMauro Carvalho Chehab 		    116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4,
4809d4fa1a1SMauro Carvalho Chehab 		    116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4,
4819d4fa1a1SMauro Carvalho Chehab 		    110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4,
4829d4fa1a1SMauro Carvalho Chehab 		    110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4,
4839d4fa1a1SMauro Carvalho Chehab 		    105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4,
4849d4fa1a1SMauro Carvalho Chehab 		    105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4,
4859d4fa1a1SMauro Carvalho Chehab 		    99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,
4869d4fa1a1SMauro Carvalho Chehab 		    99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,  99 << 4,
4879d4fa1a1SMauro Carvalho Chehab 		    94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,
4889d4fa1a1SMauro Carvalho Chehab 		    94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,  94 << 4,
4899d4fa1a1SMauro Carvalho Chehab 		    88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,
4909d4fa1a1SMauro Carvalho Chehab 		    88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,  88 << 4,
4919d4fa1a1SMauro Carvalho Chehab 		    83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,
4929d4fa1a1SMauro Carvalho Chehab 		    83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,  83 << 4,
4939d4fa1a1SMauro Carvalho Chehab 		    78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,
4949d4fa1a1SMauro Carvalho Chehab 		    78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,  78 << 4,
4959d4fa1a1SMauro Carvalho Chehab 		    73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,
4969d4fa1a1SMauro Carvalho Chehab 		    73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,  73 << 4,
4979d4fa1a1SMauro Carvalho Chehab 		    67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,
4989d4fa1a1SMauro Carvalho Chehab 		    67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,  67 << 4,
4999d4fa1a1SMauro Carvalho Chehab 		    62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,
5009d4fa1a1SMauro Carvalho Chehab 		    62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,  62 << 4,
5019d4fa1a1SMauro Carvalho Chehab 		    58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,
5029d4fa1a1SMauro Carvalho Chehab 		    58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,  58 << 4,
5039d4fa1a1SMauro Carvalho Chehab 		    53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,
5049d4fa1a1SMauro Carvalho Chehab 		    53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,  53 << 4,
5059d4fa1a1SMauro Carvalho Chehab 		    48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,
5069d4fa1a1SMauro Carvalho Chehab 		    48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,  48 << 4,
5079d4fa1a1SMauro Carvalho Chehab 		    43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,
5089d4fa1a1SMauro Carvalho Chehab 		    43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,  43 << 4,
5099d4fa1a1SMauro Carvalho Chehab 		    39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,
5109d4fa1a1SMauro Carvalho Chehab 		    39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,  39 << 4,
5119d4fa1a1SMauro Carvalho Chehab 		    35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,
5129d4fa1a1SMauro Carvalho Chehab 		    35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,  35 << 4,
5139d4fa1a1SMauro Carvalho Chehab 		    31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,
5149d4fa1a1SMauro Carvalho Chehab 		    31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,  31 << 4,
5159d4fa1a1SMauro Carvalho Chehab 		    27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,
5169d4fa1a1SMauro Carvalho Chehab 		    27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,  27 << 4,
5179d4fa1a1SMauro Carvalho Chehab 		    23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,
5189d4fa1a1SMauro Carvalho Chehab 		    23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,  23 << 4,
5199d4fa1a1SMauro Carvalho Chehab 		    19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,
5209d4fa1a1SMauro Carvalho Chehab 		    19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,  19 << 4,
5219d4fa1a1SMauro Carvalho Chehab 		    16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,
5229d4fa1a1SMauro Carvalho Chehab 		    16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,  16 << 4,
5239d4fa1a1SMauro Carvalho Chehab 		    12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,
5249d4fa1a1SMauro Carvalho Chehab 		    12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,  12 << 4,
5259d4fa1a1SMauro Carvalho Chehab 		    9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,
5269d4fa1a1SMauro Carvalho Chehab 		    9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,   9 << 4,
5279d4fa1a1SMauro Carvalho Chehab 		    7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,
5289d4fa1a1SMauro Carvalho Chehab 		    7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,   7 << 4,
5299d4fa1a1SMauro Carvalho Chehab 		    4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,
5309d4fa1a1SMauro Carvalho Chehab 		    4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,   4 << 4,
5319d4fa1a1SMauro Carvalho Chehab 		    2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,
5329d4fa1a1SMauro Carvalho Chehab 		    2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4,   2 << 4
5339d4fa1a1SMauro Carvalho Chehab 	},
5349d4fa1a1SMauro Carvalho Chehab 	{
5359d4fa1a1SMauro Carvalho Chehab 		0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
5369d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
5379d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
5389d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
5399d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
5409d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
5419d4fa1a1SMauro Carvalho Chehab 		  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,
5429d4fa1a1SMauro Carvalho Chehab 		  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,
5439d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
5449d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
5459d4fa1a1SMauro Carvalho Chehab 		  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,
5469d4fa1a1SMauro Carvalho Chehab 		  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,
5479d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
5489d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
5499d4fa1a1SMauro Carvalho Chehab 		  -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4,
5509d4fa1a1SMauro Carvalho Chehab 		  -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4,
5519d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
5529d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
5539d4fa1a1SMauro Carvalho Chehab 		  -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
5549d4fa1a1SMauro Carvalho Chehab 		  -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
5559d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
5569d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
5579d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
5589d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
5599d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
5609d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
5619d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
5629d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
5639d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5649d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5659d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5669d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5679d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5689d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5699d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5709d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5719d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5729d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5739d4fa1a1SMauro Carvalho Chehab 		  -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
5749d4fa1a1SMauro Carvalho Chehab 		  -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
5759d4fa1a1SMauro Carvalho Chehab 		  -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
5769d4fa1a1SMauro Carvalho Chehab 		  -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
5779d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5789d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5799d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5809d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5819d4fa1a1SMauro Carvalho Chehab 		  -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
5829d4fa1a1SMauro Carvalho Chehab 		  -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
5839d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5849d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5859d4fa1a1SMauro Carvalho Chehab 		  -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
5869d4fa1a1SMauro Carvalho Chehab 		  -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
5879d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5889d4fa1a1SMauro Carvalho Chehab 		  -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
5899d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5909d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5919d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5929d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5939d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5949d4fa1a1SMauro Carvalho Chehab 		  -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
5959d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
5969d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
5979d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
5989d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
5999d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
6009d4fa1a1SMauro Carvalho Chehab 		  -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
6019d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
6029d4fa1a1SMauro Carvalho Chehab 		  -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
6039d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
6049d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
6059d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
6069d4fa1a1SMauro Carvalho Chehab 		  -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
6079d4fa1a1SMauro Carvalho Chehab 		  -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
6089d4fa1a1SMauro Carvalho Chehab 		  -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
6099d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
6109d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
6119d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
6129d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
6139d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
6149d4fa1a1SMauro Carvalho Chehab 		  -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
6159d4fa1a1SMauro Carvalho Chehab 		  -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
6169d4fa1a1SMauro Carvalho Chehab 		  -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
6179d4fa1a1SMauro Carvalho Chehab 		  -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
6189d4fa1a1SMauro Carvalho Chehab 		  -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
6199d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
6209d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
6219d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
6229d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
6239d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
6249d4fa1a1SMauro Carvalho Chehab 		  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,  -9 << 4,
6259d4fa1a1SMauro Carvalho Chehab 		  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,
6269d4fa1a1SMauro Carvalho Chehab 		  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,  -8 << 4,
6279d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
6289d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
6299d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
6309d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
6319d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
6329d4fa1a1SMauro Carvalho Chehab 		  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,  -6 << 4,
6339d4fa1a1SMauro Carvalho Chehab 		  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,
6349d4fa1a1SMauro Carvalho Chehab 		  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,  -5 << 4,
6359d4fa1a1SMauro Carvalho Chehab 		  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,
6369d4fa1a1SMauro Carvalho Chehab 		  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,
6379d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
6389d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
6399d4fa1a1SMauro Carvalho Chehab 		  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,
6409d4fa1a1SMauro Carvalho Chehab 		  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,  -4 << 4,
6419d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
6429d4fa1a1SMauro Carvalho Chehab 		  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,  -3 << 4,
6439d4fa1a1SMauro Carvalho Chehab 		  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,
6449d4fa1a1SMauro Carvalho Chehab 		  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,
6459d4fa1a1SMauro Carvalho Chehab 		  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,
6469d4fa1a1SMauro Carvalho Chehab 		  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,  -2 << 4,
6479d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
6489d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
6499d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
6509d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
6519d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
6529d4fa1a1SMauro Carvalho Chehab 		  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,  -1 << 4,
6539d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
6549d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
6559d4fa1a1SMauro Carvalho Chehab 		  1 << 4,   1 << 4,   1 << 4,   1 << 4,   1 << 4,   1 << 4,   1 << 4,   1 << 4,
6569d4fa1a1SMauro Carvalho Chehab 		  1 << 4,   1 << 4,   1 << 4,   1 << 4,   1 << 4,   1 << 4,   1 << 4,   1 << 4,
6579d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
6589d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
6599d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
6609d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
6619d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,
6629d4fa1a1SMauro Carvalho Chehab 		  0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4,   0 << 4
6639d4fa1a1SMauro Carvalho Chehab 	}
6649d4fa1a1SMauro Carvalho Chehab };
6659d4fa1a1SMauro Carvalho Chehab 
6669d4fa1a1SMauro Carvalho Chehab static const struct ia_css_dz_config default_dz_config = {
6679d4fa1a1SMauro Carvalho Chehab 	HRT_GDC_N,
6689d4fa1a1SMauro Carvalho Chehab 	HRT_GDC_N,
6699d4fa1a1SMauro Carvalho Chehab 	{
6709d4fa1a1SMauro Carvalho Chehab 		\
6719d4fa1a1SMauro Carvalho Chehab 		{0, 0}, \
6729d4fa1a1SMauro Carvalho Chehab 		{0, 0}, \
6739d4fa1a1SMauro Carvalho Chehab 	}
6749d4fa1a1SMauro Carvalho Chehab };
6759d4fa1a1SMauro Carvalho Chehab 
6769d4fa1a1SMauro Carvalho Chehab static const struct ia_css_vector default_motion_config = {
6779d4fa1a1SMauro Carvalho Chehab 	0,
6789d4fa1a1SMauro Carvalho Chehab 	0
6799d4fa1a1SMauro Carvalho Chehab };
6809d4fa1a1SMauro Carvalho Chehab 
6819d4fa1a1SMauro Carvalho Chehab /* ------ deprecated(bz675) : from ------ */
6829d4fa1a1SMauro Carvalho Chehab static const struct ia_css_shading_settings default_shading_settings = {
6839d4fa1a1SMauro Carvalho Chehab 	1	/* enable shading table conversion in the css
6849d4fa1a1SMauro Carvalho Chehab 		(This matches the legacy way.) */
6859d4fa1a1SMauro Carvalho Chehab };
6869d4fa1a1SMauro Carvalho Chehab 
6879d4fa1a1SMauro Carvalho Chehab /* ------ deprecated(bz675) : to ------ */
6889d4fa1a1SMauro Carvalho Chehab 
6899d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_skc_dvs_statistics {
6909d4fa1a1SMauro Carvalho Chehab 	ia_css_ptr p_data;
6919d4fa1a1SMauro Carvalho Chehab };
6929d4fa1a1SMauro Carvalho Chehab 
69341022d35SMauro Carvalho Chehab static int
6949d4fa1a1SMauro Carvalho Chehab ref_sh_css_ddr_address_map(
6959d4fa1a1SMauro Carvalho Chehab     struct sh_css_ddr_address_map *map,
6969d4fa1a1SMauro Carvalho Chehab     struct sh_css_ddr_address_map *out);
6979d4fa1a1SMauro Carvalho Chehab 
69841022d35SMauro Carvalho Chehab static int
6999d4fa1a1SMauro Carvalho Chehab write_ia_css_isp_parameter_set_info_to_ddr(
7009d4fa1a1SMauro Carvalho Chehab     struct ia_css_isp_parameter_set_info *me,
701100e8989SMauro Carvalho Chehab     ia_css_ptr *out);
7029d4fa1a1SMauro Carvalho Chehab 
70341022d35SMauro Carvalho Chehab static int
704100e8989SMauro Carvalho Chehab free_ia_css_isp_parameter_set_info(ia_css_ptr ptr);
7059d4fa1a1SMauro Carvalho Chehab 
70641022d35SMauro Carvalho Chehab static int
7079d4fa1a1SMauro Carvalho Chehab sh_css_params_write_to_ddr_internal(
7089d4fa1a1SMauro Carvalho Chehab     struct ia_css_pipe *pipe,
7099d4fa1a1SMauro Carvalho Chehab     unsigned int pipe_id,
7109d4fa1a1SMauro Carvalho Chehab     struct ia_css_isp_parameters *params,
7119d4fa1a1SMauro Carvalho Chehab     const struct ia_css_pipeline_stage *stage,
7129d4fa1a1SMauro Carvalho Chehab     struct sh_css_ddr_address_map *ddr_map,
7139d4fa1a1SMauro Carvalho Chehab     struct sh_css_ddr_address_map_size *ddr_map_size);
7149d4fa1a1SMauro Carvalho Chehab 
71541022d35SMauro Carvalho Chehab static int
7169d4fa1a1SMauro Carvalho Chehab sh_css_create_isp_params(struct ia_css_stream *stream,
7179d4fa1a1SMauro Carvalho Chehab 			 struct ia_css_isp_parameters **isp_params_out);
7189d4fa1a1SMauro Carvalho Chehab 
7199d4fa1a1SMauro Carvalho Chehab static bool
7209d4fa1a1SMauro Carvalho Chehab sh_css_init_isp_params_from_global(struct ia_css_stream *stream,
7219d4fa1a1SMauro Carvalho Chehab 				   struct ia_css_isp_parameters *params,
7229d4fa1a1SMauro Carvalho Chehab 				   bool use_default_config,
7239d4fa1a1SMauro Carvalho Chehab 				   struct ia_css_pipe *pipe_in);
7249d4fa1a1SMauro Carvalho Chehab 
72541022d35SMauro Carvalho Chehab static int
7269d4fa1a1SMauro Carvalho Chehab sh_css_init_isp_params_from_config(struct ia_css_pipe *pipe,
7279d4fa1a1SMauro Carvalho Chehab 				   struct ia_css_isp_parameters *params,
7289d4fa1a1SMauro Carvalho Chehab 				   const struct ia_css_isp_config *config,
7299d4fa1a1SMauro Carvalho Chehab 				   struct ia_css_pipe *pipe_in);
7309d4fa1a1SMauro Carvalho Chehab 
73141022d35SMauro Carvalho Chehab static int
7329d4fa1a1SMauro Carvalho Chehab sh_css_set_global_isp_config_on_pipe(
7339d4fa1a1SMauro Carvalho Chehab     struct ia_css_pipe *curr_pipe,
7349d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_config *config,
7359d4fa1a1SMauro Carvalho Chehab     struct ia_css_pipe *pipe);
7369d4fa1a1SMauro Carvalho Chehab 
73741022d35SMauro Carvalho Chehab static int
7389d4fa1a1SMauro Carvalho Chehab sh_css_set_per_frame_isp_config_on_pipe(
7399d4fa1a1SMauro Carvalho Chehab     struct ia_css_stream *stream,
7409d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_config *config,
7419d4fa1a1SMauro Carvalho Chehab     struct ia_css_pipe *pipe);
7429d4fa1a1SMauro Carvalho Chehab 
74341022d35SMauro Carvalho Chehab static int
7449d4fa1a1SMauro Carvalho Chehab sh_css_update_uds_and_crop_info_based_on_zoom_region(
7459d4fa1a1SMauro Carvalho Chehab     const struct ia_css_binary_info *info,
7469d4fa1a1SMauro Carvalho Chehab     const struct ia_css_frame_info *in_frame_info,
7479d4fa1a1SMauro Carvalho Chehab     const struct ia_css_frame_info *out_frame_info,
7489d4fa1a1SMauro Carvalho Chehab     const struct ia_css_resolution *dvs_env,
7499d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dz_config *zoom,
7509d4fa1a1SMauro Carvalho Chehab     const struct ia_css_vector *motion_vector,
7519d4fa1a1SMauro Carvalho Chehab     struct sh_css_uds_info *uds,		/* out */
7529d4fa1a1SMauro Carvalho Chehab     struct sh_css_crop_pos *sp_out_crop_pos,	/* out */
7539d4fa1a1SMauro Carvalho Chehab     struct ia_css_resolution pipe_in_res,
7549d4fa1a1SMauro Carvalho Chehab     bool enable_zoom);
7559d4fa1a1SMauro Carvalho Chehab 
756100e8989SMauro Carvalho Chehab ia_css_ptr
sh_css_params_ddr_address_map(void)7579d4fa1a1SMauro Carvalho Chehab sh_css_params_ddr_address_map(void)
7589d4fa1a1SMauro Carvalho Chehab {
7599d4fa1a1SMauro Carvalho Chehab 	return sp_ddr_ptrs;
7609d4fa1a1SMauro Carvalho Chehab }
7619d4fa1a1SMauro Carvalho Chehab 
7629d4fa1a1SMauro Carvalho Chehab /* ****************************************************
7639d4fa1a1SMauro Carvalho Chehab  * Each coefficient is stored as 7bits to fit 2 of them into one
7649d4fa1a1SMauro Carvalho Chehab  * ISP vector element, so we will store 4 coefficents on every
7659d4fa1a1SMauro Carvalho Chehab  * memory word (32bits)
7669d4fa1a1SMauro Carvalho Chehab  *
7679d4fa1a1SMauro Carvalho Chehab  * 0: Coefficient 0 used bits
7689d4fa1a1SMauro Carvalho Chehab  * 1: Coefficient 1 used bits
7699d4fa1a1SMauro Carvalho Chehab  * 2: Coefficient 2 used bits
7709d4fa1a1SMauro Carvalho Chehab  * 3: Coefficient 3 used bits
7719d4fa1a1SMauro Carvalho Chehab  * x: not used
7729d4fa1a1SMauro Carvalho Chehab  *
7739d4fa1a1SMauro Carvalho Chehab  * xx33333332222222 | xx11111110000000
7749d4fa1a1SMauro Carvalho Chehab  *
7759d4fa1a1SMauro Carvalho Chehab  * ***************************************************
7769d4fa1a1SMauro Carvalho Chehab  */
7779d4fa1a1SMauro Carvalho Chehab static struct ia_css_host_data *
convert_allocate_fpntbl(struct ia_css_isp_parameters * params)7789d4fa1a1SMauro Carvalho Chehab convert_allocate_fpntbl(struct ia_css_isp_parameters *params)
7799d4fa1a1SMauro Carvalho Chehab {
7809d4fa1a1SMauro Carvalho Chehab 	unsigned int i, j;
7819d4fa1a1SMauro Carvalho Chehab 	short *data_ptr;
7829d4fa1a1SMauro Carvalho Chehab 	struct ia_css_host_data *me;
7839d4fa1a1SMauro Carvalho Chehab 	unsigned int isp_format_data_size;
7849d4fa1a1SMauro Carvalho Chehab 	u32 *isp_format_data_ptr;
7859d4fa1a1SMauro Carvalho Chehab 
7869d4fa1a1SMauro Carvalho Chehab 	assert(params);
7879d4fa1a1SMauro Carvalho Chehab 
7889d4fa1a1SMauro Carvalho Chehab 	data_ptr = params->fpn_config.data;
7899d4fa1a1SMauro Carvalho Chehab 	isp_format_data_size = params->fpn_config.height * params->fpn_config.width *
7909d4fa1a1SMauro Carvalho Chehab 			       sizeof(uint32_t);
7919d4fa1a1SMauro Carvalho Chehab 
7929d4fa1a1SMauro Carvalho Chehab 	me = ia_css_host_data_allocate(isp_format_data_size);
7939d4fa1a1SMauro Carvalho Chehab 
7949d4fa1a1SMauro Carvalho Chehab 	if (!me)
7959d4fa1a1SMauro Carvalho Chehab 		return NULL;
7969d4fa1a1SMauro Carvalho Chehab 
7979d4fa1a1SMauro Carvalho Chehab 	isp_format_data_ptr = (uint32_t *)me->address;
7989d4fa1a1SMauro Carvalho Chehab 
7999d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < params->fpn_config.height; i++) {
8009d4fa1a1SMauro Carvalho Chehab 		for (j = 0;
8019d4fa1a1SMauro Carvalho Chehab 		     j < params->fpn_config.width;
8029d4fa1a1SMauro Carvalho Chehab 		     j += 4, data_ptr += 4, isp_format_data_ptr++) {
8039d4fa1a1SMauro Carvalho Chehab 			int data = data_ptr[0] << 0 |
8049d4fa1a1SMauro Carvalho Chehab 				   data_ptr[1] << 7 |
8059d4fa1a1SMauro Carvalho Chehab 				   data_ptr[2] << 16 |
8069d4fa1a1SMauro Carvalho Chehab 				   data_ptr[3] << 23;
8079d4fa1a1SMauro Carvalho Chehab 			*isp_format_data_ptr = data;
8089d4fa1a1SMauro Carvalho Chehab 		}
8099d4fa1a1SMauro Carvalho Chehab 	}
8109d4fa1a1SMauro Carvalho Chehab 	return me;
8119d4fa1a1SMauro Carvalho Chehab }
8129d4fa1a1SMauro Carvalho Chehab 
81341022d35SMauro Carvalho Chehab static int
store_fpntbl(struct ia_css_isp_parameters * params,ia_css_ptr ptr)814c27479d7SDeepak R Varma store_fpntbl(struct ia_css_isp_parameters *params, ia_css_ptr ptr)
815c27479d7SDeepak R Varma {
8169d4fa1a1SMauro Carvalho Chehab 	struct ia_css_host_data *isp_data;
8179d4fa1a1SMauro Carvalho Chehab 
8189d4fa1a1SMauro Carvalho Chehab 	assert(params);
8199d4fa1a1SMauro Carvalho Chehab 	assert(ptr != mmgr_NULL);
8209d4fa1a1SMauro Carvalho Chehab 
8219d4fa1a1SMauro Carvalho Chehab 	isp_data = convert_allocate_fpntbl(params);
822c27479d7SDeepak R Varma 	if (!isp_data) {
82341022d35SMauro Carvalho Chehab 		IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
82441022d35SMauro Carvalho Chehab 		return -ENOMEM;
8259d4fa1a1SMauro Carvalho Chehab 	}
8269d4fa1a1SMauro Carvalho Chehab 	ia_css_params_store_ia_css_host_data(ptr, isp_data);
8279d4fa1a1SMauro Carvalho Chehab 
8289d4fa1a1SMauro Carvalho Chehab 	ia_css_host_data_free(isp_data);
82941022d35SMauro Carvalho Chehab 	return 0;
8309d4fa1a1SMauro Carvalho Chehab }
8319d4fa1a1SMauro Carvalho Chehab 
8329d4fa1a1SMauro Carvalho Chehab static void
convert_raw_to_fpn(struct ia_css_isp_parameters * params)8339d4fa1a1SMauro Carvalho Chehab convert_raw_to_fpn(struct ia_css_isp_parameters *params)
8349d4fa1a1SMauro Carvalho Chehab {
8359d4fa1a1SMauro Carvalho Chehab 	int maxval = 0;
8369d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
8379d4fa1a1SMauro Carvalho Chehab 
8389d4fa1a1SMauro Carvalho Chehab 	assert(params);
8399d4fa1a1SMauro Carvalho Chehab 
8409d4fa1a1SMauro Carvalho Chehab 	/* Find the maximum value in the table */
8419d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < params->fpn_config.height * params->fpn_config.width; i++) {
8429d4fa1a1SMauro Carvalho Chehab 		int val = params->fpn_config.data[i];
8439d4fa1a1SMauro Carvalho Chehab 		/* Make sure FPN value can be represented in 13-bit unsigned
8449d4fa1a1SMauro Carvalho Chehab 		 * number (ISP precision - 1), but note that actual input range
8459d4fa1a1SMauro Carvalho Chehab 		 * depends on precision of input frame data.
8469d4fa1a1SMauro Carvalho Chehab 		 */
8479d4fa1a1SMauro Carvalho Chehab 		if (val < 0) {
8489d4fa1a1SMauro Carvalho Chehab 			/* Checkpatch patch */
8499d4fa1a1SMauro Carvalho Chehab 			val = 0;
8509d4fa1a1SMauro Carvalho Chehab 		} else if (val >= (1 << 13)) {
8519d4fa1a1SMauro Carvalho Chehab 			/* Checkpatch patch */
8529d4fa1a1SMauro Carvalho Chehab 			/* MW: BUG, is "13" a system or application property */
8539d4fa1a1SMauro Carvalho Chehab 			val = (1 << 13) - 1;
8549d4fa1a1SMauro Carvalho Chehab 		}
8559d4fa1a1SMauro Carvalho Chehab 		maxval = max(maxval, val);
8569d4fa1a1SMauro Carvalho Chehab 	}
8579d4fa1a1SMauro Carvalho Chehab 	/* Find the lowest shift value to remap the values in the range
8589d4fa1a1SMauro Carvalho Chehab 	 * 0..maxval to 0..2^shiftval*63.
8599d4fa1a1SMauro Carvalho Chehab 	 */
8609d4fa1a1SMauro Carvalho Chehab 	params->fpn_config.shift = 0;
8619d4fa1a1SMauro Carvalho Chehab 	while (maxval > 63) {
8629d4fa1a1SMauro Carvalho Chehab 		/* MW: BUG, is "63" a system or application property */
8639d4fa1a1SMauro Carvalho Chehab 		maxval >>= 1;
8649d4fa1a1SMauro Carvalho Chehab 		params->fpn_config.shift++;
8659d4fa1a1SMauro Carvalho Chehab 	}
8669d4fa1a1SMauro Carvalho Chehab 	/* Adjust the values in the table for the shift value */
8679d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < params->fpn_config.height * params->fpn_config.width; i++)
8689d4fa1a1SMauro Carvalho Chehab 		((unsigned short *)params->fpn_config.data)[i] >>= params->fpn_config.shift;
8699d4fa1a1SMauro Carvalho Chehab }
8709d4fa1a1SMauro Carvalho Chehab 
8719d4fa1a1SMauro Carvalho Chehab static void
ia_css_process_kernel(struct ia_css_stream * stream,struct ia_css_isp_parameters * params,void (* process)(unsigned int pipe_id,const struct ia_css_pipeline_stage * stage,struct ia_css_isp_parameters * params))8729d4fa1a1SMauro Carvalho Chehab ia_css_process_kernel(struct ia_css_stream *stream,
8739d4fa1a1SMauro Carvalho Chehab 		      struct ia_css_isp_parameters *params,
8749d4fa1a1SMauro Carvalho Chehab 		      void (*process)(unsigned int pipe_id,
8759d4fa1a1SMauro Carvalho Chehab 				      const struct ia_css_pipeline_stage *stage,
8769d4fa1a1SMauro Carvalho Chehab 				      struct ia_css_isp_parameters *params))
8779d4fa1a1SMauro Carvalho Chehab {
8789d4fa1a1SMauro Carvalho Chehab 	int i;
8799d4fa1a1SMauro Carvalho Chehab 
8809d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < stream->num_pipes; i++) {
8819d4fa1a1SMauro Carvalho Chehab 		struct ia_css_pipe *pipe = stream->pipes[i];
8829d4fa1a1SMauro Carvalho Chehab 		struct ia_css_pipeline *pipeline = ia_css_pipe_get_pipeline(pipe);
8839d4fa1a1SMauro Carvalho Chehab 		struct ia_css_pipeline_stage *stage;
8849d4fa1a1SMauro Carvalho Chehab 
8859d4fa1a1SMauro Carvalho Chehab 		/* update the other buffers to the pipe specific copies */
8869d4fa1a1SMauro Carvalho Chehab 		for (stage = pipeline->stages; stage; stage = stage->next) {
8879d4fa1a1SMauro Carvalho Chehab 			if (!stage || !stage->binary) continue;
8889d4fa1a1SMauro Carvalho Chehab 			process(pipeline->pipe_id, stage, params);
8899d4fa1a1SMauro Carvalho Chehab 		}
8909d4fa1a1SMauro Carvalho Chehab 	}
8919d4fa1a1SMauro Carvalho Chehab }
8929d4fa1a1SMauro Carvalho Chehab 
89341022d35SMauro Carvalho Chehab static int
sh_css_select_dp_10bpp_config(const struct ia_css_pipe * pipe,bool * is_dp_10bpp)8949d4fa1a1SMauro Carvalho Chehab sh_css_select_dp_10bpp_config(const struct ia_css_pipe *pipe,
895c27479d7SDeepak R Varma 			      bool *is_dp_10bpp)
896c27479d7SDeepak R Varma {
89741022d35SMauro Carvalho Chehab 	int err = 0;
8989d4fa1a1SMauro Carvalho Chehab 	/* Currently we check if 10bpp DPC configuration is required based
8999d4fa1a1SMauro Carvalho Chehab 	 * on the use case,i.e. if BDS and DPC is both enabled. The more cleaner
9009d4fa1a1SMauro Carvalho Chehab 	 * design choice would be to expose the type of DPC (either 10bpp or 13bpp)
9019d4fa1a1SMauro Carvalho Chehab 	 * using the binary info, but the current control flow does not allow this
9029d4fa1a1SMauro Carvalho Chehab 	 * implementation. (This is because the configuration is set before a
9039d4fa1a1SMauro Carvalho Chehab 	 * binary is selected, and the binary info is not available)
9049d4fa1a1SMauro Carvalho Chehab 	 */
905c27479d7SDeepak R Varma 	if ((!pipe) || (!is_dp_10bpp)) {
90641022d35SMauro Carvalho Chehab 		IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
90741022d35SMauro Carvalho Chehab 		err = -EINVAL;
908c27479d7SDeepak R Varma 	} else {
9099d4fa1a1SMauro Carvalho Chehab 		*is_dp_10bpp = false;
9109d4fa1a1SMauro Carvalho Chehab 
9119d4fa1a1SMauro Carvalho Chehab 		/* check if DPC is enabled from the host */
9129d4fa1a1SMauro Carvalho Chehab 		if (pipe->config.enable_dpc) {
9139d4fa1a1SMauro Carvalho Chehab 			/*check if BDS is enabled*/
9149d4fa1a1SMauro Carvalho Chehab 			unsigned int required_bds_factor = SH_CSS_BDS_FACTOR_1_00;
9159d4fa1a1SMauro Carvalho Chehab 
9169d4fa1a1SMauro Carvalho Chehab 			if ((pipe->config.bayer_ds_out_res.width != 0) &&
9179d4fa1a1SMauro Carvalho Chehab 			    (pipe->config.bayer_ds_out_res.height != 0)) {
91841022d35SMauro Carvalho Chehab 				if (0 == binarydesc_calculate_bds_factor(
9199d4fa1a1SMauro Carvalho Chehab 					pipe->config.input_effective_res,
9209d4fa1a1SMauro Carvalho Chehab 					pipe->config.bayer_ds_out_res,
9219d4fa1a1SMauro Carvalho Chehab 					&required_bds_factor)) {
9229d4fa1a1SMauro Carvalho Chehab 					if (required_bds_factor != SH_CSS_BDS_FACTOR_1_00) {
9239d4fa1a1SMauro Carvalho Chehab 						/*we use 10bpp BDS configuration*/
9249d4fa1a1SMauro Carvalho Chehab 						*is_dp_10bpp = true;
9259d4fa1a1SMauro Carvalho Chehab 					}
9269d4fa1a1SMauro Carvalho Chehab 				}
9279d4fa1a1SMauro Carvalho Chehab 			}
9289d4fa1a1SMauro Carvalho Chehab 		}
9299d4fa1a1SMauro Carvalho Chehab 	}
9309d4fa1a1SMauro Carvalho Chehab 
9319d4fa1a1SMauro Carvalho Chehab 	return err;
9329d4fa1a1SMauro Carvalho Chehab }
9339d4fa1a1SMauro Carvalho Chehab 
93441022d35SMauro Carvalho Chehab int
sh_css_set_black_frame(struct ia_css_stream * stream,const struct ia_css_frame * raw_black_frame)9359d4fa1a1SMauro Carvalho Chehab sh_css_set_black_frame(struct ia_css_stream *stream,
936c27479d7SDeepak R Varma 		       const struct ia_css_frame *raw_black_frame)
937c27479d7SDeepak R Varma {
9389d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params;
9399d4fa1a1SMauro Carvalho Chehab 	/* this function desperately needs to be moved to the ISP or SP such
9409d4fa1a1SMauro Carvalho Chehab 	 * that it can use the DMA.
9419d4fa1a1SMauro Carvalho Chehab 	 */
9429d4fa1a1SMauro Carvalho Chehab 	unsigned int height, width, y, x, k, data;
943100e8989SMauro Carvalho Chehab 	ia_css_ptr ptr;
9449d4fa1a1SMauro Carvalho Chehab 
9459d4fa1a1SMauro Carvalho Chehab 	assert(stream);
9469d4fa1a1SMauro Carvalho Chehab 	assert(raw_black_frame);
9479d4fa1a1SMauro Carvalho Chehab 
9489d4fa1a1SMauro Carvalho Chehab 	params = stream->isp_params_configs;
9499a29f5fcSHans de Goede 	height = raw_black_frame->frame_info.res.height;
9509a29f5fcSHans de Goede 	width = raw_black_frame->frame_info.padded_width;
9519d4fa1a1SMauro Carvalho Chehab 
9529d4fa1a1SMauro Carvalho Chehab 	ptr = raw_black_frame->data
9539d4fa1a1SMauro Carvalho Chehab 	+ raw_black_frame->planes.raw.offset;
9549d4fa1a1SMauro Carvalho Chehab 
9559d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("black_frame=%p", raw_black_frame);
9569d4fa1a1SMauro Carvalho Chehab 
9579d4fa1a1SMauro Carvalho Chehab 	if (params->fpn_config.data &&
958c27479d7SDeepak R Varma 	    (params->fpn_config.width != width || params->fpn_config.height != height)) {
9599955d906SMauro Carvalho Chehab 		kvfree(params->fpn_config.data);
9609d4fa1a1SMauro Carvalho Chehab 		params->fpn_config.data = NULL;
9619d4fa1a1SMauro Carvalho Chehab 	}
962c27479d7SDeepak R Varma 	if (!params->fpn_config.data) {
9633ad29019SDan Carpenter 		params->fpn_config.data = kvmalloc(array3_size(height, width, sizeof(short)),
9643ad29019SDan Carpenter 						   GFP_KERNEL);
9659d4fa1a1SMauro Carvalho Chehab 		if (!params->fpn_config.data) {
9669d4fa1a1SMauro Carvalho Chehab 			IA_CSS_ERROR("out of memory");
96741022d35SMauro Carvalho Chehab 			IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
96841022d35SMauro Carvalho Chehab 			return -ENOMEM;
9699d4fa1a1SMauro Carvalho Chehab 		}
9709d4fa1a1SMauro Carvalho Chehab 		params->fpn_config.width = width;
9719d4fa1a1SMauro Carvalho Chehab 		params->fpn_config.height = height;
9729d4fa1a1SMauro Carvalho Chehab 		params->fpn_config.shift = 0;
9739d4fa1a1SMauro Carvalho Chehab 	}
9749d4fa1a1SMauro Carvalho Chehab 
9759d4fa1a1SMauro Carvalho Chehab 	/* store raw to fpntbl */
976c27479d7SDeepak R Varma 	for (y = 0; y < height; y++) {
9779d4fa1a1SMauro Carvalho Chehab 		for (x = 0; x < width; x += (ISP_VEC_NELEMS * 2)) {
9789d4fa1a1SMauro Carvalho Chehab 			int ofs = y * width + x;
9799d4fa1a1SMauro Carvalho Chehab 
9809d4fa1a1SMauro Carvalho Chehab 			for (k = 0; k < ISP_VEC_NELEMS; k += 2) {
9815472b4dbSMauro Carvalho Chehab 				hmm_load(ptr, (void *)(&data), sizeof(int));
9829d4fa1a1SMauro Carvalho Chehab 				params->fpn_config.data[ofs + 2 * k] =
9839d4fa1a1SMauro Carvalho Chehab 				    (short)(data & 0xFFFF);
9849d4fa1a1SMauro Carvalho Chehab 				params->fpn_config.data[ofs + 2 * k + 2] =
9859d4fa1a1SMauro Carvalho Chehab 				    (short)((data >> 16) & 0xFFFF);
9869d4fa1a1SMauro Carvalho Chehab 				ptr += sizeof(int);	/* byte system address */
9879d4fa1a1SMauro Carvalho Chehab 			}
9889d4fa1a1SMauro Carvalho Chehab 			for (k = 0; k < ISP_VEC_NELEMS; k += 2) {
9895472b4dbSMauro Carvalho Chehab 				hmm_load(ptr, (void *)(&data), sizeof(int));
9909d4fa1a1SMauro Carvalho Chehab 				params->fpn_config.data[ofs + 2 * k + 1] =
9919d4fa1a1SMauro Carvalho Chehab 				    (short)(data & 0xFFFF);
9929d4fa1a1SMauro Carvalho Chehab 				params->fpn_config.data[ofs + 2 * k + 3] =
9939d4fa1a1SMauro Carvalho Chehab 				    (short)((data >> 16) & 0xFFFF);
9949d4fa1a1SMauro Carvalho Chehab 				ptr += sizeof(int);	/* byte system address */
9959d4fa1a1SMauro Carvalho Chehab 			}
9969d4fa1a1SMauro Carvalho Chehab 		}
9979d4fa1a1SMauro Carvalho Chehab 	}
9989d4fa1a1SMauro Carvalho Chehab 
9999d4fa1a1SMauro Carvalho Chehab 	/* raw -> fpn */
10009d4fa1a1SMauro Carvalho Chehab 	convert_raw_to_fpn(params);
10019d4fa1a1SMauro Carvalho Chehab 
10029d4fa1a1SMauro Carvalho Chehab 	/* overwrite isp parameter */
10039d4fa1a1SMauro Carvalho Chehab 	ia_css_process_kernel(stream, params, ia_css_kernel_process_param[IA_CSS_FPN_ID]);
10049d4fa1a1SMauro Carvalho Chehab 
100541022d35SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(0);
10069d4fa1a1SMauro Carvalho Chehab 
100741022d35SMauro Carvalho Chehab 	return 0;
10089d4fa1a1SMauro Carvalho Chehab }
10099d4fa1a1SMauro Carvalho Chehab 
10109d4fa1a1SMauro Carvalho Chehab bool
sh_css_params_set_binning_factor(struct ia_css_stream * stream,unsigned int binning_fact)10119d4fa1a1SMauro Carvalho Chehab sh_css_params_set_binning_factor(struct ia_css_stream *stream,
10129d4fa1a1SMauro Carvalho Chehab 				 unsigned int binning_fact)
10139d4fa1a1SMauro Carvalho Chehab {
10149d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params;
10159d4fa1a1SMauro Carvalho Chehab 
10169d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
10179d4fa1a1SMauro Carvalho Chehab 	assert(stream);
10189d4fa1a1SMauro Carvalho Chehab 
10199d4fa1a1SMauro Carvalho Chehab 	params = stream->isp_params_configs;
10209d4fa1a1SMauro Carvalho Chehab 
10219d4fa1a1SMauro Carvalho Chehab 	if (params->sensor_binning != binning_fact) {
10229d4fa1a1SMauro Carvalho Chehab 		params->sensor_binning = binning_fact;
10239d4fa1a1SMauro Carvalho Chehab 		params->sc_table_changed = true;
10249d4fa1a1SMauro Carvalho Chehab 	}
10259d4fa1a1SMauro Carvalho Chehab 
10269d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
10279d4fa1a1SMauro Carvalho Chehab 
10289d4fa1a1SMauro Carvalho Chehab 	return params->sc_table_changed;
10299d4fa1a1SMauro Carvalho Chehab }
10309d4fa1a1SMauro Carvalho Chehab 
10319d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_shading_table(struct ia_css_stream * stream,struct ia_css_isp_parameters * params,const struct ia_css_shading_table * table)10329d4fa1a1SMauro Carvalho Chehab sh_css_set_shading_table(struct ia_css_stream *stream,
10339d4fa1a1SMauro Carvalho Chehab 			 struct ia_css_isp_parameters *params,
10349d4fa1a1SMauro Carvalho Chehab 			 const struct ia_css_shading_table *table)
10359d4fa1a1SMauro Carvalho Chehab {
10369d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("");
10379d4fa1a1SMauro Carvalho Chehab 	if (!table)
10389d4fa1a1SMauro Carvalho Chehab 		return;
10399d4fa1a1SMauro Carvalho Chehab 	assert(stream);
10409d4fa1a1SMauro Carvalho Chehab 
10419d4fa1a1SMauro Carvalho Chehab 	if (!table->enable)
10429d4fa1a1SMauro Carvalho Chehab 		table = NULL;
10439d4fa1a1SMauro Carvalho Chehab 
104435009261SMauro Carvalho Chehab 	if (table != params->sc_table) {
10459d4fa1a1SMauro Carvalho Chehab 		params->sc_table = table;
10469d4fa1a1SMauro Carvalho Chehab 		params->sc_table_changed = true;
10479d4fa1a1SMauro Carvalho Chehab 		/* Not very clean, this goes to sh_css.c to invalidate the
10489d4fa1a1SMauro Carvalho Chehab 		 * shading table for all pipes. Should replaced by a loop
10499d4fa1a1SMauro Carvalho Chehab 		 * and a pipe-specific call.
10509d4fa1a1SMauro Carvalho Chehab 		 */
10519d4fa1a1SMauro Carvalho Chehab 		if (!params->output_frame)
10529d4fa1a1SMauro Carvalho Chehab 			sh_css_invalidate_shading_tables(stream);
10539d4fa1a1SMauro Carvalho Chehab 	}
10549d4fa1a1SMauro Carvalho Chehab 
10559d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
10569d4fa1a1SMauro Carvalho Chehab }
10579d4fa1a1SMauro Carvalho Chehab 
10589d4fa1a1SMauro Carvalho Chehab void
ia_css_params_store_ia_css_host_data(ia_css_ptr ddr_addr,struct ia_css_host_data * data)10599d4fa1a1SMauro Carvalho Chehab ia_css_params_store_ia_css_host_data(
1060100e8989SMauro Carvalho Chehab     ia_css_ptr ddr_addr,
10619d4fa1a1SMauro Carvalho Chehab     struct ia_css_host_data *data)
10629d4fa1a1SMauro Carvalho Chehab {
10639d4fa1a1SMauro Carvalho Chehab 	assert(data);
10649d4fa1a1SMauro Carvalho Chehab 	assert(data->address);
10659d4fa1a1SMauro Carvalho Chehab 	assert(ddr_addr != mmgr_NULL);
10669d4fa1a1SMauro Carvalho Chehab 
10679d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("");
10689d4fa1a1SMauro Carvalho Chehab 
10695472b4dbSMauro Carvalho Chehab 	hmm_store(ddr_addr,
10709d4fa1a1SMauro Carvalho Chehab 		   (void *)(data->address),
10719d4fa1a1SMauro Carvalho Chehab 		   (size_t)data->size);
10729d4fa1a1SMauro Carvalho Chehab 
10739d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
10749d4fa1a1SMauro Carvalho Chehab }
10759d4fa1a1SMauro Carvalho Chehab 
10769d4fa1a1SMauro Carvalho Chehab struct ia_css_host_data *
ia_css_params_alloc_convert_sctbl(const struct ia_css_pipeline_stage * stage,const struct ia_css_shading_table * shading_table)10779d4fa1a1SMauro Carvalho Chehab ia_css_params_alloc_convert_sctbl(
10789d4fa1a1SMauro Carvalho Chehab     const struct ia_css_pipeline_stage *stage,
10799d4fa1a1SMauro Carvalho Chehab     const struct ia_css_shading_table *shading_table)
10809d4fa1a1SMauro Carvalho Chehab {
10819d4fa1a1SMauro Carvalho Chehab 	const struct ia_css_binary *binary = stage->binary;
10829d4fa1a1SMauro Carvalho Chehab 	struct ia_css_host_data    *sctbl;
1083852a53a0SMauro Carvalho Chehab 	unsigned int i, j, aligned_width;
10849d4fa1a1SMauro Carvalho Chehab 	unsigned int sctbl_size;
10859d4fa1a1SMauro Carvalho Chehab 	short int    *ptr;
10869d4fa1a1SMauro Carvalho Chehab 
10879d4fa1a1SMauro Carvalho Chehab 	assert(binary);
10889d4fa1a1SMauro Carvalho Chehab 	assert(shading_table);
10899d4fa1a1SMauro Carvalho Chehab 
10909d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("");
10919d4fa1a1SMauro Carvalho Chehab 
10929d4fa1a1SMauro Carvalho Chehab 	if (!shading_table) {
10939d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE_PRIVATE("void");
10949d4fa1a1SMauro Carvalho Chehab 		return NULL;
10959d4fa1a1SMauro Carvalho Chehab 	}
10969d4fa1a1SMauro Carvalho Chehab 
10979d4fa1a1SMauro Carvalho Chehab 	aligned_width = binary->sctbl_aligned_width_per_color;
10989d4fa1a1SMauro Carvalho Chehab 	sctbl_size = shading_table->height * IA_CSS_SC_NUM_COLORS * aligned_width *
10999d4fa1a1SMauro Carvalho Chehab 		     sizeof(short);
11009d4fa1a1SMauro Carvalho Chehab 
11019d4fa1a1SMauro Carvalho Chehab 	sctbl = ia_css_host_data_allocate((size_t)sctbl_size);
11029d4fa1a1SMauro Carvalho Chehab 
11039d4fa1a1SMauro Carvalho Chehab 	if (!sctbl)
11049d4fa1a1SMauro Carvalho Chehab 		return NULL;
11059d4fa1a1SMauro Carvalho Chehab 	ptr = (short int *)sctbl->address;
11069d4fa1a1SMauro Carvalho Chehab 	memset(ptr,
11079d4fa1a1SMauro Carvalho Chehab 	       0,
11089d4fa1a1SMauro Carvalho Chehab 	       sctbl_size);
11099d4fa1a1SMauro Carvalho Chehab 
11109d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < shading_table->height; i++) {
11119d4fa1a1SMauro Carvalho Chehab 		for (j = 0; j < IA_CSS_SC_NUM_COLORS; j++) {
11129d4fa1a1SMauro Carvalho Chehab 			memcpy(ptr,
11139d4fa1a1SMauro Carvalho Chehab 			       &shading_table->data[j]
11149d4fa1a1SMauro Carvalho Chehab 			       [i * shading_table->width],
11159d4fa1a1SMauro Carvalho Chehab 			       shading_table->width * sizeof(short));
11169d4fa1a1SMauro Carvalho Chehab 			ptr += aligned_width;
11179d4fa1a1SMauro Carvalho Chehab 		}
11189d4fa1a1SMauro Carvalho Chehab 	}
11199d4fa1a1SMauro Carvalho Chehab 
11209d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
11219d4fa1a1SMauro Carvalho Chehab 	return sctbl;
11229d4fa1a1SMauro Carvalho Chehab }
11239d4fa1a1SMauro Carvalho Chehab 
ia_css_params_store_sctbl(const struct ia_css_pipeline_stage * stage,ia_css_ptr sc_tbl,const struct ia_css_shading_table * sc_config)112441022d35SMauro Carvalho Chehab int ia_css_params_store_sctbl(
11259d4fa1a1SMauro Carvalho Chehab     const struct ia_css_pipeline_stage *stage,
1126100e8989SMauro Carvalho Chehab     ia_css_ptr sc_tbl,
11279d4fa1a1SMauro Carvalho Chehab     const struct ia_css_shading_table  *sc_config)
11289d4fa1a1SMauro Carvalho Chehab {
11299d4fa1a1SMauro Carvalho Chehab 	struct ia_css_host_data *isp_sc_tbl;
11309d4fa1a1SMauro Carvalho Chehab 
11319d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("");
11329d4fa1a1SMauro Carvalho Chehab 
11339d4fa1a1SMauro Carvalho Chehab 	if (!sc_config) {
11349d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE_PRIVATE("void");
113541022d35SMauro Carvalho Chehab 		return 0;
11369d4fa1a1SMauro Carvalho Chehab 	}
11379d4fa1a1SMauro Carvalho Chehab 
11389d4fa1a1SMauro Carvalho Chehab 	isp_sc_tbl = ia_css_params_alloc_convert_sctbl(stage, sc_config);
11399d4fa1a1SMauro Carvalho Chehab 	if (!isp_sc_tbl) {
114041022d35SMauro Carvalho Chehab 		IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
114141022d35SMauro Carvalho Chehab 		return -ENOMEM;
11429d4fa1a1SMauro Carvalho Chehab 	}
11439d4fa1a1SMauro Carvalho Chehab 	/* store the shading table to ddr */
11449d4fa1a1SMauro Carvalho Chehab 	ia_css_params_store_ia_css_host_data(sc_tbl, isp_sc_tbl);
11459d4fa1a1SMauro Carvalho Chehab 	ia_css_host_data_free(isp_sc_tbl);
11469d4fa1a1SMauro Carvalho Chehab 
11479d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
11489d4fa1a1SMauro Carvalho Chehab 
114941022d35SMauro Carvalho Chehab 	return 0;
11509d4fa1a1SMauro Carvalho Chehab }
11519d4fa1a1SMauro Carvalho Chehab 
11529d4fa1a1SMauro Carvalho Chehab static void
sh_css_enable_pipeline(const struct ia_css_binary * binary)11539d4fa1a1SMauro Carvalho Chehab sh_css_enable_pipeline(const struct ia_css_binary *binary)
11549d4fa1a1SMauro Carvalho Chehab {
11559d4fa1a1SMauro Carvalho Chehab 	if (!binary)
11569d4fa1a1SMauro Carvalho Chehab 		return;
11579d4fa1a1SMauro Carvalho Chehab 
11589d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("");
11599d4fa1a1SMauro Carvalho Chehab 
11609d4fa1a1SMauro Carvalho Chehab 	ia_css_isp_param_enable_pipeline(&binary->mem_params);
11619d4fa1a1SMauro Carvalho Chehab 
11629d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
11639d4fa1a1SMauro Carvalho Chehab }
11649d4fa1a1SMauro Carvalho Chehab 
116541022d35SMauro Carvalho Chehab static int
ia_css_process_zoom_and_motion(struct ia_css_isp_parameters * params,const struct ia_css_pipeline_stage * first_stage)11669d4fa1a1SMauro Carvalho Chehab ia_css_process_zoom_and_motion(
11679d4fa1a1SMauro Carvalho Chehab     struct ia_css_isp_parameters *params,
1168c27479d7SDeepak R Varma     const struct ia_css_pipeline_stage *first_stage)
1169c27479d7SDeepak R Varma {
11709d4fa1a1SMauro Carvalho Chehab 	/* first_stage can be  NULL */
11719d4fa1a1SMauro Carvalho Chehab 	const struct ia_css_pipeline_stage *stage;
117241022d35SMauro Carvalho Chehab 	int err = 0;
11739d4fa1a1SMauro Carvalho Chehab 	struct ia_css_resolution pipe_in_res;
11749d4fa1a1SMauro Carvalho Chehab 
11759d4fa1a1SMauro Carvalho Chehab 	pipe_in_res.width = 0;
11769d4fa1a1SMauro Carvalho Chehab 	pipe_in_res.height = 0;
11779d4fa1a1SMauro Carvalho Chehab 
11789d4fa1a1SMauro Carvalho Chehab 	assert(params);
11799d4fa1a1SMauro Carvalho Chehab 
11809d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("");
11819d4fa1a1SMauro Carvalho Chehab 
11829d4fa1a1SMauro Carvalho Chehab 	/* Go through all stages to udate uds and cropping */
1183c27479d7SDeepak R Varma 	for (stage = first_stage; stage; stage = stage->next) {
11849d4fa1a1SMauro Carvalho Chehab 		struct ia_css_binary *binary;
11859d4fa1a1SMauro Carvalho Chehab 		/* note: the var below is made static as it is quite large;
11869d4fa1a1SMauro Carvalho Chehab 		   if it is not static it ends up on the stack which could
11879d4fa1a1SMauro Carvalho Chehab 		   cause issues for drivers
11889d4fa1a1SMauro Carvalho Chehab 		*/
11899d4fa1a1SMauro Carvalho Chehab 		static struct ia_css_binary tmp_binary;
11909d4fa1a1SMauro Carvalho Chehab 
11919d4fa1a1SMauro Carvalho Chehab 		const struct ia_css_binary_xinfo *info = NULL;
11929d4fa1a1SMauro Carvalho Chehab 
11939d4fa1a1SMauro Carvalho Chehab 		binary = stage->binary;
11949d4fa1a1SMauro Carvalho Chehab 		if (binary) {
11959d4fa1a1SMauro Carvalho Chehab 			info = binary->info;
11969d4fa1a1SMauro Carvalho Chehab 		} else {
11979d4fa1a1SMauro Carvalho Chehab 			const struct sh_css_binary_args *args = &stage->args;
11989d4fa1a1SMauro Carvalho Chehab 			const struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS] = {NULL};
11999d4fa1a1SMauro Carvalho Chehab 
12009a29f5fcSHans de Goede 			out_infos[0] = ia_css_frame_get_info(args->out_frame[0]);
12019a29f5fcSHans de Goede 
12029d4fa1a1SMauro Carvalho Chehab 			info = &stage->firmware->info.isp;
12039d4fa1a1SMauro Carvalho Chehab 			ia_css_binary_fill_info(info, false, false,
12049d4fa1a1SMauro Carvalho Chehab 						ATOMISP_INPUT_FORMAT_RAW_10,
12059a29f5fcSHans de Goede 						ia_css_frame_get_info(args->in_frame),
12069d4fa1a1SMauro Carvalho Chehab 						NULL,
12079d4fa1a1SMauro Carvalho Chehab 						out_infos,
12089a29f5fcSHans de Goede 						ia_css_frame_get_info(args->out_vf_frame),
12099d4fa1a1SMauro Carvalho Chehab 						&tmp_binary,
12109d4fa1a1SMauro Carvalho Chehab 						NULL,
12119d4fa1a1SMauro Carvalho Chehab 						-1, true);
12129d4fa1a1SMauro Carvalho Chehab 			binary = &tmp_binary;
12139d4fa1a1SMauro Carvalho Chehab 			binary->info = info;
12149d4fa1a1SMauro Carvalho Chehab 		}
12159d4fa1a1SMauro Carvalho Chehab 
12169d4fa1a1SMauro Carvalho Chehab 		if (stage == first_stage) {
12179d4fa1a1SMauro Carvalho Chehab 			/* we will use pipe_in_res to scale the zoom crop region if needed */
12189d4fa1a1SMauro Carvalho Chehab 			pipe_in_res = binary->effective_in_frame_res;
12199d4fa1a1SMauro Carvalho Chehab 		}
12209d4fa1a1SMauro Carvalho Chehab 
12219d4fa1a1SMauro Carvalho Chehab 		assert(stage->stage_num < SH_CSS_MAX_STAGES);
12229d4fa1a1SMauro Carvalho Chehab 		if (params->dz_config.zoom_region.resolution.width == 0 &&
12239d4fa1a1SMauro Carvalho Chehab 		    params->dz_config.zoom_region.resolution.height == 0) {
12249d4fa1a1SMauro Carvalho Chehab 			sh_css_update_uds_and_crop_info(
12259d4fa1a1SMauro Carvalho Chehab 			    &info->sp,
12269d4fa1a1SMauro Carvalho Chehab 			    &binary->in_frame_info,
12279d4fa1a1SMauro Carvalho Chehab 			    &binary->out_frame_info[0],
12289d4fa1a1SMauro Carvalho Chehab 			    &binary->dvs_envelope,
12299d4fa1a1SMauro Carvalho Chehab 			    &params->dz_config,
12309d4fa1a1SMauro Carvalho Chehab 			    &params->motion_config,
12319d4fa1a1SMauro Carvalho Chehab 			    &params->uds[stage->stage_num].uds,
12329d4fa1a1SMauro Carvalho Chehab 			    &params->uds[stage->stage_num].crop_pos,
12339d4fa1a1SMauro Carvalho Chehab 			    stage->enable_zoom);
12349d4fa1a1SMauro Carvalho Chehab 		} else {
12359d4fa1a1SMauro Carvalho Chehab 			err = sh_css_update_uds_and_crop_info_based_on_zoom_region(
12369d4fa1a1SMauro Carvalho Chehab 				  &info->sp,
12379d4fa1a1SMauro Carvalho Chehab 				  &binary->in_frame_info,
12389d4fa1a1SMauro Carvalho Chehab 				  &binary->out_frame_info[0],
12399d4fa1a1SMauro Carvalho Chehab 				  &binary->dvs_envelope,
12409d4fa1a1SMauro Carvalho Chehab 				  &params->dz_config,
12419d4fa1a1SMauro Carvalho Chehab 				  &params->motion_config,
12429d4fa1a1SMauro Carvalho Chehab 				  &params->uds[stage->stage_num].uds,
12439d4fa1a1SMauro Carvalho Chehab 				  &params->uds[stage->stage_num].crop_pos,
12449d4fa1a1SMauro Carvalho Chehab 				  pipe_in_res,
12459d4fa1a1SMauro Carvalho Chehab 				  stage->enable_zoom);
124641022d35SMauro Carvalho Chehab 			if (err)
12479d4fa1a1SMauro Carvalho Chehab 				return err;
12489d4fa1a1SMauro Carvalho Chehab 		}
12499d4fa1a1SMauro Carvalho Chehab 	}
12509d4fa1a1SMauro Carvalho Chehab 	params->isp_params_changed = true;
12519d4fa1a1SMauro Carvalho Chehab 
12529d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
12539d4fa1a1SMauro Carvalho Chehab 	return err;
12549d4fa1a1SMauro Carvalho Chehab }
12559d4fa1a1SMauro Carvalho Chehab 
12569d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_gamma_table(struct ia_css_isp_parameters * params,const struct ia_css_gamma_table * table)12579d4fa1a1SMauro Carvalho Chehab sh_css_set_gamma_table(struct ia_css_isp_parameters *params,
12589d4fa1a1SMauro Carvalho Chehab 		       const struct ia_css_gamma_table *table)
12599d4fa1a1SMauro Carvalho Chehab {
12609d4fa1a1SMauro Carvalho Chehab 	if (!table)
12619d4fa1a1SMauro Carvalho Chehab 		return;
12629d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("table=%p", table);
12639d4fa1a1SMauro Carvalho Chehab 
12649d4fa1a1SMauro Carvalho Chehab 	assert(params);
12659d4fa1a1SMauro Carvalho Chehab 	params->gc_table = *table;
12669d4fa1a1SMauro Carvalho Chehab 	params->config_changed[IA_CSS_GC_ID] = true;
12679d4fa1a1SMauro Carvalho Chehab 
12689d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
12699d4fa1a1SMauro Carvalho Chehab }
12709d4fa1a1SMauro Carvalho Chehab 
12719d4fa1a1SMauro Carvalho Chehab static void
sh_css_get_gamma_table(const struct ia_css_isp_parameters * params,struct ia_css_gamma_table * table)12729d4fa1a1SMauro Carvalho Chehab sh_css_get_gamma_table(const struct ia_css_isp_parameters *params,
12739d4fa1a1SMauro Carvalho Chehab 		       struct ia_css_gamma_table *table)
12749d4fa1a1SMauro Carvalho Chehab {
12759d4fa1a1SMauro Carvalho Chehab 	if (!table)
12769d4fa1a1SMauro Carvalho Chehab 		return;
12779d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("table=%p", table);
12789d4fa1a1SMauro Carvalho Chehab 
12799d4fa1a1SMauro Carvalho Chehab 	assert(params);
12809d4fa1a1SMauro Carvalho Chehab 	*table = params->gc_table;
12819d4fa1a1SMauro Carvalho Chehab 
12829d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
12839d4fa1a1SMauro Carvalho Chehab }
12849d4fa1a1SMauro Carvalho Chehab 
12859d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_ctc_table(struct ia_css_isp_parameters * params,const struct ia_css_ctc_table * table)12869d4fa1a1SMauro Carvalho Chehab sh_css_set_ctc_table(struct ia_css_isp_parameters *params,
12879d4fa1a1SMauro Carvalho Chehab 		     const struct ia_css_ctc_table *table)
12889d4fa1a1SMauro Carvalho Chehab {
12899d4fa1a1SMauro Carvalho Chehab 	if (!table)
12909d4fa1a1SMauro Carvalho Chehab 		return;
12919d4fa1a1SMauro Carvalho Chehab 
12929d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("table=%p", table);
12939d4fa1a1SMauro Carvalho Chehab 
12949d4fa1a1SMauro Carvalho Chehab 	assert(params);
12959d4fa1a1SMauro Carvalho Chehab 	params->ctc_table = *table;
12969d4fa1a1SMauro Carvalho Chehab 	params->config_changed[IA_CSS_CTC_ID] = true;
12979d4fa1a1SMauro Carvalho Chehab 
12989d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
12999d4fa1a1SMauro Carvalho Chehab }
13009d4fa1a1SMauro Carvalho Chehab 
13019d4fa1a1SMauro Carvalho Chehab static void
sh_css_get_ctc_table(const struct ia_css_isp_parameters * params,struct ia_css_ctc_table * table)13029d4fa1a1SMauro Carvalho Chehab sh_css_get_ctc_table(const struct ia_css_isp_parameters *params,
13039d4fa1a1SMauro Carvalho Chehab 		     struct ia_css_ctc_table *table)
13049d4fa1a1SMauro Carvalho Chehab {
13059d4fa1a1SMauro Carvalho Chehab 	if (!table)
13069d4fa1a1SMauro Carvalho Chehab 		return;
13079d4fa1a1SMauro Carvalho Chehab 
13089d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("table=%p", table);
13099d4fa1a1SMauro Carvalho Chehab 
13109d4fa1a1SMauro Carvalho Chehab 	assert(params);
13119d4fa1a1SMauro Carvalho Chehab 	*table = params->ctc_table;
13129d4fa1a1SMauro Carvalho Chehab 
13139d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
13149d4fa1a1SMauro Carvalho Chehab }
13159d4fa1a1SMauro Carvalho Chehab 
13169d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_macc_table(struct ia_css_isp_parameters * params,const struct ia_css_macc_table * table)13179d4fa1a1SMauro Carvalho Chehab sh_css_set_macc_table(struct ia_css_isp_parameters *params,
13189d4fa1a1SMauro Carvalho Chehab 		      const struct ia_css_macc_table *table)
13199d4fa1a1SMauro Carvalho Chehab {
13209d4fa1a1SMauro Carvalho Chehab 	if (!table)
13219d4fa1a1SMauro Carvalho Chehab 		return;
13229d4fa1a1SMauro Carvalho Chehab 
13239d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("table=%p", table);
13249d4fa1a1SMauro Carvalho Chehab 
13259d4fa1a1SMauro Carvalho Chehab 	assert(params);
13269d4fa1a1SMauro Carvalho Chehab 	params->macc_table = *table;
13279d4fa1a1SMauro Carvalho Chehab 	params->config_changed[IA_CSS_MACC_ID] = true;
13289d4fa1a1SMauro Carvalho Chehab 
13299d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
13309d4fa1a1SMauro Carvalho Chehab }
13319d4fa1a1SMauro Carvalho Chehab 
13329d4fa1a1SMauro Carvalho Chehab static void
sh_css_get_macc_table(const struct ia_css_isp_parameters * params,struct ia_css_macc_table * table)13339d4fa1a1SMauro Carvalho Chehab sh_css_get_macc_table(const struct ia_css_isp_parameters *params,
13349d4fa1a1SMauro Carvalho Chehab 		      struct ia_css_macc_table *table)
13359d4fa1a1SMauro Carvalho Chehab {
13369d4fa1a1SMauro Carvalho Chehab 	if (!table)
13379d4fa1a1SMauro Carvalho Chehab 		return;
13389d4fa1a1SMauro Carvalho Chehab 
13399d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("table=%p", table);
13409d4fa1a1SMauro Carvalho Chehab 
13419d4fa1a1SMauro Carvalho Chehab 	assert(params);
13429d4fa1a1SMauro Carvalho Chehab 	*table = params->macc_table;
13439d4fa1a1SMauro Carvalho Chehab 
13449d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
13459d4fa1a1SMauro Carvalho Chehab }
13469d4fa1a1SMauro Carvalho Chehab 
ia_css_morph_table_free(struct ia_css_morph_table * me)13479d4fa1a1SMauro Carvalho Chehab void ia_css_morph_table_free(
13489d4fa1a1SMauro Carvalho Chehab     struct ia_css_morph_table *me)
13499d4fa1a1SMauro Carvalho Chehab {
13509d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
13519d4fa1a1SMauro Carvalho Chehab 
13529d4fa1a1SMauro Carvalho Chehab 	if (!me)
13539d4fa1a1SMauro Carvalho Chehab 		return;
13549d4fa1a1SMauro Carvalho Chehab 
13559d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("");
13569d4fa1a1SMauro Carvalho Chehab 
13579d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
13589d4fa1a1SMauro Carvalho Chehab 		if (me->coordinates_x[i]) {
13599955d906SMauro Carvalho Chehab 			kvfree(me->coordinates_x[i]);
13609d4fa1a1SMauro Carvalho Chehab 			me->coordinates_x[i] = NULL;
13619d4fa1a1SMauro Carvalho Chehab 		}
13629d4fa1a1SMauro Carvalho Chehab 		if (me->coordinates_y[i]) {
13639955d906SMauro Carvalho Chehab 			kvfree(me->coordinates_y[i]);
13649d4fa1a1SMauro Carvalho Chehab 			me->coordinates_y[i] = NULL;
13659d4fa1a1SMauro Carvalho Chehab 		}
13669d4fa1a1SMauro Carvalho Chehab 	}
13679d4fa1a1SMauro Carvalho Chehab 
13689955d906SMauro Carvalho Chehab 	kvfree(me);
13699d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("void");
13709d4fa1a1SMauro Carvalho Chehab }
13719d4fa1a1SMauro Carvalho Chehab 
ia_css_morph_table_allocate(unsigned int width,unsigned int height)13729d4fa1a1SMauro Carvalho Chehab struct ia_css_morph_table *ia_css_morph_table_allocate(
13739d4fa1a1SMauro Carvalho Chehab     unsigned int width,
13749d4fa1a1SMauro Carvalho Chehab     unsigned int height)
13759d4fa1a1SMauro Carvalho Chehab {
13769d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
13779d4fa1a1SMauro Carvalho Chehab 	struct ia_css_morph_table *me;
13789d4fa1a1SMauro Carvalho Chehab 
13799d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("");
13809d4fa1a1SMauro Carvalho Chehab 
13819955d906SMauro Carvalho Chehab 	me = kvmalloc(sizeof(*me), GFP_KERNEL);
13829d4fa1a1SMauro Carvalho Chehab 	if (!me) {
13839d4fa1a1SMauro Carvalho Chehab 		IA_CSS_ERROR("out of memory");
13849d4fa1a1SMauro Carvalho Chehab 		return me;
13859d4fa1a1SMauro Carvalho Chehab 	}
13869d4fa1a1SMauro Carvalho Chehab 
13879d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
13889d4fa1a1SMauro Carvalho Chehab 		me->coordinates_x[i] = NULL;
13899d4fa1a1SMauro Carvalho Chehab 		me->coordinates_y[i] = NULL;
13909d4fa1a1SMauro Carvalho Chehab 	}
13919d4fa1a1SMauro Carvalho Chehab 
13929d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
13939955d906SMauro Carvalho Chehab 		me->coordinates_x[i] = kvmalloc(height * width *
13949955d906SMauro Carvalho Chehab 						sizeof(*me->coordinates_x[i]),
13959955d906SMauro Carvalho Chehab 						GFP_KERNEL);
13969955d906SMauro Carvalho Chehab 		me->coordinates_y[i] = kvmalloc(height * width *
13979955d906SMauro Carvalho Chehab 						sizeof(*me->coordinates_y[i]),
13989955d906SMauro Carvalho Chehab 						GFP_KERNEL);
13999d4fa1a1SMauro Carvalho Chehab 
14009d4fa1a1SMauro Carvalho Chehab 		if ((!me->coordinates_x[i]) ||
14019d4fa1a1SMauro Carvalho Chehab 		    (!me->coordinates_y[i])) {
14029d4fa1a1SMauro Carvalho Chehab 			ia_css_morph_table_free(me);
14039d4fa1a1SMauro Carvalho Chehab 			me = NULL;
14049d4fa1a1SMauro Carvalho Chehab 			return me;
14059d4fa1a1SMauro Carvalho Chehab 		}
14069d4fa1a1SMauro Carvalho Chehab 	}
14079d4fa1a1SMauro Carvalho Chehab 	me->width = width;
14089d4fa1a1SMauro Carvalho Chehab 	me->height = height;
14099d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("");
14109d4fa1a1SMauro Carvalho Chehab 	return me;
14119d4fa1a1SMauro Carvalho Chehab }
14129d4fa1a1SMauro Carvalho Chehab 
sh_css_params_default_morph_table(struct ia_css_morph_table ** table,const struct ia_css_binary * binary)141341022d35SMauro Carvalho Chehab static int sh_css_params_default_morph_table(
14149d4fa1a1SMauro Carvalho Chehab     struct ia_css_morph_table **table,
14159d4fa1a1SMauro Carvalho Chehab     const struct ia_css_binary *binary)
14169d4fa1a1SMauro Carvalho Chehab {
14179d4fa1a1SMauro Carvalho Chehab 	/* MW 2400 advanced requires different scaling */
14189d4fa1a1SMauro Carvalho Chehab 	unsigned int i, j, k, step, width, height;
14199d4fa1a1SMauro Carvalho Chehab 	short start_x[IA_CSS_MORPH_TABLE_NUM_PLANES] = { -8, 0, -8, 0, 0, -8 },
14209d4fa1a1SMauro Carvalho Chehab 		start_y[IA_CSS_MORPH_TABLE_NUM_PLANES] = { 0, 0, -8, -8, -8, 0 };
14219d4fa1a1SMauro Carvalho Chehab 	struct ia_css_morph_table *tab;
14229d4fa1a1SMauro Carvalho Chehab 
14239d4fa1a1SMauro Carvalho Chehab 	assert(table);
14249d4fa1a1SMauro Carvalho Chehab 	assert(binary);
14259d4fa1a1SMauro Carvalho Chehab 
14269d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("");
14279d4fa1a1SMauro Carvalho Chehab 
1428321af22aSZheng Yongjun 	step = (ISP_VEC_NELEMS / 16) * 128;
1429321af22aSZheng Yongjun 	width = binary->morph_tbl_width;
14309d4fa1a1SMauro Carvalho Chehab 	height = binary->morph_tbl_height;
14319d4fa1a1SMauro Carvalho Chehab 
14329d4fa1a1SMauro Carvalho Chehab 	tab = ia_css_morph_table_allocate(width, height);
14339d4fa1a1SMauro Carvalho Chehab 	if (!tab)
143441022d35SMauro Carvalho Chehab 		return -ENOMEM;
14359d4fa1a1SMauro Carvalho Chehab 
14369d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
14379d4fa1a1SMauro Carvalho Chehab 		short val_y = start_y[i];
14389d4fa1a1SMauro Carvalho Chehab 
14399d4fa1a1SMauro Carvalho Chehab 		for (j = 0; j < height; j++) {
14409d4fa1a1SMauro Carvalho Chehab 			short val_x = start_x[i];
14419d4fa1a1SMauro Carvalho Chehab 			unsigned short *x_ptr, *y_ptr;
14429d4fa1a1SMauro Carvalho Chehab 
14439d4fa1a1SMauro Carvalho Chehab 			x_ptr = &tab->coordinates_x[i][j * width];
14449d4fa1a1SMauro Carvalho Chehab 			y_ptr = &tab->coordinates_y[i][j * width];
14459d4fa1a1SMauro Carvalho Chehab 			for (k = 0; k < width;
14469d4fa1a1SMauro Carvalho Chehab 			     k++, x_ptr++, y_ptr++, val_x += (short)step) {
14479d4fa1a1SMauro Carvalho Chehab 				if (k == 0)
14489d4fa1a1SMauro Carvalho Chehab 					*x_ptr = 0;
14499d4fa1a1SMauro Carvalho Chehab 				else if (k == width - 1)
14509d4fa1a1SMauro Carvalho Chehab 					*x_ptr = val_x + 2 * start_x[i];
14519d4fa1a1SMauro Carvalho Chehab 				else
14529d4fa1a1SMauro Carvalho Chehab 					*x_ptr = val_x;
14539d4fa1a1SMauro Carvalho Chehab 				if (j == 0)
14549d4fa1a1SMauro Carvalho Chehab 					*y_ptr = 0;
14559d4fa1a1SMauro Carvalho Chehab 				else
14569d4fa1a1SMauro Carvalho Chehab 					*y_ptr = val_y;
14579d4fa1a1SMauro Carvalho Chehab 			}
14589d4fa1a1SMauro Carvalho Chehab 			val_y += (short)step;
14599d4fa1a1SMauro Carvalho Chehab 		}
14609d4fa1a1SMauro Carvalho Chehab 	}
14619d4fa1a1SMauro Carvalho Chehab 	*table = tab;
14629d4fa1a1SMauro Carvalho Chehab 
146341022d35SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(0);
14649d4fa1a1SMauro Carvalho Chehab 
146541022d35SMauro Carvalho Chehab 	return 0;
14669d4fa1a1SMauro Carvalho Chehab }
14679d4fa1a1SMauro Carvalho Chehab 
14689d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_morph_table(struct ia_css_isp_parameters * params,const struct ia_css_morph_table * table)14699d4fa1a1SMauro Carvalho Chehab sh_css_set_morph_table(struct ia_css_isp_parameters *params,
14709d4fa1a1SMauro Carvalho Chehab 		       const struct ia_css_morph_table *table)
14719d4fa1a1SMauro Carvalho Chehab {
14729d4fa1a1SMauro Carvalho Chehab 	if (!table)
14739d4fa1a1SMauro Carvalho Chehab 		return;
14749d4fa1a1SMauro Carvalho Chehab 
14759d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("table=%p", table);
14769d4fa1a1SMauro Carvalho Chehab 
14779d4fa1a1SMauro Carvalho Chehab 	assert(params);
14789d4fa1a1SMauro Carvalho Chehab 	if (table->enable == false)
14799d4fa1a1SMauro Carvalho Chehab 		table = NULL;
14809d4fa1a1SMauro Carvalho Chehab 	params->morph_table = table;
14819d4fa1a1SMauro Carvalho Chehab 	params->morph_table_changed = true;
14829d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
14839d4fa1a1SMauro Carvalho Chehab }
14849d4fa1a1SMauro Carvalho Chehab 
14859d4fa1a1SMauro Carvalho Chehab void
ia_css_translate_3a_statistics(struct ia_css_3a_statistics * host_stats,const struct ia_css_isp_3a_statistics_map * isp_stats)14869d4fa1a1SMauro Carvalho Chehab ia_css_translate_3a_statistics(
14879d4fa1a1SMauro Carvalho Chehab     struct ia_css_3a_statistics               *host_stats,
14889d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_3a_statistics_map *isp_stats)
14899d4fa1a1SMauro Carvalho Chehab {
14909d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("");
14919d4fa1a1SMauro Carvalho Chehab 	if (host_stats->grid.use_dmem) {
14929d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LOG("3A: DMEM");
14939d4fa1a1SMauro Carvalho Chehab 		ia_css_s3a_dmem_decode(host_stats, isp_stats->dmem_stats);
14949d4fa1a1SMauro Carvalho Chehab 	} else {
14959d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LOG("3A: VMEM");
14969d4fa1a1SMauro Carvalho Chehab 		ia_css_s3a_vmem_decode(host_stats, isp_stats->vmem_stats_hi,
14979d4fa1a1SMauro Carvalho Chehab 				       isp_stats->vmem_stats_lo);
14989d4fa1a1SMauro Carvalho Chehab 	}
14999d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LOG("3A: HMEM");
15009d4fa1a1SMauro Carvalho Chehab 	ia_css_s3a_hmem_decode(host_stats, isp_stats->hmem_stats);
15019d4fa1a1SMauro Carvalho Chehab 
15029d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("void");
15039d4fa1a1SMauro Carvalho Chehab }
15049d4fa1a1SMauro Carvalho Chehab 
15059d4fa1a1SMauro Carvalho Chehab void
ia_css_isp_3a_statistics_map_free(struct ia_css_isp_3a_statistics_map * me)15069d4fa1a1SMauro Carvalho Chehab ia_css_isp_3a_statistics_map_free(struct ia_css_isp_3a_statistics_map *me)
15079d4fa1a1SMauro Carvalho Chehab {
15089d4fa1a1SMauro Carvalho Chehab 	if (me) {
15099d4fa1a1SMauro Carvalho Chehab 		if (me->data_allocated) {
15109955d906SMauro Carvalho Chehab 			kvfree(me->data_ptr);
15119d4fa1a1SMauro Carvalho Chehab 			me->data_ptr = NULL;
15129d4fa1a1SMauro Carvalho Chehab 			me->data_allocated = false;
15139d4fa1a1SMauro Carvalho Chehab 		}
15149955d906SMauro Carvalho Chehab 		kvfree(me);
15159d4fa1a1SMauro Carvalho Chehab 	}
15169d4fa1a1SMauro Carvalho Chehab }
15179d4fa1a1SMauro Carvalho Chehab 
15189d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_3a_statistics_map *
ia_css_isp_3a_statistics_map_allocate(const struct ia_css_isp_3a_statistics * isp_stats,void * data_ptr)15199d4fa1a1SMauro Carvalho Chehab ia_css_isp_3a_statistics_map_allocate(
15209d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_3a_statistics *isp_stats,
15219d4fa1a1SMauro Carvalho Chehab     void *data_ptr)
15229d4fa1a1SMauro Carvalho Chehab {
15239d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_3a_statistics_map *me;
15249d4fa1a1SMauro Carvalho Chehab 	/* Windows compiler does not like adding sizes to a void *
15259d4fa1a1SMauro Carvalho Chehab 	 * so we use a local char * instead. */
15269d4fa1a1SMauro Carvalho Chehab 	char *base_ptr;
15279d4fa1a1SMauro Carvalho Chehab 
15289955d906SMauro Carvalho Chehab 	me = kvmalloc(sizeof(*me), GFP_KERNEL);
15299d4fa1a1SMauro Carvalho Chehab 	if (!me) {
15309d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE("cannot allocate memory");
15319d4fa1a1SMauro Carvalho Chehab 		goto err;
15329d4fa1a1SMauro Carvalho Chehab 	}
15339d4fa1a1SMauro Carvalho Chehab 
15349d4fa1a1SMauro Carvalho Chehab 	me->data_ptr = data_ptr;
15359d4fa1a1SMauro Carvalho Chehab 	me->data_allocated = !data_ptr;
15369d4fa1a1SMauro Carvalho Chehab 	if (!data_ptr) {
15379955d906SMauro Carvalho Chehab 		me->data_ptr = kvmalloc(isp_stats->size, GFP_KERNEL);
15389d4fa1a1SMauro Carvalho Chehab 		if (!me->data_ptr) {
15399d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LEAVE("cannot allocate memory");
15409d4fa1a1SMauro Carvalho Chehab 			goto err;
15419d4fa1a1SMauro Carvalho Chehab 		}
15429d4fa1a1SMauro Carvalho Chehab 	}
15439d4fa1a1SMauro Carvalho Chehab 	base_ptr = me->data_ptr;
15449d4fa1a1SMauro Carvalho Chehab 
15459d4fa1a1SMauro Carvalho Chehab 	me->size = isp_stats->size;
15469d4fa1a1SMauro Carvalho Chehab 	/* GCC complains when we assign a char * to a void *, so these
15479d4fa1a1SMauro Carvalho Chehab 	 * casts are necessary unfortunately. */
15489d4fa1a1SMauro Carvalho Chehab 	me->dmem_stats    = (void *)base_ptr;
15499d4fa1a1SMauro Carvalho Chehab 	me->vmem_stats_hi = (void *)(base_ptr + isp_stats->dmem_size);
15509d4fa1a1SMauro Carvalho Chehab 	me->vmem_stats_lo = (void *)(base_ptr + isp_stats->dmem_size +
15519d4fa1a1SMauro Carvalho Chehab 				     isp_stats->vmem_size);
15529d4fa1a1SMauro Carvalho Chehab 	me->hmem_stats    = (void *)(base_ptr + isp_stats->dmem_size +
15539d4fa1a1SMauro Carvalho Chehab 				     2 * isp_stats->vmem_size);
15549d4fa1a1SMauro Carvalho Chehab 
15559d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("map=%p", me);
15569d4fa1a1SMauro Carvalho Chehab 	return me;
15579d4fa1a1SMauro Carvalho Chehab 
15589d4fa1a1SMauro Carvalho Chehab err:
15599955d906SMauro Carvalho Chehab 	kvfree(me);
15609d4fa1a1SMauro Carvalho Chehab 	return NULL;
15619d4fa1a1SMauro Carvalho Chehab }
15629d4fa1a1SMauro Carvalho Chehab 
156341022d35SMauro Carvalho Chehab int
ia_css_get_3a_statistics(struct ia_css_3a_statistics * host_stats,const struct ia_css_isp_3a_statistics * isp_stats)15649d4fa1a1SMauro Carvalho Chehab ia_css_get_3a_statistics(struct ia_css_3a_statistics           *host_stats,
1565c27479d7SDeepak R Varma 			 const struct ia_css_isp_3a_statistics *isp_stats)
1566c27479d7SDeepak R Varma {
15679d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_3a_statistics_map *map;
156841022d35SMauro Carvalho Chehab 	int ret = 0;
15699d4fa1a1SMauro Carvalho Chehab 
15709d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("host_stats=%p, isp_stats=%p", host_stats, isp_stats);
15719d4fa1a1SMauro Carvalho Chehab 
15729d4fa1a1SMauro Carvalho Chehab 	assert(host_stats);
15739d4fa1a1SMauro Carvalho Chehab 	assert(isp_stats);
15749d4fa1a1SMauro Carvalho Chehab 
15759d4fa1a1SMauro Carvalho Chehab 	map = ia_css_isp_3a_statistics_map_allocate(isp_stats, NULL);
1576c27479d7SDeepak R Varma 	if (map) {
15775472b4dbSMauro Carvalho Chehab 		hmm_load(isp_stats->data_ptr, map->data_ptr, isp_stats->size);
15789d4fa1a1SMauro Carvalho Chehab 		ia_css_translate_3a_statistics(host_stats, map);
15799d4fa1a1SMauro Carvalho Chehab 		ia_css_isp_3a_statistics_map_free(map);
1580c27479d7SDeepak R Varma 	} else {
15819d4fa1a1SMauro Carvalho Chehab 		IA_CSS_ERROR("out of memory");
158241022d35SMauro Carvalho Chehab 		ret = -ENOMEM;
15839d4fa1a1SMauro Carvalho Chehab 	}
15849d4fa1a1SMauro Carvalho Chehab 
15859d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR(ret);
15869d4fa1a1SMauro Carvalho Chehab 	return ret;
15879d4fa1a1SMauro Carvalho Chehab }
15889d4fa1a1SMauro Carvalho Chehab 
15899d4fa1a1SMauro Carvalho Chehab /* Parameter encoding is not yet orthogonal.
15909d4fa1a1SMauro Carvalho Chehab    This function hnadles some of the exceptions.
15919d4fa1a1SMauro Carvalho Chehab */
15929d4fa1a1SMauro Carvalho Chehab static void
ia_css_set_param_exceptions(const struct ia_css_pipe * pipe,struct ia_css_isp_parameters * params)15939d4fa1a1SMauro Carvalho Chehab ia_css_set_param_exceptions(const struct ia_css_pipe *pipe,
15949d4fa1a1SMauro Carvalho Chehab 			    struct ia_css_isp_parameters *params)
15959d4fa1a1SMauro Carvalho Chehab {
15969d4fa1a1SMauro Carvalho Chehab 	assert(params);
15979d4fa1a1SMauro Carvalho Chehab 
15989d4fa1a1SMauro Carvalho Chehab 	/* Copy also to DP. Should be done by the driver. */
15999d4fa1a1SMauro Carvalho Chehab 	params->dp_config.gr = params->wb_config.gr;
16009d4fa1a1SMauro Carvalho Chehab 	params->dp_config.r  = params->wb_config.r;
16019d4fa1a1SMauro Carvalho Chehab 	params->dp_config.b  = params->wb_config.b;
16029d4fa1a1SMauro Carvalho Chehab 	params->dp_config.gb = params->wb_config.gb;
16039d4fa1a1SMauro Carvalho Chehab }
16049d4fa1a1SMauro Carvalho Chehab 
16059d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_nr_config(struct ia_css_isp_parameters * params,const struct ia_css_nr_config * config)16069d4fa1a1SMauro Carvalho Chehab sh_css_set_nr_config(struct ia_css_isp_parameters *params,
16079d4fa1a1SMauro Carvalho Chehab 		     const struct ia_css_nr_config *config)
16089d4fa1a1SMauro Carvalho Chehab {
16099d4fa1a1SMauro Carvalho Chehab 	if (!config)
16109d4fa1a1SMauro Carvalho Chehab 		return;
16119d4fa1a1SMauro Carvalho Chehab 	assert(params);
16129d4fa1a1SMauro Carvalho Chehab 
16139d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("config=%p", config);
16149d4fa1a1SMauro Carvalho Chehab 
16159d4fa1a1SMauro Carvalho Chehab 	ia_css_nr_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
16169d4fa1a1SMauro Carvalho Chehab 	params->nr_config = *config;
16179d4fa1a1SMauro Carvalho Chehab 	params->yee_config.nr = *config;
16189d4fa1a1SMauro Carvalho Chehab 	params->config_changed[IA_CSS_NR_ID]  = true;
16199d4fa1a1SMauro Carvalho Chehab 	params->config_changed[IA_CSS_YEE_ID] = true;
16209d4fa1a1SMauro Carvalho Chehab 	params->config_changed[IA_CSS_BNR_ID] = true;
16219d4fa1a1SMauro Carvalho Chehab 
16229d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
16239d4fa1a1SMauro Carvalho Chehab }
16249d4fa1a1SMauro Carvalho Chehab 
16259d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_ee_config(struct ia_css_isp_parameters * params,const struct ia_css_ee_config * config)16269d4fa1a1SMauro Carvalho Chehab sh_css_set_ee_config(struct ia_css_isp_parameters *params,
16279d4fa1a1SMauro Carvalho Chehab 		     const struct ia_css_ee_config *config)
16289d4fa1a1SMauro Carvalho Chehab {
16299d4fa1a1SMauro Carvalho Chehab 	if (!config)
16309d4fa1a1SMauro Carvalho Chehab 		return;
16319d4fa1a1SMauro Carvalho Chehab 	assert(params);
16329d4fa1a1SMauro Carvalho Chehab 
16339d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("config=%p", config);
16349d4fa1a1SMauro Carvalho Chehab 	ia_css_ee_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
16359d4fa1a1SMauro Carvalho Chehab 
16369d4fa1a1SMauro Carvalho Chehab 	params->ee_config = *config;
16379d4fa1a1SMauro Carvalho Chehab 	params->yee_config.ee = *config;
16389d4fa1a1SMauro Carvalho Chehab 	params->config_changed[IA_CSS_YEE_ID] = true;
16399d4fa1a1SMauro Carvalho Chehab 
16409d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
16419d4fa1a1SMauro Carvalho Chehab }
16429d4fa1a1SMauro Carvalho Chehab 
16439d4fa1a1SMauro Carvalho Chehab static void
sh_css_get_ee_config(const struct ia_css_isp_parameters * params,struct ia_css_ee_config * config)16449d4fa1a1SMauro Carvalho Chehab sh_css_get_ee_config(const struct ia_css_isp_parameters *params,
16459d4fa1a1SMauro Carvalho Chehab 		     struct ia_css_ee_config *config)
16469d4fa1a1SMauro Carvalho Chehab {
16479d4fa1a1SMauro Carvalho Chehab 	if (!config)
16489d4fa1a1SMauro Carvalho Chehab 		return;
16499d4fa1a1SMauro Carvalho Chehab 
16509d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("config=%p", config);
16519d4fa1a1SMauro Carvalho Chehab 
16529d4fa1a1SMauro Carvalho Chehab 	assert(params);
16539d4fa1a1SMauro Carvalho Chehab 	*config = params->ee_config;
16549d4fa1a1SMauro Carvalho Chehab 
16559d4fa1a1SMauro Carvalho Chehab 	ia_css_ee_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
16569d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
16579d4fa1a1SMauro Carvalho Chehab }
16589d4fa1a1SMauro Carvalho Chehab 
16599d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_pipe_dvs_6axis_config(const struct ia_css_pipe * pipe,struct ia_css_isp_parameters * params,const struct ia_css_dvs_6axis_config * dvs_config)16609d4fa1a1SMauro Carvalho Chehab sh_css_set_pipe_dvs_6axis_config(const struct ia_css_pipe *pipe,
16619d4fa1a1SMauro Carvalho Chehab 				 struct ia_css_isp_parameters *params,
16629d4fa1a1SMauro Carvalho Chehab 				 const struct ia_css_dvs_6axis_config  *dvs_config)
16639d4fa1a1SMauro Carvalho Chehab {
16649d4fa1a1SMauro Carvalho Chehab 	if (!dvs_config)
16659d4fa1a1SMauro Carvalho Chehab 		return;
16669d4fa1a1SMauro Carvalho Chehab 	assert(params);
16679d4fa1a1SMauro Carvalho Chehab 	assert(pipe);
16689d4fa1a1SMauro Carvalho Chehab 	assert(dvs_config->height_y == dvs_config->height_uv);
16699d4fa1a1SMauro Carvalho Chehab 	assert((dvs_config->width_y - 1) == 2 * (dvs_config->width_uv - 1));
16709d4fa1a1SMauro Carvalho Chehab 	assert(pipe->mode < IA_CSS_PIPE_ID_NUM);
16719d4fa1a1SMauro Carvalho Chehab 
16729d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("dvs_config=%p", dvs_config);
16739d4fa1a1SMauro Carvalho Chehab 
16749d4fa1a1SMauro Carvalho Chehab 	copy_dvs_6axis_table(params->pipe_dvs_6axis_config[pipe->mode], dvs_config);
16759d4fa1a1SMauro Carvalho Chehab 
16769d4fa1a1SMauro Carvalho Chehab 	params->pipe_dvs_6axis_config_changed[pipe->mode] = true;
16779d4fa1a1SMauro Carvalho Chehab 
16789d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
16799d4fa1a1SMauro Carvalho Chehab }
16809d4fa1a1SMauro Carvalho Chehab 
16819d4fa1a1SMauro Carvalho Chehab static void
sh_css_get_pipe_dvs_6axis_config(const struct ia_css_pipe * pipe,const struct ia_css_isp_parameters * params,struct ia_css_dvs_6axis_config * dvs_config)16829d4fa1a1SMauro Carvalho Chehab sh_css_get_pipe_dvs_6axis_config(const struct ia_css_pipe *pipe,
16839d4fa1a1SMauro Carvalho Chehab 				 const struct ia_css_isp_parameters *params,
16849d4fa1a1SMauro Carvalho Chehab 				 struct ia_css_dvs_6axis_config *dvs_config)
16859d4fa1a1SMauro Carvalho Chehab {
16869d4fa1a1SMauro Carvalho Chehab 	if (!dvs_config)
16879d4fa1a1SMauro Carvalho Chehab 		return;
16889d4fa1a1SMauro Carvalho Chehab 	assert(params);
16899d4fa1a1SMauro Carvalho Chehab 	assert(pipe);
16909d4fa1a1SMauro Carvalho Chehab 	assert(dvs_config->height_y == dvs_config->height_uv);
16919d4fa1a1SMauro Carvalho Chehab 	assert((dvs_config->width_y - 1) == 2 * dvs_config->width_uv - 1);
16929d4fa1a1SMauro Carvalho Chehab 
16939d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("dvs_config=%p", dvs_config);
16949d4fa1a1SMauro Carvalho Chehab 
16959d4fa1a1SMauro Carvalho Chehab 	if ((pipe->mode < IA_CSS_PIPE_ID_NUM) &&
16969d4fa1a1SMauro Carvalho Chehab 	    (dvs_config->width_y == params->pipe_dvs_6axis_config[pipe->mode]->width_y) &&
16979d4fa1a1SMauro Carvalho Chehab 	    (dvs_config->height_y == params->pipe_dvs_6axis_config[pipe->mode]->height_y) &&
16989d4fa1a1SMauro Carvalho Chehab 	    (dvs_config->width_uv == params->pipe_dvs_6axis_config[pipe->mode]->width_uv) &&
16999d4fa1a1SMauro Carvalho Chehab 	    (dvs_config->height_uv == params->pipe_dvs_6axis_config[pipe->mode]->height_uv)
17009d4fa1a1SMauro Carvalho Chehab 	    &&
17019d4fa1a1SMauro Carvalho Chehab 	    dvs_config->xcoords_y &&
17029d4fa1a1SMauro Carvalho Chehab 	    dvs_config->ycoords_y &&
17039d4fa1a1SMauro Carvalho Chehab 	    dvs_config->xcoords_uv &&
17049d4fa1a1SMauro Carvalho Chehab 	    dvs_config->ycoords_uv) {
17059d4fa1a1SMauro Carvalho Chehab 		copy_dvs_6axis_table(dvs_config, params->pipe_dvs_6axis_config[pipe->mode]);
17069d4fa1a1SMauro Carvalho Chehab 	}
17079d4fa1a1SMauro Carvalho Chehab 
17089d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
17099d4fa1a1SMauro Carvalho Chehab }
17109d4fa1a1SMauro Carvalho Chehab 
17119d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_baa_config(struct ia_css_isp_parameters * params,const struct ia_css_aa_config * config)17129d4fa1a1SMauro Carvalho Chehab sh_css_set_baa_config(struct ia_css_isp_parameters *params,
17139d4fa1a1SMauro Carvalho Chehab 		      const struct ia_css_aa_config *config)
17149d4fa1a1SMauro Carvalho Chehab {
17159d4fa1a1SMauro Carvalho Chehab 	if (!config)
17169d4fa1a1SMauro Carvalho Chehab 		return;
17179d4fa1a1SMauro Carvalho Chehab 	assert(params);
17189d4fa1a1SMauro Carvalho Chehab 
17199d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("config=%p", config);
17209d4fa1a1SMauro Carvalho Chehab 
17219d4fa1a1SMauro Carvalho Chehab 	params->bds_config = *config;
17229d4fa1a1SMauro Carvalho Chehab 	params->config_changed[IA_CSS_BDS_ID] = true;
17239d4fa1a1SMauro Carvalho Chehab 
17249d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
17259d4fa1a1SMauro Carvalho Chehab }
17269d4fa1a1SMauro Carvalho Chehab 
17279d4fa1a1SMauro Carvalho Chehab static void
sh_css_get_baa_config(const struct ia_css_isp_parameters * params,struct ia_css_aa_config * config)17289d4fa1a1SMauro Carvalho Chehab sh_css_get_baa_config(const struct ia_css_isp_parameters *params,
17299d4fa1a1SMauro Carvalho Chehab 		      struct ia_css_aa_config *config)
17309d4fa1a1SMauro Carvalho Chehab {
17319d4fa1a1SMauro Carvalho Chehab 	if (!config)
17329d4fa1a1SMauro Carvalho Chehab 		return;
17339d4fa1a1SMauro Carvalho Chehab 	assert(params);
17349d4fa1a1SMauro Carvalho Chehab 
17359d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("config=%p", config);
17369d4fa1a1SMauro Carvalho Chehab 
17379d4fa1a1SMauro Carvalho Chehab 	*config = params->bds_config;
17389d4fa1a1SMauro Carvalho Chehab 
17399d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
17409d4fa1a1SMauro Carvalho Chehab }
17419d4fa1a1SMauro Carvalho Chehab 
17429d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_dz_config(struct ia_css_isp_parameters * params,const struct ia_css_dz_config * config)17439d4fa1a1SMauro Carvalho Chehab sh_css_set_dz_config(struct ia_css_isp_parameters *params,
17449d4fa1a1SMauro Carvalho Chehab 		     const struct ia_css_dz_config *config)
17459d4fa1a1SMauro Carvalho Chehab {
17469d4fa1a1SMauro Carvalho Chehab 	if (!config)
17479d4fa1a1SMauro Carvalho Chehab 		return;
17489d4fa1a1SMauro Carvalho Chehab 	assert(params);
17499d4fa1a1SMauro Carvalho Chehab 
17509d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("dx=%d, dy=%d", config->dx, config->dy);
17519d4fa1a1SMauro Carvalho Chehab 
17529d4fa1a1SMauro Carvalho Chehab 	assert(config->dx <= HRT_GDC_N);
17539d4fa1a1SMauro Carvalho Chehab 	assert(config->dy <= HRT_GDC_N);
17549d4fa1a1SMauro Carvalho Chehab 
17559d4fa1a1SMauro Carvalho Chehab 	params->dz_config = *config;
17569d4fa1a1SMauro Carvalho Chehab 	params->dz_config_changed = true;
17579d4fa1a1SMauro Carvalho Chehab 	/* JK: Why isp params changed?? */
17589d4fa1a1SMauro Carvalho Chehab 	params->isp_params_changed = true;
17599d4fa1a1SMauro Carvalho Chehab 
17609d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
17619d4fa1a1SMauro Carvalho Chehab }
17629d4fa1a1SMauro Carvalho Chehab 
17639d4fa1a1SMauro Carvalho Chehab static void
sh_css_get_dz_config(const struct ia_css_isp_parameters * params,struct ia_css_dz_config * config)17649d4fa1a1SMauro Carvalho Chehab sh_css_get_dz_config(const struct ia_css_isp_parameters *params,
17659d4fa1a1SMauro Carvalho Chehab 		     struct ia_css_dz_config *config)
17669d4fa1a1SMauro Carvalho Chehab {
17679d4fa1a1SMauro Carvalho Chehab 	if (!config)
17689d4fa1a1SMauro Carvalho Chehab 		return;
17699d4fa1a1SMauro Carvalho Chehab 	assert(params);
17709d4fa1a1SMauro Carvalho Chehab 
17719d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("config=%p", config);
17729d4fa1a1SMauro Carvalho Chehab 
17739d4fa1a1SMauro Carvalho Chehab 	*config = params->dz_config;
17749d4fa1a1SMauro Carvalho Chehab 
17759d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("dx=%d, dy=%d", config->dx, config->dy);
17769d4fa1a1SMauro Carvalho Chehab }
17779d4fa1a1SMauro Carvalho Chehab 
17789d4fa1a1SMauro Carvalho Chehab static void
sh_css_set_motion_vector(struct ia_css_isp_parameters * params,const struct ia_css_vector * motion)17799d4fa1a1SMauro Carvalho Chehab sh_css_set_motion_vector(struct ia_css_isp_parameters *params,
17809d4fa1a1SMauro Carvalho Chehab 			 const struct ia_css_vector *motion)
17819d4fa1a1SMauro Carvalho Chehab {
17829d4fa1a1SMauro Carvalho Chehab 	if (!motion)
17839d4fa1a1SMauro Carvalho Chehab 		return;
17849d4fa1a1SMauro Carvalho Chehab 	assert(params);
17859d4fa1a1SMauro Carvalho Chehab 
17869d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("x=%d, y=%d", motion->x, motion->y);
17879d4fa1a1SMauro Carvalho Chehab 
17889d4fa1a1SMauro Carvalho Chehab 	params->motion_config = *motion;
17899d4fa1a1SMauro Carvalho Chehab 	/* JK: Why do isp params change? */
17909d4fa1a1SMauro Carvalho Chehab 	params->motion_config_changed = true;
17919d4fa1a1SMauro Carvalho Chehab 	params->isp_params_changed = true;
17929d4fa1a1SMauro Carvalho Chehab 
17939d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
17949d4fa1a1SMauro Carvalho Chehab }
17959d4fa1a1SMauro Carvalho Chehab 
17969d4fa1a1SMauro Carvalho Chehab static void
sh_css_get_motion_vector(const struct ia_css_isp_parameters * params,struct ia_css_vector * motion)17979d4fa1a1SMauro Carvalho Chehab sh_css_get_motion_vector(const struct ia_css_isp_parameters *params,
17989d4fa1a1SMauro Carvalho Chehab 			 struct ia_css_vector *motion)
17999d4fa1a1SMauro Carvalho Chehab {
18009d4fa1a1SMauro Carvalho Chehab 	if (!motion)
18019d4fa1a1SMauro Carvalho Chehab 		return;
18029d4fa1a1SMauro Carvalho Chehab 	assert(params);
18039d4fa1a1SMauro Carvalho Chehab 
18049d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("motion=%p", motion);
18059d4fa1a1SMauro Carvalho Chehab 
18069d4fa1a1SMauro Carvalho Chehab 	*motion = params->motion_config;
18079d4fa1a1SMauro Carvalho Chehab 
18089d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("x=%d, y=%d", motion->x, motion->y);
18099d4fa1a1SMauro Carvalho Chehab }
18109d4fa1a1SMauro Carvalho Chehab 
18119d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_config *
sh_css_pipe_isp_config_get(struct ia_css_pipe * pipe)18129d4fa1a1SMauro Carvalho Chehab sh_css_pipe_isp_config_get(struct ia_css_pipe *pipe)
18139d4fa1a1SMauro Carvalho Chehab {
18149d4fa1a1SMauro Carvalho Chehab 	if (!pipe) {
18159d4fa1a1SMauro Carvalho Chehab 		IA_CSS_ERROR("pipe=%p", NULL);
18169d4fa1a1SMauro Carvalho Chehab 		return NULL;
18179d4fa1a1SMauro Carvalho Chehab 	}
18189d4fa1a1SMauro Carvalho Chehab 	return pipe->config.p_isp_config;
18199d4fa1a1SMauro Carvalho Chehab }
18209d4fa1a1SMauro Carvalho Chehab 
182141022d35SMauro Carvalho Chehab int
ia_css_stream_set_isp_config(struct ia_css_stream * stream,const struct ia_css_isp_config * config)18229d4fa1a1SMauro Carvalho Chehab ia_css_stream_set_isp_config(
18239d4fa1a1SMauro Carvalho Chehab     struct ia_css_stream *stream,
1824c27479d7SDeepak R Varma     const struct ia_css_isp_config *config)
1825c27479d7SDeepak R Varma {
18269d4fa1a1SMauro Carvalho Chehab 	return ia_css_stream_set_isp_config_on_pipe(stream, config, NULL);
18279d4fa1a1SMauro Carvalho Chehab }
18289d4fa1a1SMauro Carvalho Chehab 
182941022d35SMauro Carvalho Chehab int
ia_css_stream_set_isp_config_on_pipe(struct ia_css_stream * stream,const struct ia_css_isp_config * config,struct ia_css_pipe * pipe)18309d4fa1a1SMauro Carvalho Chehab ia_css_stream_set_isp_config_on_pipe(
18319d4fa1a1SMauro Carvalho Chehab     struct ia_css_stream *stream,
18329d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_config *config,
1833c27479d7SDeepak R Varma     struct ia_css_pipe *pipe)
1834c27479d7SDeepak R Varma {
183541022d35SMauro Carvalho Chehab 	int err = 0;
18369d4fa1a1SMauro Carvalho Chehab 
18379d4fa1a1SMauro Carvalho Chehab 	if ((!stream) || (!config))
183841022d35SMauro Carvalho Chehab 		return -EINVAL;
18399d4fa1a1SMauro Carvalho Chehab 
18409d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("stream=%p, config=%p, pipe=%p", stream, config, pipe);
18419d4fa1a1SMauro Carvalho Chehab 
18429d4fa1a1SMauro Carvalho Chehab 	if (config->output_frame)
18439d4fa1a1SMauro Carvalho Chehab 		err = sh_css_set_per_frame_isp_config_on_pipe(stream, config, pipe);
18449d4fa1a1SMauro Carvalho Chehab 	else
18459d4fa1a1SMauro Carvalho Chehab 		err = sh_css_set_global_isp_config_on_pipe(stream->pipes[0], config, pipe);
18469d4fa1a1SMauro Carvalho Chehab 
18479d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR(err);
18489d4fa1a1SMauro Carvalho Chehab 	return err;
18499d4fa1a1SMauro Carvalho Chehab }
18509d4fa1a1SMauro Carvalho Chehab 
185141022d35SMauro Carvalho Chehab int
ia_css_pipe_set_isp_config(struct ia_css_pipe * pipe,struct ia_css_isp_config * config)18529d4fa1a1SMauro Carvalho Chehab ia_css_pipe_set_isp_config(struct ia_css_pipe *pipe,
1853c27479d7SDeepak R Varma 			   struct ia_css_isp_config *config)
1854c27479d7SDeepak R Varma {
18559d4fa1a1SMauro Carvalho Chehab 	struct ia_css_pipe *pipe_in = pipe;
185641022d35SMauro Carvalho Chehab 	int err = 0;
18579d4fa1a1SMauro Carvalho Chehab 
18589d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("pipe=%p", pipe);
18599d4fa1a1SMauro Carvalho Chehab 
18609d4fa1a1SMauro Carvalho Chehab 	if ((!pipe) || (!pipe->stream))
186141022d35SMauro Carvalho Chehab 		return -EINVAL;
18629d4fa1a1SMauro Carvalho Chehab 
18639d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "config=%p\n", config);
18649d4fa1a1SMauro Carvalho Chehab 
18659d4fa1a1SMauro Carvalho Chehab 	if (config->output_frame)
18669d4fa1a1SMauro Carvalho Chehab 		err = sh_css_set_per_frame_isp_config_on_pipe(pipe->stream, config, pipe);
18679d4fa1a1SMauro Carvalho Chehab 	else
18689d4fa1a1SMauro Carvalho Chehab 		err = sh_css_set_global_isp_config_on_pipe(pipe, config, pipe_in);
18699d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR(err);
18709d4fa1a1SMauro Carvalho Chehab 	return err;
18719d4fa1a1SMauro Carvalho Chehab }
18729d4fa1a1SMauro Carvalho Chehab 
187341022d35SMauro Carvalho Chehab static int
sh_css_set_global_isp_config_on_pipe(struct ia_css_pipe * curr_pipe,const struct ia_css_isp_config * config,struct ia_css_pipe * pipe)18749d4fa1a1SMauro Carvalho Chehab sh_css_set_global_isp_config_on_pipe(
18759d4fa1a1SMauro Carvalho Chehab     struct ia_css_pipe *curr_pipe,
18769d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_config *config,
1877c27479d7SDeepak R Varma     struct ia_css_pipe *pipe)
1878c27479d7SDeepak R Varma {
187941022d35SMauro Carvalho Chehab 	int err = 0;
188041022d35SMauro Carvalho Chehab 	int err1 = 0;
188141022d35SMauro Carvalho Chehab 	int err2 = 0;
18829d4fa1a1SMauro Carvalho Chehab 
18839d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("stream=%p, config=%p, pipe=%p", curr_pipe, config, pipe);
18849d4fa1a1SMauro Carvalho Chehab 
18859d4fa1a1SMauro Carvalho Chehab 	err1 = sh_css_init_isp_params_from_config(curr_pipe, curr_pipe->stream->isp_params_configs, config, pipe);
18869d4fa1a1SMauro Carvalho Chehab 
18879d4fa1a1SMauro Carvalho Chehab 	/* Now commit all changes to the SP */
18889d4fa1a1SMauro Carvalho Chehab 	err2 = sh_css_param_update_isp_params(curr_pipe, curr_pipe->stream->isp_params_configs, sh_css_sp_is_running(), pipe);
18899d4fa1a1SMauro Carvalho Chehab 
18909d4fa1a1SMauro Carvalho Chehab 	/* The following code is intentional. The sh_css_init_isp_params_from_config interface
18919d4fa1a1SMauro Carvalho Chehab 	 * throws an error when both DPC and BDS is enabled. The CSS API must pass this error
18929d4fa1a1SMauro Carvalho Chehab 	 * information to the caller, ie. the host. We do not return this error immediately,
18939d4fa1a1SMauro Carvalho Chehab 	 * but instead continue with updating the ISP params to enable testing of features
18949d4fa1a1SMauro Carvalho Chehab 	 * which are currently in TR phase. */
18959d4fa1a1SMauro Carvalho Chehab 
189641022d35SMauro Carvalho Chehab 	err = (err1 != 0) ? err1 : ((err2 != 0) ? err2 : err);
18979d4fa1a1SMauro Carvalho Chehab 
18989d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(err);
18999d4fa1a1SMauro Carvalho Chehab 	return err;
19009d4fa1a1SMauro Carvalho Chehab }
19019d4fa1a1SMauro Carvalho Chehab 
190241022d35SMauro Carvalho Chehab static int
sh_css_set_per_frame_isp_config_on_pipe(struct ia_css_stream * stream,const struct ia_css_isp_config * config,struct ia_css_pipe * pipe)19039d4fa1a1SMauro Carvalho Chehab sh_css_set_per_frame_isp_config_on_pipe(
19049d4fa1a1SMauro Carvalho Chehab     struct ia_css_stream *stream,
19059d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_config *config,
1906c27479d7SDeepak R Varma     struct ia_css_pipe *pipe)
1907c27479d7SDeepak R Varma {
19089d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
19099d4fa1a1SMauro Carvalho Chehab 	bool per_frame_config_created = false;
191041022d35SMauro Carvalho Chehab 	int err = 0;
191141022d35SMauro Carvalho Chehab 	int err1 = 0;
191241022d35SMauro Carvalho Chehab 	int err2 = 0;
191341022d35SMauro Carvalho Chehab 	int err3 = 0;
19149d4fa1a1SMauro Carvalho Chehab 
19159d4fa1a1SMauro Carvalho Chehab 	struct sh_css_ddr_address_map *ddr_ptrs;
19169d4fa1a1SMauro Carvalho Chehab 	struct sh_css_ddr_address_map_size *ddr_ptrs_size;
19179d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params;
19189d4fa1a1SMauro Carvalho Chehab 
19199d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("stream=%p, config=%p, pipe=%p", stream, config, pipe);
19209d4fa1a1SMauro Carvalho Chehab 
1921c27479d7SDeepak R Varma 	if (!pipe) {
192241022d35SMauro Carvalho Chehab 		err = -EINVAL;
19239d4fa1a1SMauro Carvalho Chehab 		goto exit;
19249d4fa1a1SMauro Carvalho Chehab 	}
19259d4fa1a1SMauro Carvalho Chehab 
19269d4fa1a1SMauro Carvalho Chehab 	/* create per-frame ISP params object with default values
19279d4fa1a1SMauro Carvalho Chehab 	 * from stream->isp_params_configs if one doesn't already exist
19289d4fa1a1SMauro Carvalho Chehab 	*/
1929c27479d7SDeepak R Varma 	if (!stream->per_frame_isp_params_configs) {
19309d4fa1a1SMauro Carvalho Chehab 		err = sh_css_create_isp_params(stream,
19319d4fa1a1SMauro Carvalho Chehab 					       &stream->per_frame_isp_params_configs);
193241022d35SMauro Carvalho Chehab 		if (err)
19339d4fa1a1SMauro Carvalho Chehab 			goto exit;
19349d4fa1a1SMauro Carvalho Chehab 		per_frame_config_created = true;
19359d4fa1a1SMauro Carvalho Chehab 	}
19369d4fa1a1SMauro Carvalho Chehab 
19379d4fa1a1SMauro Carvalho Chehab 	params = stream->per_frame_isp_params_configs;
19389d4fa1a1SMauro Carvalho Chehab 
19399d4fa1a1SMauro Carvalho Chehab 	/* update new ISP params object with the new config */
1940c27479d7SDeepak R Varma 	if (!sh_css_init_isp_params_from_global(stream, params, false, pipe)) {
194141022d35SMauro Carvalho Chehab 		err1 = -EINVAL;
19429d4fa1a1SMauro Carvalho Chehab 	}
19439d4fa1a1SMauro Carvalho Chehab 
19449d4fa1a1SMauro Carvalho Chehab 	err2 = sh_css_init_isp_params_from_config(stream->pipes[0], params, config, pipe);
19459d4fa1a1SMauro Carvalho Chehab 
1946c27479d7SDeepak R Varma 	if (per_frame_config_created) {
19479d4fa1a1SMauro Carvalho Chehab 		ddr_ptrs = &params->ddr_ptrs;
19489d4fa1a1SMauro Carvalho Chehab 		ddr_ptrs_size = &params->ddr_ptrs_size;
19499d4fa1a1SMauro Carvalho Chehab 		/* create per pipe reference to general ddr_ptrs */
19509d4fa1a1SMauro Carvalho Chehab 		for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
19519d4fa1a1SMauro Carvalho Chehab 			ref_sh_css_ddr_address_map(ddr_ptrs, &params->pipe_ddr_ptrs[i]);
19529d4fa1a1SMauro Carvalho Chehab 			params->pipe_ddr_ptrs_size[i] = *ddr_ptrs_size;
19539d4fa1a1SMauro Carvalho Chehab 		}
19549d4fa1a1SMauro Carvalho Chehab 	}
19559d4fa1a1SMauro Carvalho Chehab 
19569d4fa1a1SMauro Carvalho Chehab 	/* now commit to ddr */
19579d4fa1a1SMauro Carvalho Chehab 	err3 = sh_css_param_update_isp_params(stream->pipes[0], params, sh_css_sp_is_running(), pipe);
19589d4fa1a1SMauro Carvalho Chehab 
19599d4fa1a1SMauro Carvalho Chehab 	/* The following code is intentional. The sh_css_init_sp_params_from_config and
19609d4fa1a1SMauro Carvalho Chehab 	 * sh_css_init_isp_params_from_config throws an error when both DPC and BDS is enabled.
19619d4fa1a1SMauro Carvalho Chehab 	 * The CSS API must pass this error information to the caller, ie. the host.
19629d4fa1a1SMauro Carvalho Chehab 	 * We do not return this error immediately, but instead continue with updating the ISP params
19639d4fa1a1SMauro Carvalho Chehab 	 *  to enable testing of features which are currently in TR phase. */
196441022d35SMauro Carvalho Chehab 	err = (err1 != 0) ? err1 :
196541022d35SMauro Carvalho Chehab 	      (err2 != 0) ? err2 :
196641022d35SMauro Carvalho Chehab 	      (err3 != 0) ? err3 : err;
19679d4fa1a1SMauro Carvalho Chehab exit:
19689d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(err);
19699d4fa1a1SMauro Carvalho Chehab 	return err;
19709d4fa1a1SMauro Carvalho Chehab }
19719d4fa1a1SMauro Carvalho Chehab 
197241022d35SMauro Carvalho Chehab static int
sh_css_init_isp_params_from_config(struct ia_css_pipe * pipe,struct ia_css_isp_parameters * params,const struct ia_css_isp_config * config,struct ia_css_pipe * pipe_in)19739d4fa1a1SMauro Carvalho Chehab sh_css_init_isp_params_from_config(struct ia_css_pipe *pipe,
19749d4fa1a1SMauro Carvalho Chehab 				   struct ia_css_isp_parameters *params,
19759d4fa1a1SMauro Carvalho Chehab 				   const struct ia_css_isp_config *config,
1976c27479d7SDeepak R Varma 				   struct ia_css_pipe *pipe_in)
1977c27479d7SDeepak R Varma {
197841022d35SMauro Carvalho Chehab 	int err = 0;
19799d4fa1a1SMauro Carvalho Chehab 	bool is_dp_10bpp = true;
19809d4fa1a1SMauro Carvalho Chehab 
19819d4fa1a1SMauro Carvalho Chehab 	assert(pipe);
19829d4fa1a1SMauro Carvalho Chehab 
19839d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("pipe=%p, config=%p, params=%p", pipe, config, params);
19849d4fa1a1SMauro Carvalho Chehab 
19859d4fa1a1SMauro Carvalho Chehab 	ia_css_set_configs(params, config);
19869d4fa1a1SMauro Carvalho Chehab 
19879d4fa1a1SMauro Carvalho Chehab 	sh_css_set_nr_config(params, config->nr_config);
19889d4fa1a1SMauro Carvalho Chehab 	sh_css_set_ee_config(params, config->ee_config);
19899d4fa1a1SMauro Carvalho Chehab 	sh_css_set_baa_config(params, config->baa_config);
19909d4fa1a1SMauro Carvalho Chehab 	if ((pipe->mode < IA_CSS_PIPE_ID_NUM) &&
19919d4fa1a1SMauro Carvalho Chehab 	    (params->pipe_dvs_6axis_config[pipe->mode]))
19929d4fa1a1SMauro Carvalho Chehab 		sh_css_set_pipe_dvs_6axis_config(pipe, params, config->dvs_6axis_config);
19939d4fa1a1SMauro Carvalho Chehab 	sh_css_set_dz_config(params, config->dz_config);
19949d4fa1a1SMauro Carvalho Chehab 	sh_css_set_motion_vector(params, config->motion_vector);
19959d4fa1a1SMauro Carvalho Chehab 	sh_css_set_shading_table(pipe->stream, params, config->shading_table);
19969d4fa1a1SMauro Carvalho Chehab 	sh_css_set_morph_table(params, config->morph_table);
19979d4fa1a1SMauro Carvalho Chehab 	sh_css_set_macc_table(params, config->macc_table);
19989d4fa1a1SMauro Carvalho Chehab 	sh_css_set_gamma_table(params, config->gamma_table);
19999d4fa1a1SMauro Carvalho Chehab 	sh_css_set_ctc_table(params, config->ctc_table);
20009d4fa1a1SMauro Carvalho Chehab 	/* ------ deprecated(bz675) : from ------ */
20019d4fa1a1SMauro Carvalho Chehab 	sh_css_set_shading_settings(params, config->shading_settings);
20029d4fa1a1SMauro Carvalho Chehab 	/* ------ deprecated(bz675) : to ------ */
20039d4fa1a1SMauro Carvalho Chehab 
20049d4fa1a1SMauro Carvalho Chehab 	params->dis_coef_table_changed = (config->dvs_coefs);
20059d4fa1a1SMauro Carvalho Chehab 	params->dvs2_coef_table_changed = (config->dvs2_coefs);
20069d4fa1a1SMauro Carvalho Chehab 
20079d4fa1a1SMauro Carvalho Chehab 	params->output_frame = config->output_frame;
20089d4fa1a1SMauro Carvalho Chehab 	params->isp_parameters_id = config->isp_config_id;
20093c0538fbSMauro Carvalho Chehab 
201041022d35SMauro Carvalho Chehab 	if (0 ==
2011c27479d7SDeepak R Varma 	    sh_css_select_dp_10bpp_config(pipe, &is_dp_10bpp)) {
20129d4fa1a1SMauro Carvalho Chehab 		/* return an error when both DPC and BDS is enabled by the
20139d4fa1a1SMauro Carvalho Chehab 		 * user. */
20149d4fa1a1SMauro Carvalho Chehab 		/* we do not exit from this point immediately to allow internal
20159d4fa1a1SMauro Carvalho Chehab 		 * firmware feature testing. */
20169d4fa1a1SMauro Carvalho Chehab 		if (is_dp_10bpp) {
201741022d35SMauro Carvalho Chehab 			err = -EINVAL;
20189d4fa1a1SMauro Carvalho Chehab 		}
2019c27479d7SDeepak R Varma 	} else {
202041022d35SMauro Carvalho Chehab 		err = -EINVAL;
20219d4fa1a1SMauro Carvalho Chehab 		goto exit;
20229d4fa1a1SMauro Carvalho Chehab 	}
20239d4fa1a1SMauro Carvalho Chehab 
20249d4fa1a1SMauro Carvalho Chehab 	ia_css_set_param_exceptions(pipe, params);
20253c0538fbSMauro Carvalho Chehab 
20269d4fa1a1SMauro Carvalho Chehab exit:
20279d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(err);
20289d4fa1a1SMauro Carvalho Chehab 	return err;
20299d4fa1a1SMauro Carvalho Chehab }
20309d4fa1a1SMauro Carvalho Chehab 
20319d4fa1a1SMauro Carvalho Chehab void
ia_css_stream_get_isp_config(const struct ia_css_stream * stream,struct ia_css_isp_config * config)20329d4fa1a1SMauro Carvalho Chehab ia_css_stream_get_isp_config(
20339d4fa1a1SMauro Carvalho Chehab     const struct ia_css_stream *stream,
20349d4fa1a1SMauro Carvalho Chehab     struct ia_css_isp_config *config)
20359d4fa1a1SMauro Carvalho Chehab {
20369d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("void");
20379d4fa1a1SMauro Carvalho Chehab 	ia_css_pipe_get_isp_config(stream->pipes[0], config);
20389d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("void");
20399d4fa1a1SMauro Carvalho Chehab }
20409d4fa1a1SMauro Carvalho Chehab 
20419d4fa1a1SMauro Carvalho Chehab void
ia_css_pipe_get_isp_config(struct ia_css_pipe * pipe,struct ia_css_isp_config * config)20429d4fa1a1SMauro Carvalho Chehab ia_css_pipe_get_isp_config(struct ia_css_pipe *pipe,
20439d4fa1a1SMauro Carvalho Chehab 			   struct ia_css_isp_config *config)
20449d4fa1a1SMauro Carvalho Chehab {
20459d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params = NULL;
20469d4fa1a1SMauro Carvalho Chehab 
20479d4fa1a1SMauro Carvalho Chehab 	assert(config);
20489d4fa1a1SMauro Carvalho Chehab 
20499d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("config=%p", config);
20509d4fa1a1SMauro Carvalho Chehab 
20519d4fa1a1SMauro Carvalho Chehab 	params = pipe->stream->isp_params_configs;
20529d4fa1a1SMauro Carvalho Chehab 	assert(params);
20539d4fa1a1SMauro Carvalho Chehab 
20549d4fa1a1SMauro Carvalho Chehab 	ia_css_get_configs(params, config);
20559d4fa1a1SMauro Carvalho Chehab 
20569d4fa1a1SMauro Carvalho Chehab 	sh_css_get_ee_config(params, config->ee_config);
20579d4fa1a1SMauro Carvalho Chehab 	sh_css_get_baa_config(params, config->baa_config);
20589d4fa1a1SMauro Carvalho Chehab 	sh_css_get_pipe_dvs_6axis_config(pipe, params, config->dvs_6axis_config);
20599d4fa1a1SMauro Carvalho Chehab 	sh_css_get_macc_table(params, config->macc_table);
20609d4fa1a1SMauro Carvalho Chehab 	sh_css_get_gamma_table(params, config->gamma_table);
20619d4fa1a1SMauro Carvalho Chehab 	sh_css_get_ctc_table(params, config->ctc_table);
20629d4fa1a1SMauro Carvalho Chehab 	sh_css_get_dz_config(params, config->dz_config);
20639d4fa1a1SMauro Carvalho Chehab 	sh_css_get_motion_vector(params, config->motion_vector);
20649d4fa1a1SMauro Carvalho Chehab 	/* ------ deprecated(bz675) : from ------ */
20659d4fa1a1SMauro Carvalho Chehab 	sh_css_get_shading_settings(params, config->shading_settings);
20669d4fa1a1SMauro Carvalho Chehab 	/* ------ deprecated(bz675) : to ------ */
20679d4fa1a1SMauro Carvalho Chehab 
20689d4fa1a1SMauro Carvalho Chehab 	config->output_frame = params->output_frame;
20699d4fa1a1SMauro Carvalho Chehab 	config->isp_config_id = params->isp_parameters_id;
20709d4fa1a1SMauro Carvalho Chehab 
20719d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("void");
20729d4fa1a1SMauro Carvalho Chehab }
20739d4fa1a1SMauro Carvalho Chehab 
20749d4fa1a1SMauro Carvalho Chehab /*
20759d4fa1a1SMauro Carvalho Chehab  * coding style says the return of "mmgr_NULL" is the error signal
20769d4fa1a1SMauro Carvalho Chehab  *
20779d4fa1a1SMauro Carvalho Chehab  * Deprecated: Implement mmgr_realloc()
20789d4fa1a1SMauro Carvalho Chehab  */
realloc_isp_css_mm_buf(ia_css_ptr * curr_buf,size_t * curr_size,size_t needed_size,bool force,int * err)20799d4fa1a1SMauro Carvalho Chehab static bool realloc_isp_css_mm_buf(
2080100e8989SMauro Carvalho Chehab     ia_css_ptr *curr_buf,
20819d4fa1a1SMauro Carvalho Chehab     size_t *curr_size,
20829d4fa1a1SMauro Carvalho Chehab     size_t needed_size,
20839d4fa1a1SMauro Carvalho Chehab     bool force,
20844cc20c9cSHans de Goede     int *err)
20859d4fa1a1SMauro Carvalho Chehab {
20869d4fa1a1SMauro Carvalho Chehab 	s32 id;
20879d4fa1a1SMauro Carvalho Chehab 
208841022d35SMauro Carvalho Chehab 	*err = 0;
20899d4fa1a1SMauro Carvalho Chehab 	/* Possible optimization: add a function sh_css_isp_css_mm_realloc()
20909d4fa1a1SMauro Carvalho Chehab 	 * and implement on top of hmm. */
20919d4fa1a1SMauro Carvalho Chehab 
20929d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
20939d4fa1a1SMauro Carvalho Chehab 
20949d4fa1a1SMauro Carvalho Chehab 	if (!force && *curr_size >= needed_size) {
20959d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE_PRIVATE("false");
20969d4fa1a1SMauro Carvalho Chehab 		return false;
20979d4fa1a1SMauro Carvalho Chehab 	}
20989d4fa1a1SMauro Carvalho Chehab 	/* don't reallocate if single ref to buffer and same size */
20999d4fa1a1SMauro Carvalho Chehab 	if (*curr_size == needed_size && ia_css_refcount_is_single(*curr_buf)) {
21009d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE_PRIVATE("false");
21019d4fa1a1SMauro Carvalho Chehab 		return false;
21029d4fa1a1SMauro Carvalho Chehab 	}
21039d4fa1a1SMauro Carvalho Chehab 
21049d4fa1a1SMauro Carvalho Chehab 	id = IA_CSS_REFCOUNT_PARAM_BUFFER;
21059d4fa1a1SMauro Carvalho Chehab 	ia_css_refcount_decrement(id, *curr_buf);
21064cc20c9cSHans de Goede 	*curr_buf = ia_css_refcount_increment(id, hmm_alloc(needed_size));
21079d4fa1a1SMauro Carvalho Chehab 	if (!*curr_buf) {
210841022d35SMauro Carvalho Chehab 		*err = -ENOMEM;
21099d4fa1a1SMauro Carvalho Chehab 		*curr_size = 0;
21109d4fa1a1SMauro Carvalho Chehab 	} else {
21119d4fa1a1SMauro Carvalho Chehab 		*curr_size = needed_size;
21129d4fa1a1SMauro Carvalho Chehab 	}
21139d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("true");
21149d4fa1a1SMauro Carvalho Chehab 	return true;
21159d4fa1a1SMauro Carvalho Chehab }
21169d4fa1a1SMauro Carvalho Chehab 
reallocate_buffer(ia_css_ptr * curr_buf,size_t * curr_size,size_t needed_size,bool force,int * err)21179d4fa1a1SMauro Carvalho Chehab static bool reallocate_buffer(
2118100e8989SMauro Carvalho Chehab     ia_css_ptr *curr_buf,
21199d4fa1a1SMauro Carvalho Chehab     size_t *curr_size,
21209d4fa1a1SMauro Carvalho Chehab     size_t needed_size,
21219d4fa1a1SMauro Carvalho Chehab     bool force,
212241022d35SMauro Carvalho Chehab     int *err)
21239d4fa1a1SMauro Carvalho Chehab {
21249d4fa1a1SMauro Carvalho Chehab 	bool ret;
21259d4fa1a1SMauro Carvalho Chehab 
21269d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
21279d4fa1a1SMauro Carvalho Chehab 
21289d4fa1a1SMauro Carvalho Chehab 	ret = realloc_isp_css_mm_buf(curr_buf,
21294cc20c9cSHans de Goede 				     curr_size, needed_size, force, err);
21309d4fa1a1SMauro Carvalho Chehab 
21319d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("ret=%d", ret);
21329d4fa1a1SMauro Carvalho Chehab 	return ret;
21339d4fa1a1SMauro Carvalho Chehab }
21349d4fa1a1SMauro Carvalho Chehab 
21359d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_3a_statistics *
ia_css_isp_3a_statistics_allocate(const struct ia_css_3a_grid_info * grid)21369d4fa1a1SMauro Carvalho Chehab ia_css_isp_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid)
21379d4fa1a1SMauro Carvalho Chehab {
21389d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_3a_statistics *me;
21399d4fa1a1SMauro Carvalho Chehab 
21409d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("grid=%p", grid);
21419d4fa1a1SMauro Carvalho Chehab 
21429d4fa1a1SMauro Carvalho Chehab 	assert(grid);
21439d4fa1a1SMauro Carvalho Chehab 
21449d4fa1a1SMauro Carvalho Chehab 	/* MW: Does "grid->enable" also control the histogram output ?? */
21459d4fa1a1SMauro Carvalho Chehab 	if (!grid->enable)
21469d4fa1a1SMauro Carvalho Chehab 		return NULL;
21479d4fa1a1SMauro Carvalho Chehab 
21489955d906SMauro Carvalho Chehab 	me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
21499d4fa1a1SMauro Carvalho Chehab 	if (!me)
21509d4fa1a1SMauro Carvalho Chehab 		goto err;
21519d4fa1a1SMauro Carvalho Chehab 
21529d4fa1a1SMauro Carvalho Chehab 	if (grid->use_dmem) {
21539d4fa1a1SMauro Carvalho Chehab 		me->dmem_size = sizeof(struct ia_css_3a_output) *
21549d4fa1a1SMauro Carvalho Chehab 				grid->aligned_width *
21559d4fa1a1SMauro Carvalho Chehab 				grid->aligned_height;
21569d4fa1a1SMauro Carvalho Chehab 	} else {
21579d4fa1a1SMauro Carvalho Chehab 		me->vmem_size = ISP_S3ATBL_HI_LO_STRIDE_BYTES *
21589d4fa1a1SMauro Carvalho Chehab 				grid->aligned_height;
21599d4fa1a1SMauro Carvalho Chehab 	}
21609d4fa1a1SMauro Carvalho Chehab 	me->hmem_size = sizeof_hmem(HMEM0_ID);
21619d4fa1a1SMauro Carvalho Chehab 
21629d4fa1a1SMauro Carvalho Chehab 	/* All subsections need to be aligned to the system bus width */
21639d4fa1a1SMauro Carvalho Chehab 	me->dmem_size = CEIL_MUL(me->dmem_size, HIVE_ISP_DDR_WORD_BYTES);
21649d4fa1a1SMauro Carvalho Chehab 	me->vmem_size = CEIL_MUL(me->vmem_size, HIVE_ISP_DDR_WORD_BYTES);
21659d4fa1a1SMauro Carvalho Chehab 	me->hmem_size = CEIL_MUL(me->hmem_size, HIVE_ISP_DDR_WORD_BYTES);
21669d4fa1a1SMauro Carvalho Chehab 
21679d4fa1a1SMauro Carvalho Chehab 	me->size = me->dmem_size + me->vmem_size * 2 + me->hmem_size;
21684cc20c9cSHans de Goede 	me->data_ptr = hmm_alloc(me->size);
21699d4fa1a1SMauro Carvalho Chehab 	if (me->data_ptr == mmgr_NULL) {
21709955d906SMauro Carvalho Chehab 		kvfree(me);
21719d4fa1a1SMauro Carvalho Chehab 		me = NULL;
21729d4fa1a1SMauro Carvalho Chehab 		goto err;
21739d4fa1a1SMauro Carvalho Chehab 	}
21749d4fa1a1SMauro Carvalho Chehab 	if (me->dmem_size)
21759d4fa1a1SMauro Carvalho Chehab 		me->data.dmem.s3a_tbl = me->data_ptr;
21769d4fa1a1SMauro Carvalho Chehab 	if (me->vmem_size) {
21779d4fa1a1SMauro Carvalho Chehab 		me->data.vmem.s3a_tbl_hi = me->data_ptr + me->dmem_size;
21789d4fa1a1SMauro Carvalho Chehab 		me->data.vmem.s3a_tbl_lo = me->data_ptr + me->dmem_size + me->vmem_size;
21799d4fa1a1SMauro Carvalho Chehab 	}
21809d4fa1a1SMauro Carvalho Chehab 	if (me->hmem_size)
21819d4fa1a1SMauro Carvalho Chehab 		me->data_hmem.rgby_tbl = me->data_ptr + me->dmem_size + 2 * me->vmem_size;
21829d4fa1a1SMauro Carvalho Chehab 
21839d4fa1a1SMauro Carvalho Chehab err:
21849d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("return=%p", me);
21859d4fa1a1SMauro Carvalho Chehab 	return me;
21869d4fa1a1SMauro Carvalho Chehab }
21879d4fa1a1SMauro Carvalho Chehab 
21889d4fa1a1SMauro Carvalho Chehab void
ia_css_isp_3a_statistics_free(struct ia_css_isp_3a_statistics * me)21899d4fa1a1SMauro Carvalho Chehab ia_css_isp_3a_statistics_free(struct ia_css_isp_3a_statistics *me)
21909d4fa1a1SMauro Carvalho Chehab {
21919d4fa1a1SMauro Carvalho Chehab 	if (me) {
21929d4fa1a1SMauro Carvalho Chehab 		hmm_free(me->data_ptr);
21939955d906SMauro Carvalho Chehab 		kvfree(me);
21949d4fa1a1SMauro Carvalho Chehab 	}
21959d4fa1a1SMauro Carvalho Chehab }
21969d4fa1a1SMauro Carvalho Chehab 
ia_css_skc_dvs_statistics_allocate(void)21979d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_skc_dvs_statistics *ia_css_skc_dvs_statistics_allocate(void)
21989d4fa1a1SMauro Carvalho Chehab {
21999d4fa1a1SMauro Carvalho Chehab 	return NULL;
22009d4fa1a1SMauro Carvalho Chehab }
22019d4fa1a1SMauro Carvalho Chehab 
22029d4fa1a1SMauro Carvalho Chehab struct ia_css_metadata *
ia_css_metadata_allocate(const struct ia_css_metadata_info * metadata_info)22039d4fa1a1SMauro Carvalho Chehab ia_css_metadata_allocate(const struct ia_css_metadata_info *metadata_info)
22049d4fa1a1SMauro Carvalho Chehab {
22059d4fa1a1SMauro Carvalho Chehab 	struct ia_css_metadata *md = NULL;
22069d4fa1a1SMauro Carvalho Chehab 
22079d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("");
22089d4fa1a1SMauro Carvalho Chehab 
22099d4fa1a1SMauro Carvalho Chehab 	if (metadata_info->size == 0)
22109d4fa1a1SMauro Carvalho Chehab 		return NULL;
22119d4fa1a1SMauro Carvalho Chehab 
22129955d906SMauro Carvalho Chehab 	md = kvmalloc(sizeof(*md), GFP_KERNEL);
22139d4fa1a1SMauro Carvalho Chehab 	if (!md)
22149d4fa1a1SMauro Carvalho Chehab 		goto error;
22159d4fa1a1SMauro Carvalho Chehab 
22169d4fa1a1SMauro Carvalho Chehab 	md->info = *metadata_info;
22179d4fa1a1SMauro Carvalho Chehab 	md->exp_id = 0;
22184cc20c9cSHans de Goede 	md->address = hmm_alloc(metadata_info->size);
22199d4fa1a1SMauro Carvalho Chehab 	if (md->address == mmgr_NULL)
22209d4fa1a1SMauro Carvalho Chehab 		goto error;
22219d4fa1a1SMauro Carvalho Chehab 
22229d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("return=%p", md);
22239d4fa1a1SMauro Carvalho Chehab 	return md;
22249d4fa1a1SMauro Carvalho Chehab 
22259d4fa1a1SMauro Carvalho Chehab error:
22269d4fa1a1SMauro Carvalho Chehab 	ia_css_metadata_free(md);
22279d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("return=%p", NULL);
22289d4fa1a1SMauro Carvalho Chehab 	return NULL;
22299d4fa1a1SMauro Carvalho Chehab }
22309d4fa1a1SMauro Carvalho Chehab 
22319d4fa1a1SMauro Carvalho Chehab void
ia_css_metadata_free(struct ia_css_metadata * me)22329d4fa1a1SMauro Carvalho Chehab ia_css_metadata_free(struct ia_css_metadata *me)
22339d4fa1a1SMauro Carvalho Chehab {
22349d4fa1a1SMauro Carvalho Chehab 	if (me) {
22359d4fa1a1SMauro Carvalho Chehab 		/* The enter and leave macros are placed inside
22369d4fa1a1SMauro Carvalho Chehab 		 * the condition to avoid false logging of metadata
22379d4fa1a1SMauro Carvalho Chehab 		 * free events when metadata is disabled.
22389d4fa1a1SMauro Carvalho Chehab 		 * We found this to be confusing during development
22399d4fa1a1SMauro Carvalho Chehab 		 * and debugging. */
22409d4fa1a1SMauro Carvalho Chehab 		IA_CSS_ENTER("me=%p", me);
22419d4fa1a1SMauro Carvalho Chehab 		hmm_free(me->address);
22429955d906SMauro Carvalho Chehab 		kvfree(me);
22439d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE("void");
22449d4fa1a1SMauro Carvalho Chehab 	}
22459d4fa1a1SMauro Carvalho Chehab }
22469d4fa1a1SMauro Carvalho Chehab 
22479d4fa1a1SMauro Carvalho Chehab void
ia_css_metadata_free_multiple(unsigned int num_bufs,struct ia_css_metadata ** bufs)22489d4fa1a1SMauro Carvalho Chehab ia_css_metadata_free_multiple(unsigned int num_bufs,
22499d4fa1a1SMauro Carvalho Chehab 			      struct ia_css_metadata **bufs)
22509d4fa1a1SMauro Carvalho Chehab {
22519d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
22529d4fa1a1SMauro Carvalho Chehab 
22539d4fa1a1SMauro Carvalho Chehab 	if (bufs) {
22549d4fa1a1SMauro Carvalho Chehab 		for (i = 0; i < num_bufs; i++)
22559d4fa1a1SMauro Carvalho Chehab 			ia_css_metadata_free(bufs[i]);
22569d4fa1a1SMauro Carvalho Chehab 	}
22579d4fa1a1SMauro Carvalho Chehab }
22589d4fa1a1SMauro Carvalho Chehab 
22599d4fa1a1SMauro Carvalho Chehab static unsigned int g_param_buffer_dequeue_count;
22609d4fa1a1SMauro Carvalho Chehab static unsigned int g_param_buffer_enqueue_count;
22619d4fa1a1SMauro Carvalho Chehab 
226241022d35SMauro Carvalho Chehab int
ia_css_stream_isp_parameters_init(struct ia_css_stream * stream)2263c27479d7SDeepak R Varma ia_css_stream_isp_parameters_init(struct ia_css_stream *stream)
2264c27479d7SDeepak R Varma {
226541022d35SMauro Carvalho Chehab 	int err = 0;
22669d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
22679d4fa1a1SMauro Carvalho Chehab 	struct sh_css_ddr_address_map *ddr_ptrs;
22689d4fa1a1SMauro Carvalho Chehab 	struct sh_css_ddr_address_map_size *ddr_ptrs_size;
22699d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params;
22709d4fa1a1SMauro Carvalho Chehab 
22719d4fa1a1SMauro Carvalho Chehab 	assert(stream);
22729d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
22739d4fa1a1SMauro Carvalho Chehab 
2274c27479d7SDeepak R Varma 	if (!stream) {
227541022d35SMauro Carvalho Chehab 		IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
227641022d35SMauro Carvalho Chehab 		return -EINVAL;
22779d4fa1a1SMauro Carvalho Chehab 	}
22789d4fa1a1SMauro Carvalho Chehab 	/* TMP: tracking of paramsets */
22799d4fa1a1SMauro Carvalho Chehab 	g_param_buffer_dequeue_count = 0;
22809d4fa1a1SMauro Carvalho Chehab 	g_param_buffer_enqueue_count = 0;
22819d4fa1a1SMauro Carvalho Chehab 
22829d4fa1a1SMauro Carvalho Chehab 	stream->per_frame_isp_params_configs = NULL;
22839d4fa1a1SMauro Carvalho Chehab 	err = sh_css_create_isp_params(stream,
22849d4fa1a1SMauro Carvalho Chehab 				       &stream->isp_params_configs);
228541022d35SMauro Carvalho Chehab 	if (err)
22869d4fa1a1SMauro Carvalho Chehab 		goto ERR;
22879d4fa1a1SMauro Carvalho Chehab 
22889d4fa1a1SMauro Carvalho Chehab 	params = stream->isp_params_configs;
2289c27479d7SDeepak R Varma 	if (!sh_css_init_isp_params_from_global(stream, params, true, NULL)) {
22909d4fa1a1SMauro Carvalho Chehab 		/* we do not return the error immediately to enable internal
22919d4fa1a1SMauro Carvalho Chehab 		 * firmware feature testing */
229241022d35SMauro Carvalho Chehab 		err = -EINVAL;
22939d4fa1a1SMauro Carvalho Chehab 	}
22949d4fa1a1SMauro Carvalho Chehab 
22959d4fa1a1SMauro Carvalho Chehab 	ddr_ptrs = &params->ddr_ptrs;
22969d4fa1a1SMauro Carvalho Chehab 	ddr_ptrs_size = &params->ddr_ptrs_size;
22979d4fa1a1SMauro Carvalho Chehab 
22989d4fa1a1SMauro Carvalho Chehab 	/* create per pipe reference to general ddr_ptrs */
2299c27479d7SDeepak R Varma 	for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
23009d4fa1a1SMauro Carvalho Chehab 		ref_sh_css_ddr_address_map(ddr_ptrs, &params->pipe_ddr_ptrs[i]);
23019d4fa1a1SMauro Carvalho Chehab 		params->pipe_ddr_ptrs_size[i] = *ddr_ptrs_size;
23029d4fa1a1SMauro Carvalho Chehab 	}
23039d4fa1a1SMauro Carvalho Chehab 
23049d4fa1a1SMauro Carvalho Chehab ERR:
23059d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(err);
23069d4fa1a1SMauro Carvalho Chehab 	return err;
23079d4fa1a1SMauro Carvalho Chehab }
23089d4fa1a1SMauro Carvalho Chehab 
23099d4fa1a1SMauro Carvalho Chehab static void
ia_css_set_sdis_config(struct ia_css_isp_parameters * params,const struct ia_css_dvs_coefficients * dvs_coefs)23109d4fa1a1SMauro Carvalho Chehab ia_css_set_sdis_config(
23119d4fa1a1SMauro Carvalho Chehab     struct ia_css_isp_parameters *params,
23129d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs_coefficients *dvs_coefs)
23139d4fa1a1SMauro Carvalho Chehab {
23149d4fa1a1SMauro Carvalho Chehab 	ia_css_set_sdis_horicoef_config(params, dvs_coefs);
23159d4fa1a1SMauro Carvalho Chehab 	ia_css_set_sdis_vertcoef_config(params, dvs_coefs);
23169d4fa1a1SMauro Carvalho Chehab 	ia_css_set_sdis_horiproj_config(params, dvs_coefs);
23179d4fa1a1SMauro Carvalho Chehab 	ia_css_set_sdis_vertproj_config(params, dvs_coefs);
23189d4fa1a1SMauro Carvalho Chehab }
23199d4fa1a1SMauro Carvalho Chehab 
23209d4fa1a1SMauro Carvalho Chehab static void
ia_css_set_sdis2_config(struct ia_css_isp_parameters * params,const struct ia_css_dvs2_coefficients * dvs2_coefs)23219d4fa1a1SMauro Carvalho Chehab ia_css_set_sdis2_config(
23229d4fa1a1SMauro Carvalho Chehab     struct ia_css_isp_parameters *params,
23239d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs2_coefficients *dvs2_coefs)
23249d4fa1a1SMauro Carvalho Chehab {
23259d4fa1a1SMauro Carvalho Chehab 	ia_css_set_sdis2_horicoef_config(params, dvs2_coefs);
23269d4fa1a1SMauro Carvalho Chehab 	ia_css_set_sdis2_vertcoef_config(params, dvs2_coefs);
23279d4fa1a1SMauro Carvalho Chehab 	ia_css_set_sdis2_horiproj_config(params, dvs2_coefs);
23289d4fa1a1SMauro Carvalho Chehab 	ia_css_set_sdis2_vertproj_config(params, dvs2_coefs);
23299d4fa1a1SMauro Carvalho Chehab }
23309d4fa1a1SMauro Carvalho Chehab 
233141022d35SMauro Carvalho Chehab static int
sh_css_create_isp_params(struct ia_css_stream * stream,struct ia_css_isp_parameters ** isp_params_out)23329d4fa1a1SMauro Carvalho Chehab sh_css_create_isp_params(struct ia_css_stream *stream,
2333c27479d7SDeepak R Varma 			 struct ia_css_isp_parameters **isp_params_out)
2334c27479d7SDeepak R Varma {
23359d4fa1a1SMauro Carvalho Chehab 	bool succ = true;
23369d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
23379d4fa1a1SMauro Carvalho Chehab 	struct sh_css_ddr_address_map *ddr_ptrs;
23389d4fa1a1SMauro Carvalho Chehab 	struct sh_css_ddr_address_map_size *ddr_ptrs_size;
233958043dbfSMauro Carvalho Chehab 	int err;
23409d4fa1a1SMauro Carvalho Chehab 	size_t params_size;
23419d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params =
23429955d906SMauro Carvalho Chehab 	kvmalloc(sizeof(struct ia_css_isp_parameters), GFP_KERNEL);
23439d4fa1a1SMauro Carvalho Chehab 
2344c27479d7SDeepak R Varma 	if (!params) {
23459d4fa1a1SMauro Carvalho Chehab 		*isp_params_out = NULL;
234641022d35SMauro Carvalho Chehab 		err = -ENOMEM;
23479d4fa1a1SMauro Carvalho Chehab 		IA_CSS_ERROR("%s:%d error: cannot allocate memory", __FILE__, __LINE__);
23489d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE_ERR_PRIVATE(err);
23499d4fa1a1SMauro Carvalho Chehab 		return err;
2350c27479d7SDeepak R Varma 	} else {
23519d4fa1a1SMauro Carvalho Chehab 		memset(params, 0, sizeof(struct ia_css_isp_parameters));
23529d4fa1a1SMauro Carvalho Chehab 	}
23539d4fa1a1SMauro Carvalho Chehab 
23549d4fa1a1SMauro Carvalho Chehab 	ddr_ptrs = &params->ddr_ptrs;
23559d4fa1a1SMauro Carvalho Chehab 	ddr_ptrs_size = &params->ddr_ptrs_size;
23569d4fa1a1SMauro Carvalho Chehab 
2357c27479d7SDeepak R Varma 	for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
23589d4fa1a1SMauro Carvalho Chehab 		memset(&params->pipe_ddr_ptrs[i], 0,
23599d4fa1a1SMauro Carvalho Chehab 		       sizeof(params->pipe_ddr_ptrs[i]));
23609d4fa1a1SMauro Carvalho Chehab 		memset(&params->pipe_ddr_ptrs_size[i], 0,
23619d4fa1a1SMauro Carvalho Chehab 		       sizeof(params->pipe_ddr_ptrs_size[i]));
23629d4fa1a1SMauro Carvalho Chehab 	}
23639d4fa1a1SMauro Carvalho Chehab 
23649d4fa1a1SMauro Carvalho Chehab 	memset(ddr_ptrs, 0, sizeof(*ddr_ptrs));
23659d4fa1a1SMauro Carvalho Chehab 	memset(ddr_ptrs_size, 0, sizeof(*ddr_ptrs_size));
23669d4fa1a1SMauro Carvalho Chehab 
23679d4fa1a1SMauro Carvalho Chehab 	params_size = sizeof(params->uds);
23689d4fa1a1SMauro Carvalho Chehab 	ddr_ptrs_size->isp_param = params_size;
23699d4fa1a1SMauro Carvalho Chehab 	ddr_ptrs->isp_param =
23709d4fa1a1SMauro Carvalho Chehab 	ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_BUFFER,
23714cc20c9cSHans de Goede 				  hmm_alloc(params_size));
23729d4fa1a1SMauro Carvalho Chehab 	succ &= (ddr_ptrs->isp_param != mmgr_NULL);
23739d4fa1a1SMauro Carvalho Chehab 
23749d4fa1a1SMauro Carvalho Chehab 	ddr_ptrs_size->macc_tbl = sizeof(struct ia_css_macc_table);
23759d4fa1a1SMauro Carvalho Chehab 	ddr_ptrs->macc_tbl =
23769d4fa1a1SMauro Carvalho Chehab 	ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_BUFFER,
23774cc20c9cSHans de Goede 				  hmm_alloc(sizeof(struct ia_css_macc_table)));
23789d4fa1a1SMauro Carvalho Chehab 	succ &= (ddr_ptrs->macc_tbl != mmgr_NULL);
23799d4fa1a1SMauro Carvalho Chehab 
23809d4fa1a1SMauro Carvalho Chehab 	*isp_params_out = params;
238158043dbfSMauro Carvalho Chehab 
238258043dbfSMauro Carvalho Chehab 	if (!succ)
238358043dbfSMauro Carvalho Chehab 		return -ENOMEM;
238458043dbfSMauro Carvalho Chehab 
238558043dbfSMauro Carvalho Chehab 	return 0;
23869d4fa1a1SMauro Carvalho Chehab }
23879d4fa1a1SMauro Carvalho Chehab 
23889d4fa1a1SMauro Carvalho Chehab static bool
sh_css_init_isp_params_from_global(struct ia_css_stream * stream,struct ia_css_isp_parameters * params,bool use_default_config,struct ia_css_pipe * pipe_in)23899d4fa1a1SMauro Carvalho Chehab sh_css_init_isp_params_from_global(struct ia_css_stream *stream,
23909d4fa1a1SMauro Carvalho Chehab 				   struct ia_css_isp_parameters *params,
23919d4fa1a1SMauro Carvalho Chehab 				   bool use_default_config,
23929d4fa1a1SMauro Carvalho Chehab 				   struct ia_css_pipe *pipe_in)
23939d4fa1a1SMauro Carvalho Chehab {
23949d4fa1a1SMauro Carvalho Chehab 	bool retval = true;
23959d4fa1a1SMauro Carvalho Chehab 	int i = 0;
23969d4fa1a1SMauro Carvalho Chehab 	bool is_dp_10bpp = true;
23979d4fa1a1SMauro Carvalho Chehab 	unsigned int isp_pipe_version = ia_css_pipe_get_isp_pipe_version(
23989d4fa1a1SMauro Carvalho Chehab 					    stream->pipes[0]);
23999d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *stream_params = stream->isp_params_configs;
24009d4fa1a1SMauro Carvalho Chehab 
24019d4fa1a1SMauro Carvalho Chehab 	if (!use_default_config && !stream_params) {
24029d4fa1a1SMauro Carvalho Chehab 		retval = false;
24039d4fa1a1SMauro Carvalho Chehab 		goto exit;
24049d4fa1a1SMauro Carvalho Chehab 	}
24059d4fa1a1SMauro Carvalho Chehab 
24069d4fa1a1SMauro Carvalho Chehab 	params->output_frame = NULL;
24079d4fa1a1SMauro Carvalho Chehab 	params->isp_parameters_id = 0;
24089d4fa1a1SMauro Carvalho Chehab 
24099d4fa1a1SMauro Carvalho Chehab 	if (use_default_config) {
24109d4fa1a1SMauro Carvalho Chehab 		ia_css_set_xnr3_config(params, &default_xnr3_config);
24119d4fa1a1SMauro Carvalho Chehab 
24129d4fa1a1SMauro Carvalho Chehab 		sh_css_set_nr_config(params, &default_nr_config);
24139d4fa1a1SMauro Carvalho Chehab 		sh_css_set_ee_config(params, &default_ee_config);
24149d4fa1a1SMauro Carvalho Chehab 		if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_1)
24159d4fa1a1SMauro Carvalho Chehab 			sh_css_set_macc_table(params, &default_macc_table);
24169d4fa1a1SMauro Carvalho Chehab 		else if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_2_2)
24179d4fa1a1SMauro Carvalho Chehab 			sh_css_set_macc_table(params, &default_macc2_table);
24189d4fa1a1SMauro Carvalho Chehab 		sh_css_set_gamma_table(params, &default_gamma_table);
24199d4fa1a1SMauro Carvalho Chehab 		sh_css_set_ctc_table(params, &default_ctc_table);
24209d4fa1a1SMauro Carvalho Chehab 		sh_css_set_baa_config(params, &default_baa_config);
24219d4fa1a1SMauro Carvalho Chehab 		sh_css_set_dz_config(params, &default_dz_config);
24229d4fa1a1SMauro Carvalho Chehab 		/* ------ deprecated(bz675) : from ------ */
24239d4fa1a1SMauro Carvalho Chehab 		sh_css_set_shading_settings(params, &default_shading_settings);
24249d4fa1a1SMauro Carvalho Chehab 		/* ------ deprecated(bz675) : to ------ */
24259d4fa1a1SMauro Carvalho Chehab 
24269d4fa1a1SMauro Carvalho Chehab 		ia_css_set_s3a_config(params, &default_3a_config);
24279d4fa1a1SMauro Carvalho Chehab 		ia_css_set_wb_config(params, &default_wb_config);
24289d4fa1a1SMauro Carvalho Chehab 		ia_css_set_csc_config(params, &default_cc_config);
24299d4fa1a1SMauro Carvalho Chehab 		ia_css_set_tnr_config(params, &default_tnr_config);
24309d4fa1a1SMauro Carvalho Chehab 		ia_css_set_ob_config(params, &default_ob_config);
24319d4fa1a1SMauro Carvalho Chehab 		ia_css_set_dp_config(params, &default_dp_config);
24329d4fa1a1SMauro Carvalho Chehab 
24333c0538fbSMauro Carvalho Chehab 		ia_css_set_param_exceptions(pipe_in, params);
24349d4fa1a1SMauro Carvalho Chehab 
24359d4fa1a1SMauro Carvalho Chehab 		ia_css_set_de_config(params, &default_de_config);
24369d4fa1a1SMauro Carvalho Chehab 		ia_css_set_gc_config(params, &default_gc_config);
24379d4fa1a1SMauro Carvalho Chehab 		ia_css_set_anr_config(params, &default_anr_config);
24389d4fa1a1SMauro Carvalho Chehab 		ia_css_set_anr2_config(params, &default_anr_thres);
24399d4fa1a1SMauro Carvalho Chehab 		ia_css_set_ce_config(params, &default_ce_config);
24409d4fa1a1SMauro Carvalho Chehab 		ia_css_set_xnr_table_config(params, &default_xnr_table);
24419d4fa1a1SMauro Carvalho Chehab 		ia_css_set_ecd_config(params, &default_ecd_config);
24429d4fa1a1SMauro Carvalho Chehab 		ia_css_set_ynr_config(params, &default_ynr_config);
24439d4fa1a1SMauro Carvalho Chehab 		ia_css_set_fc_config(params, &default_fc_config);
24449d4fa1a1SMauro Carvalho Chehab 		ia_css_set_cnr_config(params, &default_cnr_config);
24459d4fa1a1SMauro Carvalho Chehab 		ia_css_set_macc_config(params, &default_macc_config);
24469d4fa1a1SMauro Carvalho Chehab 		ia_css_set_ctc_config(params, &default_ctc_config);
24479d4fa1a1SMauro Carvalho Chehab 		ia_css_set_aa_config(params, &default_aa_config);
24489d4fa1a1SMauro Carvalho Chehab 		ia_css_set_r_gamma_config(params, &default_r_gamma_table);
24499d4fa1a1SMauro Carvalho Chehab 		ia_css_set_g_gamma_config(params, &default_g_gamma_table);
24509d4fa1a1SMauro Carvalho Chehab 		ia_css_set_b_gamma_config(params, &default_b_gamma_table);
24519d4fa1a1SMauro Carvalho Chehab 		ia_css_set_yuv2rgb_config(params, &default_yuv2rgb_cc_config);
24529d4fa1a1SMauro Carvalho Chehab 		ia_css_set_rgb2yuv_config(params, &default_rgb2yuv_cc_config);
24539d4fa1a1SMauro Carvalho Chehab 		ia_css_set_xnr_config(params, &default_xnr_config);
24549d4fa1a1SMauro Carvalho Chehab 		ia_css_set_sdis_config(params, &default_sdis_config);
24559d4fa1a1SMauro Carvalho Chehab 		ia_css_set_sdis2_config(params, &default_sdis2_config);
24569d4fa1a1SMauro Carvalho Chehab 		ia_css_set_formats_config(params, &default_formats_config);
24579d4fa1a1SMauro Carvalho Chehab 
24589d4fa1a1SMauro Carvalho Chehab 		params->fpn_config.data = NULL;
24599d4fa1a1SMauro Carvalho Chehab 		params->config_changed[IA_CSS_FPN_ID] = true;
24609d4fa1a1SMauro Carvalho Chehab 		params->fpn_config.enabled = 0;
24619d4fa1a1SMauro Carvalho Chehab 
24629d4fa1a1SMauro Carvalho Chehab 		params->motion_config = default_motion_config;
24639d4fa1a1SMauro Carvalho Chehab 		params->motion_config_changed = true;
24649d4fa1a1SMauro Carvalho Chehab 
24659d4fa1a1SMauro Carvalho Chehab 		params->morph_table = NULL;
24669d4fa1a1SMauro Carvalho Chehab 		params->morph_table_changed = true;
24679d4fa1a1SMauro Carvalho Chehab 
24689d4fa1a1SMauro Carvalho Chehab 		params->sc_table = NULL;
24699d4fa1a1SMauro Carvalho Chehab 		params->sc_table_changed = true;
24709d4fa1a1SMauro Carvalho Chehab 
24719d4fa1a1SMauro Carvalho Chehab 		ia_css_sdis2_clear_coefficients(&params->dvs2_coefs);
24729d4fa1a1SMauro Carvalho Chehab 		params->dvs2_coef_table_changed = true;
24739d4fa1a1SMauro Carvalho Chehab 
24749d4fa1a1SMauro Carvalho Chehab 		ia_css_sdis_clear_coefficients(&params->dvs_coefs);
24759d4fa1a1SMauro Carvalho Chehab 		params->dis_coef_table_changed = true;
24769d4fa1a1SMauro Carvalho Chehab 	} else {
24779d4fa1a1SMauro Carvalho Chehab 		ia_css_set_xnr3_config(params, &stream_params->xnr3_config);
24789d4fa1a1SMauro Carvalho Chehab 
24799d4fa1a1SMauro Carvalho Chehab 		sh_css_set_nr_config(params, &stream_params->nr_config);
24809d4fa1a1SMauro Carvalho Chehab 		sh_css_set_ee_config(params, &stream_params->ee_config);
24819d4fa1a1SMauro Carvalho Chehab 		if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_1)
24829d4fa1a1SMauro Carvalho Chehab 			sh_css_set_macc_table(params, &stream_params->macc_table);
24839d4fa1a1SMauro Carvalho Chehab 		else if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_2_2)
24849d4fa1a1SMauro Carvalho Chehab 			sh_css_set_macc_table(params, &stream_params->macc_table);
24859d4fa1a1SMauro Carvalho Chehab 		sh_css_set_gamma_table(params, &stream_params->gc_table);
24869d4fa1a1SMauro Carvalho Chehab 		sh_css_set_ctc_table(params, &stream_params->ctc_table);
24879d4fa1a1SMauro Carvalho Chehab 		sh_css_set_baa_config(params, &stream_params->bds_config);
24889d4fa1a1SMauro Carvalho Chehab 		sh_css_set_dz_config(params, &stream_params->dz_config);
24899d4fa1a1SMauro Carvalho Chehab 		/* ------ deprecated(bz675) : from ------ */
24909d4fa1a1SMauro Carvalho Chehab 		sh_css_set_shading_settings(params, &stream_params->shading_settings);
24919d4fa1a1SMauro Carvalho Chehab 		/* ------ deprecated(bz675) : to ------ */
24929d4fa1a1SMauro Carvalho Chehab 
24939d4fa1a1SMauro Carvalho Chehab 		ia_css_set_s3a_config(params, &stream_params->s3a_config);
24949d4fa1a1SMauro Carvalho Chehab 		ia_css_set_wb_config(params, &stream_params->wb_config);
24959d4fa1a1SMauro Carvalho Chehab 		ia_css_set_csc_config(params, &stream_params->cc_config);
24969d4fa1a1SMauro Carvalho Chehab 		ia_css_set_tnr_config(params, &stream_params->tnr_config);
24979d4fa1a1SMauro Carvalho Chehab 		ia_css_set_ob_config(params, &stream_params->ob_config);
24989d4fa1a1SMauro Carvalho Chehab 		ia_css_set_dp_config(params, &stream_params->dp_config);
24999d4fa1a1SMauro Carvalho Chehab 		ia_css_set_de_config(params, &stream_params->de_config);
25009d4fa1a1SMauro Carvalho Chehab 		ia_css_set_gc_config(params, &stream_params->gc_config);
25019d4fa1a1SMauro Carvalho Chehab 		ia_css_set_anr_config(params, &stream_params->anr_config);
25029d4fa1a1SMauro Carvalho Chehab 		ia_css_set_anr2_config(params, &stream_params->anr_thres);
25039d4fa1a1SMauro Carvalho Chehab 		ia_css_set_ce_config(params, &stream_params->ce_config);
25049d4fa1a1SMauro Carvalho Chehab 		ia_css_set_xnr_table_config(params, &stream_params->xnr_table);
25059d4fa1a1SMauro Carvalho Chehab 		ia_css_set_ecd_config(params, &stream_params->ecd_config);
25069d4fa1a1SMauro Carvalho Chehab 		ia_css_set_ynr_config(params, &stream_params->ynr_config);
25079d4fa1a1SMauro Carvalho Chehab 		ia_css_set_fc_config(params, &stream_params->fc_config);
25089d4fa1a1SMauro Carvalho Chehab 		ia_css_set_cnr_config(params, &stream_params->cnr_config);
25099d4fa1a1SMauro Carvalho Chehab 		ia_css_set_macc_config(params, &stream_params->macc_config);
25109d4fa1a1SMauro Carvalho Chehab 		ia_css_set_ctc_config(params, &stream_params->ctc_config);
25119d4fa1a1SMauro Carvalho Chehab 		ia_css_set_aa_config(params, &stream_params->aa_config);
25129d4fa1a1SMauro Carvalho Chehab 		ia_css_set_r_gamma_config(params, &stream_params->r_gamma_table);
25139d4fa1a1SMauro Carvalho Chehab 		ia_css_set_g_gamma_config(params, &stream_params->g_gamma_table);
25149d4fa1a1SMauro Carvalho Chehab 		ia_css_set_b_gamma_config(params, &stream_params->b_gamma_table);
25159d4fa1a1SMauro Carvalho Chehab 		ia_css_set_yuv2rgb_config(params, &stream_params->yuv2rgb_cc_config);
25169d4fa1a1SMauro Carvalho Chehab 		ia_css_set_rgb2yuv_config(params, &stream_params->rgb2yuv_cc_config);
25179d4fa1a1SMauro Carvalho Chehab 		ia_css_set_xnr_config(params, &stream_params->xnr_config);
25189d4fa1a1SMauro Carvalho Chehab 		ia_css_set_formats_config(params, &stream_params->formats_config);
25199d4fa1a1SMauro Carvalho Chehab 
25209d4fa1a1SMauro Carvalho Chehab 		for (i = 0; i < stream->num_pipes; i++) {
252141022d35SMauro Carvalho Chehab 			if (0 ==
25229d4fa1a1SMauro Carvalho Chehab 			    sh_css_select_dp_10bpp_config(stream->pipes[i], &is_dp_10bpp)) {
25239d4fa1a1SMauro Carvalho Chehab 				/* set the return value as false if both DPC and
25249d4fa1a1SMauro Carvalho Chehab 				 * BDS is enabled by the user. But we do not return
25259d4fa1a1SMauro Carvalho Chehab 				 * the value immediately to enable internal firmware
25269d4fa1a1SMauro Carvalho Chehab 				 * feature testing. */
252735009261SMauro Carvalho Chehab 				retval = !is_dp_10bpp;
25283c0538fbSMauro Carvalho Chehab 				/* FIXME: should it ignore this error? */
25299d4fa1a1SMauro Carvalho Chehab 			} else {
25309d4fa1a1SMauro Carvalho Chehab 				retval = false;
25319d4fa1a1SMauro Carvalho Chehab 				goto exit;
25329d4fa1a1SMauro Carvalho Chehab 			}
25333c0538fbSMauro Carvalho Chehab 		}
25349d4fa1a1SMauro Carvalho Chehab 
25359d4fa1a1SMauro Carvalho Chehab 		ia_css_set_param_exceptions(pipe_in, params);
25369d4fa1a1SMauro Carvalho Chehab 
25379d4fa1a1SMauro Carvalho Chehab 		params->fpn_config.data = stream_params->fpn_config.data;
25389d4fa1a1SMauro Carvalho Chehab 		params->config_changed[IA_CSS_FPN_ID] =
25399d4fa1a1SMauro Carvalho Chehab 		    stream_params->config_changed[IA_CSS_FPN_ID];
25409d4fa1a1SMauro Carvalho Chehab 		params->fpn_config.enabled = stream_params->fpn_config.enabled;
25419d4fa1a1SMauro Carvalho Chehab 
25429d4fa1a1SMauro Carvalho Chehab 		sh_css_set_motion_vector(params, &stream_params->motion_config);
25439d4fa1a1SMauro Carvalho Chehab 		sh_css_set_morph_table(params, stream_params->morph_table);
25449d4fa1a1SMauro Carvalho Chehab 
25459d4fa1a1SMauro Carvalho Chehab 		if (stream_params->sc_table) {
25469d4fa1a1SMauro Carvalho Chehab 			sh_css_set_shading_table(stream, params, stream_params->sc_table);
25479d4fa1a1SMauro Carvalho Chehab 		} else {
25489d4fa1a1SMauro Carvalho Chehab 			params->sc_table = NULL;
25499d4fa1a1SMauro Carvalho Chehab 			params->sc_table_changed = true;
25509d4fa1a1SMauro Carvalho Chehab 		}
25519d4fa1a1SMauro Carvalho Chehab 
25529d4fa1a1SMauro Carvalho Chehab 		/* Only IA_CSS_PIPE_ID_VIDEO & IA_CSS_PIPE_ID_CAPTURE will support dvs_6axis_config*/
25539d4fa1a1SMauro Carvalho Chehab 		for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
25549d4fa1a1SMauro Carvalho Chehab 			if (stream_params->pipe_dvs_6axis_config[i]) {
25559d4fa1a1SMauro Carvalho Chehab 				if (params->pipe_dvs_6axis_config[i]) {
25569d4fa1a1SMauro Carvalho Chehab 					copy_dvs_6axis_table(params->pipe_dvs_6axis_config[i],
25579d4fa1a1SMauro Carvalho Chehab 							     stream_params->pipe_dvs_6axis_config[i]);
25589d4fa1a1SMauro Carvalho Chehab 				} else {
25599d4fa1a1SMauro Carvalho Chehab 					params->pipe_dvs_6axis_config[i] =
25609d4fa1a1SMauro Carvalho Chehab 					    generate_dvs_6axis_table_from_config(stream_params->pipe_dvs_6axis_config[i]);
25619d4fa1a1SMauro Carvalho Chehab 				}
25629d4fa1a1SMauro Carvalho Chehab 			}
25639d4fa1a1SMauro Carvalho Chehab 		}
25649d4fa1a1SMauro Carvalho Chehab 		ia_css_set_sdis_config(params, &stream_params->dvs_coefs);
25659d4fa1a1SMauro Carvalho Chehab 		params->dis_coef_table_changed = stream_params->dis_coef_table_changed;
25669d4fa1a1SMauro Carvalho Chehab 
25679d4fa1a1SMauro Carvalho Chehab 		ia_css_set_sdis2_config(params, &stream_params->dvs2_coefs);
25689d4fa1a1SMauro Carvalho Chehab 		params->dvs2_coef_table_changed = stream_params->dvs2_coef_table_changed;
25699d4fa1a1SMauro Carvalho Chehab 		params->sensor_binning = stream_params->sensor_binning;
25709d4fa1a1SMauro Carvalho Chehab 	}
25719d4fa1a1SMauro Carvalho Chehab 
25729d4fa1a1SMauro Carvalho Chehab exit:
25739d4fa1a1SMauro Carvalho Chehab 	return retval;
25749d4fa1a1SMauro Carvalho Chehab }
25759d4fa1a1SMauro Carvalho Chehab 
257641022d35SMauro Carvalho Chehab int
sh_css_params_init(void)2577c27479d7SDeepak R Varma sh_css_params_init(void)
2578c27479d7SDeepak R Varma {
25799d4fa1a1SMauro Carvalho Chehab 	int i, p;
25809d4fa1a1SMauro Carvalho Chehab 
25819d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
25829d4fa1a1SMauro Carvalho Chehab 
25839d4fa1a1SMauro Carvalho Chehab 	/* TMP: tracking of paramsets */
25849d4fa1a1SMauro Carvalho Chehab 	g_param_buffer_dequeue_count = 0;
25859d4fa1a1SMauro Carvalho Chehab 	g_param_buffer_enqueue_count = 0;
25869d4fa1a1SMauro Carvalho Chehab 
2587c27479d7SDeepak R Varma 	for (p = 0; p < IA_CSS_PIPE_ID_NUM; p++) {
25889d4fa1a1SMauro Carvalho Chehab 		for (i = 0; i < SH_CSS_MAX_STAGES; i++) {
25899d4fa1a1SMauro Carvalho Chehab 			xmem_sp_stage_ptrs[p][i] =
25909d4fa1a1SMauro Carvalho Chehab 			ia_css_refcount_increment(-1,
25914cc20c9cSHans de Goede 						  hmm_alloc(sizeof(struct sh_css_sp_stage)));
25929d4fa1a1SMauro Carvalho Chehab 			xmem_isp_stage_ptrs[p][i] =
25939d4fa1a1SMauro Carvalho Chehab 			ia_css_refcount_increment(-1,
25944cc20c9cSHans de Goede 						  hmm_alloc(sizeof(struct sh_css_sp_stage)));
25959d4fa1a1SMauro Carvalho Chehab 
25969d4fa1a1SMauro Carvalho Chehab 			if ((xmem_sp_stage_ptrs[p][i] == mmgr_NULL) ||
25979d4fa1a1SMauro Carvalho Chehab 			    (xmem_isp_stage_ptrs[p][i] == mmgr_NULL)) {
25989d4fa1a1SMauro Carvalho Chehab 				sh_css_params_uninit();
259941022d35SMauro Carvalho Chehab 				IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
260041022d35SMauro Carvalho Chehab 				return -ENOMEM;
26019d4fa1a1SMauro Carvalho Chehab 			}
26029f40d3a7SHans de Goede 
26039f40d3a7SHans de Goede 			hmm_set(xmem_sp_stage_ptrs[p][i], 0, sizeof(struct sh_css_sp_stage));
26049f40d3a7SHans de Goede 			hmm_set(xmem_isp_stage_ptrs[p][i], 0, sizeof(struct sh_css_sp_stage));
26059d4fa1a1SMauro Carvalho Chehab 		}
26069d4fa1a1SMauro Carvalho Chehab 	}
26079d4fa1a1SMauro Carvalho Chehab 
26089d4fa1a1SMauro Carvalho Chehab 	ia_css_config_gamma_table();
26099d4fa1a1SMauro Carvalho Chehab 	ia_css_config_ctc_table();
26109d4fa1a1SMauro Carvalho Chehab 	ia_css_config_rgb_gamma_tables();
26119d4fa1a1SMauro Carvalho Chehab 	ia_css_config_xnr_table();
26129d4fa1a1SMauro Carvalho Chehab 
261386df6ff2SMauro Carvalho Chehab 	sp_ddr_ptrs = ia_css_refcount_increment(-1,
261408fef4faSMauro Carvalho Chehab 						hmm_alloc(CEIL_MUL(sizeof(struct sh_css_ddr_address_map),
26154cc20c9cSHans de Goede 								   HIVE_ISP_DDR_WORD_BYTES)));
261686df6ff2SMauro Carvalho Chehab 	xmem_sp_group_ptrs = ia_css_refcount_increment(-1,
26174cc20c9cSHans de Goede 						       hmm_alloc(sizeof(struct sh_css_sp_group)));
26189d4fa1a1SMauro Carvalho Chehab 
26199d4fa1a1SMauro Carvalho Chehab 	if ((sp_ddr_ptrs == mmgr_NULL) ||
2620c27479d7SDeepak R Varma 	    (xmem_sp_group_ptrs == mmgr_NULL)) {
26219d4fa1a1SMauro Carvalho Chehab 		ia_css_uninit();
262241022d35SMauro Carvalho Chehab 		IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
262341022d35SMauro Carvalho Chehab 		return -ENOMEM;
26249d4fa1a1SMauro Carvalho Chehab 	}
26259f40d3a7SHans de Goede 	hmm_set(sp_ddr_ptrs, 0, CEIL_MUL(sizeof(struct sh_css_ddr_address_map),
26269f40d3a7SHans de Goede 					 HIVE_ISP_DDR_WORD_BYTES));
26279f40d3a7SHans de Goede 	hmm_set(xmem_sp_group_ptrs, 0, sizeof(struct sh_css_sp_group));
262841022d35SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(0);
262941022d35SMauro Carvalho Chehab 	return 0;
26309d4fa1a1SMauro Carvalho Chehab }
26319d4fa1a1SMauro Carvalho Chehab 
host_lut_store(const void * lut)26329d4fa1a1SMauro Carvalho Chehab static void host_lut_store(const void *lut)
26339d4fa1a1SMauro Carvalho Chehab {
26349d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
26359d4fa1a1SMauro Carvalho Chehab 
26369d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < N_GDC_ID; i++)
26379d4fa1a1SMauro Carvalho Chehab 		gdc_lut_store((gdc_ID_t)i, (const int (*)[HRT_GDC_N]) lut);
26389d4fa1a1SMauro Carvalho Chehab }
26399d4fa1a1SMauro Carvalho Chehab 
ia_css_pipe_set_bci_scaler_lut(struct ia_css_pipe * pipe,const void * lut)264041022d35SMauro Carvalho Chehab int ia_css_pipe_set_bci_scaler_lut(struct ia_css_pipe *pipe,
26419d4fa1a1SMauro Carvalho Chehab 	const void *lut)
26429d4fa1a1SMauro Carvalho Chehab {
264341022d35SMauro Carvalho Chehab 	int err = 0;
26449d4fa1a1SMauro Carvalho Chehab 	bool stream_started = false;
26453c0538fbSMauro Carvalho Chehab 
26469d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("pipe=%p lut=%p", pipe, lut);
26479d4fa1a1SMauro Carvalho Chehab 
26489d4fa1a1SMauro Carvalho Chehab 	if (!lut || !pipe) {
264941022d35SMauro Carvalho Chehab 		err = -EINVAL;
26509d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE("err=%d", err);
26519d4fa1a1SMauro Carvalho Chehab 		return err;
26529d4fa1a1SMauro Carvalho Chehab 	}
26539d4fa1a1SMauro Carvalho Chehab 
26549d4fa1a1SMauro Carvalho Chehab 	/* If the pipe belongs to a stream and the stream has started, it is not
26559d4fa1a1SMauro Carvalho Chehab 	 * safe to store lut to gdc HW. If pipe->stream is NULL, then no stream is
26569d4fa1a1SMauro Carvalho Chehab 	 * created with this pipe, so it is safe to do this operation as long as
26579d4fa1a1SMauro Carvalho Chehab 	 * ia_css_init() has been called. */
26589d4fa1a1SMauro Carvalho Chehab 	if (pipe->stream && pipe->stream->started) {
26599d4fa1a1SMauro Carvalho Chehab 		ia_css_debug_dtrace(IA_CSS_DEBUG_ERROR,
26609d4fa1a1SMauro Carvalho Chehab 				    "unable to set scaler lut since stream has started\n");
26619d4fa1a1SMauro Carvalho Chehab 		stream_started = true;
266241022d35SMauro Carvalho Chehab 		err = -ENOTSUPP;
26639d4fa1a1SMauro Carvalho Chehab 	}
26649d4fa1a1SMauro Carvalho Chehab 
26659d4fa1a1SMauro Carvalho Chehab 	/* Free any existing tables. */
266635009261SMauro Carvalho Chehab 	if (pipe->scaler_pp_lut != mmgr_NULL) {
266735009261SMauro Carvalho Chehab 		hmm_free(pipe->scaler_pp_lut);
26689d4fa1a1SMauro Carvalho Chehab 		pipe->scaler_pp_lut = mmgr_NULL;
266935009261SMauro Carvalho Chehab 	}
26709d4fa1a1SMauro Carvalho Chehab 
26719d4fa1a1SMauro Carvalho Chehab 	if (!stream_started) {
26724cc20c9cSHans de Goede 		pipe->scaler_pp_lut = hmm_alloc(sizeof(zoom_table));
26733c0538fbSMauro Carvalho Chehab 
26749d4fa1a1SMauro Carvalho Chehab 		if (pipe->scaler_pp_lut == mmgr_NULL) {
26759d4fa1a1SMauro Carvalho Chehab 			ia_css_debug_dtrace(IA_CSS_DEBUG_ERROR,
26769d4fa1a1SMauro Carvalho Chehab 					    "unable to allocate scaler_pp_lut\n");
267741022d35SMauro Carvalho Chehab 			err = -ENOMEM;
26789d4fa1a1SMauro Carvalho Chehab 		} else {
26799d4fa1a1SMauro Carvalho Chehab 			gdc_lut_convert_to_isp_format((const int(*)[HRT_GDC_N])lut,
26809d4fa1a1SMauro Carvalho Chehab 						      interleaved_lut_temp);
26815472b4dbSMauro Carvalho Chehab 			hmm_store(pipe->scaler_pp_lut,
26829d4fa1a1SMauro Carvalho Chehab 				   (int *)interleaved_lut_temp,
26839d4fa1a1SMauro Carvalho Chehab 				   sizeof(zoom_table));
26849d4fa1a1SMauro Carvalho Chehab 		}
26859d4fa1a1SMauro Carvalho Chehab 	}
26869d4fa1a1SMauro Carvalho Chehab 
26879d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("lut(%u) err=%d", pipe->scaler_pp_lut, err);
26889d4fa1a1SMauro Carvalho Chehab 	return err;
26899d4fa1a1SMauro Carvalho Chehab }
26909d4fa1a1SMauro Carvalho Chehab 
26919d4fa1a1SMauro Carvalho Chehab /* if pipe is NULL, returns default lut addr. */
sh_css_pipe_get_pp_gdc_lut(const struct ia_css_pipe * pipe)2692100e8989SMauro Carvalho Chehab ia_css_ptr sh_css_pipe_get_pp_gdc_lut(const struct ia_css_pipe *pipe)
26939d4fa1a1SMauro Carvalho Chehab {
26949d4fa1a1SMauro Carvalho Chehab 	assert(pipe);
26959d4fa1a1SMauro Carvalho Chehab 
26969d4fa1a1SMauro Carvalho Chehab 	if (pipe->scaler_pp_lut != mmgr_NULL)
26979d4fa1a1SMauro Carvalho Chehab 		return pipe->scaler_pp_lut;
26989d4fa1a1SMauro Carvalho Chehab 	else
26999d4fa1a1SMauro Carvalho Chehab 		return sh_css_params_get_default_gdc_lut();
27009d4fa1a1SMauro Carvalho Chehab }
27019d4fa1a1SMauro Carvalho Chehab 
sh_css_params_map_and_store_default_gdc_lut(void)270241022d35SMauro Carvalho Chehab int sh_css_params_map_and_store_default_gdc_lut(void)
27039d4fa1a1SMauro Carvalho Chehab {
270441022d35SMauro Carvalho Chehab 	int err = 0;
27059d4fa1a1SMauro Carvalho Chehab 
27069d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
27079d4fa1a1SMauro Carvalho Chehab 
27089d4fa1a1SMauro Carvalho Chehab 	/* Is table already mapped? Nothing to do if it is mapped. */
27099d4fa1a1SMauro Carvalho Chehab 	if (default_gdc_lut != mmgr_NULL)
27109d4fa1a1SMauro Carvalho Chehab 		return err;
27119d4fa1a1SMauro Carvalho Chehab 
27129d4fa1a1SMauro Carvalho Chehab 	host_lut_store((void *)zoom_table);
27139d4fa1a1SMauro Carvalho Chehab 
27144cc20c9cSHans de Goede 	default_gdc_lut = hmm_alloc(sizeof(zoom_table));
27153c0538fbSMauro Carvalho Chehab 
27169d4fa1a1SMauro Carvalho Chehab 	if (default_gdc_lut == mmgr_NULL)
271741022d35SMauro Carvalho Chehab 		return -ENOMEM;
27189d4fa1a1SMauro Carvalho Chehab 
27199d4fa1a1SMauro Carvalho Chehab 	gdc_lut_convert_to_isp_format((const int(*)[HRT_GDC_N])zoom_table,
27209d4fa1a1SMauro Carvalho Chehab 				      interleaved_lut_temp);
27215472b4dbSMauro Carvalho Chehab 	hmm_store(default_gdc_lut, (int *)interleaved_lut_temp,
27229d4fa1a1SMauro Carvalho Chehab 		   sizeof(zoom_table));
27239d4fa1a1SMauro Carvalho Chehab 
27249d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("lut(%u) err=%d", default_gdc_lut, err);
27259d4fa1a1SMauro Carvalho Chehab 	return err;
27269d4fa1a1SMauro Carvalho Chehab }
27279d4fa1a1SMauro Carvalho Chehab 
sh_css_params_free_default_gdc_lut(void)27289d4fa1a1SMauro Carvalho Chehab void sh_css_params_free_default_gdc_lut(void)
27299d4fa1a1SMauro Carvalho Chehab {
27309d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
27319d4fa1a1SMauro Carvalho Chehab 
273235009261SMauro Carvalho Chehab 	if (default_gdc_lut != mmgr_NULL) {
273335009261SMauro Carvalho Chehab 		hmm_free(default_gdc_lut);
27349d4fa1a1SMauro Carvalho Chehab 		default_gdc_lut = mmgr_NULL;
273535009261SMauro Carvalho Chehab 	}
27369d4fa1a1SMauro Carvalho Chehab 
27379d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
27389d4fa1a1SMauro Carvalho Chehab }
27399d4fa1a1SMauro Carvalho Chehab 
sh_css_params_get_default_gdc_lut(void)2740100e8989SMauro Carvalho Chehab ia_css_ptr sh_css_params_get_default_gdc_lut(void)
27419d4fa1a1SMauro Carvalho Chehab {
27429d4fa1a1SMauro Carvalho Chehab 	return default_gdc_lut;
27439d4fa1a1SMauro Carvalho Chehab }
27449d4fa1a1SMauro Carvalho Chehab 
free_param_set_callback(ia_css_ptr ptr)27459d4fa1a1SMauro Carvalho Chehab static void free_param_set_callback(
2746100e8989SMauro Carvalho Chehab     ia_css_ptr ptr)
27479d4fa1a1SMauro Carvalho Chehab {
27489d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
27499d4fa1a1SMauro Carvalho Chehab 
27509d4fa1a1SMauro Carvalho Chehab 	free_ia_css_isp_parameter_set_info(ptr);
27519d4fa1a1SMauro Carvalho Chehab 
27529d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
27539d4fa1a1SMauro Carvalho Chehab }
27549d4fa1a1SMauro Carvalho Chehab 
free_buffer_callback(ia_css_ptr ptr)27559d4fa1a1SMauro Carvalho Chehab static void free_buffer_callback(
2756100e8989SMauro Carvalho Chehab     ia_css_ptr ptr)
27579d4fa1a1SMauro Carvalho Chehab {
27589d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
27599d4fa1a1SMauro Carvalho Chehab 
27609d4fa1a1SMauro Carvalho Chehab 	hmm_free(ptr);
27619d4fa1a1SMauro Carvalho Chehab 
27629d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
27639d4fa1a1SMauro Carvalho Chehab }
27649d4fa1a1SMauro Carvalho Chehab 
27659d4fa1a1SMauro Carvalho Chehab void
sh_css_param_clear_param_sets(void)27669d4fa1a1SMauro Carvalho Chehab sh_css_param_clear_param_sets(void)
27679d4fa1a1SMauro Carvalho Chehab {
27689d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
27699d4fa1a1SMauro Carvalho Chehab 
27709d4fa1a1SMauro Carvalho Chehab 	ia_css_refcount_clear(IA_CSS_REFCOUNT_PARAM_SET_POOL, &free_param_set_callback);
27719d4fa1a1SMauro Carvalho Chehab 
27729d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
27739d4fa1a1SMauro Carvalho Chehab }
27749d4fa1a1SMauro Carvalho Chehab 
27759d4fa1a1SMauro Carvalho Chehab /*
27769d4fa1a1SMauro Carvalho Chehab  * MW: we can define hmm_free() to return a NULL
27779d4fa1a1SMauro Carvalho Chehab  * then you can write ptr = hmm_free(ptr);
27789d4fa1a1SMauro Carvalho Chehab  */
27799d4fa1a1SMauro Carvalho Chehab #define safe_free(id, x)      \
27809d4fa1a1SMauro Carvalho Chehab 	do {                  \
27819d4fa1a1SMauro Carvalho Chehab 		ia_css_refcount_decrement(id, x);     \
27829d4fa1a1SMauro Carvalho Chehab 		(x) = mmgr_NULL;  \
27839d4fa1a1SMauro Carvalho Chehab 	} while (0)
27849d4fa1a1SMauro Carvalho Chehab 
free_map(struct sh_css_ddr_address_map * map)27859d4fa1a1SMauro Carvalho Chehab static void free_map(struct sh_css_ddr_address_map *map)
27869d4fa1a1SMauro Carvalho Chehab {
27879d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
27889d4fa1a1SMauro Carvalho Chehab 
2789100e8989SMauro Carvalho Chehab 	ia_css_ptr *addrs = (ia_css_ptr *)map;
27909d4fa1a1SMauro Carvalho Chehab 
27919d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
27929d4fa1a1SMauro Carvalho Chehab 
27939d4fa1a1SMauro Carvalho Chehab 	/* free buffers */
27949d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < (sizeof(struct sh_css_ddr_address_map_size) /
27959d4fa1a1SMauro Carvalho Chehab 			 sizeof(size_t)); i++) {
27969d4fa1a1SMauro Carvalho Chehab 		if (addrs[i] == mmgr_NULL)
27979d4fa1a1SMauro Carvalho Chehab 			continue;
27989d4fa1a1SMauro Carvalho Chehab 		safe_free(IA_CSS_REFCOUNT_PARAM_BUFFER, addrs[i]);
27999d4fa1a1SMauro Carvalho Chehab 	}
28009d4fa1a1SMauro Carvalho Chehab 
28019d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
28029d4fa1a1SMauro Carvalho Chehab }
28039d4fa1a1SMauro Carvalho Chehab 
28049d4fa1a1SMauro Carvalho Chehab void
ia_css_stream_isp_parameters_uninit(struct ia_css_stream * stream)28059d4fa1a1SMauro Carvalho Chehab ia_css_stream_isp_parameters_uninit(struct ia_css_stream *stream)
28069d4fa1a1SMauro Carvalho Chehab {
28079d4fa1a1SMauro Carvalho Chehab 	int i;
28089d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params = stream->isp_params_configs;
28099d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *per_frame_params =
28109d4fa1a1SMauro Carvalho Chehab 		    stream->per_frame_isp_params_configs;
28119d4fa1a1SMauro Carvalho Chehab 
28129d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
28139d4fa1a1SMauro Carvalho Chehab 	if (!params) {
28149d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE_PRIVATE("isp_param_configs is NULL");
28159d4fa1a1SMauro Carvalho Chehab 		return;
28169d4fa1a1SMauro Carvalho Chehab 	}
28179d4fa1a1SMauro Carvalho Chehab 
28189d4fa1a1SMauro Carvalho Chehab 	/* free existing ddr_ptr maps */
28199d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
28209d4fa1a1SMauro Carvalho Chehab 		free_map(&params->pipe_ddr_ptrs[i]);
28219d4fa1a1SMauro Carvalho Chehab 		if (per_frame_params)
28229d4fa1a1SMauro Carvalho Chehab 			free_map(&per_frame_params->pipe_ddr_ptrs[i]);
28239d4fa1a1SMauro Carvalho Chehab 		/* Free up theDVS table memory blocks before recomputing new table */
28249d4fa1a1SMauro Carvalho Chehab 		if (params->pipe_dvs_6axis_config[i])
28259d4fa1a1SMauro Carvalho Chehab 			free_dvs_6axis_table(&params->pipe_dvs_6axis_config[i]);
28269d4fa1a1SMauro Carvalho Chehab 		if (per_frame_params && per_frame_params->pipe_dvs_6axis_config[i])
28279d4fa1a1SMauro Carvalho Chehab 			free_dvs_6axis_table(&per_frame_params->pipe_dvs_6axis_config[i]);
28289d4fa1a1SMauro Carvalho Chehab 	}
28299d4fa1a1SMauro Carvalho Chehab 	free_map(&params->ddr_ptrs);
28309d4fa1a1SMauro Carvalho Chehab 	if (per_frame_params)
28319d4fa1a1SMauro Carvalho Chehab 		free_map(&per_frame_params->ddr_ptrs);
28329d4fa1a1SMauro Carvalho Chehab 
28339d4fa1a1SMauro Carvalho Chehab 	if (params->fpn_config.data) {
28349955d906SMauro Carvalho Chehab 		kvfree(params->fpn_config.data);
28359d4fa1a1SMauro Carvalho Chehab 		params->fpn_config.data = NULL;
28369d4fa1a1SMauro Carvalho Chehab 	}
28379d4fa1a1SMauro Carvalho Chehab 
28389d4fa1a1SMauro Carvalho Chehab 	/* Free up sc_config (temporal shading table) if it is allocated. */
28399d4fa1a1SMauro Carvalho Chehab 	if (params->sc_config) {
28409d4fa1a1SMauro Carvalho Chehab 		ia_css_shading_table_free(params->sc_config);
28419d4fa1a1SMauro Carvalho Chehab 		params->sc_config = NULL;
28429d4fa1a1SMauro Carvalho Chehab 	}
28439d4fa1a1SMauro Carvalho Chehab 	if (per_frame_params) {
28449d4fa1a1SMauro Carvalho Chehab 		if (per_frame_params->sc_config) {
28459d4fa1a1SMauro Carvalho Chehab 			ia_css_shading_table_free(per_frame_params->sc_config);
28469d4fa1a1SMauro Carvalho Chehab 			per_frame_params->sc_config = NULL;
28479d4fa1a1SMauro Carvalho Chehab 		}
28489d4fa1a1SMauro Carvalho Chehab 	}
28499d4fa1a1SMauro Carvalho Chehab 
28509955d906SMauro Carvalho Chehab 	kvfree(params);
28519955d906SMauro Carvalho Chehab 	kvfree(per_frame_params);
28529d4fa1a1SMauro Carvalho Chehab 	stream->isp_params_configs = NULL;
28539d4fa1a1SMauro Carvalho Chehab 	stream->per_frame_isp_params_configs = NULL;
28549d4fa1a1SMauro Carvalho Chehab 
28559d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
28569d4fa1a1SMauro Carvalho Chehab }
28579d4fa1a1SMauro Carvalho Chehab 
28589d4fa1a1SMauro Carvalho Chehab void
sh_css_params_uninit(void)28599d4fa1a1SMauro Carvalho Chehab sh_css_params_uninit(void)
28609d4fa1a1SMauro Carvalho Chehab {
28619d4fa1a1SMauro Carvalho Chehab 	unsigned int p, i;
28629d4fa1a1SMauro Carvalho Chehab 
28639d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
28649d4fa1a1SMauro Carvalho Chehab 
28659d4fa1a1SMauro Carvalho Chehab 	ia_css_refcount_decrement(-1, sp_ddr_ptrs);
28669d4fa1a1SMauro Carvalho Chehab 	sp_ddr_ptrs = mmgr_NULL;
28679d4fa1a1SMauro Carvalho Chehab 	ia_css_refcount_decrement(-1, xmem_sp_group_ptrs);
28689d4fa1a1SMauro Carvalho Chehab 	xmem_sp_group_ptrs = mmgr_NULL;
28699d4fa1a1SMauro Carvalho Chehab 
28709d4fa1a1SMauro Carvalho Chehab 	for (p = 0; p < IA_CSS_PIPE_ID_NUM; p++)
28719d4fa1a1SMauro Carvalho Chehab 		for (i = 0; i < SH_CSS_MAX_STAGES; i++) {
28729d4fa1a1SMauro Carvalho Chehab 			ia_css_refcount_decrement(-1, xmem_sp_stage_ptrs[p][i]);
28739d4fa1a1SMauro Carvalho Chehab 			xmem_sp_stage_ptrs[p][i] = mmgr_NULL;
28749d4fa1a1SMauro Carvalho Chehab 			ia_css_refcount_decrement(-1, xmem_isp_stage_ptrs[p][i]);
28759d4fa1a1SMauro Carvalho Chehab 			xmem_isp_stage_ptrs[p][i] = mmgr_NULL;
28769d4fa1a1SMauro Carvalho Chehab 		}
28779d4fa1a1SMauro Carvalho Chehab 
28789d4fa1a1SMauro Carvalho Chehab 	/* go through the pools to clear references */
28799d4fa1a1SMauro Carvalho Chehab 	ia_css_refcount_clear(IA_CSS_REFCOUNT_PARAM_SET_POOL, &free_param_set_callback);
28809d4fa1a1SMauro Carvalho Chehab 	ia_css_refcount_clear(IA_CSS_REFCOUNT_PARAM_BUFFER, &free_buffer_callback);
28819d4fa1a1SMauro Carvalho Chehab 	ia_css_refcount_clear(-1, &free_buffer_callback);
28829d4fa1a1SMauro Carvalho Chehab 
28839d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
28849d4fa1a1SMauro Carvalho Chehab }
28859d4fa1a1SMauro Carvalho Chehab 
28869d4fa1a1SMauro Carvalho Chehab static struct ia_css_host_data *
convert_allocate_morph_plane(unsigned short * data,unsigned int width,unsigned int height,unsigned int aligned_width)28879d4fa1a1SMauro Carvalho Chehab convert_allocate_morph_plane(
28889d4fa1a1SMauro Carvalho Chehab     unsigned short *data,
28899d4fa1a1SMauro Carvalho Chehab     unsigned int width,
28909d4fa1a1SMauro Carvalho Chehab     unsigned int height,
28919d4fa1a1SMauro Carvalho Chehab     unsigned int aligned_width)
28929d4fa1a1SMauro Carvalho Chehab {
28939d4fa1a1SMauro Carvalho Chehab 	unsigned int i, j, padding, w;
28949d4fa1a1SMauro Carvalho Chehab 	struct ia_css_host_data *me;
28959d4fa1a1SMauro Carvalho Chehab 	unsigned int isp_data_size;
28969d4fa1a1SMauro Carvalho Chehab 	u16 *isp_data_ptr;
28979d4fa1a1SMauro Carvalho Chehab 
28989d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
28999d4fa1a1SMauro Carvalho Chehab 
29009d4fa1a1SMauro Carvalho Chehab 	/* currently we don't have morph table interpolation yet,
29019d4fa1a1SMauro Carvalho Chehab 	 * so we allow a wider table to be used. This will be removed
29029d4fa1a1SMauro Carvalho Chehab 	 * in the future. */
29039d4fa1a1SMauro Carvalho Chehab 	if (width > aligned_width) {
29049d4fa1a1SMauro Carvalho Chehab 		padding = 0;
29059d4fa1a1SMauro Carvalho Chehab 		w = aligned_width;
29069d4fa1a1SMauro Carvalho Chehab 	} else {
29079d4fa1a1SMauro Carvalho Chehab 		padding = aligned_width - width;
29089d4fa1a1SMauro Carvalho Chehab 		w = width;
29099d4fa1a1SMauro Carvalho Chehab 	}
29109d4fa1a1SMauro Carvalho Chehab 	isp_data_size = height * (w + padding) * sizeof(uint16_t);
29119d4fa1a1SMauro Carvalho Chehab 
29129d4fa1a1SMauro Carvalho Chehab 	me = ia_css_host_data_allocate((size_t)isp_data_size);
29139d4fa1a1SMauro Carvalho Chehab 
29149d4fa1a1SMauro Carvalho Chehab 	if (!me) {
291541022d35SMauro Carvalho Chehab 		IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
29169d4fa1a1SMauro Carvalho Chehab 		return NULL;
29179d4fa1a1SMauro Carvalho Chehab 	}
29189d4fa1a1SMauro Carvalho Chehab 
29199d4fa1a1SMauro Carvalho Chehab 	isp_data_ptr = (uint16_t *)me->address;
29209d4fa1a1SMauro Carvalho Chehab 
29219d4fa1a1SMauro Carvalho Chehab 	memset(isp_data_ptr, 0, (size_t)isp_data_size);
29229d4fa1a1SMauro Carvalho Chehab 
29239d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < height; i++) {
29249d4fa1a1SMauro Carvalho Chehab 		for (j = 0; j < w; j++)
29259d4fa1a1SMauro Carvalho Chehab 			*isp_data_ptr++ = (uint16_t)data[j];
29269d4fa1a1SMauro Carvalho Chehab 		isp_data_ptr += padding;
29279d4fa1a1SMauro Carvalho Chehab 		data += width;
29289d4fa1a1SMauro Carvalho Chehab 	}
29299d4fa1a1SMauro Carvalho Chehab 
29309d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
29319d4fa1a1SMauro Carvalho Chehab 	return me;
29329d4fa1a1SMauro Carvalho Chehab }
29339d4fa1a1SMauro Carvalho Chehab 
293441022d35SMauro Carvalho Chehab static int
store_morph_plane(unsigned short * data,unsigned int width,unsigned int height,ia_css_ptr dest,unsigned int aligned_width)29359d4fa1a1SMauro Carvalho Chehab store_morph_plane(
29369d4fa1a1SMauro Carvalho Chehab     unsigned short *data,
29379d4fa1a1SMauro Carvalho Chehab     unsigned int width,
29389d4fa1a1SMauro Carvalho Chehab     unsigned int height,
2939100e8989SMauro Carvalho Chehab     ia_css_ptr dest,
2940c27479d7SDeepak R Varma     unsigned int aligned_width)
2941c27479d7SDeepak R Varma {
29429d4fa1a1SMauro Carvalho Chehab 	struct ia_css_host_data *isp_data;
29439d4fa1a1SMauro Carvalho Chehab 
29449d4fa1a1SMauro Carvalho Chehab 	assert(dest != mmgr_NULL);
29459d4fa1a1SMauro Carvalho Chehab 
29469d4fa1a1SMauro Carvalho Chehab 	isp_data = convert_allocate_morph_plane(data, width, height, aligned_width);
2947c27479d7SDeepak R Varma 	if (!isp_data) {
294841022d35SMauro Carvalho Chehab 		IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
294941022d35SMauro Carvalho Chehab 		return -ENOMEM;
29509d4fa1a1SMauro Carvalho Chehab 	}
29519d4fa1a1SMauro Carvalho Chehab 	ia_css_params_store_ia_css_host_data(dest, isp_data);
29529d4fa1a1SMauro Carvalho Chehab 
29539d4fa1a1SMauro Carvalho Chehab 	ia_css_host_data_free(isp_data);
295441022d35SMauro Carvalho Chehab 	return 0;
29559d4fa1a1SMauro Carvalho Chehab }
29569d4fa1a1SMauro Carvalho Chehab 
sh_css_update_isp_params_to_ddr(struct ia_css_isp_parameters * params,ia_css_ptr ddr_ptr)29579d4fa1a1SMauro Carvalho Chehab static void sh_css_update_isp_params_to_ddr(
29589d4fa1a1SMauro Carvalho Chehab     struct ia_css_isp_parameters *params,
2959100e8989SMauro Carvalho Chehab     ia_css_ptr ddr_ptr)
29609d4fa1a1SMauro Carvalho Chehab {
29619d4fa1a1SMauro Carvalho Chehab 	size_t size = sizeof(params->uds);
29629d4fa1a1SMauro Carvalho Chehab 
29639d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
29649d4fa1a1SMauro Carvalho Chehab 
29659d4fa1a1SMauro Carvalho Chehab 	assert(params);
29669d4fa1a1SMauro Carvalho Chehab 
29675472b4dbSMauro Carvalho Chehab 	hmm_store(ddr_ptr, &params->uds, size);
29689d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
29699d4fa1a1SMauro Carvalho Chehab }
29709d4fa1a1SMauro Carvalho Chehab 
sh_css_update_isp_mem_params_to_ddr(const struct ia_css_binary * binary,ia_css_ptr ddr_mem_ptr,size_t size,enum ia_css_isp_memories mem)29719d4fa1a1SMauro Carvalho Chehab static void sh_css_update_isp_mem_params_to_ddr(
29729d4fa1a1SMauro Carvalho Chehab     const struct ia_css_binary *binary,
2973100e8989SMauro Carvalho Chehab     ia_css_ptr ddr_mem_ptr,
29749d4fa1a1SMauro Carvalho Chehab     size_t size,
29759d4fa1a1SMauro Carvalho Chehab     enum ia_css_isp_memories mem)
29769d4fa1a1SMauro Carvalho Chehab {
29779d4fa1a1SMauro Carvalho Chehab 	const struct ia_css_host_data *params;
29789d4fa1a1SMauro Carvalho Chehab 
29799d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
29809d4fa1a1SMauro Carvalho Chehab 
29819d4fa1a1SMauro Carvalho Chehab 	params = ia_css_isp_param_get_mem_init(&binary->mem_params,
29829d4fa1a1SMauro Carvalho Chehab 					       IA_CSS_PARAM_CLASS_PARAM, mem);
29835472b4dbSMauro Carvalho Chehab 	hmm_store(ddr_mem_ptr, params->address, size);
29849d4fa1a1SMauro Carvalho Chehab 
29859d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
29869d4fa1a1SMauro Carvalho Chehab }
29879d4fa1a1SMauro Carvalho Chehab 
ia_css_dequeue_param_buffers(void)29889d4fa1a1SMauro Carvalho Chehab void ia_css_dequeue_param_buffers(/*unsigned int pipe_num*/ void)
29899d4fa1a1SMauro Carvalho Chehab {
29909d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
2991100e8989SMauro Carvalho Chehab 	ia_css_ptr cpy;
29929d4fa1a1SMauro Carvalho Chehab 	enum sh_css_queue_id param_queue_ids[3] = {	IA_CSS_PARAMETER_SET_QUEUE_ID,
29939d4fa1a1SMauro Carvalho Chehab 						    IA_CSS_PER_FRAME_PARAMETER_SET_QUEUE_ID,
29949d4fa1a1SMauro Carvalho Chehab 						    SH_CSS_INVALID_QUEUE_ID
29959d4fa1a1SMauro Carvalho Chehab 						  };
29969d4fa1a1SMauro Carvalho Chehab 
29979d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
29989d4fa1a1SMauro Carvalho Chehab 
29999d4fa1a1SMauro Carvalho Chehab 	if (!sh_css_sp_is_running()) {
30009d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE_PRIVATE("sp is not running");
30019d4fa1a1SMauro Carvalho Chehab 		/* SP is not running. The queues are not valid */
30029d4fa1a1SMauro Carvalho Chehab 		return;
30039d4fa1a1SMauro Carvalho Chehab 	}
30049d4fa1a1SMauro Carvalho Chehab 
30059d4fa1a1SMauro Carvalho Chehab 	for (i = 0; SH_CSS_INVALID_QUEUE_ID != param_queue_ids[i]; i++) {
3006100e8989SMauro Carvalho Chehab 		cpy = (ia_css_ptr)0;
30079d4fa1a1SMauro Carvalho Chehab 		/* clean-up old copy */
30089d4fa1a1SMauro Carvalho Chehab 		while (ia_css_bufq_dequeue_buffer(param_queue_ids[i],
300941022d35SMauro Carvalho Chehab 						  (uint32_t *)&cpy) == 0) {
30109d4fa1a1SMauro Carvalho Chehab 			/* TMP: keep track of dequeued param set count
30119d4fa1a1SMauro Carvalho Chehab 			 */
30129d4fa1a1SMauro Carvalho Chehab 			g_param_buffer_dequeue_count++;
30139d4fa1a1SMauro Carvalho Chehab 			ia_css_bufq_enqueue_psys_event(
30149d4fa1a1SMauro Carvalho Chehab 			    IA_CSS_PSYS_SW_EVENT_BUFFER_DEQUEUED,
30159d4fa1a1SMauro Carvalho Chehab 			    0,
30169d4fa1a1SMauro Carvalho Chehab 			    param_queue_ids[i],
30179d4fa1a1SMauro Carvalho Chehab 			    0);
30189d4fa1a1SMauro Carvalho Chehab 
30199d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LOG("dequeued param set %x from %d, release ref", cpy, 0);
30209d4fa1a1SMauro Carvalho Chehab 			free_ia_css_isp_parameter_set_info(cpy);
3021100e8989SMauro Carvalho Chehab 			cpy = (ia_css_ptr)0;
30229d4fa1a1SMauro Carvalho Chehab 		}
30239d4fa1a1SMauro Carvalho Chehab 	}
30249d4fa1a1SMauro Carvalho Chehab 
30259d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
30269d4fa1a1SMauro Carvalho Chehab }
30279d4fa1a1SMauro Carvalho Chehab 
30289d4fa1a1SMauro Carvalho Chehab static void
process_kernel_parameters(unsigned int pipe_id,struct ia_css_pipeline_stage * stage,struct ia_css_isp_parameters * params,unsigned int isp_pipe_version,unsigned int raw_bit_depth)30299d4fa1a1SMauro Carvalho Chehab process_kernel_parameters(unsigned int pipe_id,
30309d4fa1a1SMauro Carvalho Chehab 			  struct ia_css_pipeline_stage *stage,
30319d4fa1a1SMauro Carvalho Chehab 			  struct ia_css_isp_parameters *params,
30329d4fa1a1SMauro Carvalho Chehab 			  unsigned int isp_pipe_version,
30339d4fa1a1SMauro Carvalho Chehab 			  unsigned int raw_bit_depth)
30349d4fa1a1SMauro Carvalho Chehab {
30359d4fa1a1SMauro Carvalho Chehab 	unsigned int param_id;
30369d4fa1a1SMauro Carvalho Chehab 
30379d4fa1a1SMauro Carvalho Chehab 	(void)isp_pipe_version;
30389d4fa1a1SMauro Carvalho Chehab 	(void)raw_bit_depth;
30399d4fa1a1SMauro Carvalho Chehab 
30409d4fa1a1SMauro Carvalho Chehab 	sh_css_enable_pipeline(stage->binary);
30419d4fa1a1SMauro Carvalho Chehab 
30429d4fa1a1SMauro Carvalho Chehab 	if (params->config_changed[IA_CSS_OB_ID]) {
30439d4fa1a1SMauro Carvalho Chehab 		ia_css_ob_configure(&params->stream_configs.ob,
30449d4fa1a1SMauro Carvalho Chehab 				    isp_pipe_version, raw_bit_depth);
30459d4fa1a1SMauro Carvalho Chehab 	}
30469d4fa1a1SMauro Carvalho Chehab 	if (params->config_changed[IA_CSS_S3A_ID]) {
30479d4fa1a1SMauro Carvalho Chehab 		ia_css_s3a_configure(raw_bit_depth);
30489d4fa1a1SMauro Carvalho Chehab 	}
30499d4fa1a1SMauro Carvalho Chehab 	/* Copy stage uds parameters to config, since they can differ per stage.
30509d4fa1a1SMauro Carvalho Chehab 	 */
30519d4fa1a1SMauro Carvalho Chehab 	params->crop_config.crop_pos = params->uds[stage->stage_num].crop_pos;
30529d4fa1a1SMauro Carvalho Chehab 	params->uds_config.crop_pos  = params->uds[stage->stage_num].crop_pos;
30539d4fa1a1SMauro Carvalho Chehab 	params->uds_config.uds       = params->uds[stage->stage_num].uds;
30549d4fa1a1SMauro Carvalho Chehab 	/* Call parameter process functions for all kernels */
30559d4fa1a1SMauro Carvalho Chehab 	/* Skip SC, since that is called on a temp sc table */
30569d4fa1a1SMauro Carvalho Chehab 	for (param_id = 0; param_id < IA_CSS_NUM_PARAMETER_IDS; param_id++) {
30579d4fa1a1SMauro Carvalho Chehab 		if (param_id == IA_CSS_SC_ID) continue;
30589d4fa1a1SMauro Carvalho Chehab 		if (params->config_changed[param_id])
30599d4fa1a1SMauro Carvalho Chehab 			ia_css_kernel_process_param[param_id](pipe_id, stage, params);
30609d4fa1a1SMauro Carvalho Chehab 	}
30619d4fa1a1SMauro Carvalho Chehab }
30629d4fa1a1SMauro Carvalho Chehab 
306341022d35SMauro Carvalho Chehab int
sh_css_param_update_isp_params(struct ia_css_pipe * curr_pipe,struct ia_css_isp_parameters * params,bool commit,struct ia_css_pipe * pipe_in)30649d4fa1a1SMauro Carvalho Chehab sh_css_param_update_isp_params(struct ia_css_pipe *curr_pipe,
30659d4fa1a1SMauro Carvalho Chehab 			       struct ia_css_isp_parameters *params,
30669d4fa1a1SMauro Carvalho Chehab 			       bool commit,
3067c27479d7SDeepak R Varma 			       struct ia_css_pipe *pipe_in)
3068c27479d7SDeepak R Varma {
306941022d35SMauro Carvalho Chehab 	int err = 0;
3070100e8989SMauro Carvalho Chehab 	ia_css_ptr cpy;
30719d4fa1a1SMauro Carvalho Chehab 	int i;
30729d4fa1a1SMauro Carvalho Chehab 	unsigned int raw_bit_depth = 10;
30739d4fa1a1SMauro Carvalho Chehab 	unsigned int isp_pipe_version = SH_CSS_ISP_PIPE_VERSION_1;
30749d4fa1a1SMauro Carvalho Chehab 	bool acc_cluster_params_changed = false;
30759d4fa1a1SMauro Carvalho Chehab 	unsigned int thread_id, pipe_num;
30769d4fa1a1SMauro Carvalho Chehab 
30779d4fa1a1SMauro Carvalho Chehab 	(void)acc_cluster_params_changed;
30789d4fa1a1SMauro Carvalho Chehab 
30799d4fa1a1SMauro Carvalho Chehab 	assert(curr_pipe);
30809d4fa1a1SMauro Carvalho Chehab 
30819d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("pipe=%p, isp_parameters_id=%d", pipe_in, params->isp_parameters_id);
30829d4fa1a1SMauro Carvalho Chehab 	raw_bit_depth = ia_css_stream_input_format_bits_per_pixel(curr_pipe->stream);
30839d4fa1a1SMauro Carvalho Chehab 
30849d4fa1a1SMauro Carvalho Chehab 	/* now make the map available to the sp */
3085c27479d7SDeepak R Varma 	if (!commit) {
30869d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE_ERR_PRIVATE(err);
30879d4fa1a1SMauro Carvalho Chehab 		return err;
30889d4fa1a1SMauro Carvalho Chehab 	}
30899d4fa1a1SMauro Carvalho Chehab 	/* enqueue a copies of the mem_map to
30909d4fa1a1SMauro Carvalho Chehab 	   the designated pipelines */
3091c27479d7SDeepak R Varma 	for (i = 0; i < curr_pipe->stream->num_pipes; i++) {
30929d4fa1a1SMauro Carvalho Chehab 		struct ia_css_pipe *pipe;
30939d4fa1a1SMauro Carvalho Chehab 		struct sh_css_ddr_address_map *cur_map;
30949d4fa1a1SMauro Carvalho Chehab 		struct sh_css_ddr_address_map_size *cur_map_size;
30959d4fa1a1SMauro Carvalho Chehab 		struct ia_css_isp_parameter_set_info isp_params_info;
30969d4fa1a1SMauro Carvalho Chehab 		struct ia_css_pipeline *pipeline;
30979d4fa1a1SMauro Carvalho Chehab 		struct ia_css_pipeline_stage *stage;
30989d4fa1a1SMauro Carvalho Chehab 
30999d4fa1a1SMauro Carvalho Chehab 		enum sh_css_queue_id queue_id;
31009d4fa1a1SMauro Carvalho Chehab 
31019d4fa1a1SMauro Carvalho Chehab 		pipe = curr_pipe->stream->pipes[i];
31029d4fa1a1SMauro Carvalho Chehab 		pipeline = ia_css_pipe_get_pipeline(pipe);
31039d4fa1a1SMauro Carvalho Chehab 		pipe_num = ia_css_pipe_get_pipe_num(pipe);
31049d4fa1a1SMauro Carvalho Chehab 		isp_pipe_version = ia_css_pipe_get_isp_pipe_version(pipe);
31059d4fa1a1SMauro Carvalho Chehab 		ia_css_pipeline_get_sp_thread_id(pipe_num, &thread_id);
31069d4fa1a1SMauro Carvalho Chehab 
31079d4fa1a1SMauro Carvalho Chehab 		ia_css_query_internal_queue_id(params->output_frame
31089d4fa1a1SMauro Carvalho Chehab 					       ? IA_CSS_BUFFER_TYPE_PER_FRAME_PARAMETER_SET
31099d4fa1a1SMauro Carvalho Chehab 					       : IA_CSS_BUFFER_TYPE_PARAMETER_SET,
31109d4fa1a1SMauro Carvalho Chehab 					       thread_id, &queue_id);
31119d4fa1a1SMauro Carvalho Chehab 		if (!sh_css_sp_is_running()) {
31129d4fa1a1SMauro Carvalho Chehab 			/* SP is not running. The queues are not valid */
311341022d35SMauro Carvalho Chehab 			err = -EBUSY;
31149d4fa1a1SMauro Carvalho Chehab 			break;
31159d4fa1a1SMauro Carvalho Chehab 		}
31169d4fa1a1SMauro Carvalho Chehab 		cur_map = &params->pipe_ddr_ptrs[pipeline->pipe_id];
31179d4fa1a1SMauro Carvalho Chehab 		cur_map_size = &params->pipe_ddr_ptrs_size[pipeline->pipe_id];
31189d4fa1a1SMauro Carvalho Chehab 
31199d4fa1a1SMauro Carvalho Chehab 		/* TODO: Normally, zoom and motion parameters shouldn't
31209d4fa1a1SMauro Carvalho Chehab 		 * be part of "isp_params" as it is resolution/pipe dependent
31219d4fa1a1SMauro Carvalho Chehab 		 * Therefore, move the zoom config elsewhere (e.g. shading
31229d4fa1a1SMauro Carvalho Chehab 		 * table can be taken as an example! @GC
31239d4fa1a1SMauro Carvalho Chehab 		 * */
31249d4fa1a1SMauro Carvalho Chehab 		{
31259d4fa1a1SMauro Carvalho Chehab 			/* we have to do this per pipeline because */
31269d4fa1a1SMauro Carvalho Chehab 			/* the processing is a.o. resolution dependent */
31279d4fa1a1SMauro Carvalho Chehab 			err = ia_css_process_zoom_and_motion(params,
31289d4fa1a1SMauro Carvalho Chehab 							     pipeline->stages);
312941022d35SMauro Carvalho Chehab 			if (err)
31309d4fa1a1SMauro Carvalho Chehab 				return err;
31319d4fa1a1SMauro Carvalho Chehab 		}
31329d4fa1a1SMauro Carvalho Chehab 		/* check if to actually update the parameters for this pipe */
31339d4fa1a1SMauro Carvalho Chehab 		/* When API change is implemented making good distinction between
31349d4fa1a1SMauro Carvalho Chehab 		* stream config and pipe config this skipping code can be moved out of the #ifdef */
31359d4fa1a1SMauro Carvalho Chehab 		if (pipe_in && (pipe != pipe_in)) {
31369d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LOG("skipping pipe %p", pipe);
31379d4fa1a1SMauro Carvalho Chehab 			continue;
31389d4fa1a1SMauro Carvalho Chehab 		}
31399d4fa1a1SMauro Carvalho Chehab 
31409d4fa1a1SMauro Carvalho Chehab 		/* BZ 125915, should be moved till after "update other buff" */
31419d4fa1a1SMauro Carvalho Chehab 		/* update the other buffers to the pipe specific copies */
31429d4fa1a1SMauro Carvalho Chehab 		for (stage = pipeline->stages; stage; stage = stage->next) {
31439d4fa1a1SMauro Carvalho Chehab 			unsigned int mem;
31449d4fa1a1SMauro Carvalho Chehab 
31459d4fa1a1SMauro Carvalho Chehab 			if (!stage || !stage->binary)
31469d4fa1a1SMauro Carvalho Chehab 				continue;
31479d4fa1a1SMauro Carvalho Chehab 
31489d4fa1a1SMauro Carvalho Chehab 			process_kernel_parameters(pipeline->pipe_id,
31499d4fa1a1SMauro Carvalho Chehab 						  stage, params,
31509d4fa1a1SMauro Carvalho Chehab 						  isp_pipe_version, raw_bit_depth);
31519d4fa1a1SMauro Carvalho Chehab 
31529d4fa1a1SMauro Carvalho Chehab 			err = sh_css_params_write_to_ddr_internal(
31539d4fa1a1SMauro Carvalho Chehab 				  pipe,
31549d4fa1a1SMauro Carvalho Chehab 				  pipeline->pipe_id,
31559d4fa1a1SMauro Carvalho Chehab 				  params,
31569d4fa1a1SMauro Carvalho Chehab 				  stage,
31579d4fa1a1SMauro Carvalho Chehab 				  cur_map,
31589d4fa1a1SMauro Carvalho Chehab 				  cur_map_size);
31599d4fa1a1SMauro Carvalho Chehab 
316041022d35SMauro Carvalho Chehab 			if (err)
31619d4fa1a1SMauro Carvalho Chehab 				break;
31629d4fa1a1SMauro Carvalho Chehab 			for (mem = 0; mem < IA_CSS_NUM_MEMORIES; mem++) {
31639d4fa1a1SMauro Carvalho Chehab 				params->isp_mem_params_changed
31649d4fa1a1SMauro Carvalho Chehab 				[pipeline->pipe_id][stage->stage_num][mem] = false;
31659d4fa1a1SMauro Carvalho Chehab 			}
31669d4fa1a1SMauro Carvalho Chehab 		} /* for */
316741022d35SMauro Carvalho Chehab 		if (err)
31689d4fa1a1SMauro Carvalho Chehab 			break;
31699d4fa1a1SMauro Carvalho Chehab 		/* update isp_params to pipe specific copies */
31709d4fa1a1SMauro Carvalho Chehab 		if (params->isp_params_changed) {
31719d4fa1a1SMauro Carvalho Chehab 			reallocate_buffer(&cur_map->isp_param,
31729d4fa1a1SMauro Carvalho Chehab 					  &cur_map_size->isp_param,
31739d4fa1a1SMauro Carvalho Chehab 					  cur_map_size->isp_param,
31749d4fa1a1SMauro Carvalho Chehab 					  true,
31759d4fa1a1SMauro Carvalho Chehab 					  &err);
317641022d35SMauro Carvalho Chehab 			if (err)
31779d4fa1a1SMauro Carvalho Chehab 				break;
31789d4fa1a1SMauro Carvalho Chehab 			sh_css_update_isp_params_to_ddr(params, cur_map->isp_param);
31799d4fa1a1SMauro Carvalho Chehab 		}
31809d4fa1a1SMauro Carvalho Chehab 
31819d4fa1a1SMauro Carvalho Chehab 		/* last make referenced copy */
31829d4fa1a1SMauro Carvalho Chehab 		err = ref_sh_css_ddr_address_map(
31839d4fa1a1SMauro Carvalho Chehab 			  cur_map,
31849d4fa1a1SMauro Carvalho Chehab 			  &isp_params_info.mem_map);
318541022d35SMauro Carvalho Chehab 		if (err)
31869d4fa1a1SMauro Carvalho Chehab 			break;
31879d4fa1a1SMauro Carvalho Chehab 
31889d4fa1a1SMauro Carvalho Chehab 		/* Update Parameters ID */
31899d4fa1a1SMauro Carvalho Chehab 		isp_params_info.isp_parameters_id = params->isp_parameters_id;
31909d4fa1a1SMauro Carvalho Chehab 
31919d4fa1a1SMauro Carvalho Chehab 		/* Update output frame pointer */
31929d4fa1a1SMauro Carvalho Chehab 		isp_params_info.output_frame_ptr =
31939d4fa1a1SMauro Carvalho Chehab 		    (params->output_frame) ? params->output_frame->data : mmgr_NULL;
31949d4fa1a1SMauro Carvalho Chehab 
31959d4fa1a1SMauro Carvalho Chehab 		/* now write the copy to ddr */
31969d4fa1a1SMauro Carvalho Chehab 		err = write_ia_css_isp_parameter_set_info_to_ddr(&isp_params_info, &cpy);
319741022d35SMauro Carvalho Chehab 		if (err)
31989d4fa1a1SMauro Carvalho Chehab 			break;
31999d4fa1a1SMauro Carvalho Chehab 
32009d4fa1a1SMauro Carvalho Chehab 		/* enqueue the set to sp */
32019d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LOG("queue param set %x to %d", cpy, thread_id);
32029d4fa1a1SMauro Carvalho Chehab 
32039d4fa1a1SMauro Carvalho Chehab 		err = ia_css_bufq_enqueue_buffer(thread_id, queue_id, (uint32_t)cpy);
320441022d35SMauro Carvalho Chehab 		if (err) {
32059d4fa1a1SMauro Carvalho Chehab 			free_ia_css_isp_parameter_set_info(cpy);
32069d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LOG("pfp: FAILED to add config id %d for OF %d to q %d on thread %d",
32079d4fa1a1SMauro Carvalho Chehab 				   isp_params_info.isp_parameters_id,
32089d4fa1a1SMauro Carvalho Chehab 				   isp_params_info.output_frame_ptr,
32099d4fa1a1SMauro Carvalho Chehab 				   queue_id, thread_id);
32109d4fa1a1SMauro Carvalho Chehab 			break;
32119d4fa1a1SMauro Carvalho Chehab 		} else {
32129d4fa1a1SMauro Carvalho Chehab 			/* TMP: check discrepancy between nr of enqueued
32139d4fa1a1SMauro Carvalho Chehab 			 * parameter sets and dequeued sets
32149d4fa1a1SMauro Carvalho Chehab 			 */
32159d4fa1a1SMauro Carvalho Chehab 			g_param_buffer_enqueue_count++;
32169d4fa1a1SMauro Carvalho Chehab 			assert(g_param_buffer_enqueue_count < g_param_buffer_dequeue_count + 50);
32179d4fa1a1SMauro Carvalho Chehab 			/*
32189d4fa1a1SMauro Carvalho Chehab 			 * Tell the SP which queues are not empty,
32199d4fa1a1SMauro Carvalho Chehab 			 * by sending the software event.
32209d4fa1a1SMauro Carvalho Chehab 			 */
32219d4fa1a1SMauro Carvalho Chehab 			if (!sh_css_sp_is_running()) {
32229d4fa1a1SMauro Carvalho Chehab 				/* SP is not running. The queues are not valid */
322341022d35SMauro Carvalho Chehab 				IA_CSS_LEAVE_ERR_PRIVATE(-EBUSY);
322441022d35SMauro Carvalho Chehab 				return -EBUSY;
32259d4fa1a1SMauro Carvalho Chehab 			}
32269d4fa1a1SMauro Carvalho Chehab 			ia_css_bufq_enqueue_psys_event(
32279d4fa1a1SMauro Carvalho Chehab 			    IA_CSS_PSYS_SW_EVENT_BUFFER_ENQUEUED,
32289d4fa1a1SMauro Carvalho Chehab 			    (uint8_t)thread_id,
32299d4fa1a1SMauro Carvalho Chehab 			    (uint8_t)queue_id,
32309d4fa1a1SMauro Carvalho Chehab 			    0);
32319d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LOG("pfp: added config id %d for OF %d to q %d on thread %d",
32329d4fa1a1SMauro Carvalho Chehab 				   isp_params_info.isp_parameters_id,
32339d4fa1a1SMauro Carvalho Chehab 				   isp_params_info.output_frame_ptr,
32349d4fa1a1SMauro Carvalho Chehab 				   queue_id, thread_id);
32359d4fa1a1SMauro Carvalho Chehab 		}
32369d4fa1a1SMauro Carvalho Chehab 		/* clean-up old copy */
32379d4fa1a1SMauro Carvalho Chehab 		ia_css_dequeue_param_buffers(/*pipe_num*/);
32389d4fa1a1SMauro Carvalho Chehab 		params->pipe_dvs_6axis_config_changed[pipeline->pipe_id] = false;
32399d4fa1a1SMauro Carvalho Chehab 	} /* end for each 'active' pipeline */
32409d4fa1a1SMauro Carvalho Chehab 	/* clear the changed flags after all params
32419d4fa1a1SMauro Carvalho Chehab 	for all pipelines have been updated */
32429d4fa1a1SMauro Carvalho Chehab 	params->isp_params_changed = false;
32439d4fa1a1SMauro Carvalho Chehab 	params->sc_table_changed = false;
32449d4fa1a1SMauro Carvalho Chehab 	params->dis_coef_table_changed = false;
32459d4fa1a1SMauro Carvalho Chehab 	params->dvs2_coef_table_changed = false;
32469d4fa1a1SMauro Carvalho Chehab 	params->morph_table_changed = false;
32479d4fa1a1SMauro Carvalho Chehab 	params->dz_config_changed = false;
32489d4fa1a1SMauro Carvalho Chehab 	params->motion_config_changed = false;
32499d4fa1a1SMauro Carvalho Chehab 	/* ------ deprecated(bz675) : from ------ */
32509d4fa1a1SMauro Carvalho Chehab 	params->shading_settings_changed = false;
32519d4fa1a1SMauro Carvalho Chehab 	/* ------ deprecated(bz675) : to ------ */
32529d4fa1a1SMauro Carvalho Chehab 
32539d4fa1a1SMauro Carvalho Chehab 	memset(&params->config_changed[0], 0, sizeof(params->config_changed));
32549d4fa1a1SMauro Carvalho Chehab 
32559d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(err);
32569d4fa1a1SMauro Carvalho Chehab 	return err;
32579d4fa1a1SMauro Carvalho Chehab }
32589d4fa1a1SMauro Carvalho Chehab 
325941022d35SMauro Carvalho Chehab static int
sh_css_params_write_to_ddr_internal(struct ia_css_pipe * pipe,unsigned int pipe_id,struct ia_css_isp_parameters * params,const struct ia_css_pipeline_stage * stage,struct sh_css_ddr_address_map * ddr_map,struct sh_css_ddr_address_map_size * ddr_map_size)32609d4fa1a1SMauro Carvalho Chehab sh_css_params_write_to_ddr_internal(
32619d4fa1a1SMauro Carvalho Chehab     struct ia_css_pipe *pipe,
32629d4fa1a1SMauro Carvalho Chehab     unsigned int pipe_id,
32639d4fa1a1SMauro Carvalho Chehab     struct ia_css_isp_parameters *params,
32649d4fa1a1SMauro Carvalho Chehab     const struct ia_css_pipeline_stage *stage,
32659d4fa1a1SMauro Carvalho Chehab     struct sh_css_ddr_address_map *ddr_map,
3266c27479d7SDeepak R Varma     struct sh_css_ddr_address_map_size *ddr_map_size)
3267c27479d7SDeepak R Varma {
326841022d35SMauro Carvalho Chehab 	int err;
32699d4fa1a1SMauro Carvalho Chehab 	const struct ia_css_binary *binary;
32709d4fa1a1SMauro Carvalho Chehab 
32719d4fa1a1SMauro Carvalho Chehab 	unsigned int stage_num;
32729d4fa1a1SMauro Carvalho Chehab 	unsigned int mem;
32739d4fa1a1SMauro Carvalho Chehab 	bool buff_realloced;
32749d4fa1a1SMauro Carvalho Chehab 
32759d4fa1a1SMauro Carvalho Chehab 	/* struct is > 128 bytes so it should not be on stack (see checkpatch) */
32769d4fa1a1SMauro Carvalho Chehab 	static struct ia_css_macc_table converted_macc_table;
32779d4fa1a1SMauro Carvalho Chehab 
32789d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
32799d4fa1a1SMauro Carvalho Chehab 	assert(params);
32809d4fa1a1SMauro Carvalho Chehab 	assert(ddr_map);
32819d4fa1a1SMauro Carvalho Chehab 	assert(ddr_map_size);
32829d4fa1a1SMauro Carvalho Chehab 	assert(stage);
32839d4fa1a1SMauro Carvalho Chehab 
32849d4fa1a1SMauro Carvalho Chehab 	binary = stage->binary;
32859d4fa1a1SMauro Carvalho Chehab 	assert(binary);
32869d4fa1a1SMauro Carvalho Chehab 
32879d4fa1a1SMauro Carvalho Chehab 	stage_num = stage->stage_num;
32889d4fa1a1SMauro Carvalho Chehab 
3289c27479d7SDeepak R Varma 	if (binary->info->sp.enable.fpnr) {
32909d4fa1a1SMauro Carvalho Chehab 		buff_realloced = reallocate_buffer(&ddr_map->fpn_tbl,
32919d4fa1a1SMauro Carvalho Chehab 						   &ddr_map_size->fpn_tbl,
3292*2e82f054SBrent Pappas 						   fpntbl_bytes(binary),
32939d4fa1a1SMauro Carvalho Chehab 						   params->config_changed[IA_CSS_FPN_ID],
32949d4fa1a1SMauro Carvalho Chehab 						   &err);
329541022d35SMauro Carvalho Chehab 		if (err) {
32969d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LEAVE_ERR_PRIVATE(err);
32979d4fa1a1SMauro Carvalho Chehab 			return err;
32989d4fa1a1SMauro Carvalho Chehab 		}
32999d4fa1a1SMauro Carvalho Chehab 		if (params->config_changed[IA_CSS_FPN_ID] || buff_realloced) {
33009d4fa1a1SMauro Carvalho Chehab 			if (params->fpn_config.enabled) {
33019d4fa1a1SMauro Carvalho Chehab 				err = store_fpntbl(params, ddr_map->fpn_tbl);
330241022d35SMauro Carvalho Chehab 				if (err) {
33039d4fa1a1SMauro Carvalho Chehab 					IA_CSS_LEAVE_ERR_PRIVATE(err);
33049d4fa1a1SMauro Carvalho Chehab 					return err;
33059d4fa1a1SMauro Carvalho Chehab 				}
33069d4fa1a1SMauro Carvalho Chehab 			}
33079d4fa1a1SMauro Carvalho Chehab 		}
33089d4fa1a1SMauro Carvalho Chehab 	}
33099d4fa1a1SMauro Carvalho Chehab 
3310c27479d7SDeepak R Varma 	if (binary->info->sp.enable.sc) {
33113c0538fbSMauro Carvalho Chehab 		u32 enable_conv;
33123c0538fbSMauro Carvalho Chehab 
33133c0538fbSMauro Carvalho Chehab 		enable_conv = params->shading_settings.enable_shading_table_conversion;
33149d4fa1a1SMauro Carvalho Chehab 
33159d4fa1a1SMauro Carvalho Chehab 		buff_realloced = reallocate_buffer(&ddr_map->sc_tbl,
33169d4fa1a1SMauro Carvalho Chehab 						   &ddr_map_size->sc_tbl,
3317*2e82f054SBrent Pappas 						   sctbl_bytes(binary),
33189d4fa1a1SMauro Carvalho Chehab 						   params->sc_table_changed,
33199d4fa1a1SMauro Carvalho Chehab 						   &err);
332041022d35SMauro Carvalho Chehab 		if (err) {
33219d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LEAVE_ERR_PRIVATE(err);
33229d4fa1a1SMauro Carvalho Chehab 			return err;
33239d4fa1a1SMauro Carvalho Chehab 		}
33249d4fa1a1SMauro Carvalho Chehab 
33259d4fa1a1SMauro Carvalho Chehab 		if (params->shading_settings_changed ||
33269d4fa1a1SMauro Carvalho Chehab 		    params->sc_table_changed || buff_realloced) {
33279d4fa1a1SMauro Carvalho Chehab 			if (enable_conv == 0) {
33289d4fa1a1SMauro Carvalho Chehab 				if (params->sc_table) {
33299d4fa1a1SMauro Carvalho Chehab 					/* store the shading table to ddr */
33309d4fa1a1SMauro Carvalho Chehab 					err = ia_css_params_store_sctbl(stage, ddr_map->sc_tbl, params->sc_table);
333141022d35SMauro Carvalho Chehab 					if (err) {
33329d4fa1a1SMauro Carvalho Chehab 						IA_CSS_LEAVE_ERR_PRIVATE(err);
33339d4fa1a1SMauro Carvalho Chehab 						return err;
33349d4fa1a1SMauro Carvalho Chehab 					}
33359d4fa1a1SMauro Carvalho Chehab 					/* set sc_config to isp */
33369d4fa1a1SMauro Carvalho Chehab 					params->sc_config = (struct ia_css_shading_table *)params->sc_table;
33379d4fa1a1SMauro Carvalho Chehab 					ia_css_kernel_process_param[IA_CSS_SC_ID](pipe_id, stage, params);
33389d4fa1a1SMauro Carvalho Chehab 					params->sc_config = NULL;
33399d4fa1a1SMauro Carvalho Chehab 				} else {
33409d4fa1a1SMauro Carvalho Chehab 					/* generate the identical shading table */
33419d4fa1a1SMauro Carvalho Chehab 					if (params->sc_config) {
33429d4fa1a1SMauro Carvalho Chehab 						ia_css_shading_table_free(params->sc_config);
33439d4fa1a1SMauro Carvalho Chehab 						params->sc_config = NULL;
33449d4fa1a1SMauro Carvalho Chehab 					}
33459d4fa1a1SMauro Carvalho Chehab 					sh_css_params_shading_id_table_generate(&params->sc_config,
33469d4fa1a1SMauro Carvalho Chehab 										binary->sctbl_width_per_color,
33479d4fa1a1SMauro Carvalho Chehab 										binary->sctbl_height);
33489d4fa1a1SMauro Carvalho Chehab 					if (!params->sc_config) {
334941022d35SMauro Carvalho Chehab 						IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
335041022d35SMauro Carvalho Chehab 						return -ENOMEM;
33519d4fa1a1SMauro Carvalho Chehab 					}
33529d4fa1a1SMauro Carvalho Chehab 
33539d4fa1a1SMauro Carvalho Chehab 					/* store the shading table to ddr */
33549d4fa1a1SMauro Carvalho Chehab 					err = ia_css_params_store_sctbl(stage, ddr_map->sc_tbl, params->sc_config);
335541022d35SMauro Carvalho Chehab 					if (err) {
33569d4fa1a1SMauro Carvalho Chehab 						IA_CSS_LEAVE_ERR_PRIVATE(err);
33579d4fa1a1SMauro Carvalho Chehab 						return err;
33589d4fa1a1SMauro Carvalho Chehab 					}
33599d4fa1a1SMauro Carvalho Chehab 
33609d4fa1a1SMauro Carvalho Chehab 					/* set sc_config to isp */
33619d4fa1a1SMauro Carvalho Chehab 					ia_css_kernel_process_param[IA_CSS_SC_ID](pipe_id, stage, params);
33629d4fa1a1SMauro Carvalho Chehab 
33639d4fa1a1SMauro Carvalho Chehab 					/* free the shading table */
33649d4fa1a1SMauro Carvalho Chehab 					ia_css_shading_table_free(params->sc_config);
33659d4fa1a1SMauro Carvalho Chehab 					params->sc_config = NULL;
33669d4fa1a1SMauro Carvalho Chehab 				}
33679d4fa1a1SMauro Carvalho Chehab 			} else { /* legacy */
33689d4fa1a1SMauro Carvalho Chehab 				/* ------ deprecated(bz675) : from ------ */
33699d4fa1a1SMauro Carvalho Chehab 				/* shading table is full resolution, reduce */
33709d4fa1a1SMauro Carvalho Chehab 				if (params->sc_config) {
33719d4fa1a1SMauro Carvalho Chehab 					ia_css_shading_table_free(params->sc_config);
33729d4fa1a1SMauro Carvalho Chehab 					params->sc_config = NULL;
33739d4fa1a1SMauro Carvalho Chehab 				}
33749d4fa1a1SMauro Carvalho Chehab 				prepare_shading_table(
33759d4fa1a1SMauro Carvalho Chehab 				    (const struct ia_css_shading_table *)params->sc_table,
33769d4fa1a1SMauro Carvalho Chehab 				    params->sensor_binning,
33779d4fa1a1SMauro Carvalho Chehab 				    &params->sc_config,
33789d4fa1a1SMauro Carvalho Chehab 				    binary, pipe->required_bds_factor);
33799d4fa1a1SMauro Carvalho Chehab 				if (!params->sc_config) {
338041022d35SMauro Carvalho Chehab 					IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
338141022d35SMauro Carvalho Chehab 					return -ENOMEM;
33829d4fa1a1SMauro Carvalho Chehab 				}
33839d4fa1a1SMauro Carvalho Chehab 
33849d4fa1a1SMauro Carvalho Chehab 				/* store the shading table to ddr */
33859d4fa1a1SMauro Carvalho Chehab 				err = ia_css_params_store_sctbl(stage, ddr_map->sc_tbl, params->sc_config);
338641022d35SMauro Carvalho Chehab 				if (err) {
33879d4fa1a1SMauro Carvalho Chehab 					IA_CSS_LEAVE_ERR_PRIVATE(err);
33889d4fa1a1SMauro Carvalho Chehab 					return err;
33899d4fa1a1SMauro Carvalho Chehab 				}
33909d4fa1a1SMauro Carvalho Chehab 
33919d4fa1a1SMauro Carvalho Chehab 				/* set sc_config to isp */
33929d4fa1a1SMauro Carvalho Chehab 				ia_css_kernel_process_param[IA_CSS_SC_ID](pipe_id, stage, params);
33939d4fa1a1SMauro Carvalho Chehab 
33949d4fa1a1SMauro Carvalho Chehab 				/* free the shading table */
33959d4fa1a1SMauro Carvalho Chehab 				ia_css_shading_table_free(params->sc_config);
33969d4fa1a1SMauro Carvalho Chehab 				params->sc_config = NULL;
33979d4fa1a1SMauro Carvalho Chehab 				/* ------ deprecated(bz675) : to ------ */
33989d4fa1a1SMauro Carvalho Chehab 			}
33999d4fa1a1SMauro Carvalho Chehab 		}
34009d4fa1a1SMauro Carvalho Chehab 	}
34013c0538fbSMauro Carvalho Chehab 
3402c27479d7SDeepak R Varma 	if (params->config_changed[IA_CSS_MACC_ID] && binary->info->sp.enable.macc) {
34039d4fa1a1SMauro Carvalho Chehab 		unsigned int i, j, idx;
34041ace494fSColin Ian King 		static const unsigned int idx_map[] = {
34059d4fa1a1SMauro Carvalho Chehab 			0, 1, 3, 2, 6, 7, 5, 4, 12, 13, 15, 14, 10, 11, 9, 8
34069d4fa1a1SMauro Carvalho Chehab 		};
34079d4fa1a1SMauro Carvalho Chehab 
34089d4fa1a1SMauro Carvalho Chehab 		for (i = 0; i < IA_CSS_MACC_NUM_AXES; i++) {
34099d4fa1a1SMauro Carvalho Chehab 			idx = 4 * idx_map[i];
34109d4fa1a1SMauro Carvalho Chehab 			j   = 4 * i;
34119d4fa1a1SMauro Carvalho Chehab 
34129d4fa1a1SMauro Carvalho Chehab 			if (binary->info->sp.pipeline.isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_1) {
34139d4fa1a1SMauro Carvalho Chehab 				converted_macc_table.data[idx] =
34149d4fa1a1SMauro Carvalho Chehab 				    (int16_t)sDIGIT_FITTING(params->macc_table.data[j],
34159d4fa1a1SMauro Carvalho Chehab 							    13, SH_CSS_MACC_COEF_SHIFT);
34169d4fa1a1SMauro Carvalho Chehab 				converted_macc_table.data[idx + 1] =
34179d4fa1a1SMauro Carvalho Chehab 				    (int16_t)sDIGIT_FITTING(params->macc_table.data[j + 1],
34189d4fa1a1SMauro Carvalho Chehab 							    13, SH_CSS_MACC_COEF_SHIFT);
34199d4fa1a1SMauro Carvalho Chehab 				converted_macc_table.data[idx + 2] =
34209d4fa1a1SMauro Carvalho Chehab 				    (int16_t)sDIGIT_FITTING(params->macc_table.data[j + 2],
34219d4fa1a1SMauro Carvalho Chehab 							    13, SH_CSS_MACC_COEF_SHIFT);
34229d4fa1a1SMauro Carvalho Chehab 				converted_macc_table.data[idx + 3] =
34239d4fa1a1SMauro Carvalho Chehab 				    (int16_t)sDIGIT_FITTING(params->macc_table.data[j + 3],
34249d4fa1a1SMauro Carvalho Chehab 							    13, SH_CSS_MACC_COEF_SHIFT);
34259d4fa1a1SMauro Carvalho Chehab 			} else if (binary->info->sp.pipeline.isp_pipe_version ==
34269d4fa1a1SMauro Carvalho Chehab 				   SH_CSS_ISP_PIPE_VERSION_2_2) {
34279d4fa1a1SMauro Carvalho Chehab 				converted_macc_table.data[idx] =
34289d4fa1a1SMauro Carvalho Chehab 				    params->macc_table.data[j];
34299d4fa1a1SMauro Carvalho Chehab 				converted_macc_table.data[idx + 1] =
34309d4fa1a1SMauro Carvalho Chehab 				    params->macc_table.data[j + 1];
34319d4fa1a1SMauro Carvalho Chehab 				converted_macc_table.data[idx + 2] =
34329d4fa1a1SMauro Carvalho Chehab 				    params->macc_table.data[j + 2];
34339d4fa1a1SMauro Carvalho Chehab 				converted_macc_table.data[idx + 3] =
34349d4fa1a1SMauro Carvalho Chehab 				    params->macc_table.data[j + 3];
34359d4fa1a1SMauro Carvalho Chehab 			}
34369d4fa1a1SMauro Carvalho Chehab 		}
34379d4fa1a1SMauro Carvalho Chehab 		reallocate_buffer(&ddr_map->macc_tbl,
34389d4fa1a1SMauro Carvalho Chehab 				  &ddr_map_size->macc_tbl,
34399d4fa1a1SMauro Carvalho Chehab 				  ddr_map_size->macc_tbl,
34409d4fa1a1SMauro Carvalho Chehab 				  true,
34419d4fa1a1SMauro Carvalho Chehab 				  &err);
344241022d35SMauro Carvalho Chehab 		if (err) {
34439d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LEAVE_ERR_PRIVATE(err);
34449d4fa1a1SMauro Carvalho Chehab 			return err;
34459d4fa1a1SMauro Carvalho Chehab 		}
34465472b4dbSMauro Carvalho Chehab 		hmm_store(ddr_map->macc_tbl,
34479d4fa1a1SMauro Carvalho Chehab 			   converted_macc_table.data,
34489d4fa1a1SMauro Carvalho Chehab 			   sizeof(converted_macc_table.data));
34499d4fa1a1SMauro Carvalho Chehab 	}
34509d4fa1a1SMauro Carvalho Chehab 
3451c27479d7SDeepak R Varma 	if (binary->info->sp.enable.dvs_6axis) {
34529d4fa1a1SMauro Carvalho Chehab 		/* because UV is packed into the Y plane, calc total
34539d4fa1a1SMauro Carvalho Chehab 		 * YYU size = /2 gives size of UV-only,
34549d4fa1a1SMauro Carvalho Chehab 		 * total YYU size = UV-only * 3.
34559d4fa1a1SMauro Carvalho Chehab 		 */
34569d4fa1a1SMauro Carvalho Chehab 		buff_realloced = reallocate_buffer(
34579d4fa1a1SMauro Carvalho Chehab 				     &ddr_map->dvs_6axis_params_y,
34589d4fa1a1SMauro Carvalho Chehab 				     &ddr_map_size->dvs_6axis_params_y,
34599d4fa1a1SMauro Carvalho Chehab 				     (size_t)((DVS_6AXIS_BYTES(binary) / 2) * 3),
34609d4fa1a1SMauro Carvalho Chehab 				     params->pipe_dvs_6axis_config_changed[pipe_id],
34619d4fa1a1SMauro Carvalho Chehab 				     &err);
346241022d35SMauro Carvalho Chehab 		if (err) {
34639d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LEAVE_ERR_PRIVATE(err);
34649d4fa1a1SMauro Carvalho Chehab 			return err;
34659d4fa1a1SMauro Carvalho Chehab 		}
34669d4fa1a1SMauro Carvalho Chehab 
34679d4fa1a1SMauro Carvalho Chehab 		if (params->pipe_dvs_6axis_config_changed[pipe_id] || buff_realloced) {
34689d4fa1a1SMauro Carvalho Chehab 			const struct ia_css_frame_info *dvs_in_frame_info;
34699d4fa1a1SMauro Carvalho Chehab 
34709d4fa1a1SMauro Carvalho Chehab 			if (stage->args.delay_frames[0]) {
34719d4fa1a1SMauro Carvalho Chehab 				/*When delay frames are present(as in case of video),
34729d4fa1a1SMauro Carvalho Chehab 				they are used for dvs. Configure DVS using those params*/
34739a29f5fcSHans de Goede 				dvs_in_frame_info = &stage->args.delay_frames[0]->frame_info;
34749d4fa1a1SMauro Carvalho Chehab 			} else {
34759d4fa1a1SMauro Carvalho Chehab 				/*Otherwise, use input frame to configure DVS*/
34769a29f5fcSHans de Goede 				dvs_in_frame_info = &stage->args.in_frame->frame_info;
34779d4fa1a1SMauro Carvalho Chehab 			}
34789d4fa1a1SMauro Carvalho Chehab 
34799d4fa1a1SMauro Carvalho Chehab 			/* Generate default DVS unity table on start up*/
34809d4fa1a1SMauro Carvalho Chehab 			if (!params->pipe_dvs_6axis_config[pipe_id]) {
34813c0538fbSMauro Carvalho Chehab 				struct ia_css_resolution dvs_offset = {0};
34829d4fa1a1SMauro Carvalho Chehab 
34833c0538fbSMauro Carvalho Chehab 				dvs_offset.width = (PIX_SHIFT_FILTER_RUN_IN_X + binary->dvs_envelope.width) / 2;
34843c0538fbSMauro Carvalho Chehab 				dvs_offset.height = (PIX_SHIFT_FILTER_RUN_IN_Y + binary->dvs_envelope.height) / 2;
34859d4fa1a1SMauro Carvalho Chehab 
34869d4fa1a1SMauro Carvalho Chehab 				params->pipe_dvs_6axis_config[pipe_id] =
34879d4fa1a1SMauro Carvalho Chehab 				    generate_dvs_6axis_table(&binary->out_frame_info[0].res, &dvs_offset);
34889d4fa1a1SMauro Carvalho Chehab 				if (!params->pipe_dvs_6axis_config[pipe_id]) {
348941022d35SMauro Carvalho Chehab 					IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
349041022d35SMauro Carvalho Chehab 					return -ENOMEM;
34919d4fa1a1SMauro Carvalho Chehab 				}
34929d4fa1a1SMauro Carvalho Chehab 				params->pipe_dvs_6axis_config_changed[pipe_id] = true;
34939d4fa1a1SMauro Carvalho Chehab 
34949d4fa1a1SMauro Carvalho Chehab 				store_dvs_6axis_config(params->pipe_dvs_6axis_config[pipe_id],
34959d4fa1a1SMauro Carvalho Chehab 						    binary,
34969d4fa1a1SMauro Carvalho Chehab 						    dvs_in_frame_info,
34979d4fa1a1SMauro Carvalho Chehab 						    ddr_map->dvs_6axis_params_y);
34989d4fa1a1SMauro Carvalho Chehab 				params->isp_params_changed = true;
34999d4fa1a1SMauro Carvalho Chehab 			}
35009d4fa1a1SMauro Carvalho Chehab 		}
35013c0538fbSMauro Carvalho Chehab 	}
35029d4fa1a1SMauro Carvalho Chehab 
3503c27479d7SDeepak R Varma 	if (binary->info->sp.enable.ca_gdc) {
35049d4fa1a1SMauro Carvalho Chehab 		unsigned int i;
3505100e8989SMauro Carvalho Chehab 		ia_css_ptr *virt_addr_tetra_x[
3506abbd669dSMauro Carvalho Chehab 
35079d4fa1a1SMauro Carvalho Chehab 		IA_CSS_MORPH_TABLE_NUM_PLANES];
35089d4fa1a1SMauro Carvalho Chehab 		size_t *virt_size_tetra_x[
3509abbd669dSMauro Carvalho Chehab 
35109d4fa1a1SMauro Carvalho Chehab 		IA_CSS_MORPH_TABLE_NUM_PLANES];
3511100e8989SMauro Carvalho Chehab 		ia_css_ptr *virt_addr_tetra_y[
3512abbd669dSMauro Carvalho Chehab 
35139d4fa1a1SMauro Carvalho Chehab 		IA_CSS_MORPH_TABLE_NUM_PLANES];
35149d4fa1a1SMauro Carvalho Chehab 		size_t *virt_size_tetra_y[
3515abbd669dSMauro Carvalho Chehab 
35169d4fa1a1SMauro Carvalho Chehab 		IA_CSS_MORPH_TABLE_NUM_PLANES];
35179d4fa1a1SMauro Carvalho Chehab 
35189d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_x[0] = &ddr_map->tetra_r_x;
35199d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_x[1] = &ddr_map->tetra_gr_x;
35209d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_x[2] = &ddr_map->tetra_gb_x;
35219d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_x[3] = &ddr_map->tetra_b_x;
35229d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_x[4] = &ddr_map->tetra_ratb_x;
35239d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_x[5] = &ddr_map->tetra_batr_x;
35249d4fa1a1SMauro Carvalho Chehab 
35259d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_x[0] = &ddr_map_size->tetra_r_x;
35269d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_x[1] = &ddr_map_size->tetra_gr_x;
35279d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_x[2] = &ddr_map_size->tetra_gb_x;
35289d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_x[3] = &ddr_map_size->tetra_b_x;
35299d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_x[4] = &ddr_map_size->tetra_ratb_x;
35309d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_x[5] = &ddr_map_size->tetra_batr_x;
35319d4fa1a1SMauro Carvalho Chehab 
35329d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_y[0] = &ddr_map->tetra_r_y;
35339d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_y[1] = &ddr_map->tetra_gr_y;
35349d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_y[2] = &ddr_map->tetra_gb_y;
35359d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_y[3] = &ddr_map->tetra_b_y;
35369d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_y[4] = &ddr_map->tetra_ratb_y;
35379d4fa1a1SMauro Carvalho Chehab 		virt_addr_tetra_y[5] = &ddr_map->tetra_batr_y;
35389d4fa1a1SMauro Carvalho Chehab 
35399d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_y[0] = &ddr_map_size->tetra_r_y;
35409d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_y[1] = &ddr_map_size->tetra_gr_y;
35419d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_y[2] = &ddr_map_size->tetra_gb_y;
35429d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_y[3] = &ddr_map_size->tetra_b_y;
35439d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_y[4] = &ddr_map_size->tetra_ratb_y;
35449d4fa1a1SMauro Carvalho Chehab 		virt_size_tetra_y[5] = &ddr_map_size->tetra_batr_y;
35459d4fa1a1SMauro Carvalho Chehab 
35469d4fa1a1SMauro Carvalho Chehab 		buff_realloced = false;
35479d4fa1a1SMauro Carvalho Chehab 		for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
35489d4fa1a1SMauro Carvalho Chehab 			buff_realloced |=
35499d4fa1a1SMauro Carvalho Chehab 			    reallocate_buffer(virt_addr_tetra_x[i],
35509d4fa1a1SMauro Carvalho Chehab 					    virt_size_tetra_x[i],
3551*2e82f054SBrent Pappas 					    morph_plane_bytes(binary),
35529d4fa1a1SMauro Carvalho Chehab 					    params->morph_table_changed,
35539d4fa1a1SMauro Carvalho Chehab 					    &err);
355441022d35SMauro Carvalho Chehab 			if (err) {
35559d4fa1a1SMauro Carvalho Chehab 				IA_CSS_LEAVE_ERR_PRIVATE(err);
35569d4fa1a1SMauro Carvalho Chehab 				return err;
35579d4fa1a1SMauro Carvalho Chehab 			}
35589d4fa1a1SMauro Carvalho Chehab 			buff_realloced |=
35599d4fa1a1SMauro Carvalho Chehab 			    reallocate_buffer(virt_addr_tetra_y[i],
35609d4fa1a1SMauro Carvalho Chehab 					    virt_size_tetra_y[i],
3561*2e82f054SBrent Pappas 					    morph_plane_bytes(binary),
35629d4fa1a1SMauro Carvalho Chehab 					    params->morph_table_changed,
35639d4fa1a1SMauro Carvalho Chehab 					    &err);
356441022d35SMauro Carvalho Chehab 			if (err) {
35659d4fa1a1SMauro Carvalho Chehab 				IA_CSS_LEAVE_ERR_PRIVATE(err);
35669d4fa1a1SMauro Carvalho Chehab 				return err;
35679d4fa1a1SMauro Carvalho Chehab 			}
35689d4fa1a1SMauro Carvalho Chehab 		}
35699d4fa1a1SMauro Carvalho Chehab 		if (params->morph_table_changed || buff_realloced) {
35709d4fa1a1SMauro Carvalho Chehab 			const struct ia_css_morph_table *table = params->morph_table;
35719d4fa1a1SMauro Carvalho Chehab 			struct ia_css_morph_table *id_table = NULL;
35729d4fa1a1SMauro Carvalho Chehab 
35739d4fa1a1SMauro Carvalho Chehab 			if ((table) &&
35749d4fa1a1SMauro Carvalho Chehab 			    (table->width < binary->morph_tbl_width ||
35759d4fa1a1SMauro Carvalho Chehab 			    table->height < binary->morph_tbl_height)) {
35769d4fa1a1SMauro Carvalho Chehab 				table = NULL;
35779d4fa1a1SMauro Carvalho Chehab 			}
35789d4fa1a1SMauro Carvalho Chehab 			if (!table) {
35799d4fa1a1SMauro Carvalho Chehab 				err = sh_css_params_default_morph_table(&id_table,
35809d4fa1a1SMauro Carvalho Chehab 									binary);
358141022d35SMauro Carvalho Chehab 				if (err) {
35829d4fa1a1SMauro Carvalho Chehab 					IA_CSS_LEAVE_ERR_PRIVATE(err);
35839d4fa1a1SMauro Carvalho Chehab 					return err;
35849d4fa1a1SMauro Carvalho Chehab 				}
35859d4fa1a1SMauro Carvalho Chehab 				table = id_table;
35869d4fa1a1SMauro Carvalho Chehab 			}
35879d4fa1a1SMauro Carvalho Chehab 
35889d4fa1a1SMauro Carvalho Chehab 			for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
35899d4fa1a1SMauro Carvalho Chehab 				store_morph_plane(table->coordinates_x[i],
35909d4fa1a1SMauro Carvalho Chehab 						table->width,
35919d4fa1a1SMauro Carvalho Chehab 						table->height,
35929d4fa1a1SMauro Carvalho Chehab 						*virt_addr_tetra_x[i],
35939d4fa1a1SMauro Carvalho Chehab 						binary->morph_tbl_aligned_width);
35949d4fa1a1SMauro Carvalho Chehab 				store_morph_plane(table->coordinates_y[i],
35959d4fa1a1SMauro Carvalho Chehab 						table->width,
35969d4fa1a1SMauro Carvalho Chehab 						table->height,
35979d4fa1a1SMauro Carvalho Chehab 						*virt_addr_tetra_y[i],
35989d4fa1a1SMauro Carvalho Chehab 						binary->morph_tbl_aligned_width);
35999d4fa1a1SMauro Carvalho Chehab 			}
36009d4fa1a1SMauro Carvalho Chehab 			if (id_table)
36019d4fa1a1SMauro Carvalho Chehab 				ia_css_morph_table_free(id_table);
36029d4fa1a1SMauro Carvalho Chehab 		}
36039d4fa1a1SMauro Carvalho Chehab 	}
36049d4fa1a1SMauro Carvalho Chehab 
36059d4fa1a1SMauro Carvalho Chehab 	/* After special cases like SC, FPN since they may change parameters */
3606c27479d7SDeepak R Varma 	for (mem = 0; mem < N_IA_CSS_MEMORIES; mem++) {
36079d4fa1a1SMauro Carvalho Chehab 		const struct ia_css_isp_data *isp_data =
36089d4fa1a1SMauro Carvalho Chehab 		    ia_css_isp_param_get_isp_mem_init(&binary->info->sp.mem_initializers,
36099d4fa1a1SMauro Carvalho Chehab 						    IA_CSS_PARAM_CLASS_PARAM, mem);
36109d4fa1a1SMauro Carvalho Chehab 		size_t size = isp_data->size;
36119d4fa1a1SMauro Carvalho Chehab 
36129d4fa1a1SMauro Carvalho Chehab 		if (!size) continue;
36139d4fa1a1SMauro Carvalho Chehab 		buff_realloced = reallocate_buffer(&ddr_map->isp_mem_param[stage_num][mem],
36149d4fa1a1SMauro Carvalho Chehab 						&ddr_map_size->isp_mem_param[stage_num][mem],
36159d4fa1a1SMauro Carvalho Chehab 						size,
36169d4fa1a1SMauro Carvalho Chehab 						params->isp_mem_params_changed[pipe_id][stage_num][mem],
36179d4fa1a1SMauro Carvalho Chehab 						&err);
361841022d35SMauro Carvalho Chehab 		if (err) {
36199d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LEAVE_ERR_PRIVATE(err);
36209d4fa1a1SMauro Carvalho Chehab 			return err;
36219d4fa1a1SMauro Carvalho Chehab 		}
36229d4fa1a1SMauro Carvalho Chehab 		if (params->isp_mem_params_changed[pipe_id][stage_num][mem] || buff_realloced) {
36239d4fa1a1SMauro Carvalho Chehab 			sh_css_update_isp_mem_params_to_ddr(binary,
36249d4fa1a1SMauro Carvalho Chehab 							    ddr_map->isp_mem_param[stage_num][mem],
36259d4fa1a1SMauro Carvalho Chehab 							    ddr_map_size->isp_mem_param[stage_num][mem], mem);
36269d4fa1a1SMauro Carvalho Chehab 		}
36279d4fa1a1SMauro Carvalho Chehab 	}
36289d4fa1a1SMauro Carvalho Chehab 
362941022d35SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(0);
363041022d35SMauro Carvalho Chehab 	return 0;
36319d4fa1a1SMauro Carvalho Chehab }
36329d4fa1a1SMauro Carvalho Chehab 
ia_css_get_fpn_table(struct ia_css_stream * stream)36339d4fa1a1SMauro Carvalho Chehab const struct ia_css_fpn_table *ia_css_get_fpn_table(struct ia_css_stream
36349d4fa1a1SMauro Carvalho Chehab 	*stream)
36359d4fa1a1SMauro Carvalho Chehab {
36369d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params;
36379d4fa1a1SMauro Carvalho Chehab 
36389d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_LEAVE("void");
36399d4fa1a1SMauro Carvalho Chehab 	assert(stream);
36409d4fa1a1SMauro Carvalho Chehab 
36419d4fa1a1SMauro Carvalho Chehab 	params = stream->isp_params_configs;
36429d4fa1a1SMauro Carvalho Chehab 
36439d4fa1a1SMauro Carvalho Chehab 	return &params->fpn_config;
36449d4fa1a1SMauro Carvalho Chehab }
36459d4fa1a1SMauro Carvalho Chehab 
ia_css_get_shading_table(struct ia_css_stream * stream)36469d4fa1a1SMauro Carvalho Chehab struct ia_css_shading_table *ia_css_get_shading_table(struct ia_css_stream
36479d4fa1a1SMauro Carvalho Chehab 	*stream)
36489d4fa1a1SMauro Carvalho Chehab {
36499d4fa1a1SMauro Carvalho Chehab 	struct ia_css_shading_table *table = NULL;
36509d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params;
36519d4fa1a1SMauro Carvalho Chehab 
36529d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("void");
36539d4fa1a1SMauro Carvalho Chehab 
36549d4fa1a1SMauro Carvalho Chehab 	assert(stream);
36559d4fa1a1SMauro Carvalho Chehab 
36569d4fa1a1SMauro Carvalho Chehab 	params = stream->isp_params_configs;
36579d4fa1a1SMauro Carvalho Chehab 	if (!params)
36589d4fa1a1SMauro Carvalho Chehab 		return NULL;
36599d4fa1a1SMauro Carvalho Chehab 
36609d4fa1a1SMauro Carvalho Chehab 	if (params->shading_settings.enable_shading_table_conversion == 0) {
36619d4fa1a1SMauro Carvalho Chehab 		if (params->sc_table) {
36629d4fa1a1SMauro Carvalho Chehab 			table = (struct ia_css_shading_table *)params->sc_table;
36639d4fa1a1SMauro Carvalho Chehab 		} else {
36649d4fa1a1SMauro Carvalho Chehab 			const struct ia_css_binary *binary
36659d4fa1a1SMauro Carvalho Chehab 			    = ia_css_stream_get_shading_correction_binary(stream);
36669d4fa1a1SMauro Carvalho Chehab 			if (binary) {
36679d4fa1a1SMauro Carvalho Chehab 				/* generate the identical shading table */
36689d4fa1a1SMauro Carvalho Chehab 				if (params->sc_config) {
36699d4fa1a1SMauro Carvalho Chehab 					ia_css_shading_table_free(params->sc_config);
36709d4fa1a1SMauro Carvalho Chehab 					params->sc_config = NULL;
36719d4fa1a1SMauro Carvalho Chehab 				}
36729d4fa1a1SMauro Carvalho Chehab 				sh_css_params_shading_id_table_generate(&params->sc_config,
36739d4fa1a1SMauro Carvalho Chehab 									binary->sctbl_width_per_color,
36749d4fa1a1SMauro Carvalho Chehab 									binary->sctbl_height);
36759d4fa1a1SMauro Carvalho Chehab 				table = params->sc_config;
36769d4fa1a1SMauro Carvalho Chehab 				/* The sc_config will be freed in the
36779d4fa1a1SMauro Carvalho Chehab 				 * ia_css_stream_isp_parameters_uninit function. */
36789d4fa1a1SMauro Carvalho Chehab 			}
36799d4fa1a1SMauro Carvalho Chehab 		}
36809d4fa1a1SMauro Carvalho Chehab 	} else {
36819d4fa1a1SMauro Carvalho Chehab 		/* ------ deprecated(bz675) : from ------ */
36829d4fa1a1SMauro Carvalho Chehab 		const struct ia_css_binary *binary
36839d4fa1a1SMauro Carvalho Chehab 		    = ia_css_stream_get_shading_correction_binary(stream);
36849d4fa1a1SMauro Carvalho Chehab 		struct ia_css_pipe *pipe;
36859d4fa1a1SMauro Carvalho Chehab 
36869d4fa1a1SMauro Carvalho Chehab 		/**********************************************************************/
36879d4fa1a1SMauro Carvalho Chehab 		/* following code is copied from function ia_css_stream_get_shading_correction_binary()
36889d4fa1a1SMauro Carvalho Chehab 		 * to match with the binary */
36899d4fa1a1SMauro Carvalho Chehab 		pipe = stream->pipes[0];
36909d4fa1a1SMauro Carvalho Chehab 
36919d4fa1a1SMauro Carvalho Chehab 		if (stream->num_pipes == 2) {
36929d4fa1a1SMauro Carvalho Chehab 			assert(stream->pipes[1]);
36939d4fa1a1SMauro Carvalho Chehab 			if (stream->pipes[1]->config.mode == IA_CSS_PIPE_MODE_VIDEO ||
36949d4fa1a1SMauro Carvalho Chehab 			    stream->pipes[1]->config.mode == IA_CSS_PIPE_MODE_PREVIEW)
36959d4fa1a1SMauro Carvalho Chehab 				pipe = stream->pipes[1];
36969d4fa1a1SMauro Carvalho Chehab 		}
36979d4fa1a1SMauro Carvalho Chehab 		/**********************************************************************/
36989d4fa1a1SMauro Carvalho Chehab 		if (binary) {
36999d4fa1a1SMauro Carvalho Chehab 			if (params->sc_config) {
37009d4fa1a1SMauro Carvalho Chehab 				ia_css_shading_table_free(params->sc_config);
37019d4fa1a1SMauro Carvalho Chehab 				params->sc_config = NULL;
37029d4fa1a1SMauro Carvalho Chehab 			}
37039d4fa1a1SMauro Carvalho Chehab 			prepare_shading_table(
37049d4fa1a1SMauro Carvalho Chehab 			    (const struct ia_css_shading_table *)params->sc_table,
37059d4fa1a1SMauro Carvalho Chehab 			    params->sensor_binning,
37069d4fa1a1SMauro Carvalho Chehab 			    &params->sc_config,
37079d4fa1a1SMauro Carvalho Chehab 			    binary, pipe->required_bds_factor);
37089d4fa1a1SMauro Carvalho Chehab 
37099d4fa1a1SMauro Carvalho Chehab 			table = params->sc_config;
37109d4fa1a1SMauro Carvalho Chehab 			/* The sc_config will be freed in the
37119d4fa1a1SMauro Carvalho Chehab 			 * ia_css_stream_isp_parameters_uninit function. */
37129d4fa1a1SMauro Carvalho Chehab 		}
37139d4fa1a1SMauro Carvalho Chehab 		/* ------ deprecated(bz675) : to ------ */
37149d4fa1a1SMauro Carvalho Chehab 	}
37159d4fa1a1SMauro Carvalho Chehab 
37169d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("table=%p", table);
37179d4fa1a1SMauro Carvalho Chehab 
37189d4fa1a1SMauro Carvalho Chehab 	return table;
37199d4fa1a1SMauro Carvalho Chehab }
37209d4fa1a1SMauro Carvalho Chehab 
sh_css_store_sp_group_to_ddr(void)3721100e8989SMauro Carvalho Chehab ia_css_ptr sh_css_store_sp_group_to_ddr(void)
37229d4fa1a1SMauro Carvalho Chehab {
37239d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_LEAVE_PRIVATE("void");
37245472b4dbSMauro Carvalho Chehab 	hmm_store(xmem_sp_group_ptrs,
37259d4fa1a1SMauro Carvalho Chehab 		   &sh_css_sp_group,
37269d4fa1a1SMauro Carvalho Chehab 		   sizeof(struct sh_css_sp_group));
37279d4fa1a1SMauro Carvalho Chehab 	return xmem_sp_group_ptrs;
37289d4fa1a1SMauro Carvalho Chehab }
37299d4fa1a1SMauro Carvalho Chehab 
sh_css_store_sp_stage_to_ddr(unsigned int pipe,unsigned int stage)3730100e8989SMauro Carvalho Chehab ia_css_ptr sh_css_store_sp_stage_to_ddr(
37319d4fa1a1SMauro Carvalho Chehab     unsigned int pipe,
37329d4fa1a1SMauro Carvalho Chehab     unsigned int stage)
37339d4fa1a1SMauro Carvalho Chehab {
37349d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_LEAVE_PRIVATE("void");
37355472b4dbSMauro Carvalho Chehab 	hmm_store(xmem_sp_stage_ptrs[pipe][stage],
37369d4fa1a1SMauro Carvalho Chehab 		   &sh_css_sp_stage,
37379d4fa1a1SMauro Carvalho Chehab 		   sizeof(struct sh_css_sp_stage));
37389d4fa1a1SMauro Carvalho Chehab 	return xmem_sp_stage_ptrs[pipe][stage];
37399d4fa1a1SMauro Carvalho Chehab }
37409d4fa1a1SMauro Carvalho Chehab 
sh_css_store_isp_stage_to_ddr(unsigned int pipe,unsigned int stage)3741100e8989SMauro Carvalho Chehab ia_css_ptr sh_css_store_isp_stage_to_ddr(
37429d4fa1a1SMauro Carvalho Chehab     unsigned int pipe,
37439d4fa1a1SMauro Carvalho Chehab     unsigned int stage)
37449d4fa1a1SMauro Carvalho Chehab {
37459d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_LEAVE_PRIVATE("void");
37465472b4dbSMauro Carvalho Chehab 	hmm_store(xmem_isp_stage_ptrs[pipe][stage],
37479d4fa1a1SMauro Carvalho Chehab 		   &sh_css_isp_stage,
37489d4fa1a1SMauro Carvalho Chehab 		   sizeof(struct sh_css_isp_stage));
37499d4fa1a1SMauro Carvalho Chehab 	return xmem_isp_stage_ptrs[pipe][stage];
37509d4fa1a1SMauro Carvalho Chehab }
37519d4fa1a1SMauro Carvalho Chehab 
ref_sh_css_ddr_address_map(struct sh_css_ddr_address_map * map,struct sh_css_ddr_address_map * out)375241022d35SMauro Carvalho Chehab static int ref_sh_css_ddr_address_map(
37539d4fa1a1SMauro Carvalho Chehab     struct sh_css_ddr_address_map *map,
37549d4fa1a1SMauro Carvalho Chehab     struct sh_css_ddr_address_map *out)
37559d4fa1a1SMauro Carvalho Chehab {
375641022d35SMauro Carvalho Chehab 	int err = 0;
37579d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
37589d4fa1a1SMauro Carvalho Chehab 
37599d4fa1a1SMauro Carvalho Chehab 	/* we will use a union to copy things; overlaying an array
37609d4fa1a1SMauro Carvalho Chehab 	   with the struct; that way adding fields in the struct
37619d4fa1a1SMauro Carvalho Chehab 	   will keep things working, and we will not get type errors.
37629d4fa1a1SMauro Carvalho Chehab 	*/
37639d4fa1a1SMauro Carvalho Chehab 	union {
37649d4fa1a1SMauro Carvalho Chehab 		struct sh_css_ddr_address_map *map;
3765100e8989SMauro Carvalho Chehab 		ia_css_ptr *addrs;
37669d4fa1a1SMauro Carvalho Chehab 	} in_addrs, to_addrs;
37679d4fa1a1SMauro Carvalho Chehab 
37689d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
37699d4fa1a1SMauro Carvalho Chehab 	assert(map);
37709d4fa1a1SMauro Carvalho Chehab 	assert(out);
37719d4fa1a1SMauro Carvalho Chehab 
37729d4fa1a1SMauro Carvalho Chehab 	in_addrs.map = map;
37739d4fa1a1SMauro Carvalho Chehab 	to_addrs.map = out;
37749d4fa1a1SMauro Carvalho Chehab 
37759d4fa1a1SMauro Carvalho Chehab 	assert(sizeof(struct sh_css_ddr_address_map_size) / sizeof(size_t) ==
3776100e8989SMauro Carvalho Chehab 	       sizeof(struct sh_css_ddr_address_map) / sizeof(ia_css_ptr));
37779d4fa1a1SMauro Carvalho Chehab 
37789d4fa1a1SMauro Carvalho Chehab 	/* copy map using size info */
37799d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < (sizeof(struct sh_css_ddr_address_map_size) /
37809d4fa1a1SMauro Carvalho Chehab 			 sizeof(size_t)); i++) {
37819d4fa1a1SMauro Carvalho Chehab 		if (in_addrs.addrs[i] == mmgr_NULL)
37829d4fa1a1SMauro Carvalho Chehab 			to_addrs.addrs[i] = mmgr_NULL;
37839d4fa1a1SMauro Carvalho Chehab 		else
37849d4fa1a1SMauro Carvalho Chehab 			to_addrs.addrs[i] = ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_BUFFER,
37859d4fa1a1SMauro Carvalho Chehab 					    in_addrs.addrs[i]);
37869d4fa1a1SMauro Carvalho Chehab 	}
37879d4fa1a1SMauro Carvalho Chehab 
37889d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(err);
37899d4fa1a1SMauro Carvalho Chehab 	return err;
37909d4fa1a1SMauro Carvalho Chehab }
37919d4fa1a1SMauro Carvalho Chehab 
write_ia_css_isp_parameter_set_info_to_ddr(struct ia_css_isp_parameter_set_info * me,ia_css_ptr * out)379241022d35SMauro Carvalho Chehab static int write_ia_css_isp_parameter_set_info_to_ddr(
37939d4fa1a1SMauro Carvalho Chehab     struct ia_css_isp_parameter_set_info *me,
3794100e8989SMauro Carvalho Chehab     ia_css_ptr *out)
37959d4fa1a1SMauro Carvalho Chehab {
379641022d35SMauro Carvalho Chehab 	int err = 0;
37979d4fa1a1SMauro Carvalho Chehab 	bool succ;
37989d4fa1a1SMauro Carvalho Chehab 
37999d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
38009d4fa1a1SMauro Carvalho Chehab 
38019d4fa1a1SMauro Carvalho Chehab 	assert(me);
38029d4fa1a1SMauro Carvalho Chehab 	assert(out);
38039d4fa1a1SMauro Carvalho Chehab 
380486df6ff2SMauro Carvalho Chehab 	*out = ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_SET_POOL,
38054cc20c9cSHans de Goede 					 hmm_alloc(sizeof(struct ia_css_isp_parameter_set_info)));
38069d4fa1a1SMauro Carvalho Chehab 	succ = (*out != mmgr_NULL);
38079d4fa1a1SMauro Carvalho Chehab 	if (succ)
38085472b4dbSMauro Carvalho Chehab 		hmm_store(*out,
38099d4fa1a1SMauro Carvalho Chehab 			   me, sizeof(struct ia_css_isp_parameter_set_info));
38109d4fa1a1SMauro Carvalho Chehab 	else
381141022d35SMauro Carvalho Chehab 		err = -ENOMEM;
38129d4fa1a1SMauro Carvalho Chehab 
38139d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(err);
38149d4fa1a1SMauro Carvalho Chehab 	return err;
38159d4fa1a1SMauro Carvalho Chehab }
38169d4fa1a1SMauro Carvalho Chehab 
381741022d35SMauro Carvalho Chehab static int
free_ia_css_isp_parameter_set_info(ia_css_ptr ptr)38189d4fa1a1SMauro Carvalho Chehab free_ia_css_isp_parameter_set_info(
3819c27479d7SDeepak R Varma     ia_css_ptr ptr)
3820c27479d7SDeepak R Varma {
382141022d35SMauro Carvalho Chehab 	int err = 0;
38229d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameter_set_info isp_params_info;
38239d4fa1a1SMauro Carvalho Chehab 	unsigned int i;
3824100e8989SMauro Carvalho Chehab 	ia_css_ptr *addrs = (ia_css_ptr *)&isp_params_info.mem_map;
38259d4fa1a1SMauro Carvalho Chehab 
38269d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("ptr = %u", ptr);
38279d4fa1a1SMauro Carvalho Chehab 
38289d4fa1a1SMauro Carvalho Chehab 	/* sanity check - ptr must be valid */
3829c27479d7SDeepak R Varma 	if (!ia_css_refcount_is_valid(ptr)) {
38309d4fa1a1SMauro Carvalho Chehab 		IA_CSS_ERROR("%s: IA_CSS_REFCOUNT_PARAM_SET_POOL(0x%x) invalid arg", __func__,
38319d4fa1a1SMauro Carvalho Chehab 			     ptr);
383241022d35SMauro Carvalho Chehab 		err = -EINVAL;
38339d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LEAVE_ERR_PRIVATE(err);
38349d4fa1a1SMauro Carvalho Chehab 		return err;
38359d4fa1a1SMauro Carvalho Chehab 	}
38369d4fa1a1SMauro Carvalho Chehab 
38375472b4dbSMauro Carvalho Chehab 	hmm_load(ptr, &isp_params_info.mem_map, sizeof(struct sh_css_ddr_address_map));
38389d4fa1a1SMauro Carvalho Chehab 	/* copy map using size info */
38399d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < (sizeof(struct sh_css_ddr_address_map_size) /
3840c27479d7SDeepak R Varma 			 sizeof(size_t)); i++) {
38419d4fa1a1SMauro Carvalho Chehab 		if (addrs[i] == mmgr_NULL)
38429d4fa1a1SMauro Carvalho Chehab 			continue;
38439d4fa1a1SMauro Carvalho Chehab 
38449d4fa1a1SMauro Carvalho Chehab 		/* sanity check - ptr must be valid */
38459d4fa1a1SMauro Carvalho Chehab 		if (!ia_css_refcount_is_valid(addrs[i])) {
38469d4fa1a1SMauro Carvalho Chehab 			IA_CSS_ERROR("%s: IA_CSS_REFCOUNT_PARAM_BUFFER(0x%x) invalid arg", __func__,
38479d4fa1a1SMauro Carvalho Chehab 				     ptr);
384841022d35SMauro Carvalho Chehab 			err = -EINVAL;
38499d4fa1a1SMauro Carvalho Chehab 			continue;
38509d4fa1a1SMauro Carvalho Chehab 		}
38519d4fa1a1SMauro Carvalho Chehab 
38529d4fa1a1SMauro Carvalho Chehab 		ia_css_refcount_decrement(IA_CSS_REFCOUNT_PARAM_BUFFER, addrs[i]);
38539d4fa1a1SMauro Carvalho Chehab 	}
38549d4fa1a1SMauro Carvalho Chehab 	ia_css_refcount_decrement(IA_CSS_REFCOUNT_PARAM_SET_POOL, ptr);
38559d4fa1a1SMauro Carvalho Chehab 
38569d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR_PRIVATE(err);
38579d4fa1a1SMauro Carvalho Chehab 	return err;
38589d4fa1a1SMauro Carvalho Chehab }
38599d4fa1a1SMauro Carvalho Chehab 
38609d4fa1a1SMauro Carvalho Chehab /* Mark all parameters as changed to force recomputing the derived ISP parameters */
38619d4fa1a1SMauro Carvalho Chehab void
sh_css_invalidate_params(struct ia_css_stream * stream)38629d4fa1a1SMauro Carvalho Chehab sh_css_invalidate_params(struct ia_css_stream *stream)
38639d4fa1a1SMauro Carvalho Chehab {
38649d4fa1a1SMauro Carvalho Chehab 	struct	ia_css_isp_parameters *params;
38659d4fa1a1SMauro Carvalho Chehab 	unsigned int i, j, mem;
38669d4fa1a1SMauro Carvalho Chehab 
38679d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
38689d4fa1a1SMauro Carvalho Chehab 	assert(stream);
38699d4fa1a1SMauro Carvalho Chehab 
38709d4fa1a1SMauro Carvalho Chehab 	params = stream->isp_params_configs;
38719d4fa1a1SMauro Carvalho Chehab 	params->isp_params_changed = true;
38729d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
38739d4fa1a1SMauro Carvalho Chehab 		for (j = 0; j < SH_CSS_MAX_STAGES; j++) {
38749d4fa1a1SMauro Carvalho Chehab 			for (mem = 0; mem < N_IA_CSS_MEMORIES; mem++) {
38759d4fa1a1SMauro Carvalho Chehab 				params->isp_mem_params_changed[i][j][mem] = true;
38769d4fa1a1SMauro Carvalho Chehab 			}
38779d4fa1a1SMauro Carvalho Chehab 		}
38789d4fa1a1SMauro Carvalho Chehab 	}
38799d4fa1a1SMauro Carvalho Chehab 
38809d4fa1a1SMauro Carvalho Chehab 	memset(&params->config_changed[0], 1, sizeof(params->config_changed));
38819d4fa1a1SMauro Carvalho Chehab 	params->dis_coef_table_changed = true;
38829d4fa1a1SMauro Carvalho Chehab 	params->dvs2_coef_table_changed = true;
38839d4fa1a1SMauro Carvalho Chehab 	params->morph_table_changed = true;
38849d4fa1a1SMauro Carvalho Chehab 	params->sc_table_changed = true;
38859d4fa1a1SMauro Carvalho Chehab 	params->dz_config_changed = true;
38869d4fa1a1SMauro Carvalho Chehab 	params->motion_config_changed = true;
38879d4fa1a1SMauro Carvalho Chehab 
38889d4fa1a1SMauro Carvalho Chehab 	/*Free up theDVS table memory blocks before recomputing new table  */
38899d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
38909d4fa1a1SMauro Carvalho Chehab 		if (params->pipe_dvs_6axis_config[i]) {
38919d4fa1a1SMauro Carvalho Chehab 			free_dvs_6axis_table(&params->pipe_dvs_6axis_config[i]);
38929d4fa1a1SMauro Carvalho Chehab 			params->pipe_dvs_6axis_config_changed[i] = true;
38939d4fa1a1SMauro Carvalho Chehab 		}
38949d4fa1a1SMauro Carvalho Chehab 	}
38959d4fa1a1SMauro Carvalho Chehab 
38969d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
38979d4fa1a1SMauro Carvalho Chehab }
38989d4fa1a1SMauro Carvalho Chehab 
38999d4fa1a1SMauro Carvalho Chehab void
sh_css_update_uds_and_crop_info(const struct ia_css_binary_info * info,const struct ia_css_frame_info * in_frame_info,const struct ia_css_frame_info * out_frame_info,const struct ia_css_resolution * dvs_env,const struct ia_css_dz_config * zoom,const struct ia_css_vector * motion_vector,struct sh_css_uds_info * uds,struct sh_css_crop_pos * sp_out_crop_pos,bool enable_zoom)39009d4fa1a1SMauro Carvalho Chehab sh_css_update_uds_and_crop_info(
39019d4fa1a1SMauro Carvalho Chehab     const struct ia_css_binary_info *info,
39029d4fa1a1SMauro Carvalho Chehab     const struct ia_css_frame_info *in_frame_info,
39039d4fa1a1SMauro Carvalho Chehab     const struct ia_css_frame_info *out_frame_info,
39049d4fa1a1SMauro Carvalho Chehab     const struct ia_css_resolution *dvs_env,
39059d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dz_config *zoom,
39069d4fa1a1SMauro Carvalho Chehab     const struct ia_css_vector *motion_vector,
39079d4fa1a1SMauro Carvalho Chehab     struct sh_css_uds_info *uds,		/* out */
39089d4fa1a1SMauro Carvalho Chehab     struct sh_css_crop_pos *sp_out_crop_pos,	/* out */
39099d4fa1a1SMauro Carvalho Chehab 
39109d4fa1a1SMauro Carvalho Chehab     bool enable_zoom)
39119d4fa1a1SMauro Carvalho Chehab {
39129d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
39139d4fa1a1SMauro Carvalho Chehab 
39149d4fa1a1SMauro Carvalho Chehab 	assert(info);
39159d4fa1a1SMauro Carvalho Chehab 	assert(in_frame_info);
39169d4fa1a1SMauro Carvalho Chehab 	assert(out_frame_info);
39179d4fa1a1SMauro Carvalho Chehab 	assert(dvs_env);
39189d4fa1a1SMauro Carvalho Chehab 	assert(zoom);
39199d4fa1a1SMauro Carvalho Chehab 	assert(motion_vector);
39209d4fa1a1SMauro Carvalho Chehab 	assert(uds);
39219d4fa1a1SMauro Carvalho Chehab 	assert(sp_out_crop_pos);
39229d4fa1a1SMauro Carvalho Chehab 
39239d4fa1a1SMauro Carvalho Chehab 	uds->curr_dx   = enable_zoom ? (uint16_t)zoom->dx : HRT_GDC_N;
39249d4fa1a1SMauro Carvalho Chehab 	uds->curr_dy   = enable_zoom ? (uint16_t)zoom->dy : HRT_GDC_N;
39259d4fa1a1SMauro Carvalho Chehab 
39269d4fa1a1SMauro Carvalho Chehab 	if (info->enable.dvs_envelope) {
39279d4fa1a1SMauro Carvalho Chehab 		unsigned int crop_x = 0,
39289d4fa1a1SMauro Carvalho Chehab 			     crop_y = 0,
39299d4fa1a1SMauro Carvalho Chehab 			     uds_xc = 0,
39309d4fa1a1SMauro Carvalho Chehab 			     uds_yc = 0,
39319d4fa1a1SMauro Carvalho Chehab 			     env_width, env_height;
39329d4fa1a1SMauro Carvalho Chehab 		int half_env_x, half_env_y;
39339d4fa1a1SMauro Carvalho Chehab 		int motion_x = motion_vector->x;
39349d4fa1a1SMauro Carvalho Chehab 		int motion_y = motion_vector->y;
39359d4fa1a1SMauro Carvalho Chehab 		bool upscale_x = in_frame_info->res.width < out_frame_info->res.width;
39369d4fa1a1SMauro Carvalho Chehab 		bool upscale_y = in_frame_info->res.height < out_frame_info->res.height;
39379d4fa1a1SMauro Carvalho Chehab 
39389d4fa1a1SMauro Carvalho Chehab 		if (info->enable.uds && !info->enable.ds) {
39399d4fa1a1SMauro Carvalho Chehab 			/**
39409d4fa1a1SMauro Carvalho Chehab 			 * we calculate with the envelope that we can actually
39419d4fa1a1SMauro Carvalho Chehab 			 * use, the min dvs envelope is for the filter
39429d4fa1a1SMauro Carvalho Chehab 			 * initialization.
39439d4fa1a1SMauro Carvalho Chehab 			 */
39449d4fa1a1SMauro Carvalho Chehab 			env_width  = dvs_env->width -
39459d4fa1a1SMauro Carvalho Chehab 				     SH_CSS_MIN_DVS_ENVELOPE;
39469d4fa1a1SMauro Carvalho Chehab 			env_height = dvs_env->height -
39479d4fa1a1SMauro Carvalho Chehab 				     SH_CSS_MIN_DVS_ENVELOPE;
39489d4fa1a1SMauro Carvalho Chehab 			half_env_x = env_width / 2;
39499d4fa1a1SMauro Carvalho Chehab 			half_env_y = env_height / 2;
39509d4fa1a1SMauro Carvalho Chehab 			/**
39519d4fa1a1SMauro Carvalho Chehab 			 * for digital zoom, we use the dvs envelope and make
39529d4fa1a1SMauro Carvalho Chehab 			 * sure that we don't include the 8 leftmost pixels or
39539d4fa1a1SMauro Carvalho Chehab 			 * 8 topmost rows.
39549d4fa1a1SMauro Carvalho Chehab 			 */
39559d4fa1a1SMauro Carvalho Chehab 			if (upscale_x) {
39569d4fa1a1SMauro Carvalho Chehab 				uds_xc = (in_frame_info->res.width
39579d4fa1a1SMauro Carvalho Chehab 					  + env_width
39589d4fa1a1SMauro Carvalho Chehab 					  + SH_CSS_MIN_DVS_ENVELOPE) / 2;
39599d4fa1a1SMauro Carvalho Chehab 			} else {
39609d4fa1a1SMauro Carvalho Chehab 				uds_xc = (out_frame_info->res.width
39619d4fa1a1SMauro Carvalho Chehab 					  + env_width) / 2
39629d4fa1a1SMauro Carvalho Chehab 					 + SH_CSS_MIN_DVS_ENVELOPE;
39639d4fa1a1SMauro Carvalho Chehab 			}
39649d4fa1a1SMauro Carvalho Chehab 			if (upscale_y) {
39659d4fa1a1SMauro Carvalho Chehab 				uds_yc = (in_frame_info->res.height
39669d4fa1a1SMauro Carvalho Chehab 					  + env_height
39679d4fa1a1SMauro Carvalho Chehab 					  + SH_CSS_MIN_DVS_ENVELOPE) / 2;
39689d4fa1a1SMauro Carvalho Chehab 			} else {
39699d4fa1a1SMauro Carvalho Chehab 				uds_yc = (out_frame_info->res.height
39709d4fa1a1SMauro Carvalho Chehab 					  + env_height) / 2
39719d4fa1a1SMauro Carvalho Chehab 					 + SH_CSS_MIN_DVS_ENVELOPE;
39729d4fa1a1SMauro Carvalho Chehab 			}
39739d4fa1a1SMauro Carvalho Chehab 			/* clip the motion vector to +/- half the envelope */
39749d4fa1a1SMauro Carvalho Chehab 			motion_x = clamp(motion_x, -half_env_x, half_env_x);
39759d4fa1a1SMauro Carvalho Chehab 			motion_y = clamp(motion_y, -half_env_y, half_env_y);
39769d4fa1a1SMauro Carvalho Chehab 			uds_xc += motion_x;
39779d4fa1a1SMauro Carvalho Chehab 			uds_yc += motion_y;
39789d4fa1a1SMauro Carvalho Chehab 			/* uds can be pipelined, remove top lines */
39799d4fa1a1SMauro Carvalho Chehab 			crop_y = 2;
39809d4fa1a1SMauro Carvalho Chehab 		} else if (info->enable.ds) {
39819d4fa1a1SMauro Carvalho Chehab 			env_width  = dvs_env->width;
39829d4fa1a1SMauro Carvalho Chehab 			env_height = dvs_env->height;
39839d4fa1a1SMauro Carvalho Chehab 			half_env_x = env_width / 2;
39849d4fa1a1SMauro Carvalho Chehab 			half_env_y = env_height / 2;
39859d4fa1a1SMauro Carvalho Chehab 			/* clip the motion vector to +/- half the envelope */
39869d4fa1a1SMauro Carvalho Chehab 			motion_x = clamp(motion_x, -half_env_x, half_env_x);
39879d4fa1a1SMauro Carvalho Chehab 			motion_y = clamp(motion_y, -half_env_y, half_env_y);
39889d4fa1a1SMauro Carvalho Chehab 			/* for video with downscaling, the envelope is included
39899d4fa1a1SMauro Carvalho Chehab 			    in the input resolution. */
39909d4fa1a1SMauro Carvalho Chehab 			uds_xc = in_frame_info->res.width / 2 + motion_x;
39919d4fa1a1SMauro Carvalho Chehab 			uds_yc = in_frame_info->res.height / 2 + motion_y;
39929d4fa1a1SMauro Carvalho Chehab 			crop_x = info->pipeline.left_cropping;
39939d4fa1a1SMauro Carvalho Chehab 			/* ds == 2 (yuv_ds) can be pipelined, remove top
39949d4fa1a1SMauro Carvalho Chehab 			   lines */
39959d4fa1a1SMauro Carvalho Chehab 			if (info->enable.ds & 1)
39969d4fa1a1SMauro Carvalho Chehab 				crop_y = info->pipeline.top_cropping;
39979d4fa1a1SMauro Carvalho Chehab 			else
39989d4fa1a1SMauro Carvalho Chehab 				crop_y = 2;
39999d4fa1a1SMauro Carvalho Chehab 		} else {
40009d4fa1a1SMauro Carvalho Chehab 			/* video nodz: here we can only crop. We make sure we
40019d4fa1a1SMauro Carvalho Chehab 			   crop at least the first 8x8 pixels away. */
40029d4fa1a1SMauro Carvalho Chehab 			env_width  = dvs_env->width -
40039d4fa1a1SMauro Carvalho Chehab 				     SH_CSS_MIN_DVS_ENVELOPE;
40049d4fa1a1SMauro Carvalho Chehab 			env_height = dvs_env->height -
40059d4fa1a1SMauro Carvalho Chehab 				     SH_CSS_MIN_DVS_ENVELOPE;
40069d4fa1a1SMauro Carvalho Chehab 			half_env_x = env_width / 2;
40079d4fa1a1SMauro Carvalho Chehab 			half_env_y = env_height / 2;
40089d4fa1a1SMauro Carvalho Chehab 			motion_x = clamp(motion_x, -half_env_x, half_env_x);
40099d4fa1a1SMauro Carvalho Chehab 			motion_y = clamp(motion_y, -half_env_y, half_env_y);
40109d4fa1a1SMauro Carvalho Chehab 			crop_x = SH_CSS_MIN_DVS_ENVELOPE
40119d4fa1a1SMauro Carvalho Chehab 				 + half_env_x + motion_x;
40129d4fa1a1SMauro Carvalho Chehab 			crop_y = SH_CSS_MIN_DVS_ENVELOPE
40139d4fa1a1SMauro Carvalho Chehab 				 + half_env_y + motion_y;
40149d4fa1a1SMauro Carvalho Chehab 		}
40159d4fa1a1SMauro Carvalho Chehab 
40169d4fa1a1SMauro Carvalho Chehab 		/* Must enforce that the crop position is even */
40179d4fa1a1SMauro Carvalho Chehab 		crop_x = EVEN_FLOOR(crop_x);
40189d4fa1a1SMauro Carvalho Chehab 		crop_y = EVEN_FLOOR(crop_y);
40199d4fa1a1SMauro Carvalho Chehab 		uds_xc = EVEN_FLOOR(uds_xc);
40209d4fa1a1SMauro Carvalho Chehab 		uds_yc = EVEN_FLOOR(uds_yc);
40219d4fa1a1SMauro Carvalho Chehab 
40229d4fa1a1SMauro Carvalho Chehab 		uds->xc = (uint16_t)uds_xc;
40239d4fa1a1SMauro Carvalho Chehab 		uds->yc = (uint16_t)uds_yc;
40249d4fa1a1SMauro Carvalho Chehab 		sp_out_crop_pos->x = (uint16_t)crop_x;
40259d4fa1a1SMauro Carvalho Chehab 		sp_out_crop_pos->y = (uint16_t)crop_y;
40269d4fa1a1SMauro Carvalho Chehab 	} else {
40279d4fa1a1SMauro Carvalho Chehab 		/* for down scaling, we always use the center of the image */
40289d4fa1a1SMauro Carvalho Chehab 		uds->xc = (uint16_t)in_frame_info->res.width / 2;
40299d4fa1a1SMauro Carvalho Chehab 		uds->yc = (uint16_t)in_frame_info->res.height / 2;
40309d4fa1a1SMauro Carvalho Chehab 		sp_out_crop_pos->x = (uint16_t)info->pipeline.left_cropping;
40319d4fa1a1SMauro Carvalho Chehab 		sp_out_crop_pos->y = (uint16_t)info->pipeline.top_cropping;
40329d4fa1a1SMauro Carvalho Chehab 	}
40339d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
40349d4fa1a1SMauro Carvalho Chehab }
40359d4fa1a1SMauro Carvalho Chehab 
403641022d35SMauro Carvalho Chehab static int
sh_css_update_uds_and_crop_info_based_on_zoom_region(const struct ia_css_binary_info * info,const struct ia_css_frame_info * in_frame_info,const struct ia_css_frame_info * out_frame_info,const struct ia_css_resolution * dvs_env,const struct ia_css_dz_config * zoom,const struct ia_css_vector * motion_vector,struct sh_css_uds_info * uds,struct sh_css_crop_pos * sp_out_crop_pos,struct ia_css_resolution pipe_in_res,bool enable_zoom)40379d4fa1a1SMauro Carvalho Chehab sh_css_update_uds_and_crop_info_based_on_zoom_region(
40389d4fa1a1SMauro Carvalho Chehab     const struct ia_css_binary_info *info,
40399d4fa1a1SMauro Carvalho Chehab     const struct ia_css_frame_info *in_frame_info,
40409d4fa1a1SMauro Carvalho Chehab     const struct ia_css_frame_info *out_frame_info,
40419d4fa1a1SMauro Carvalho Chehab     const struct ia_css_resolution *dvs_env,
40429d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dz_config *zoom,
40439d4fa1a1SMauro Carvalho Chehab     const struct ia_css_vector *motion_vector,
40449d4fa1a1SMauro Carvalho Chehab     struct sh_css_uds_info *uds,		/* out */
40459d4fa1a1SMauro Carvalho Chehab     struct sh_css_crop_pos *sp_out_crop_pos,	/* out */
40469d4fa1a1SMauro Carvalho Chehab     struct ia_css_resolution pipe_in_res,
4047c27479d7SDeepak R Varma     bool enable_zoom)
4048c27479d7SDeepak R Varma {
40499d4fa1a1SMauro Carvalho Chehab 	unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0;
405041022d35SMauro Carvalho Chehab 	int err = 0;
40519d4fa1a1SMauro Carvalho Chehab 	/* Note:
40529d4fa1a1SMauro Carvalho Chehab 	* Filter_Envelope = 0 for NND/LUT
40539d4fa1a1SMauro Carvalho Chehab 	* Filter_Envelope = 1 for BCI
40549d4fa1a1SMauro Carvalho Chehab 	* Filter_Envelope = 3 for BLI
40559d4fa1a1SMauro Carvalho Chehab 	* Currently, not considering this filter envelope because, In uds.sp.c is recalculating
40569d4fa1a1SMauro Carvalho Chehab 	* the dx/dy based on filter envelope and other information (ia_css_uds_sp_scale_params)
40579d4fa1a1SMauro Carvalho Chehab 	* Ideally, That should be done on host side not on sp side.
40589d4fa1a1SMauro Carvalho Chehab 	*/
40599d4fa1a1SMauro Carvalho Chehab 	unsigned int filter_envelope = 0;
40609d4fa1a1SMauro Carvalho Chehab 
40619d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER_PRIVATE("void");
40629d4fa1a1SMauro Carvalho Chehab 
40639d4fa1a1SMauro Carvalho Chehab 	assert(info);
40649d4fa1a1SMauro Carvalho Chehab 	assert(in_frame_info);
40659d4fa1a1SMauro Carvalho Chehab 	assert(out_frame_info);
40669d4fa1a1SMauro Carvalho Chehab 	assert(dvs_env);
40679d4fa1a1SMauro Carvalho Chehab 	assert(zoom);
40689d4fa1a1SMauro Carvalho Chehab 	assert(motion_vector);
40699d4fa1a1SMauro Carvalho Chehab 	assert(uds);
40709d4fa1a1SMauro Carvalho Chehab 	assert(sp_out_crop_pos);
40719d4fa1a1SMauro Carvalho Chehab 	x0 = zoom->zoom_region.origin.x;
40729d4fa1a1SMauro Carvalho Chehab 	y0 = zoom->zoom_region.origin.y;
40739d4fa1a1SMauro Carvalho Chehab 	x1 = zoom->zoom_region.resolution.width + x0;
40749d4fa1a1SMauro Carvalho Chehab 	y1 = zoom->zoom_region.resolution.height + y0;
40759d4fa1a1SMauro Carvalho Chehab 
40769d4fa1a1SMauro Carvalho Chehab 	if ((x0 > x1) || (y0 > y1) || (x1 > pipe_in_res.width) || (y1 > pipe_in_res.height))
407741022d35SMauro Carvalho Chehab 		return -EINVAL;
40789d4fa1a1SMauro Carvalho Chehab 
4079c27479d7SDeepak R Varma 	if (!enable_zoom) {
40809d4fa1a1SMauro Carvalho Chehab 		uds->curr_dx = HRT_GDC_N;
40819d4fa1a1SMauro Carvalho Chehab 		uds->curr_dy = HRT_GDC_N;
40829d4fa1a1SMauro Carvalho Chehab 	}
40839d4fa1a1SMauro Carvalho Chehab 
4084c27479d7SDeepak R Varma 	if (info->enable.dvs_envelope) {
40859d4fa1a1SMauro Carvalho Chehab 		/* Zoom region is only supported by the UDS module on ISP
40869d4fa1a1SMauro Carvalho Chehab 		 * 2 and higher. It is not supported in video mode on ISP 1 */
408741022d35SMauro Carvalho Chehab 		return -EINVAL;
4088c27479d7SDeepak R Varma 	} else {
40899d4fa1a1SMauro Carvalho Chehab 		if (enable_zoom) {
40909d4fa1a1SMauro Carvalho Chehab 			/* A. Calculate dx/dy based on crop region using in_frame_info
40919d4fa1a1SMauro Carvalho Chehab 			* Scale the crop region if in_frame_info to the stage is not same as
40929d4fa1a1SMauro Carvalho Chehab 			* actual effective input of the pipeline
40939d4fa1a1SMauro Carvalho Chehab 			*/
40949d4fa1a1SMauro Carvalho Chehab 			if (in_frame_info->res.width != pipe_in_res.width ||
40959d4fa1a1SMauro Carvalho Chehab 			    in_frame_info->res.height != pipe_in_res.height) {
40969d4fa1a1SMauro Carvalho Chehab 				x0 = (x0 * in_frame_info->res.width) / (pipe_in_res.width);
40979d4fa1a1SMauro Carvalho Chehab 				y0 = (y0 * in_frame_info->res.height) / (pipe_in_res.height);
40989d4fa1a1SMauro Carvalho Chehab 				x1 = (x1 * in_frame_info->res.width) / (pipe_in_res.width);
40999d4fa1a1SMauro Carvalho Chehab 				y1 = (y1 * in_frame_info->res.height) / (pipe_in_res.height);
41009d4fa1a1SMauro Carvalho Chehab 			}
41019d4fa1a1SMauro Carvalho Chehab 			uds->curr_dx =
41029d4fa1a1SMauro Carvalho Chehab 			    ((x1 - x0 - filter_envelope) * HRT_GDC_N) / in_frame_info->res.width;
41039d4fa1a1SMauro Carvalho Chehab 			uds->curr_dy =
41049d4fa1a1SMauro Carvalho Chehab 			    ((y1 - y0 - filter_envelope) * HRT_GDC_N) / in_frame_info->res.height;
41059d4fa1a1SMauro Carvalho Chehab 
41069d4fa1a1SMauro Carvalho Chehab 			/* B. Calculate xc/yc based on crop region */
41079d4fa1a1SMauro Carvalho Chehab 			uds->xc = (uint16_t)x0 + (((x1) - (x0)) / 2);
41089d4fa1a1SMauro Carvalho Chehab 			uds->yc = (uint16_t)y0 + (((y1) - (y0)) / 2);
41099d4fa1a1SMauro Carvalho Chehab 		} else {
41109d4fa1a1SMauro Carvalho Chehab 			uds->xc = (uint16_t)in_frame_info->res.width / 2;
41119d4fa1a1SMauro Carvalho Chehab 			uds->yc = (uint16_t)in_frame_info->res.height / 2;
41129d4fa1a1SMauro Carvalho Chehab 		}
41139d4fa1a1SMauro Carvalho Chehab 
41149d4fa1a1SMauro Carvalho Chehab 		ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
41159d4fa1a1SMauro Carvalho Chehab 				    "uds->curr_dx=%d, uds->xc=%d, uds->yc=%d\n",
41169d4fa1a1SMauro Carvalho Chehab 				    uds->curr_dx, uds->xc, uds->yc);
41179d4fa1a1SMauro Carvalho Chehab 		ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "x0=%d, y0=%d, x1=%d, y1=%d\n",
41189d4fa1a1SMauro Carvalho Chehab 				    x0, y0, x1, y1);
41199d4fa1a1SMauro Carvalho Chehab 		sp_out_crop_pos->x = (uint16_t)info->pipeline.left_cropping;
41209d4fa1a1SMauro Carvalho Chehab 		sp_out_crop_pos->y = (uint16_t)info->pipeline.top_cropping;
41219d4fa1a1SMauro Carvalho Chehab 	}
41229d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_PRIVATE("void");
41239d4fa1a1SMauro Carvalho Chehab 	return err;
41249d4fa1a1SMauro Carvalho Chehab }
41259d4fa1a1SMauro Carvalho Chehab 
41269d4fa1a1SMauro Carvalho Chehab struct ia_css_3a_statistics *
ia_css_3a_statistics_allocate(const struct ia_css_3a_grid_info * grid)41279d4fa1a1SMauro Carvalho Chehab ia_css_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid)
41289d4fa1a1SMauro Carvalho Chehab {
41299d4fa1a1SMauro Carvalho Chehab 	struct ia_css_3a_statistics *me;
41309d4fa1a1SMauro Carvalho Chehab 	int grid_size;
41319d4fa1a1SMauro Carvalho Chehab 
41329d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("grid=%p", grid);
41339d4fa1a1SMauro Carvalho Chehab 
41349d4fa1a1SMauro Carvalho Chehab 	assert(grid);
41359d4fa1a1SMauro Carvalho Chehab 
41369955d906SMauro Carvalho Chehab 	me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
41379d4fa1a1SMauro Carvalho Chehab 	if (!me)
41389d4fa1a1SMauro Carvalho Chehab 		goto err;
41399d4fa1a1SMauro Carvalho Chehab 
41409d4fa1a1SMauro Carvalho Chehab 	me->grid = *grid;
41419d4fa1a1SMauro Carvalho Chehab 	grid_size = grid->width * grid->height;
41429955d906SMauro Carvalho Chehab 	me->data = kvmalloc(grid_size * sizeof(*me->data), GFP_KERNEL);
41439d4fa1a1SMauro Carvalho Chehab 	if (!me->data)
41449d4fa1a1SMauro Carvalho Chehab 		goto err;
41459d4fa1a1SMauro Carvalho Chehab 	/* No weighted histogram, no structure, treat the histogram data as a byte dump in a byte array */
41469955d906SMauro Carvalho Chehab 	me->rgby_data = kvmalloc(sizeof_hmem(HMEM0_ID), GFP_KERNEL);
41479d4fa1a1SMauro Carvalho Chehab 
41489d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("return=%p", me);
41499d4fa1a1SMauro Carvalho Chehab 	return me;
41509d4fa1a1SMauro Carvalho Chehab err:
41519d4fa1a1SMauro Carvalho Chehab 	ia_css_3a_statistics_free(me);
41529d4fa1a1SMauro Carvalho Chehab 
41539d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("return=%p", NULL);
41549d4fa1a1SMauro Carvalho Chehab 	return NULL;
41559d4fa1a1SMauro Carvalho Chehab }
41569d4fa1a1SMauro Carvalho Chehab 
41579d4fa1a1SMauro Carvalho Chehab void
ia_css_3a_statistics_free(struct ia_css_3a_statistics * me)41589d4fa1a1SMauro Carvalho Chehab ia_css_3a_statistics_free(struct ia_css_3a_statistics *me)
41599d4fa1a1SMauro Carvalho Chehab {
41609d4fa1a1SMauro Carvalho Chehab 	if (me) {
41619955d906SMauro Carvalho Chehab 		kvfree(me->rgby_data);
41629955d906SMauro Carvalho Chehab 		kvfree(me->data);
41639955d906SMauro Carvalho Chehab 		kvfree(me);
41649d4fa1a1SMauro Carvalho Chehab 	}
41659d4fa1a1SMauro Carvalho Chehab }
41669d4fa1a1SMauro Carvalho Chehab 
41679d4fa1a1SMauro Carvalho Chehab struct ia_css_dvs_statistics *
ia_css_dvs_statistics_allocate(const struct ia_css_dvs_grid_info * grid)41689d4fa1a1SMauro Carvalho Chehab ia_css_dvs_statistics_allocate(const struct ia_css_dvs_grid_info *grid)
41699d4fa1a1SMauro Carvalho Chehab {
41709d4fa1a1SMauro Carvalho Chehab 	struct ia_css_dvs_statistics *me;
41719d4fa1a1SMauro Carvalho Chehab 
41729d4fa1a1SMauro Carvalho Chehab 	assert(grid);
41739d4fa1a1SMauro Carvalho Chehab 
41749955d906SMauro Carvalho Chehab 	me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
41759d4fa1a1SMauro Carvalho Chehab 	if (!me)
41769d4fa1a1SMauro Carvalho Chehab 		goto err;
41779d4fa1a1SMauro Carvalho Chehab 
41789d4fa1a1SMauro Carvalho Chehab 	me->grid = *grid;
41799955d906SMauro Carvalho Chehab 	me->hor_proj = kvmalloc(grid->height * IA_CSS_DVS_NUM_COEF_TYPES *
41809955d906SMauro Carvalho Chehab 				sizeof(*me->hor_proj), GFP_KERNEL);
41819d4fa1a1SMauro Carvalho Chehab 	if (!me->hor_proj)
41829d4fa1a1SMauro Carvalho Chehab 		goto err;
41839d4fa1a1SMauro Carvalho Chehab 
41849955d906SMauro Carvalho Chehab 	me->ver_proj = kvmalloc(grid->width * IA_CSS_DVS_NUM_COEF_TYPES *
41859955d906SMauro Carvalho Chehab 				sizeof(*me->ver_proj), GFP_KERNEL);
41869d4fa1a1SMauro Carvalho Chehab 	if (!me->ver_proj)
41879d4fa1a1SMauro Carvalho Chehab 		goto err;
41889d4fa1a1SMauro Carvalho Chehab 
41899d4fa1a1SMauro Carvalho Chehab 	return me;
41909d4fa1a1SMauro Carvalho Chehab err:
41919d4fa1a1SMauro Carvalho Chehab 	ia_css_dvs_statistics_free(me);
41929d4fa1a1SMauro Carvalho Chehab 	return NULL;
41939d4fa1a1SMauro Carvalho Chehab }
41949d4fa1a1SMauro Carvalho Chehab 
41959d4fa1a1SMauro Carvalho Chehab void
ia_css_dvs_statistics_free(struct ia_css_dvs_statistics * me)41969d4fa1a1SMauro Carvalho Chehab ia_css_dvs_statistics_free(struct ia_css_dvs_statistics *me)
41979d4fa1a1SMauro Carvalho Chehab {
41989d4fa1a1SMauro Carvalho Chehab 	if (me) {
41999955d906SMauro Carvalho Chehab 		kvfree(me->hor_proj);
42009955d906SMauro Carvalho Chehab 		kvfree(me->ver_proj);
42019955d906SMauro Carvalho Chehab 		kvfree(me);
42029d4fa1a1SMauro Carvalho Chehab 	}
42039d4fa1a1SMauro Carvalho Chehab }
42049d4fa1a1SMauro Carvalho Chehab 
42059d4fa1a1SMauro Carvalho Chehab struct ia_css_dvs_coefficients *
ia_css_dvs_coefficients_allocate(const struct ia_css_dvs_grid_info * grid)42069d4fa1a1SMauro Carvalho Chehab ia_css_dvs_coefficients_allocate(const struct ia_css_dvs_grid_info *grid)
42079d4fa1a1SMauro Carvalho Chehab {
42089d4fa1a1SMauro Carvalho Chehab 	struct ia_css_dvs_coefficients *me;
42099d4fa1a1SMauro Carvalho Chehab 
42109d4fa1a1SMauro Carvalho Chehab 	assert(grid);
42119d4fa1a1SMauro Carvalho Chehab 
42129955d906SMauro Carvalho Chehab 	me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
42139d4fa1a1SMauro Carvalho Chehab 	if (!me)
42149d4fa1a1SMauro Carvalho Chehab 		goto err;
42159d4fa1a1SMauro Carvalho Chehab 
42169d4fa1a1SMauro Carvalho Chehab 	me->grid = *grid;
42179d4fa1a1SMauro Carvalho Chehab 
42189955d906SMauro Carvalho Chehab 	me->hor_coefs = kvmalloc(grid->num_hor_coefs *
42199d4fa1a1SMauro Carvalho Chehab 				 IA_CSS_DVS_NUM_COEF_TYPES *
42209955d906SMauro Carvalho Chehab 				 sizeof(*me->hor_coefs), GFP_KERNEL);
42219d4fa1a1SMauro Carvalho Chehab 	if (!me->hor_coefs)
42229d4fa1a1SMauro Carvalho Chehab 		goto err;
42239d4fa1a1SMauro Carvalho Chehab 
42249955d906SMauro Carvalho Chehab 	me->ver_coefs = kvmalloc(grid->num_ver_coefs *
42259d4fa1a1SMauro Carvalho Chehab 				 IA_CSS_DVS_NUM_COEF_TYPES *
42269955d906SMauro Carvalho Chehab 				 sizeof(*me->ver_coefs), GFP_KERNEL);
42279d4fa1a1SMauro Carvalho Chehab 	if (!me->ver_coefs)
42289d4fa1a1SMauro Carvalho Chehab 		goto err;
42299d4fa1a1SMauro Carvalho Chehab 
42309d4fa1a1SMauro Carvalho Chehab 	return me;
42319d4fa1a1SMauro Carvalho Chehab err:
42329d4fa1a1SMauro Carvalho Chehab 	ia_css_dvs_coefficients_free(me);
42339d4fa1a1SMauro Carvalho Chehab 	return NULL;
42349d4fa1a1SMauro Carvalho Chehab }
42359d4fa1a1SMauro Carvalho Chehab 
42369d4fa1a1SMauro Carvalho Chehab void
ia_css_dvs_coefficients_free(struct ia_css_dvs_coefficients * me)42379d4fa1a1SMauro Carvalho Chehab ia_css_dvs_coefficients_free(struct ia_css_dvs_coefficients *me)
42389d4fa1a1SMauro Carvalho Chehab {
42399d4fa1a1SMauro Carvalho Chehab 	if (me) {
42409955d906SMauro Carvalho Chehab 		kvfree(me->hor_coefs);
42419955d906SMauro Carvalho Chehab 		kvfree(me->ver_coefs);
42429955d906SMauro Carvalho Chehab 		kvfree(me);
42439d4fa1a1SMauro Carvalho Chehab 	}
42449d4fa1a1SMauro Carvalho Chehab }
42459d4fa1a1SMauro Carvalho Chehab 
42469d4fa1a1SMauro Carvalho Chehab struct ia_css_dvs2_statistics *
ia_css_dvs2_statistics_allocate(const struct ia_css_dvs_grid_info * grid)42479d4fa1a1SMauro Carvalho Chehab ia_css_dvs2_statistics_allocate(const struct ia_css_dvs_grid_info *grid)
42489d4fa1a1SMauro Carvalho Chehab {
42499d4fa1a1SMauro Carvalho Chehab 	struct ia_css_dvs2_statistics *me;
42509d4fa1a1SMauro Carvalho Chehab 
42519d4fa1a1SMauro Carvalho Chehab 	assert(grid);
42529d4fa1a1SMauro Carvalho Chehab 
42539955d906SMauro Carvalho Chehab 	me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
42549d4fa1a1SMauro Carvalho Chehab 	if (!me)
42559d4fa1a1SMauro Carvalho Chehab 		goto err;
42569d4fa1a1SMauro Carvalho Chehab 
42579d4fa1a1SMauro Carvalho Chehab 	me->grid = *grid;
42589d4fa1a1SMauro Carvalho Chehab 
42599955d906SMauro Carvalho Chehab 	me->hor_prod.odd_real = kvmalloc(grid->aligned_width *
42609955d906SMauro Carvalho Chehab 					 grid->aligned_height *
42619955d906SMauro Carvalho Chehab 					 sizeof(*me->hor_prod.odd_real),
42629955d906SMauro Carvalho Chehab 					 GFP_KERNEL);
42639d4fa1a1SMauro Carvalho Chehab 	if (!me->hor_prod.odd_real)
42649d4fa1a1SMauro Carvalho Chehab 		goto err;
42659d4fa1a1SMauro Carvalho Chehab 
42669955d906SMauro Carvalho Chehab 	me->hor_prod.odd_imag = kvmalloc(grid->aligned_width *
42679955d906SMauro Carvalho Chehab 					 grid->aligned_height *
42689955d906SMauro Carvalho Chehab 					 sizeof(*me->hor_prod.odd_imag),
42699955d906SMauro Carvalho Chehab 					 GFP_KERNEL);
42709d4fa1a1SMauro Carvalho Chehab 	if (!me->hor_prod.odd_imag)
42719d4fa1a1SMauro Carvalho Chehab 		goto err;
42729d4fa1a1SMauro Carvalho Chehab 
42739955d906SMauro Carvalho Chehab 	me->hor_prod.even_real = kvmalloc(grid->aligned_width *
42749955d906SMauro Carvalho Chehab 					  grid->aligned_height *
42759955d906SMauro Carvalho Chehab 					  sizeof(*me->hor_prod.even_real),
42769955d906SMauro Carvalho Chehab 					  GFP_KERNEL);
42779d4fa1a1SMauro Carvalho Chehab 	if (!me->hor_prod.even_real)
42789d4fa1a1SMauro Carvalho Chehab 		goto err;
42799d4fa1a1SMauro Carvalho Chehab 
42809955d906SMauro Carvalho Chehab 	me->hor_prod.even_imag = kvmalloc(grid->aligned_width *
42819955d906SMauro Carvalho Chehab 					  grid->aligned_height *
42829955d906SMauro Carvalho Chehab 					  sizeof(*me->hor_prod.even_imag),
42839955d906SMauro Carvalho Chehab 					  GFP_KERNEL);
42849d4fa1a1SMauro Carvalho Chehab 	if (!me->hor_prod.even_imag)
42859d4fa1a1SMauro Carvalho Chehab 		goto err;
42869d4fa1a1SMauro Carvalho Chehab 
42879955d906SMauro Carvalho Chehab 	me->ver_prod.odd_real = kvmalloc(grid->aligned_width *
42889955d906SMauro Carvalho Chehab 					 grid->aligned_height *
42899955d906SMauro Carvalho Chehab 					 sizeof(*me->ver_prod.odd_real),
42909955d906SMauro Carvalho Chehab 					 GFP_KERNEL);
42919d4fa1a1SMauro Carvalho Chehab 	if (!me->ver_prod.odd_real)
42929d4fa1a1SMauro Carvalho Chehab 		goto err;
42939d4fa1a1SMauro Carvalho Chehab 
42949955d906SMauro Carvalho Chehab 	me->ver_prod.odd_imag = kvmalloc(grid->aligned_width *
42959955d906SMauro Carvalho Chehab 					 grid->aligned_height *
42969955d906SMauro Carvalho Chehab 					 sizeof(*me->ver_prod.odd_imag),
42979955d906SMauro Carvalho Chehab 					 GFP_KERNEL);
42989d4fa1a1SMauro Carvalho Chehab 	if (!me->ver_prod.odd_imag)
42999d4fa1a1SMauro Carvalho Chehab 		goto err;
43009d4fa1a1SMauro Carvalho Chehab 
43019955d906SMauro Carvalho Chehab 	me->ver_prod.even_real = kvmalloc(grid->aligned_width *
43029955d906SMauro Carvalho Chehab 					  grid->aligned_height *
43039955d906SMauro Carvalho Chehab 					  sizeof(*me->ver_prod.even_real),
43049955d906SMauro Carvalho Chehab 					  GFP_KERNEL);
43059d4fa1a1SMauro Carvalho Chehab 	if (!me->ver_prod.even_real)
43069d4fa1a1SMauro Carvalho Chehab 		goto err;
43079d4fa1a1SMauro Carvalho Chehab 
43089955d906SMauro Carvalho Chehab 	me->ver_prod.even_imag = kvmalloc(grid->aligned_width *
43099955d906SMauro Carvalho Chehab 					  grid->aligned_height *
43109955d906SMauro Carvalho Chehab 					  sizeof(*me->ver_prod.even_imag),
43119955d906SMauro Carvalho Chehab 					  GFP_KERNEL);
43129d4fa1a1SMauro Carvalho Chehab 	if (!me->ver_prod.even_imag)
43139d4fa1a1SMauro Carvalho Chehab 		goto err;
43149d4fa1a1SMauro Carvalho Chehab 
43159d4fa1a1SMauro Carvalho Chehab 	return me;
43169d4fa1a1SMauro Carvalho Chehab err:
43179d4fa1a1SMauro Carvalho Chehab 	ia_css_dvs2_statistics_free(me);
43189d4fa1a1SMauro Carvalho Chehab 	return NULL;
43199d4fa1a1SMauro Carvalho Chehab }
43209d4fa1a1SMauro Carvalho Chehab 
43219d4fa1a1SMauro Carvalho Chehab void
ia_css_dvs2_statistics_free(struct ia_css_dvs2_statistics * me)43229d4fa1a1SMauro Carvalho Chehab ia_css_dvs2_statistics_free(struct ia_css_dvs2_statistics *me)
43239d4fa1a1SMauro Carvalho Chehab {
43249d4fa1a1SMauro Carvalho Chehab 	if (me) {
43259955d906SMauro Carvalho Chehab 		kvfree(me->hor_prod.odd_real);
43269955d906SMauro Carvalho Chehab 		kvfree(me->hor_prod.odd_imag);
43279955d906SMauro Carvalho Chehab 		kvfree(me->hor_prod.even_real);
43289955d906SMauro Carvalho Chehab 		kvfree(me->hor_prod.even_imag);
43299955d906SMauro Carvalho Chehab 		kvfree(me->ver_prod.odd_real);
43309955d906SMauro Carvalho Chehab 		kvfree(me->ver_prod.odd_imag);
43319955d906SMauro Carvalho Chehab 		kvfree(me->ver_prod.even_real);
43329955d906SMauro Carvalho Chehab 		kvfree(me->ver_prod.even_imag);
43339955d906SMauro Carvalho Chehab 		kvfree(me);
43349d4fa1a1SMauro Carvalho Chehab 	}
43359d4fa1a1SMauro Carvalho Chehab }
43369d4fa1a1SMauro Carvalho Chehab 
43379d4fa1a1SMauro Carvalho Chehab struct ia_css_dvs2_coefficients *
ia_css_dvs2_coefficients_allocate(const struct ia_css_dvs_grid_info * grid)43389d4fa1a1SMauro Carvalho Chehab ia_css_dvs2_coefficients_allocate(const struct ia_css_dvs_grid_info *grid)
43399d4fa1a1SMauro Carvalho Chehab {
43409d4fa1a1SMauro Carvalho Chehab 	struct ia_css_dvs2_coefficients *me;
43419d4fa1a1SMauro Carvalho Chehab 
43429d4fa1a1SMauro Carvalho Chehab 	assert(grid);
43439d4fa1a1SMauro Carvalho Chehab 
43449955d906SMauro Carvalho Chehab 	me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
43459d4fa1a1SMauro Carvalho Chehab 	if (!me)
43469d4fa1a1SMauro Carvalho Chehab 		goto err;
43479d4fa1a1SMauro Carvalho Chehab 
43489d4fa1a1SMauro Carvalho Chehab 	me->grid = *grid;
43499d4fa1a1SMauro Carvalho Chehab 
43509955d906SMauro Carvalho Chehab 	me->hor_coefs.odd_real = kvmalloc(grid->num_hor_coefs *
43519955d906SMauro Carvalho Chehab 					  sizeof(*me->hor_coefs.odd_real),
43529955d906SMauro Carvalho Chehab 					  GFP_KERNEL);
43539d4fa1a1SMauro Carvalho Chehab 	if (!me->hor_coefs.odd_real)
43549d4fa1a1SMauro Carvalho Chehab 		goto err;
43559d4fa1a1SMauro Carvalho Chehab 
43569955d906SMauro Carvalho Chehab 	me->hor_coefs.odd_imag = kvmalloc(grid->num_hor_coefs *
43579955d906SMauro Carvalho Chehab 					  sizeof(*me->hor_coefs.odd_imag),
43589955d906SMauro Carvalho Chehab 					  GFP_KERNEL);
43599d4fa1a1SMauro Carvalho Chehab 	if (!me->hor_coefs.odd_imag)
43609d4fa1a1SMauro Carvalho Chehab 		goto err;
43619d4fa1a1SMauro Carvalho Chehab 
43629955d906SMauro Carvalho Chehab 	me->hor_coefs.even_real = kvmalloc(grid->num_hor_coefs *
43639955d906SMauro Carvalho Chehab 					   sizeof(*me->hor_coefs.even_real),
43649955d906SMauro Carvalho Chehab 					   GFP_KERNEL);
43659d4fa1a1SMauro Carvalho Chehab 	if (!me->hor_coefs.even_real)
43669d4fa1a1SMauro Carvalho Chehab 		goto err;
43679d4fa1a1SMauro Carvalho Chehab 
43689955d906SMauro Carvalho Chehab 	me->hor_coefs.even_imag = kvmalloc(grid->num_hor_coefs *
43699955d906SMauro Carvalho Chehab 					   sizeof(*me->hor_coefs.even_imag),
43709955d906SMauro Carvalho Chehab 					   GFP_KERNEL);
43719d4fa1a1SMauro Carvalho Chehab 	if (!me->hor_coefs.even_imag)
43729d4fa1a1SMauro Carvalho Chehab 		goto err;
43739d4fa1a1SMauro Carvalho Chehab 
43749955d906SMauro Carvalho Chehab 	me->ver_coefs.odd_real = kvmalloc(grid->num_ver_coefs *
43759955d906SMauro Carvalho Chehab 					  sizeof(*me->ver_coefs.odd_real),
43769955d906SMauro Carvalho Chehab 					  GFP_KERNEL);
43779d4fa1a1SMauro Carvalho Chehab 	if (!me->ver_coefs.odd_real)
43789d4fa1a1SMauro Carvalho Chehab 		goto err;
43799d4fa1a1SMauro Carvalho Chehab 
43809955d906SMauro Carvalho Chehab 	me->ver_coefs.odd_imag = kvmalloc(grid->num_ver_coefs *
43819955d906SMauro Carvalho Chehab 					  sizeof(*me->ver_coefs.odd_imag),
43829955d906SMauro Carvalho Chehab 					  GFP_KERNEL);
43839d4fa1a1SMauro Carvalho Chehab 	if (!me->ver_coefs.odd_imag)
43849d4fa1a1SMauro Carvalho Chehab 		goto err;
43859d4fa1a1SMauro Carvalho Chehab 
43869955d906SMauro Carvalho Chehab 	me->ver_coefs.even_real = kvmalloc(grid->num_ver_coefs *
43879955d906SMauro Carvalho Chehab 					   sizeof(*me->ver_coefs.even_real),
43889955d906SMauro Carvalho Chehab 					   GFP_KERNEL);
43899d4fa1a1SMauro Carvalho Chehab 	if (!me->ver_coefs.even_real)
43909d4fa1a1SMauro Carvalho Chehab 		goto err;
43919d4fa1a1SMauro Carvalho Chehab 
43929955d906SMauro Carvalho Chehab 	me->ver_coefs.even_imag = kvmalloc(grid->num_ver_coefs *
43939955d906SMauro Carvalho Chehab 					   sizeof(*me->ver_coefs.even_imag),
43949955d906SMauro Carvalho Chehab 					   GFP_KERNEL);
43959d4fa1a1SMauro Carvalho Chehab 	if (!me->ver_coefs.even_imag)
43969d4fa1a1SMauro Carvalho Chehab 		goto err;
43979d4fa1a1SMauro Carvalho Chehab 
43989d4fa1a1SMauro Carvalho Chehab 	return me;
43999d4fa1a1SMauro Carvalho Chehab err:
44009d4fa1a1SMauro Carvalho Chehab 	ia_css_dvs2_coefficients_free(me);
44019d4fa1a1SMauro Carvalho Chehab 	return NULL;
44029d4fa1a1SMauro Carvalho Chehab }
44039d4fa1a1SMauro Carvalho Chehab 
44049d4fa1a1SMauro Carvalho Chehab void
ia_css_dvs2_coefficients_free(struct ia_css_dvs2_coefficients * me)44059d4fa1a1SMauro Carvalho Chehab ia_css_dvs2_coefficients_free(struct ia_css_dvs2_coefficients *me)
44069d4fa1a1SMauro Carvalho Chehab {
44079d4fa1a1SMauro Carvalho Chehab 	if (me) {
44089955d906SMauro Carvalho Chehab 		kvfree(me->hor_coefs.odd_real);
44099955d906SMauro Carvalho Chehab 		kvfree(me->hor_coefs.odd_imag);
44109955d906SMauro Carvalho Chehab 		kvfree(me->hor_coefs.even_real);
44119955d906SMauro Carvalho Chehab 		kvfree(me->hor_coefs.even_imag);
44129955d906SMauro Carvalho Chehab 		kvfree(me->ver_coefs.odd_real);
44139955d906SMauro Carvalho Chehab 		kvfree(me->ver_coefs.odd_imag);
44149955d906SMauro Carvalho Chehab 		kvfree(me->ver_coefs.even_real);
44159955d906SMauro Carvalho Chehab 		kvfree(me->ver_coefs.even_imag);
44169955d906SMauro Carvalho Chehab 		kvfree(me);
44179d4fa1a1SMauro Carvalho Chehab 	}
44189d4fa1a1SMauro Carvalho Chehab }
44199d4fa1a1SMauro Carvalho Chehab 
44209d4fa1a1SMauro Carvalho Chehab struct ia_css_dvs_6axis_config *
ia_css_dvs2_6axis_config_allocate(const struct ia_css_stream * stream)44219d4fa1a1SMauro Carvalho Chehab ia_css_dvs2_6axis_config_allocate(const struct ia_css_stream *stream)
44229d4fa1a1SMauro Carvalho Chehab {
44239d4fa1a1SMauro Carvalho Chehab 	struct ia_css_dvs_6axis_config *dvs_config = NULL;
44249d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params = NULL;
44259d4fa1a1SMauro Carvalho Chehab 	unsigned int width_y;
44269d4fa1a1SMauro Carvalho Chehab 	unsigned int height_y;
44279d4fa1a1SMauro Carvalho Chehab 	unsigned int width_uv;
44289d4fa1a1SMauro Carvalho Chehab 	unsigned int height_uv;
44299d4fa1a1SMauro Carvalho Chehab 
44309d4fa1a1SMauro Carvalho Chehab 	assert(stream);
44319d4fa1a1SMauro Carvalho Chehab 	params = stream->isp_params_configs;
44329d4fa1a1SMauro Carvalho Chehab 
44339d4fa1a1SMauro Carvalho Chehab 	/* Backward compatibility by default consider pipe as Video*/
4434c1f1d76cSDing Xiang 	if (!params || !params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO])
44359d4fa1a1SMauro Carvalho Chehab 		goto err;
44369d4fa1a1SMauro Carvalho Chehab 
44379955d906SMauro Carvalho Chehab 	dvs_config = kvcalloc(1, sizeof(struct ia_css_dvs_6axis_config),
44389955d906SMauro Carvalho Chehab 			      GFP_KERNEL);
44399d4fa1a1SMauro Carvalho Chehab 	if (!dvs_config)
44409d4fa1a1SMauro Carvalho Chehab 		goto err;
44419d4fa1a1SMauro Carvalho Chehab 
44429d4fa1a1SMauro Carvalho Chehab 	dvs_config->width_y = width_y =
44439d4fa1a1SMauro Carvalho Chehab 				  params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->width_y;
44449d4fa1a1SMauro Carvalho Chehab 	dvs_config->height_y = height_y =
44459d4fa1a1SMauro Carvalho Chehab 				   params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->height_y;
44469d4fa1a1SMauro Carvalho Chehab 	dvs_config->width_uv = width_uv =
44479d4fa1a1SMauro Carvalho Chehab 				   params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->width_uv;
44489d4fa1a1SMauro Carvalho Chehab 	dvs_config->height_uv = height_uv =
44499d4fa1a1SMauro Carvalho Chehab 				    params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->height_uv;
44509d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LOG("table Y: W %d H %d", width_y, height_y);
44519d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LOG("table UV: W %d H %d", width_uv, height_uv);
44529955d906SMauro Carvalho Chehab 	dvs_config->xcoords_y = kvmalloc(width_y * height_y * sizeof(uint32_t),
44539955d906SMauro Carvalho Chehab 					 GFP_KERNEL);
44549d4fa1a1SMauro Carvalho Chehab 	if (!dvs_config->xcoords_y)
44559d4fa1a1SMauro Carvalho Chehab 		goto err;
44569d4fa1a1SMauro Carvalho Chehab 
44579955d906SMauro Carvalho Chehab 	dvs_config->ycoords_y = kvmalloc(width_y * height_y * sizeof(uint32_t),
44589955d906SMauro Carvalho Chehab 					 GFP_KERNEL);
44599d4fa1a1SMauro Carvalho Chehab 	if (!dvs_config->ycoords_y)
44609d4fa1a1SMauro Carvalho Chehab 		goto err;
44619d4fa1a1SMauro Carvalho Chehab 
44629955d906SMauro Carvalho Chehab 	dvs_config->xcoords_uv = kvmalloc(width_uv * height_uv *
44639955d906SMauro Carvalho Chehab 					  sizeof(uint32_t),
44649955d906SMauro Carvalho Chehab 					  GFP_KERNEL);
44659d4fa1a1SMauro Carvalho Chehab 	if (!dvs_config->xcoords_uv)
44669d4fa1a1SMauro Carvalho Chehab 		goto err;
44679d4fa1a1SMauro Carvalho Chehab 
44689955d906SMauro Carvalho Chehab 	dvs_config->ycoords_uv = kvmalloc(width_uv * height_uv *
44699955d906SMauro Carvalho Chehab 					  sizeof(uint32_t),
44709955d906SMauro Carvalho Chehab 					  GFP_KERNEL);
44719d4fa1a1SMauro Carvalho Chehab 	if (!dvs_config->ycoords_uv)
44729d4fa1a1SMauro Carvalho Chehab 		goto err;
44739d4fa1a1SMauro Carvalho Chehab 
44749d4fa1a1SMauro Carvalho Chehab 	return dvs_config;
44759d4fa1a1SMauro Carvalho Chehab err:
44769d4fa1a1SMauro Carvalho Chehab 	ia_css_dvs2_6axis_config_free(dvs_config);
44779d4fa1a1SMauro Carvalho Chehab 	return NULL;
44789d4fa1a1SMauro Carvalho Chehab }
44799d4fa1a1SMauro Carvalho Chehab 
44809d4fa1a1SMauro Carvalho Chehab void
ia_css_dvs2_6axis_config_free(struct ia_css_dvs_6axis_config * dvs_6axis_config)44819d4fa1a1SMauro Carvalho Chehab ia_css_dvs2_6axis_config_free(struct ia_css_dvs_6axis_config *dvs_6axis_config)
44829d4fa1a1SMauro Carvalho Chehab {
44839d4fa1a1SMauro Carvalho Chehab 	if (dvs_6axis_config) {
44849955d906SMauro Carvalho Chehab 		kvfree(dvs_6axis_config->xcoords_y);
44859955d906SMauro Carvalho Chehab 		kvfree(dvs_6axis_config->ycoords_y);
44869955d906SMauro Carvalho Chehab 		kvfree(dvs_6axis_config->xcoords_uv);
44879955d906SMauro Carvalho Chehab 		kvfree(dvs_6axis_config->ycoords_uv);
44889955d906SMauro Carvalho Chehab 		kvfree(dvs_6axis_config);
44899d4fa1a1SMauro Carvalho Chehab 	}
44909d4fa1a1SMauro Carvalho Chehab }
44919d4fa1a1SMauro Carvalho Chehab 
44929d4fa1a1SMauro Carvalho Chehab void
ia_css_en_dz_capt_pipe(struct ia_css_stream * stream,bool enable)44939d4fa1a1SMauro Carvalho Chehab ia_css_en_dz_capt_pipe(struct ia_css_stream *stream, bool enable)
44949d4fa1a1SMauro Carvalho Chehab {
44959d4fa1a1SMauro Carvalho Chehab 	struct ia_css_pipe *pipe;
44969d4fa1a1SMauro Carvalho Chehab 	struct ia_css_pipeline *pipeline;
44979d4fa1a1SMauro Carvalho Chehab 	struct ia_css_pipeline_stage *stage;
44989d4fa1a1SMauro Carvalho Chehab 	enum ia_css_pipe_id pipe_id;
449941022d35SMauro Carvalho Chehab 	int err;
45009d4fa1a1SMauro Carvalho Chehab 	int i;
45019d4fa1a1SMauro Carvalho Chehab 
45029d4fa1a1SMauro Carvalho Chehab 	if (!stream)
45039d4fa1a1SMauro Carvalho Chehab 		return;
45049d4fa1a1SMauro Carvalho Chehab 
45059d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < stream->num_pipes; i++) {
45069d4fa1a1SMauro Carvalho Chehab 		pipe = stream->pipes[i];
45079d4fa1a1SMauro Carvalho Chehab 		pipeline = ia_css_pipe_get_pipeline(pipe);
45089d4fa1a1SMauro Carvalho Chehab 		pipe_id = pipeline->pipe_id;
45099d4fa1a1SMauro Carvalho Chehab 
45109d4fa1a1SMauro Carvalho Chehab 		if (pipe_id == IA_CSS_PIPE_ID_CAPTURE) {
45119d4fa1a1SMauro Carvalho Chehab 			err = ia_css_pipeline_get_stage(pipeline, IA_CSS_BINARY_MODE_CAPTURE_PP,
45129d4fa1a1SMauro Carvalho Chehab 							&stage);
451341022d35SMauro Carvalho Chehab 			if (!err)
45149d4fa1a1SMauro Carvalho Chehab 				stage->enable_zoom = enable;
45159d4fa1a1SMauro Carvalho Chehab 			break;
45169d4fa1a1SMauro Carvalho Chehab 		}
45179d4fa1a1SMauro Carvalho Chehab 	}
45189d4fa1a1SMauro Carvalho Chehab }
4519