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 #ifndef IA_CSS_NO_DEBUG
179d4fa1a1SMauro Carvalho Chehab #include "ia_css_debug.h"
189d4fa1a1SMauro Carvalho Chehab #endif
199d4fa1a1SMauro Carvalho Chehab 
209d4fa1a1SMauro Carvalho Chehab #include "type_support.h"
219d4fa1a1SMauro Carvalho Chehab #include "assert_support.h"
229d4fa1a1SMauro Carvalho Chehab #include "math_support.h" /* for min and max */
239d4fa1a1SMauro Carvalho Chehab 
249d4fa1a1SMauro Carvalho Chehab #include "ia_css_eed1_8.host.h"
259d4fa1a1SMauro Carvalho Chehab 
269d4fa1a1SMauro Carvalho Chehab /* WARNING1: Number of inv points should be less or equal to 16,
279d4fa1a1SMauro Carvalho Chehab  * due to implementation limitation. See kernel design document
289d4fa1a1SMauro Carvalho Chehab  * for more details.
299d4fa1a1SMauro Carvalho Chehab  * WARNING2: Do not modify the number of inv points without correcting
309d4fa1a1SMauro Carvalho Chehab  * the EED1_8 kernel implementation assumptions.
319d4fa1a1SMauro Carvalho Chehab  */
329d4fa1a1SMauro Carvalho Chehab #define NUMBER_OF_CHGRINV_POINTS 15
339d4fa1a1SMauro Carvalho Chehab #define NUMBER_OF_TCINV_POINTS 9
349d4fa1a1SMauro Carvalho Chehab #define NUMBER_OF_FCINV_POINTS 9
359d4fa1a1SMauro Carvalho Chehab 
369d4fa1a1SMauro Carvalho Chehab static const s16 chgrinv_x[NUMBER_OF_CHGRINV_POINTS] = {
379d4fa1a1SMauro Carvalho Chehab 	0, 16, 64, 144, 272, 448, 672, 976,
389d4fa1a1SMauro Carvalho Chehab 	1376, 1888, 2528, 3312, 4256, 5376, 6688
399d4fa1a1SMauro Carvalho Chehab };
409d4fa1a1SMauro Carvalho Chehab 
419d4fa1a1SMauro Carvalho Chehab static const s16 chgrinv_a[NUMBER_OF_CHGRINV_POINTS] = {
429d4fa1a1SMauro Carvalho Chehab 	-7171, -256, -29, -3456, -1071, -475, -189, -102,
439d4fa1a1SMauro Carvalho Chehab 	    -48, -38, -10, -9, -7, -6, 0
449d4fa1a1SMauro Carvalho Chehab     };
459d4fa1a1SMauro Carvalho Chehab 
469d4fa1a1SMauro Carvalho Chehab static const s16 chgrinv_b[NUMBER_OF_CHGRINV_POINTS] = {
479d4fa1a1SMauro Carvalho Chehab 	8191, 1021, 256, 114, 60, 37, 24, 17,
489d4fa1a1SMauro Carvalho Chehab 	12, 9, 6, 5, 4, 3, 2
499d4fa1a1SMauro Carvalho Chehab };
509d4fa1a1SMauro Carvalho Chehab 
519d4fa1a1SMauro Carvalho Chehab static const s16 chgrinv_c[NUMBER_OF_CHGRINV_POINTS] = {
529d4fa1a1SMauro Carvalho Chehab 	1, 1, 1, 0, 0, 0, 0, 0,
539d4fa1a1SMauro Carvalho Chehab 	0, 0, 0, 0, 0, 0, 0
549d4fa1a1SMauro Carvalho Chehab };
559d4fa1a1SMauro Carvalho Chehab 
569d4fa1a1SMauro Carvalho Chehab static const s16 tcinv_x[NUMBER_OF_TCINV_POINTS] = {
579d4fa1a1SMauro Carvalho Chehab 	0, 4, 11, 23, 42, 68, 102, 148, 205
589d4fa1a1SMauro Carvalho Chehab };
599d4fa1a1SMauro Carvalho Chehab 
609d4fa1a1SMauro Carvalho Chehab static const s16 tcinv_a[NUMBER_OF_TCINV_POINTS] = {
619d4fa1a1SMauro Carvalho Chehab 	-6364, -631, -126, -34, -13, -6, -4452, -2156, 0
629d4fa1a1SMauro Carvalho Chehab     };
639d4fa1a1SMauro Carvalho Chehab 
649d4fa1a1SMauro Carvalho Chehab static const s16 tcinv_b[NUMBER_OF_TCINV_POINTS] = {
659d4fa1a1SMauro Carvalho Chehab 	8191, 1828, 726, 352, 197, 121, 80, 55, 40
669d4fa1a1SMauro Carvalho Chehab };
679d4fa1a1SMauro Carvalho Chehab 
689d4fa1a1SMauro Carvalho Chehab static const s16 tcinv_c[NUMBER_OF_TCINV_POINTS] = {
699d4fa1a1SMauro Carvalho Chehab 	1, 1, 1, 1, 1, 1, 0, 0, 0
709d4fa1a1SMauro Carvalho Chehab };
719d4fa1a1SMauro Carvalho Chehab 
729d4fa1a1SMauro Carvalho Chehab static const s16 fcinv_x[NUMBER_OF_FCINV_POINTS] = {
739d4fa1a1SMauro Carvalho Chehab 	0, 80, 216, 456, 824, 1344, 2040, 2952, 4096
749d4fa1a1SMauro Carvalho Chehab };
759d4fa1a1SMauro Carvalho Chehab 
769d4fa1a1SMauro Carvalho Chehab static const s16 fcinv_a[NUMBER_OF_FCINV_POINTS] = {
779d4fa1a1SMauro Carvalho Chehab 	-5244, -486, -86, -2849, -961, -400, -180, -86, 0
789d4fa1a1SMauro Carvalho Chehab     };
799d4fa1a1SMauro Carvalho Chehab 
809d4fa1a1SMauro Carvalho Chehab static const s16 fcinv_b[NUMBER_OF_FCINV_POINTS] = {
819d4fa1a1SMauro Carvalho Chehab 	8191, 1637, 607, 287, 159, 98, 64, 44, 32
829d4fa1a1SMauro Carvalho Chehab };
839d4fa1a1SMauro Carvalho Chehab 
849d4fa1a1SMauro Carvalho Chehab static const s16 fcinv_c[NUMBER_OF_FCINV_POINTS] = {
859d4fa1a1SMauro Carvalho Chehab 	1, 1, 1, 0, 0, 0, 0, 0, 0
869d4fa1a1SMauro Carvalho Chehab };
879d4fa1a1SMauro Carvalho Chehab 
889d4fa1a1SMauro Carvalho Chehab void
ia_css_eed1_8_vmem_encode(struct eed1_8_vmem_params * to,const struct ia_css_eed1_8_config * from,size_t size)899d4fa1a1SMauro Carvalho Chehab ia_css_eed1_8_vmem_encode(
909d4fa1a1SMauro Carvalho Chehab     struct eed1_8_vmem_params *to,
919d4fa1a1SMauro Carvalho Chehab     const struct ia_css_eed1_8_config *from,
929d4fa1a1SMauro Carvalho Chehab     size_t size)
939d4fa1a1SMauro Carvalho Chehab {
949d4fa1a1SMauro Carvalho Chehab 	unsigned int i, j, base;
959d4fa1a1SMauro Carvalho Chehab 	const unsigned int total_blocks = 4;
969d4fa1a1SMauro Carvalho Chehab 	const unsigned int shuffle_block = 16;
979d4fa1a1SMauro Carvalho Chehab 
989d4fa1a1SMauro Carvalho Chehab 	(void)size;
999d4fa1a1SMauro Carvalho Chehab 
1009d4fa1a1SMauro Carvalho Chehab 	/* Init */
1019d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < ISP_VEC_NELEMS; i++) {
1029d4fa1a1SMauro Carvalho Chehab 		to->e_dew_enh_x[0][i] = 0;
1039d4fa1a1SMauro Carvalho Chehab 		to->e_dew_enh_y[0][i] = 0;
1049d4fa1a1SMauro Carvalho Chehab 		to->e_dew_enh_a[0][i] = 0;
1059d4fa1a1SMauro Carvalho Chehab 		to->e_dew_enh_f[0][i] = 0;
1069d4fa1a1SMauro Carvalho Chehab 		to->chgrinv_x[0][i] = 0;
1079d4fa1a1SMauro Carvalho Chehab 		to->chgrinv_a[0][i] = 0;
1089d4fa1a1SMauro Carvalho Chehab 		to->chgrinv_b[0][i] = 0;
1099d4fa1a1SMauro Carvalho Chehab 		to->chgrinv_c[0][i] = 0;
1109d4fa1a1SMauro Carvalho Chehab 		to->tcinv_x[0][i] = 0;
1119d4fa1a1SMauro Carvalho Chehab 		to->tcinv_a[0][i] = 0;
1129d4fa1a1SMauro Carvalho Chehab 		to->tcinv_b[0][i] = 0;
1139d4fa1a1SMauro Carvalho Chehab 		to->tcinv_c[0][i] = 0;
1149d4fa1a1SMauro Carvalho Chehab 		to->fcinv_x[0][i] = 0;
1159d4fa1a1SMauro Carvalho Chehab 		to->fcinv_a[0][i] = 0;
1169d4fa1a1SMauro Carvalho Chehab 		to->fcinv_b[0][i] = 0;
1179d4fa1a1SMauro Carvalho Chehab 		to->fcinv_c[0][i] = 0;
1189d4fa1a1SMauro Carvalho Chehab 	}
1199d4fa1a1SMauro Carvalho Chehab 
1209d4fa1a1SMauro Carvalho Chehab 	/* Constraints on dew_enhance_seg_x and dew_enhance_seg_y:
1219d4fa1a1SMauro Carvalho Chehab 	 * - values should be greater or equal to 0.
1229d4fa1a1SMauro Carvalho Chehab 	 * - values should be ascending.
1239d4fa1a1SMauro Carvalho Chehab 	 * - value of index zero is equal to 0.
1249d4fa1a1SMauro Carvalho Chehab 	 */
1259d4fa1a1SMauro Carvalho Chehab 
1269d4fa1a1SMauro Carvalho Chehab 	/* Checking constraints: */
1279d4fa1a1SMauro Carvalho Chehab 	/* TODO: investigate if an assert is the right way to report that
1289d4fa1a1SMauro Carvalho Chehab 	 * the constraints are violated.
1299d4fa1a1SMauro Carvalho Chehab 	 */
1309d4fa1a1SMauro Carvalho Chehab 	for (j = 0; j < IA_CSS_NUMBER_OF_DEW_ENHANCE_SEGMENTS; j++) {
1319d4fa1a1SMauro Carvalho Chehab 		assert(from->dew_enhance_seg_x[j] > -1);
1329d4fa1a1SMauro Carvalho Chehab 		assert(from->dew_enhance_seg_y[j] > -1);
1339d4fa1a1SMauro Carvalho Chehab 	}
1349d4fa1a1SMauro Carvalho Chehab 
1359d4fa1a1SMauro Carvalho Chehab 	for (j = 1; j < IA_CSS_NUMBER_OF_DEW_ENHANCE_SEGMENTS; j++) {
1369d4fa1a1SMauro Carvalho Chehab 		assert(from->dew_enhance_seg_x[j] > from->dew_enhance_seg_x[j - 1]);
1379d4fa1a1SMauro Carvalho Chehab 		assert(from->dew_enhance_seg_y[j] > from->dew_enhance_seg_y[j - 1]);
1389d4fa1a1SMauro Carvalho Chehab 	}
1399d4fa1a1SMauro Carvalho Chehab 
1409d4fa1a1SMauro Carvalho Chehab 	assert(from->dew_enhance_seg_x[0] == 0);
1419d4fa1a1SMauro Carvalho Chehab 	assert(from->dew_enhance_seg_y[0] == 0);
1429d4fa1a1SMauro Carvalho Chehab 
1439d4fa1a1SMauro Carvalho Chehab 	/* Constraints on chgrinv_x, tcinv_x and fcinv_x:
1449d4fa1a1SMauro Carvalho Chehab 	 * - values should be greater or equal to 0.
1459d4fa1a1SMauro Carvalho Chehab 	 * - values should be ascending.
1469d4fa1a1SMauro Carvalho Chehab 	 * - value of index zero is equal to 0.
1479d4fa1a1SMauro Carvalho Chehab 	 */
1489d4fa1a1SMauro Carvalho Chehab 	assert(chgrinv_x[0] == 0);
1499d4fa1a1SMauro Carvalho Chehab 	assert(tcinv_x[0] == 0);
1509d4fa1a1SMauro Carvalho Chehab 	assert(fcinv_x[0] == 0);
1519d4fa1a1SMauro Carvalho Chehab 
1529d4fa1a1SMauro Carvalho Chehab 	for (j = 1; j < NUMBER_OF_CHGRINV_POINTS; j++) {
1539d4fa1a1SMauro Carvalho Chehab 		assert(chgrinv_x[j] > chgrinv_x[j - 1]);
1549d4fa1a1SMauro Carvalho Chehab 	}
1559d4fa1a1SMauro Carvalho Chehab 
1569d4fa1a1SMauro Carvalho Chehab 	for (j = 1; j < NUMBER_OF_TCINV_POINTS; j++) {
1579d4fa1a1SMauro Carvalho Chehab 		assert(tcinv_x[j] > tcinv_x[j - 1]);
1589d4fa1a1SMauro Carvalho Chehab 	}
1599d4fa1a1SMauro Carvalho Chehab 
1609d4fa1a1SMauro Carvalho Chehab 	for (j = 1; j < NUMBER_OF_FCINV_POINTS; j++) {
1619d4fa1a1SMauro Carvalho Chehab 		assert(fcinv_x[j] > fcinv_x[j - 1]);
1629d4fa1a1SMauro Carvalho Chehab 	}
1639d4fa1a1SMauro Carvalho Chehab 
1649d4fa1a1SMauro Carvalho Chehab 	/* The implementation of the calulating 1/x is based on the availability
1659d4fa1a1SMauro Carvalho Chehab 	 * of the OP_vec_shuffle16 operation.
1669d4fa1a1SMauro Carvalho Chehab 	 * A 64 element vector is split up in 4 blocks of 16 element. Each array is copied to
1679d4fa1a1SMauro Carvalho Chehab 	 * a vector 4 times, (starting at 0, 16, 32 and 48). All array elements are copied or
1689d4fa1a1SMauro Carvalho Chehab 	 * initialised as described in the KFS. The remaining elements of a vector are set to 0.
1699d4fa1a1SMauro Carvalho Chehab 	 */
1709d4fa1a1SMauro Carvalho Chehab 	/* TODO: guard this code with above assumptions */
1719d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < total_blocks; i++) {
1729d4fa1a1SMauro Carvalho Chehab 		base = shuffle_block * i;
1739d4fa1a1SMauro Carvalho Chehab 
1749d4fa1a1SMauro Carvalho Chehab 		for (j = 0; j < IA_CSS_NUMBER_OF_DEW_ENHANCE_SEGMENTS; j++) {
1759d4fa1a1SMauro Carvalho Chehab 			to->e_dew_enh_x[0][base + j] = min_t(int, max_t(int,
1769d4fa1a1SMauro Carvalho Chehab 							     from->dew_enhance_seg_x[j], 0),
1779d4fa1a1SMauro Carvalho Chehab 							     8191);
1789d4fa1a1SMauro Carvalho Chehab 			to->e_dew_enh_y[0][base + j] = min_t(int, max_t(int,
1799d4fa1a1SMauro Carvalho Chehab 							     from->dew_enhance_seg_y[j], -8192),
1809d4fa1a1SMauro Carvalho Chehab 							     8191);
1819d4fa1a1SMauro Carvalho Chehab 		}
1829d4fa1a1SMauro Carvalho Chehab 
1839d4fa1a1SMauro Carvalho Chehab 		for (j = 0; j < (IA_CSS_NUMBER_OF_DEW_ENHANCE_SEGMENTS - 1); j++) {
1849d4fa1a1SMauro Carvalho Chehab 			to->e_dew_enh_a[0][base + j] = min_t(int, max_t(int,
1859d4fa1a1SMauro Carvalho Chehab 							     from->dew_enhance_seg_slope[j],
1869d4fa1a1SMauro Carvalho Chehab 							     -8192), 8191);
1879d4fa1a1SMauro Carvalho Chehab 			/* Convert dew_enhance_seg_exp to flag:
1889d4fa1a1SMauro Carvalho Chehab 			 * 0 -> 0
1899d4fa1a1SMauro Carvalho Chehab 			 * 1...13 -> 1
1909d4fa1a1SMauro Carvalho Chehab 			 */
1919d4fa1a1SMauro Carvalho Chehab 			to->e_dew_enh_f[0][base + j] = (min_t(int, max_t(int,
1929d4fa1a1SMauro Carvalho Chehab 							      from->dew_enhance_seg_exp[j],
1939d4fa1a1SMauro Carvalho Chehab 							      0), 13) > 0);
1949d4fa1a1SMauro Carvalho Chehab 		}
1959d4fa1a1SMauro Carvalho Chehab 
1969d4fa1a1SMauro Carvalho Chehab 		/* Hard-coded to 0, in order to be able to handle out of
1979d4fa1a1SMauro Carvalho Chehab 		 * range input in the same way as the other segments.
1989d4fa1a1SMauro Carvalho Chehab 		 * See KFS for more details.
1999d4fa1a1SMauro Carvalho Chehab 		 */
2009d4fa1a1SMauro Carvalho Chehab 		to->e_dew_enh_a[0][base + (IA_CSS_NUMBER_OF_DEW_ENHANCE_SEGMENTS - 1)] = 0;
2019d4fa1a1SMauro Carvalho Chehab 		to->e_dew_enh_f[0][base + (IA_CSS_NUMBER_OF_DEW_ENHANCE_SEGMENTS - 1)] = 0;
2029d4fa1a1SMauro Carvalho Chehab 
2039d4fa1a1SMauro Carvalho Chehab 		for (j = 0; j < NUMBER_OF_CHGRINV_POINTS; j++) {
2049d4fa1a1SMauro Carvalho Chehab 			to->chgrinv_x[0][base + j] = chgrinv_x[j];
2059d4fa1a1SMauro Carvalho Chehab 			to->chgrinv_a[0][base + j] = chgrinv_a[j];
2069d4fa1a1SMauro Carvalho Chehab 			to->chgrinv_b[0][base + j] = chgrinv_b[j];
2079d4fa1a1SMauro Carvalho Chehab 			to->chgrinv_c[0][base + j] = chgrinv_c[j];
2089d4fa1a1SMauro Carvalho Chehab 		}
2099d4fa1a1SMauro Carvalho Chehab 
2109d4fa1a1SMauro Carvalho Chehab 		for (j = 0; j < NUMBER_OF_TCINV_POINTS; j++) {
2119d4fa1a1SMauro Carvalho Chehab 			to->tcinv_x[0][base + j] = tcinv_x[j];
2129d4fa1a1SMauro Carvalho Chehab 			to->tcinv_a[0][base + j] = tcinv_a[j];
2139d4fa1a1SMauro Carvalho Chehab 			to->tcinv_b[0][base + j] = tcinv_b[j];
2149d4fa1a1SMauro Carvalho Chehab 			to->tcinv_c[0][base + j] = tcinv_c[j];
2159d4fa1a1SMauro Carvalho Chehab 		}
2169d4fa1a1SMauro Carvalho Chehab 
2179d4fa1a1SMauro Carvalho Chehab 		for (j = 0; j < NUMBER_OF_FCINV_POINTS; j++) {
2189d4fa1a1SMauro Carvalho Chehab 			to->fcinv_x[0][base + j] = fcinv_x[j];
2199d4fa1a1SMauro Carvalho Chehab 			to->fcinv_a[0][base + j] = fcinv_a[j];
2209d4fa1a1SMauro Carvalho Chehab 			to->fcinv_b[0][base + j] = fcinv_b[j];
2219d4fa1a1SMauro Carvalho Chehab 			to->fcinv_c[0][base + j] = fcinv_c[j];
2229d4fa1a1SMauro Carvalho Chehab 		}
2239d4fa1a1SMauro Carvalho Chehab 	}
2249d4fa1a1SMauro Carvalho Chehab }
2259d4fa1a1SMauro Carvalho Chehab 
2269d4fa1a1SMauro Carvalho Chehab void
ia_css_eed1_8_encode(struct eed1_8_dmem_params * to,const struct ia_css_eed1_8_config * from,size_t size)2279d4fa1a1SMauro Carvalho Chehab ia_css_eed1_8_encode(
2289d4fa1a1SMauro Carvalho Chehab     struct eed1_8_dmem_params *to,
2299d4fa1a1SMauro Carvalho Chehab     const struct ia_css_eed1_8_config *from,
2309d4fa1a1SMauro Carvalho Chehab     size_t size)
2319d4fa1a1SMauro Carvalho Chehab {
2329d4fa1a1SMauro Carvalho Chehab 	int i;
2339d4fa1a1SMauro Carvalho Chehab 	int min_exp = 0;
2349d4fa1a1SMauro Carvalho Chehab 
2359d4fa1a1SMauro Carvalho Chehab 	(void)size;
2369d4fa1a1SMauro Carvalho Chehab 
2379d4fa1a1SMauro Carvalho Chehab 	to->rbzp_strength = from->rbzp_strength;
2389d4fa1a1SMauro Carvalho Chehab 
2399d4fa1a1SMauro Carvalho Chehab 	to->fcstrength = from->fcstrength;
2409d4fa1a1SMauro Carvalho Chehab 	to->fcthres_0 = from->fcthres_0;
2419d4fa1a1SMauro Carvalho Chehab 	to->fc_sat_coef = from->fc_sat_coef;
2429d4fa1a1SMauro Carvalho Chehab 	to->fc_coring_prm = from->fc_coring_prm;
2439d4fa1a1SMauro Carvalho Chehab 	to->fc_slope = from->fcthres_1 - from->fcthres_0;
2449d4fa1a1SMauro Carvalho Chehab 
2459d4fa1a1SMauro Carvalho Chehab 	to->aerel_thres0 = from->aerel_thres0;
2469d4fa1a1SMauro Carvalho Chehab 	to->aerel_gain0 = from->aerel_gain0;
2479d4fa1a1SMauro Carvalho Chehab 	to->aerel_thres_diff = from->aerel_thres1 - from->aerel_thres0;
2489d4fa1a1SMauro Carvalho Chehab 	to->aerel_gain_diff = from->aerel_gain1 - from->aerel_gain0;
2499d4fa1a1SMauro Carvalho Chehab 
2509d4fa1a1SMauro Carvalho Chehab 	to->derel_thres0 = from->derel_thres0;
2519d4fa1a1SMauro Carvalho Chehab 	to->derel_gain0 = from->derel_gain0;
2529d4fa1a1SMauro Carvalho Chehab 	to->derel_thres_diff = (from->derel_thres1 - from->derel_thres0);
2539d4fa1a1SMauro Carvalho Chehab 	to->derel_gain_diff = (from->derel_gain1 - from->derel_gain0);
2549d4fa1a1SMauro Carvalho Chehab 
2559d4fa1a1SMauro Carvalho Chehab 	to->coring_pos0 = from->coring_pos0;
2569d4fa1a1SMauro Carvalho Chehab 	to->coring_pos_diff = (from->coring_pos1 - from->coring_pos0);
2579d4fa1a1SMauro Carvalho Chehab 	to->coring_neg0 = from->coring_neg0;
2589d4fa1a1SMauro Carvalho Chehab 	to->coring_neg_diff = (from->coring_neg1 - from->coring_neg0);
2599d4fa1a1SMauro Carvalho Chehab 
2609d4fa1a1SMauro Carvalho Chehab 	/* Note: (ISP_VEC_ELEMBITS -1)
2619d4fa1a1SMauro Carvalho Chehab 	 * TODO: currently the testbench does not support to use
2629d4fa1a1SMauro Carvalho Chehab 	 * ISP_VEC_ELEMBITS. Investigate how to fix this
2639d4fa1a1SMauro Carvalho Chehab 	 */
2649d4fa1a1SMauro Carvalho Chehab 	to->gain_exp = (13 - from->gain_exp);
2659d4fa1a1SMauro Carvalho Chehab 	to->gain_pos0 = from->gain_pos0;
2669d4fa1a1SMauro Carvalho Chehab 	to->gain_pos_diff = (from->gain_pos1 - from->gain_pos0);
2679d4fa1a1SMauro Carvalho Chehab 	to->gain_neg0 = from->gain_neg0;
2689d4fa1a1SMauro Carvalho Chehab 	to->gain_neg_diff = (from->gain_neg1 - from->gain_neg0);
2699d4fa1a1SMauro Carvalho Chehab 
2709d4fa1a1SMauro Carvalho Chehab 	to->margin_pos0 = from->pos_margin0;
2719d4fa1a1SMauro Carvalho Chehab 	to->margin_pos_diff = (from->pos_margin1 - from->pos_margin0);
2729d4fa1a1SMauro Carvalho Chehab 	to->margin_neg0 = from->neg_margin0;
2739d4fa1a1SMauro Carvalho Chehab 	to->margin_neg_diff = (from->neg_margin1 - from->neg_margin0);
2749d4fa1a1SMauro Carvalho Chehab 
2759d4fa1a1SMauro Carvalho Chehab 	/* Encode DEWEnhance exp (e_dew_enh_asr) */
2769d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < (IA_CSS_NUMBER_OF_DEW_ENHANCE_SEGMENTS - 1); i++) {
2779d4fa1a1SMauro Carvalho Chehab 		min_exp = max(min_exp, from->dew_enhance_seg_exp[i]);
2789d4fa1a1SMauro Carvalho Chehab 	}
2799d4fa1a1SMauro Carvalho Chehab 	to->e_dew_enh_asr = 13 - min(max(min_exp, 0), 13);
2809d4fa1a1SMauro Carvalho Chehab 
2819d4fa1a1SMauro Carvalho Chehab 	to->dedgew_max = from->dedgew_max;
2829d4fa1a1SMauro Carvalho Chehab }
2839d4fa1a1SMauro Carvalho Chehab 
2849d4fa1a1SMauro Carvalho Chehab void
ia_css_init_eed1_8_state(void * state,size_t size)2859d4fa1a1SMauro Carvalho Chehab ia_css_init_eed1_8_state(
2869d4fa1a1SMauro Carvalho Chehab     void *state,
2879d4fa1a1SMauro Carvalho Chehab     size_t size)
2889d4fa1a1SMauro Carvalho Chehab {
2899d4fa1a1SMauro Carvalho Chehab 	memset(state, 0, size);
2909d4fa1a1SMauro Carvalho Chehab }
2919d4fa1a1SMauro Carvalho Chehab 
2929d4fa1a1SMauro Carvalho Chehab #ifndef IA_CSS_NO_DEBUG
2939d4fa1a1SMauro Carvalho Chehab void
ia_css_eed1_8_debug_dtrace(const struct ia_css_eed1_8_config * eed,unsigned int level)2949d4fa1a1SMauro Carvalho Chehab ia_css_eed1_8_debug_dtrace(
2959d4fa1a1SMauro Carvalho Chehab     const struct ia_css_eed1_8_config *eed,
2969d4fa1a1SMauro Carvalho Chehab     unsigned int level)
2979d4fa1a1SMauro Carvalho Chehab {
2989d4fa1a1SMauro Carvalho Chehab 	if (!eed)
2999d4fa1a1SMauro Carvalho Chehab 		return;
3009d4fa1a1SMauro Carvalho Chehab 
3019d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "Edge Enhancing Demosaic 1.8:\n");
3029d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "rbzp_strength",
3039d4fa1a1SMauro Carvalho Chehab 			    eed->rbzp_strength);
3049d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "fcstrength", eed->fcstrength);
3059d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "fcthres_0", eed->fcthres_0);
3069d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "fcthres_1", eed->fcthres_1);
3079d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "fc_sat_coef", eed->fc_sat_coef);
3089d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "fc_coring_prm",
3099d4fa1a1SMauro Carvalho Chehab 			    eed->fc_coring_prm);
3109d4fa1a1SMauro Carvalho Chehab 
3119d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "aerel_thres0", eed->aerel_thres0);
3129d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "aerel_gain0", eed->aerel_gain0);
3139d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "aerel_thres1", eed->aerel_thres1);
3149d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "aerel_gain1", eed->aerel_gain1);
3159d4fa1a1SMauro Carvalho Chehab 
3169d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "derel_thres0", eed->derel_thres0);
3179d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "derel_gain0", eed->derel_gain0);
3189d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "derel_thres1", eed->derel_thres1);
3199d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "derel_gain1", eed->derel_gain1);
3209d4fa1a1SMauro Carvalho Chehab 
3219d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "coring_pos0", eed->coring_pos0);
3229d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "coring_pos1", eed->coring_pos1);
3239d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "coring_neg0", eed->coring_neg0);
3249d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "coring_neg1", eed->coring_neg1);
3259d4fa1a1SMauro Carvalho Chehab 
3269d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "gain_exp", eed->gain_exp);
3279d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "gain_pos0", eed->gain_pos0);
3289d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "gain_pos1", eed->gain_pos1);
3299d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "gain_neg0", eed->gain_neg0);
3309d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "gain_neg1", eed->gain_neg1);
3319d4fa1a1SMauro Carvalho Chehab 
3329d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "pos_margin0", eed->pos_margin0);
3339d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "pos_margin1", eed->pos_margin1);
3349d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "neg_margin0", eed->neg_margin0);
3359d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "neg_margin1", eed->neg_margin1);
3369d4fa1a1SMauro Carvalho Chehab 
3379d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n", "dedgew_max", eed->dedgew_max);
3389d4fa1a1SMauro Carvalho Chehab }
3399d4fa1a1SMauro Carvalho Chehab #endif
340