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 "ia_css_types.h"
179d4fa1a1SMauro Carvalho Chehab #include "sh_css_defs.h"
189d4fa1a1SMauro Carvalho Chehab #include "ia_css_debug.h"
199d4fa1a1SMauro Carvalho Chehab #include "sh_css_frac.h"
209d4fa1a1SMauro Carvalho Chehab 
219d4fa1a1SMauro Carvalho Chehab #include "bnr/bnr_1.0/ia_css_bnr.host.h"
229d4fa1a1SMauro Carvalho Chehab #include "ia_css_ynr.host.h"
239d4fa1a1SMauro Carvalho Chehab 
249d4fa1a1SMauro Carvalho Chehab const struct ia_css_nr_config default_nr_config = {
259d4fa1a1SMauro Carvalho Chehab 	16384,
269d4fa1a1SMauro Carvalho Chehab 	8192,
279d4fa1a1SMauro Carvalho Chehab 	1280,
289d4fa1a1SMauro Carvalho Chehab 	0,
299d4fa1a1SMauro Carvalho Chehab 	0
309d4fa1a1SMauro Carvalho Chehab };
319d4fa1a1SMauro Carvalho Chehab 
329d4fa1a1SMauro Carvalho Chehab const struct ia_css_ee_config default_ee_config = {
339d4fa1a1SMauro Carvalho Chehab 	8192,
349d4fa1a1SMauro Carvalho Chehab 	128,
359d4fa1a1SMauro Carvalho Chehab 	2048
369d4fa1a1SMauro Carvalho Chehab };
379d4fa1a1SMauro Carvalho Chehab 
389d4fa1a1SMauro Carvalho Chehab void
ia_css_nr_encode(struct sh_css_isp_ynr_params * to,const struct ia_css_nr_config * from,unsigned int size)399d4fa1a1SMauro Carvalho Chehab ia_css_nr_encode(
409d4fa1a1SMauro Carvalho Chehab     struct sh_css_isp_ynr_params *to,
419d4fa1a1SMauro Carvalho Chehab     const struct ia_css_nr_config *from,
429d4fa1a1SMauro Carvalho Chehab     unsigned int size)
439d4fa1a1SMauro Carvalho Chehab {
449d4fa1a1SMauro Carvalho Chehab 	(void)size;
459d4fa1a1SMauro Carvalho Chehab 	/* YNR (Y Noise Reduction) */
469d4fa1a1SMauro Carvalho Chehab 	to->threshold =
479d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(8192U, 16, SH_CSS_BAYER_BITS);
489d4fa1a1SMauro Carvalho Chehab 	to->gain_all =
499d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(from->ynr_gain, 16, SH_CSS_YNR_GAIN_SHIFT);
509d4fa1a1SMauro Carvalho Chehab 	to->gain_dir =
519d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(from->ynr_gain, 16, SH_CSS_YNR_GAIN_SHIFT);
529d4fa1a1SMauro Carvalho Chehab 	to->threshold_cb =
539d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(from->threshold_cb, 16, SH_CSS_BAYER_BITS);
549d4fa1a1SMauro Carvalho Chehab 	to->threshold_cr =
559d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(from->threshold_cr, 16, SH_CSS_BAYER_BITS);
569d4fa1a1SMauro Carvalho Chehab }
579d4fa1a1SMauro Carvalho Chehab 
589d4fa1a1SMauro Carvalho Chehab void
ia_css_yee_encode(struct sh_css_isp_yee_params * to,const struct ia_css_yee_config * from,unsigned int size)599d4fa1a1SMauro Carvalho Chehab ia_css_yee_encode(
609d4fa1a1SMauro Carvalho Chehab     struct sh_css_isp_yee_params *to,
619d4fa1a1SMauro Carvalho Chehab     const struct ia_css_yee_config *from,
629d4fa1a1SMauro Carvalho Chehab     unsigned int size)
639d4fa1a1SMauro Carvalho Chehab {
649d4fa1a1SMauro Carvalho Chehab 	int asiWk1 = (int)from->ee.gain;
659d4fa1a1SMauro Carvalho Chehab 	int asiWk2 = asiWk1 / 8;
669d4fa1a1SMauro Carvalho Chehab 	int asiWk3 = asiWk1 / 4;
679d4fa1a1SMauro Carvalho Chehab 
689d4fa1a1SMauro Carvalho Chehab 	(void)size;
699d4fa1a1SMauro Carvalho Chehab 	/* YEE (Y Edge Enhancement) */
709d4fa1a1SMauro Carvalho Chehab 	to->dirthreshold_s =
719d4fa1a1SMauro Carvalho Chehab 	    min((uDIGIT_FITTING(from->nr.direction, 16, SH_CSS_BAYER_BITS)
729d4fa1a1SMauro Carvalho Chehab 		 << 1),
739d4fa1a1SMauro Carvalho Chehab 		SH_CSS_BAYER_MAXVAL);
749d4fa1a1SMauro Carvalho Chehab 	to->dirthreshold_g =
759d4fa1a1SMauro Carvalho Chehab 	    min((uDIGIT_FITTING(from->nr.direction, 16, SH_CSS_BAYER_BITS)
769d4fa1a1SMauro Carvalho Chehab 		 << 4),
779d4fa1a1SMauro Carvalho Chehab 		SH_CSS_BAYER_MAXVAL);
789d4fa1a1SMauro Carvalho Chehab 	to->dirthreshold_width_log2 =
799d4fa1a1SMauro Carvalho Chehab 	    uFRACTION_BITS_FITTING(8);
809d4fa1a1SMauro Carvalho Chehab 	to->dirthreshold_width =
819d4fa1a1SMauro Carvalho Chehab 	    1 << to->dirthreshold_width_log2;
829d4fa1a1SMauro Carvalho Chehab 	to->detailgain =
839d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(from->ee.detail_gain, 11,
849d4fa1a1SMauro Carvalho Chehab 			   SH_CSS_YEE_DETAIL_GAIN_SHIFT);
859d4fa1a1SMauro Carvalho Chehab 	to->coring_s =
869d4fa1a1SMauro Carvalho Chehab 	    (uDIGIT_FITTING(56U, 16, SH_CSS_BAYER_BITS) *
879d4fa1a1SMauro Carvalho Chehab 	     from->ee.threshold) >> 8;
889d4fa1a1SMauro Carvalho Chehab 	to->coring_g =
899d4fa1a1SMauro Carvalho Chehab 	    (uDIGIT_FITTING(224U, 16, SH_CSS_BAYER_BITS) *
909d4fa1a1SMauro Carvalho Chehab 	     from->ee.threshold) >> 8;
919d4fa1a1SMauro Carvalho Chehab 	/* 8; // *1.125 ->[s4.8] */
929d4fa1a1SMauro Carvalho Chehab 	to->scale_plus_s =
939d4fa1a1SMauro Carvalho Chehab 	    (asiWk1 + asiWk2) >> (11 - SH_CSS_YEE_SCALE_SHIFT);
949d4fa1a1SMauro Carvalho Chehab 	/* 8; // ( * -.25)->[s4.8] */
959d4fa1a1SMauro Carvalho Chehab 	to->scale_plus_g =
969d4fa1a1SMauro Carvalho Chehab 	    (0 - asiWk3) >> (11 - SH_CSS_YEE_SCALE_SHIFT);
979d4fa1a1SMauro Carvalho Chehab 	/* 8; // *0.875 ->[s4.8] */
989d4fa1a1SMauro Carvalho Chehab 	to->scale_minus_s =
999d4fa1a1SMauro Carvalho Chehab 	    (asiWk1 - asiWk2) >> (11 - SH_CSS_YEE_SCALE_SHIFT);
1009d4fa1a1SMauro Carvalho Chehab 	/* 8; // ( *.25 ) ->[s4.8] */
1019d4fa1a1SMauro Carvalho Chehab 	to->scale_minus_g =
1029d4fa1a1SMauro Carvalho Chehab 	    (asiWk3) >> (11 - SH_CSS_YEE_SCALE_SHIFT);
1039d4fa1a1SMauro Carvalho Chehab 	to->clip_plus_s =
1049d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(32760U, 16, SH_CSS_BAYER_BITS);
1059d4fa1a1SMauro Carvalho Chehab 	to->clip_plus_g = 0;
1069d4fa1a1SMauro Carvalho Chehab 	to->clip_minus_s =
1079d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(504U, 16, SH_CSS_BAYER_BITS);
1089d4fa1a1SMauro Carvalho Chehab 	to->clip_minus_g =
1099d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(32256U, 16, SH_CSS_BAYER_BITS);
1109d4fa1a1SMauro Carvalho Chehab 	to->Yclip = SH_CSS_BAYER_MAXVAL;
1119d4fa1a1SMauro Carvalho Chehab }
1129d4fa1a1SMauro Carvalho Chehab 
1139d4fa1a1SMauro Carvalho Chehab void
ia_css_nr_dump(const struct sh_css_isp_ynr_params * ynr,unsigned int level)1149d4fa1a1SMauro Carvalho Chehab ia_css_nr_dump(
1159d4fa1a1SMauro Carvalho Chehab     const struct sh_css_isp_ynr_params *ynr,
1169d4fa1a1SMauro Carvalho Chehab     unsigned int level)
1179d4fa1a1SMauro Carvalho Chehab {
1189d4fa1a1SMauro Carvalho Chehab 	if (!ynr) return;
1199d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level,
1209d4fa1a1SMauro Carvalho Chehab 			    "Y Noise Reduction:\n");
1219d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1229d4fa1a1SMauro Carvalho Chehab 			    "ynr_threshold", ynr->threshold);
1239d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1249d4fa1a1SMauro Carvalho Chehab 			    "ynr_gain_all", ynr->gain_all);
1259d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1269d4fa1a1SMauro Carvalho Chehab 			    "ynr_gain_dir", ynr->gain_dir);
1279d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1289d4fa1a1SMauro Carvalho Chehab 			    "ynr_threshold_cb", ynr->threshold_cb);
1299d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1309d4fa1a1SMauro Carvalho Chehab 			    "ynr_threshold_cr", ynr->threshold_cr);
1319d4fa1a1SMauro Carvalho Chehab }
1329d4fa1a1SMauro Carvalho Chehab 
1339d4fa1a1SMauro Carvalho Chehab void
ia_css_yee_dump(const struct sh_css_isp_yee_params * yee,unsigned int level)1349d4fa1a1SMauro Carvalho Chehab ia_css_yee_dump(
1359d4fa1a1SMauro Carvalho Chehab     const struct sh_css_isp_yee_params *yee,
1369d4fa1a1SMauro Carvalho Chehab     unsigned int level)
1379d4fa1a1SMauro Carvalho Chehab {
1389d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level,
1399d4fa1a1SMauro Carvalho Chehab 			    "Y Edge Enhancement:\n");
1409d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1419d4fa1a1SMauro Carvalho Chehab 			    "ynryee_dirthreshold_s",
1429d4fa1a1SMauro Carvalho Chehab 			    yee->dirthreshold_s);
1439d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1449d4fa1a1SMauro Carvalho Chehab 			    "ynryee_dirthreshold_g",
1459d4fa1a1SMauro Carvalho Chehab 			    yee->dirthreshold_g);
1469d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1479d4fa1a1SMauro Carvalho Chehab 			    "ynryee_dirthreshold_width_log2",
1489d4fa1a1SMauro Carvalho Chehab 			    yee->dirthreshold_width_log2);
1499d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1509d4fa1a1SMauro Carvalho Chehab 			    "ynryee_dirthreshold_width",
1519d4fa1a1SMauro Carvalho Chehab 			    yee->dirthreshold_width);
1529d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1539d4fa1a1SMauro Carvalho Chehab 			    "yee_detailgain",
1549d4fa1a1SMauro Carvalho Chehab 			    yee->detailgain);
1559d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1569d4fa1a1SMauro Carvalho Chehab 			    "yee_coring_s",
1579d4fa1a1SMauro Carvalho Chehab 			    yee->coring_s);
1589d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1599d4fa1a1SMauro Carvalho Chehab 			    "yee_coring_g",
1609d4fa1a1SMauro Carvalho Chehab 			    yee->coring_g);
1619d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1629d4fa1a1SMauro Carvalho Chehab 			    "yee_scale_plus_s",
1639d4fa1a1SMauro Carvalho Chehab 			    yee->scale_plus_s);
1649d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1659d4fa1a1SMauro Carvalho Chehab 			    "yee_scale_plus_g",
1669d4fa1a1SMauro Carvalho Chehab 			    yee->scale_plus_g);
1679d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1689d4fa1a1SMauro Carvalho Chehab 			    "yee_scale_minus_s",
1699d4fa1a1SMauro Carvalho Chehab 			    yee->scale_minus_s);
1709d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1719d4fa1a1SMauro Carvalho Chehab 			    "yee_scale_minus_g",
1729d4fa1a1SMauro Carvalho Chehab 			    yee->scale_minus_g);
1739d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1749d4fa1a1SMauro Carvalho Chehab 			    "yee_clip_plus_s",
1759d4fa1a1SMauro Carvalho Chehab 			    yee->clip_plus_s);
1769d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1779d4fa1a1SMauro Carvalho Chehab 			    "yee_clip_plus_g",
1789d4fa1a1SMauro Carvalho Chehab 			    yee->clip_plus_g);
1799d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1809d4fa1a1SMauro Carvalho Chehab 			    "yee_clip_minus_s",
1819d4fa1a1SMauro Carvalho Chehab 			    yee->clip_minus_s);
1829d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1839d4fa1a1SMauro Carvalho Chehab 			    "yee_clip_minus_g",
1849d4fa1a1SMauro Carvalho Chehab 			    yee->clip_minus_g);
1859d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1869d4fa1a1SMauro Carvalho Chehab 			    "ynryee_Yclip",
1879d4fa1a1SMauro Carvalho Chehab 			    yee->Yclip);
1889d4fa1a1SMauro Carvalho Chehab }
1899d4fa1a1SMauro Carvalho Chehab 
1909d4fa1a1SMauro Carvalho Chehab void
ia_css_nr_debug_dtrace(const struct ia_css_nr_config * config,unsigned int level)1919d4fa1a1SMauro Carvalho Chehab ia_css_nr_debug_dtrace(
1929d4fa1a1SMauro Carvalho Chehab     const struct ia_css_nr_config *config,
1939d4fa1a1SMauro Carvalho Chehab     unsigned int level)
1949d4fa1a1SMauro Carvalho Chehab {
1959d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level,
1969d4fa1a1SMauro Carvalho Chehab 			    "config.direction=%d, config.bnr_gain=%d, config.ynr_gain=%d, config.threshold_cb=%d, config.threshold_cr=%d\n",
1979d4fa1a1SMauro Carvalho Chehab 			    config->direction,
1989d4fa1a1SMauro Carvalho Chehab 			    config->bnr_gain, config->ynr_gain,
1999d4fa1a1SMauro Carvalho Chehab 			    config->threshold_cb, config->threshold_cr);
2009d4fa1a1SMauro Carvalho Chehab }
2019d4fa1a1SMauro Carvalho Chehab 
2029d4fa1a1SMauro Carvalho Chehab void
ia_css_ee_debug_dtrace(const struct ia_css_ee_config * config,unsigned int level)2039d4fa1a1SMauro Carvalho Chehab ia_css_ee_debug_dtrace(
2049d4fa1a1SMauro Carvalho Chehab     const struct ia_css_ee_config *config,
2059d4fa1a1SMauro Carvalho Chehab     unsigned int level)
2069d4fa1a1SMauro Carvalho Chehab {
2079d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level,
2089d4fa1a1SMauro Carvalho Chehab 			    "config.threshold=%d, config.gain=%d, config.detail_gain=%d\n",
2099d4fa1a1SMauro Carvalho Chehab 			    config->threshold, config->gain, config->detail_gain);
2109d4fa1a1SMauro Carvalho Chehab }
2119d4fa1a1SMauro Carvalho Chehab 
2129d4fa1a1SMauro Carvalho Chehab void
ia_css_init_ynr_state(void * state,size_t size)2139d4fa1a1SMauro Carvalho Chehab ia_css_init_ynr_state(
2149d4fa1a1SMauro Carvalho Chehab     void/*struct sh_css_isp_ynr_vmem_state*/ * state,
2159d4fa1a1SMauro Carvalho Chehab     size_t size)
2169d4fa1a1SMauro Carvalho Chehab {
2179d4fa1a1SMauro Carvalho Chehab 	memset(state, 0, size);
2189d4fa1a1SMauro Carvalho Chehab }
219