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 "ia_css_dp.host.h"
229d4fa1a1SMauro Carvalho Chehab 
239d4fa1a1SMauro Carvalho Chehab /* We use a different set of DPC configuration parameters when
249d4fa1a1SMauro Carvalho Chehab  * DPC is used before OBC and NORM. Currently these parameters
259d4fa1a1SMauro Carvalho Chehab  * are used in usecases which selects both BDS and DPC.
269d4fa1a1SMauro Carvalho Chehab  **/
279d4fa1a1SMauro Carvalho Chehab const struct ia_css_dp_config default_dp_10bpp_config = {
289d4fa1a1SMauro Carvalho Chehab 	1024,
299d4fa1a1SMauro Carvalho Chehab 	2048,
309d4fa1a1SMauro Carvalho Chehab 	32768,
319d4fa1a1SMauro Carvalho Chehab 	32768,
329d4fa1a1SMauro Carvalho Chehab 	32768,
339d4fa1a1SMauro Carvalho Chehab 	32768
349d4fa1a1SMauro Carvalho Chehab };
353c0538fbSMauro Carvalho Chehab 
369d4fa1a1SMauro Carvalho Chehab const struct ia_css_dp_config default_dp_config = {
379d4fa1a1SMauro Carvalho Chehab 	8192,
389d4fa1a1SMauro Carvalho Chehab 	2048,
399d4fa1a1SMauro Carvalho Chehab 	32768,
409d4fa1a1SMauro Carvalho Chehab 	32768,
419d4fa1a1SMauro Carvalho Chehab 	32768,
429d4fa1a1SMauro Carvalho Chehab 	32768
439d4fa1a1SMauro Carvalho Chehab };
449d4fa1a1SMauro Carvalho Chehab 
459d4fa1a1SMauro Carvalho Chehab void
ia_css_dp_encode(struct sh_css_isp_dp_params * to,const struct ia_css_dp_config * from,unsigned int size)469d4fa1a1SMauro Carvalho Chehab ia_css_dp_encode(
479d4fa1a1SMauro Carvalho Chehab     struct sh_css_isp_dp_params *to,
489d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dp_config *from,
499d4fa1a1SMauro Carvalho Chehab     unsigned int size)
509d4fa1a1SMauro Carvalho Chehab {
519d4fa1a1SMauro Carvalho Chehab 	int gain = from->gain;
529d4fa1a1SMauro Carvalho Chehab 	int gr   = from->gr;
539d4fa1a1SMauro Carvalho Chehab 	int r    = from->r;
549d4fa1a1SMauro Carvalho Chehab 	int b    = from->b;
559d4fa1a1SMauro Carvalho Chehab 	int gb   = from->gb;
569d4fa1a1SMauro Carvalho Chehab 
579d4fa1a1SMauro Carvalho Chehab 	(void)size;
589d4fa1a1SMauro Carvalho Chehab 	to->threshold_single =
599d4fa1a1SMauro Carvalho Chehab 	    SH_CSS_BAYER_MAXVAL;
609d4fa1a1SMauro Carvalho Chehab 	to->threshold_2adjacent =
619d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(from->threshold, 16, SH_CSS_BAYER_BITS);
629d4fa1a1SMauro Carvalho Chehab 	to->gain =
639d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(from->gain, 8, SH_CSS_DP_GAIN_SHIFT);
649d4fa1a1SMauro Carvalho Chehab 
659d4fa1a1SMauro Carvalho Chehab 	to->coef_rr_gr =
669d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(gain * gr / r, 8, SH_CSS_DP_GAIN_SHIFT);
679d4fa1a1SMauro Carvalho Chehab 	to->coef_rr_gb =
689d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(gain * gb / r, 8, SH_CSS_DP_GAIN_SHIFT);
699d4fa1a1SMauro Carvalho Chehab 	to->coef_bb_gb =
709d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(gain * gb / b, 8, SH_CSS_DP_GAIN_SHIFT);
719d4fa1a1SMauro Carvalho Chehab 	to->coef_bb_gr =
729d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(gain * gr / b, 8, SH_CSS_DP_GAIN_SHIFT);
739d4fa1a1SMauro Carvalho Chehab 	to->coef_gr_rr =
749d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(gain * r / gr, 8, SH_CSS_DP_GAIN_SHIFT);
759d4fa1a1SMauro Carvalho Chehab 	to->coef_gr_bb =
769d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(gain * b / gr, 8, SH_CSS_DP_GAIN_SHIFT);
779d4fa1a1SMauro Carvalho Chehab 	to->coef_gb_bb =
789d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(gain * b / gb, 8, SH_CSS_DP_GAIN_SHIFT);
799d4fa1a1SMauro Carvalho Chehab 	to->coef_gb_rr =
809d4fa1a1SMauro Carvalho Chehab 	    uDIGIT_FITTING(gain * r / gb, 8, SH_CSS_DP_GAIN_SHIFT);
819d4fa1a1SMauro Carvalho Chehab }
829d4fa1a1SMauro Carvalho Chehab 
839d4fa1a1SMauro Carvalho Chehab void
ia_css_dp_dump(const struct sh_css_isp_dp_params * dp,unsigned int level)849d4fa1a1SMauro Carvalho Chehab ia_css_dp_dump(
859d4fa1a1SMauro Carvalho Chehab     const struct sh_css_isp_dp_params *dp,
869d4fa1a1SMauro Carvalho Chehab     unsigned int level)
879d4fa1a1SMauro Carvalho Chehab {
889d4fa1a1SMauro Carvalho Chehab 	if (!dp) return;
899d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "Defect Pixel Correction:\n");
909d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
919d4fa1a1SMauro Carvalho Chehab 			    "dp_threshold_single_w_2adj_on",
929d4fa1a1SMauro Carvalho Chehab 			    dp->threshold_single);
939d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
949d4fa1a1SMauro Carvalho Chehab 			    "dp_threshold_2adj_w_2adj_on",
959d4fa1a1SMauro Carvalho Chehab 			    dp->threshold_2adjacent);
969d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
979d4fa1a1SMauro Carvalho Chehab 			    "dp_gain", dp->gain);
989d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
999d4fa1a1SMauro Carvalho Chehab 			    "dpc_coef_rr_gr", dp->coef_rr_gr);
1009d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1019d4fa1a1SMauro Carvalho Chehab 			    "dpc_coef_rr_gb", dp->coef_rr_gb);
1029d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1039d4fa1a1SMauro Carvalho Chehab 			    "dpc_coef_bb_gb", dp->coef_bb_gb);
1049d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1059d4fa1a1SMauro Carvalho Chehab 			    "dpc_coef_bb_gr", dp->coef_bb_gr);
1069d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1079d4fa1a1SMauro Carvalho Chehab 			    "dpc_coef_gr_rr", dp->coef_gr_rr);
1089d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1099d4fa1a1SMauro Carvalho Chehab 			    "dpc_coef_gr_bb", dp->coef_gr_bb);
1109d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1119d4fa1a1SMauro Carvalho Chehab 			    "dpc_coef_gb_bb", dp->coef_gb_bb);
1129d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
1139d4fa1a1SMauro Carvalho Chehab 			    "dpc_coef_gb_rr", dp->coef_gb_rr);
1149d4fa1a1SMauro Carvalho Chehab }
1159d4fa1a1SMauro Carvalho Chehab 
1169d4fa1a1SMauro Carvalho Chehab void
ia_css_dp_debug_dtrace(const struct ia_css_dp_config * config,unsigned int level)1179d4fa1a1SMauro Carvalho Chehab ia_css_dp_debug_dtrace(
1189d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dp_config *config,
1199d4fa1a1SMauro Carvalho Chehab     unsigned int level)
1209d4fa1a1SMauro Carvalho Chehab {
1219d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(level,
1229d4fa1a1SMauro Carvalho Chehab 			    "config.threshold=%d, config.gain=%d\n",
1239d4fa1a1SMauro Carvalho Chehab 			    config->threshold, config->gain);
1249d4fa1a1SMauro Carvalho Chehab }
1259d4fa1a1SMauro Carvalho Chehab 
1269d4fa1a1SMauro Carvalho Chehab void
ia_css_init_dp_state(void * state,size_t size)1279d4fa1a1SMauro Carvalho Chehab ia_css_init_dp_state(
1289d4fa1a1SMauro Carvalho Chehab     void/*struct sh_css_isp_dp_vmem_state*/ * state,
1299d4fa1a1SMauro Carvalho Chehab     size_t size)
1309d4fa1a1SMauro Carvalho Chehab {
1319d4fa1a1SMauro Carvalho Chehab 	memset(state, 0, size);
1329d4fa1a1SMauro Carvalho Chehab }
133