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 
1608fef4faSMauro Carvalho Chehab #include "hmm.h"
1708fef4faSMauro Carvalho Chehab 
189d4fa1a1SMauro Carvalho Chehab #include "assert_support.h"
199d4fa1a1SMauro Carvalho Chehab #include "ia_css_debug.h"
209d4fa1a1SMauro Carvalho Chehab #include "ia_css_sdis_types.h"
219d4fa1a1SMauro Carvalho Chehab #include "sdis/common/ia_css_sdis_common.host.h"
229d4fa1a1SMauro Carvalho Chehab #include "ia_css_sdis.host.h"
239d4fa1a1SMauro Carvalho Chehab 
249d4fa1a1SMauro Carvalho Chehab const struct ia_css_dvs_coefficients default_sdis_config = {
259d4fa1a1SMauro Carvalho Chehab 	.grid = { 0, 0, 0, 0, 0, 0, 0, 0 },
269d4fa1a1SMauro Carvalho Chehab 	.hor_coefs = NULL,
279d4fa1a1SMauro Carvalho Chehab 	.ver_coefs = NULL
289d4fa1a1SMauro Carvalho Chehab };
299d4fa1a1SMauro Carvalho Chehab 
309d4fa1a1SMauro Carvalho Chehab static void
fill_row(short * private,const short * public,unsigned int width,unsigned int padding)319d4fa1a1SMauro Carvalho Chehab fill_row(short *private, const short *public, unsigned int width,
329d4fa1a1SMauro Carvalho Chehab 	 unsigned int padding)
339d4fa1a1SMauro Carvalho Chehab {
349d4fa1a1SMauro Carvalho Chehab 	assert((int)width >= 0);
359d4fa1a1SMauro Carvalho Chehab 	assert((int)padding >= 0);
369d4fa1a1SMauro Carvalho Chehab 	memcpy(private, public, width * sizeof(short));
379d4fa1a1SMauro Carvalho Chehab 	memset(&private[width], 0, padding * sizeof(short));
389d4fa1a1SMauro Carvalho Chehab }
399d4fa1a1SMauro Carvalho Chehab 
ia_css_sdis_horicoef_vmem_encode(struct sh_css_isp_sdis_hori_coef_tbl * to,const struct ia_css_dvs_coefficients * from,unsigned int size)409d4fa1a1SMauro Carvalho Chehab void ia_css_sdis_horicoef_vmem_encode(
419d4fa1a1SMauro Carvalho Chehab     struct sh_css_isp_sdis_hori_coef_tbl *to,
429d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs_coefficients *from,
439d4fa1a1SMauro Carvalho Chehab     unsigned int size)
449d4fa1a1SMauro Carvalho Chehab {
459d4fa1a1SMauro Carvalho Chehab 	unsigned int aligned_width = from->grid.aligned_width *
469d4fa1a1SMauro Carvalho Chehab 				     from->grid.bqs_per_grid_cell;
479d4fa1a1SMauro Carvalho Chehab 	unsigned int width         = from->grid.num_hor_coefs;
489d4fa1a1SMauro Carvalho Chehab 	int      padding       = aligned_width - width;
499d4fa1a1SMauro Carvalho Chehab 	unsigned int stride        = size / IA_CSS_DVS_NUM_COEF_TYPES / sizeof(short);
509d4fa1a1SMauro Carvalho Chehab 	unsigned int total_bytes   = aligned_width * IA_CSS_DVS_NUM_COEF_TYPES * sizeof(
519d4fa1a1SMauro Carvalho Chehab 					 short);
529d4fa1a1SMauro Carvalho Chehab 	short   *public        = from->hor_coefs;
539d4fa1a1SMauro Carvalho Chehab 	short   *private       = (short *)to;
549d4fa1a1SMauro Carvalho Chehab 	unsigned int type;
559d4fa1a1SMauro Carvalho Chehab 
569d4fa1a1SMauro Carvalho Chehab 	/* Copy the table, add padding */
579d4fa1a1SMauro Carvalho Chehab 	assert(padding >= 0);
589d4fa1a1SMauro Carvalho Chehab 	assert(total_bytes <= size);
599d4fa1a1SMauro Carvalho Chehab 	assert(size % (IA_CSS_DVS_NUM_COEF_TYPES * ISP_VEC_NELEMS * sizeof(
609d4fa1a1SMauro Carvalho Chehab 			   short)) == 0);
619d4fa1a1SMauro Carvalho Chehab 
629d4fa1a1SMauro Carvalho Chehab 	for (type = 0; type < IA_CSS_DVS_NUM_COEF_TYPES; type++) {
639d4fa1a1SMauro Carvalho Chehab 		fill_row(&private[type * stride], &public[type * width], width, padding);
649d4fa1a1SMauro Carvalho Chehab 	}
659d4fa1a1SMauro Carvalho Chehab }
669d4fa1a1SMauro Carvalho Chehab 
ia_css_sdis_vertcoef_vmem_encode(struct sh_css_isp_sdis_vert_coef_tbl * to,const struct ia_css_dvs_coefficients * from,unsigned int size)679d4fa1a1SMauro Carvalho Chehab void ia_css_sdis_vertcoef_vmem_encode(
689d4fa1a1SMauro Carvalho Chehab     struct sh_css_isp_sdis_vert_coef_tbl *to,
699d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs_coefficients *from,
709d4fa1a1SMauro Carvalho Chehab     unsigned int size)
719d4fa1a1SMauro Carvalho Chehab {
729d4fa1a1SMauro Carvalho Chehab 	unsigned int aligned_height = from->grid.aligned_height *
739d4fa1a1SMauro Carvalho Chehab 				      from->grid.bqs_per_grid_cell;
749d4fa1a1SMauro Carvalho Chehab 	unsigned int height         = from->grid.num_ver_coefs;
759d4fa1a1SMauro Carvalho Chehab 	int      padding        = aligned_height - height;
769d4fa1a1SMauro Carvalho Chehab 	unsigned int stride         = size / IA_CSS_DVS_NUM_COEF_TYPES / sizeof(short);
779d4fa1a1SMauro Carvalho Chehab 	unsigned int total_bytes    = aligned_height * IA_CSS_DVS_NUM_COEF_TYPES *
789d4fa1a1SMauro Carvalho Chehab 				      sizeof(short);
799d4fa1a1SMauro Carvalho Chehab 	short   *public         = from->ver_coefs;
809d4fa1a1SMauro Carvalho Chehab 	short   *private        = (short *)to;
819d4fa1a1SMauro Carvalho Chehab 	unsigned int type;
829d4fa1a1SMauro Carvalho Chehab 
839d4fa1a1SMauro Carvalho Chehab 	/* Copy the table, add padding */
849d4fa1a1SMauro Carvalho Chehab 	assert(padding >= 0);
859d4fa1a1SMauro Carvalho Chehab 	assert(total_bytes <= size);
869d4fa1a1SMauro Carvalho Chehab 	assert(size % (IA_CSS_DVS_NUM_COEF_TYPES * ISP_VEC_NELEMS * sizeof(
879d4fa1a1SMauro Carvalho Chehab 			   short)) == 0);
889d4fa1a1SMauro Carvalho Chehab 
899d4fa1a1SMauro Carvalho Chehab 	for (type = 0; type < IA_CSS_DVS_NUM_COEF_TYPES; type++) {
909d4fa1a1SMauro Carvalho Chehab 		fill_row(&private[type * stride], &public[type * height], height, padding);
919d4fa1a1SMauro Carvalho Chehab 	}
929d4fa1a1SMauro Carvalho Chehab }
939d4fa1a1SMauro Carvalho Chehab 
ia_css_sdis_horiproj_encode(struct sh_css_isp_sdis_hori_proj_tbl * to,const struct ia_css_dvs_coefficients * from,unsigned int size)949d4fa1a1SMauro Carvalho Chehab void ia_css_sdis_horiproj_encode(
959d4fa1a1SMauro Carvalho Chehab     struct sh_css_isp_sdis_hori_proj_tbl *to,
969d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs_coefficients *from,
979d4fa1a1SMauro Carvalho Chehab     unsigned int size)
989d4fa1a1SMauro Carvalho Chehab {
999d4fa1a1SMauro Carvalho Chehab 	(void)to;
1009d4fa1a1SMauro Carvalho Chehab 	(void)from;
1019d4fa1a1SMauro Carvalho Chehab 	(void)size;
1029d4fa1a1SMauro Carvalho Chehab }
1039d4fa1a1SMauro Carvalho Chehab 
ia_css_sdis_vertproj_encode(struct sh_css_isp_sdis_vert_proj_tbl * to,const struct ia_css_dvs_coefficients * from,unsigned int size)1049d4fa1a1SMauro Carvalho Chehab void ia_css_sdis_vertproj_encode(
1059d4fa1a1SMauro Carvalho Chehab     struct sh_css_isp_sdis_vert_proj_tbl *to,
1069d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs_coefficients *from,
1079d4fa1a1SMauro Carvalho Chehab     unsigned int size)
1089d4fa1a1SMauro Carvalho Chehab {
1099d4fa1a1SMauro Carvalho Chehab 	(void)to;
1109d4fa1a1SMauro Carvalho Chehab 	(void)from;
1119d4fa1a1SMauro Carvalho Chehab 	(void)size;
1129d4fa1a1SMauro Carvalho Chehab }
1139d4fa1a1SMauro Carvalho Chehab 
ia_css_get_isp_dis_coefficients(struct ia_css_stream * stream,short * horizontal_coefficients,short * vertical_coefficients)1149d4fa1a1SMauro Carvalho Chehab void ia_css_get_isp_dis_coefficients(
1159d4fa1a1SMauro Carvalho Chehab     struct ia_css_stream *stream,
1169d4fa1a1SMauro Carvalho Chehab     short *horizontal_coefficients,
1179d4fa1a1SMauro Carvalho Chehab     short *vertical_coefficients)
1189d4fa1a1SMauro Carvalho Chehab {
1199d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_parameters *params;
1209d4fa1a1SMauro Carvalho Chehab 	unsigned int hor_num_isp, ver_num_isp;
1219d4fa1a1SMauro Carvalho Chehab 	unsigned int hor_num_3a,  ver_num_3a;
1229d4fa1a1SMauro Carvalho Chehab 	int i;
1239d4fa1a1SMauro Carvalho Chehab 	struct ia_css_binary *dvs_binary;
1249d4fa1a1SMauro Carvalho Chehab 
1259d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("void");
1269d4fa1a1SMauro Carvalho Chehab 
1279d4fa1a1SMauro Carvalho Chehab 	assert(horizontal_coefficients);
1289d4fa1a1SMauro Carvalho Chehab 	assert(vertical_coefficients);
1299d4fa1a1SMauro Carvalho Chehab 
1309d4fa1a1SMauro Carvalho Chehab 	params = stream->isp_params_configs;
1319d4fa1a1SMauro Carvalho Chehab 
1329d4fa1a1SMauro Carvalho Chehab 	/* Only video pipe supports DVS */
1339d4fa1a1SMauro Carvalho Chehab 	dvs_binary = ia_css_stream_get_dvs_binary(stream);
1349d4fa1a1SMauro Carvalho Chehab 	if (!dvs_binary)
1359d4fa1a1SMauro Carvalho Chehab 		return;
1369d4fa1a1SMauro Carvalho Chehab 
1379d4fa1a1SMauro Carvalho Chehab 	hor_num_isp = dvs_binary->dis.coef.pad.width;
1389d4fa1a1SMauro Carvalho Chehab 	ver_num_isp = dvs_binary->dis.coef.pad.height;
1399d4fa1a1SMauro Carvalho Chehab 	hor_num_3a  = dvs_binary->dis.coef.dim.width;
1409d4fa1a1SMauro Carvalho Chehab 	ver_num_3a  = dvs_binary->dis.coef.dim.height;
1419d4fa1a1SMauro Carvalho Chehab 
1429d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < IA_CSS_DVS_NUM_COEF_TYPES; i++) {
1439d4fa1a1SMauro Carvalho Chehab 		fill_row(&horizontal_coefficients[i * hor_num_isp],
1449d4fa1a1SMauro Carvalho Chehab 			 &params->dvs_coefs.hor_coefs[i * hor_num_3a], hor_num_3a,
1459d4fa1a1SMauro Carvalho Chehab 			 hor_num_isp - hor_num_3a);
1469d4fa1a1SMauro Carvalho Chehab 	}
1479d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < SH_CSS_DIS_VER_NUM_COEF_TYPES(dvs_binary); i++) {
1489d4fa1a1SMauro Carvalho Chehab 		fill_row(&vertical_coefficients[i * ver_num_isp],
1499d4fa1a1SMauro Carvalho Chehab 			 &params->dvs_coefs.ver_coefs[i * ver_num_3a], ver_num_3a,
1509d4fa1a1SMauro Carvalho Chehab 			 ver_num_isp - ver_num_3a);
1519d4fa1a1SMauro Carvalho Chehab 	}
1529d4fa1a1SMauro Carvalho Chehab 
1539d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("void");
1549d4fa1a1SMauro Carvalho Chehab }
1559d4fa1a1SMauro Carvalho Chehab 
1569d4fa1a1SMauro Carvalho Chehab size_t
ia_css_sdis_hor_coef_tbl_bytes(const struct ia_css_binary * binary)1579d4fa1a1SMauro Carvalho Chehab ia_css_sdis_hor_coef_tbl_bytes(
1589d4fa1a1SMauro Carvalho Chehab     const struct ia_css_binary *binary)
1599d4fa1a1SMauro Carvalho Chehab {
1609d4fa1a1SMauro Carvalho Chehab 	if (binary->info->sp.pipeline.isp_pipe_version == 1)
1619d4fa1a1SMauro Carvalho Chehab 		return sizeof(short) * IA_CSS_DVS_NUM_COEF_TYPES  * binary->dis.coef.pad.width;
1629d4fa1a1SMauro Carvalho Chehab 	else
1639d4fa1a1SMauro Carvalho Chehab 		return sizeof(short) * IA_CSS_DVS2_NUM_COEF_TYPES * binary->dis.coef.pad.width;
1649d4fa1a1SMauro Carvalho Chehab }
1659d4fa1a1SMauro Carvalho Chehab 
1669d4fa1a1SMauro Carvalho Chehab size_t
ia_css_sdis_ver_coef_tbl_bytes(const struct ia_css_binary * binary)1679d4fa1a1SMauro Carvalho Chehab ia_css_sdis_ver_coef_tbl_bytes(
1689d4fa1a1SMauro Carvalho Chehab     const struct ia_css_binary *binary)
1699d4fa1a1SMauro Carvalho Chehab {
1709d4fa1a1SMauro Carvalho Chehab 	return sizeof(short) * SH_CSS_DIS_VER_NUM_COEF_TYPES(binary) *
1719d4fa1a1SMauro Carvalho Chehab 	       binary->dis.coef.pad.height;
1729d4fa1a1SMauro Carvalho Chehab }
1739d4fa1a1SMauro Carvalho Chehab 
1749d4fa1a1SMauro Carvalho Chehab void
ia_css_sdis_init_info(struct ia_css_sdis_info * dis,unsigned int sc_3a_dis_width,unsigned int sc_3a_dis_padded_width,unsigned int sc_3a_dis_height,unsigned int isp_pipe_version,unsigned int enabled)1759d4fa1a1SMauro Carvalho Chehab ia_css_sdis_init_info(
1769d4fa1a1SMauro Carvalho Chehab     struct ia_css_sdis_info *dis,
1779d4fa1a1SMauro Carvalho Chehab     unsigned int sc_3a_dis_width,
1789d4fa1a1SMauro Carvalho Chehab     unsigned int sc_3a_dis_padded_width,
1799d4fa1a1SMauro Carvalho Chehab     unsigned int sc_3a_dis_height,
1809d4fa1a1SMauro Carvalho Chehab     unsigned int isp_pipe_version,
1819d4fa1a1SMauro Carvalho Chehab     unsigned int enabled)
1829d4fa1a1SMauro Carvalho Chehab {
1839d4fa1a1SMauro Carvalho Chehab 	if (!enabled) {
1849d4fa1a1SMauro Carvalho Chehab 		*dis = (struct ia_css_sdis_info) { };
1859d4fa1a1SMauro Carvalho Chehab 		return;
1869d4fa1a1SMauro Carvalho Chehab 	}
1879d4fa1a1SMauro Carvalho Chehab 
1889d4fa1a1SMauro Carvalho Chehab 	dis->deci_factor_log2 = SH_CSS_DIS_DECI_FACTOR_LOG2;
1899d4fa1a1SMauro Carvalho Chehab 
1909d4fa1a1SMauro Carvalho Chehab 	dis->grid.dim.width  =
1919d4fa1a1SMauro Carvalho Chehab 	    _ISP_BQS(sc_3a_dis_width) >> SH_CSS_DIS_DECI_FACTOR_LOG2;
1929d4fa1a1SMauro Carvalho Chehab 	dis->grid.dim.height =
1939d4fa1a1SMauro Carvalho Chehab 	    _ISP_BQS(sc_3a_dis_height) >> SH_CSS_DIS_DECI_FACTOR_LOG2;
1949d4fa1a1SMauro Carvalho Chehab 	dis->grid.pad.width  =
1959d4fa1a1SMauro Carvalho Chehab 	    CEIL_SHIFT(_ISP_BQS(sc_3a_dis_padded_width), SH_CSS_DIS_DECI_FACTOR_LOG2);
1969d4fa1a1SMauro Carvalho Chehab 	dis->grid.pad.height =
1979d4fa1a1SMauro Carvalho Chehab 	    CEIL_SHIFT(_ISP_BQS(sc_3a_dis_height), SH_CSS_DIS_DECI_FACTOR_LOG2);
1989d4fa1a1SMauro Carvalho Chehab 
1999d4fa1a1SMauro Carvalho Chehab 	dis->coef.dim.width  =
2009d4fa1a1SMauro Carvalho Chehab 	    (_ISP_BQS(sc_3a_dis_width)  >> SH_CSS_DIS_DECI_FACTOR_LOG2) <<
2019d4fa1a1SMauro Carvalho Chehab 	    SH_CSS_DIS_DECI_FACTOR_LOG2;
2029d4fa1a1SMauro Carvalho Chehab 	dis->coef.dim.height =
2039d4fa1a1SMauro Carvalho Chehab 	    (_ISP_BQS(sc_3a_dis_height) >> SH_CSS_DIS_DECI_FACTOR_LOG2) <<
2049d4fa1a1SMauro Carvalho Chehab 	    SH_CSS_DIS_DECI_FACTOR_LOG2;
2059d4fa1a1SMauro Carvalho Chehab 	dis->coef.pad.width  =
2069d4fa1a1SMauro Carvalho Chehab 	    __ISP_SDIS_HOR_COEF_NUM_VECS(sc_3a_dis_padded_width) * ISP_VEC_NELEMS;
2079d4fa1a1SMauro Carvalho Chehab 	dis->coef.pad.height =
2089d4fa1a1SMauro Carvalho Chehab 	    __ISP_SDIS_VER_COEF_NUM_VECS(sc_3a_dis_height) * ISP_VEC_NELEMS;
2099d4fa1a1SMauro Carvalho Chehab 	if (isp_pipe_version == 1) {
2109d4fa1a1SMauro Carvalho Chehab 		dis->proj.dim.width  =
2119d4fa1a1SMauro Carvalho Chehab 		    _ISP_BQS(sc_3a_dis_height) >> SH_CSS_DIS_DECI_FACTOR_LOG2;
2129d4fa1a1SMauro Carvalho Chehab 		dis->proj.dim.height =
2139d4fa1a1SMauro Carvalho Chehab 		    _ISP_BQS(sc_3a_dis_width)  >> SH_CSS_DIS_DECI_FACTOR_LOG2;
2149d4fa1a1SMauro Carvalho Chehab 	} else {
2159d4fa1a1SMauro Carvalho Chehab 		dis->proj.dim.width  =
2169d4fa1a1SMauro Carvalho Chehab 		    (_ISP_BQS(sc_3a_dis_width)  >> SH_CSS_DIS_DECI_FACTOR_LOG2) *
2179d4fa1a1SMauro Carvalho Chehab 		    (_ISP_BQS(sc_3a_dis_height) >> SH_CSS_DIS_DECI_FACTOR_LOG2);
2189d4fa1a1SMauro Carvalho Chehab 		dis->proj.dim.height =
2199d4fa1a1SMauro Carvalho Chehab 		    (_ISP_BQS(sc_3a_dis_width)  >> SH_CSS_DIS_DECI_FACTOR_LOG2) *
2209d4fa1a1SMauro Carvalho Chehab 		    (_ISP_BQS(sc_3a_dis_height) >> SH_CSS_DIS_DECI_FACTOR_LOG2);
2219d4fa1a1SMauro Carvalho Chehab 	}
2229d4fa1a1SMauro Carvalho Chehab 	dis->proj.pad.width  =
2239d4fa1a1SMauro Carvalho Chehab 	    __ISP_SDIS_HOR_PROJ_NUM_ISP(sc_3a_dis_padded_width,
2249d4fa1a1SMauro Carvalho Chehab 					sc_3a_dis_height,
2259d4fa1a1SMauro Carvalho Chehab 					SH_CSS_DIS_DECI_FACTOR_LOG2,
2269d4fa1a1SMauro Carvalho Chehab 					isp_pipe_version);
2279d4fa1a1SMauro Carvalho Chehab 	dis->proj.pad.height =
2289d4fa1a1SMauro Carvalho Chehab 	    __ISP_SDIS_VER_PROJ_NUM_ISP(sc_3a_dis_padded_width,
2299d4fa1a1SMauro Carvalho Chehab 					SH_CSS_DIS_DECI_FACTOR_LOG2);
2309d4fa1a1SMauro Carvalho Chehab }
2319d4fa1a1SMauro Carvalho Chehab 
ia_css_sdis_clear_coefficients(struct ia_css_dvs_coefficients * dvs_coefs)2329d4fa1a1SMauro Carvalho Chehab void ia_css_sdis_clear_coefficients(
2339d4fa1a1SMauro Carvalho Chehab     struct ia_css_dvs_coefficients *dvs_coefs)
2349d4fa1a1SMauro Carvalho Chehab {
2359d4fa1a1SMauro Carvalho Chehab 	dvs_coefs->hor_coefs = NULL;
2369d4fa1a1SMauro Carvalho Chehab 	dvs_coefs->ver_coefs = NULL;
2379d4fa1a1SMauro Carvalho Chehab }
2389d4fa1a1SMauro Carvalho Chehab 
23941022d35SMauro Carvalho Chehab int
ia_css_get_dvs_statistics(struct ia_css_dvs_statistics * host_stats,const struct ia_css_isp_dvs_statistics * isp_stats)2409d4fa1a1SMauro Carvalho Chehab ia_css_get_dvs_statistics(
2419d4fa1a1SMauro Carvalho Chehab     struct ia_css_dvs_statistics	       *host_stats,
2429d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_dvs_statistics *isp_stats) {
2439d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_dvs_statistics_map *map;
24441022d35SMauro Carvalho Chehab 	int ret = 0;
2459d4fa1a1SMauro Carvalho Chehab 
2469d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("host_stats=%p, isp_stats=%p", host_stats, isp_stats);
2479d4fa1a1SMauro Carvalho Chehab 
2489d4fa1a1SMauro Carvalho Chehab 	assert(host_stats);
2499d4fa1a1SMauro Carvalho Chehab 	assert(isp_stats);
2509d4fa1a1SMauro Carvalho Chehab 
2519d4fa1a1SMauro Carvalho Chehab 	map = ia_css_isp_dvs_statistics_map_allocate(isp_stats, NULL);
2529d4fa1a1SMauro Carvalho Chehab 	if (map)
2539d4fa1a1SMauro Carvalho Chehab 	{
2545472b4dbSMauro Carvalho Chehab 		hmm_load(isp_stats->data_ptr, map->data_ptr, isp_stats->size);
2559d4fa1a1SMauro Carvalho Chehab 		ia_css_translate_dvs_statistics(host_stats, map);
2569d4fa1a1SMauro Carvalho Chehab 		ia_css_isp_dvs_statistics_map_free(map);
2579d4fa1a1SMauro Carvalho Chehab 	} else
2589d4fa1a1SMauro Carvalho Chehab 	{
2599d4fa1a1SMauro Carvalho Chehab 		IA_CSS_ERROR("out of memory");
26041022d35SMauro Carvalho Chehab 		ret = -ENOMEM;
2619d4fa1a1SMauro Carvalho Chehab 	}
2629d4fa1a1SMauro Carvalho Chehab 
2639d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE_ERR(ret);
2649d4fa1a1SMauro Carvalho Chehab 	return ret;
2659d4fa1a1SMauro Carvalho Chehab }
2669d4fa1a1SMauro Carvalho Chehab 
2679d4fa1a1SMauro Carvalho Chehab void
ia_css_translate_dvs_statistics(struct ia_css_dvs_statistics * host_stats,const struct ia_css_isp_dvs_statistics_map * isp_stats)2689d4fa1a1SMauro Carvalho Chehab ia_css_translate_dvs_statistics(
2699d4fa1a1SMauro Carvalho Chehab     struct ia_css_dvs_statistics               *host_stats,
2709d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_dvs_statistics_map *isp_stats)
2719d4fa1a1SMauro Carvalho Chehab {
2729d4fa1a1SMauro Carvalho Chehab 	unsigned int hor_num_isp, ver_num_isp, hor_num_dvs, ver_num_dvs, i;
2739d4fa1a1SMauro Carvalho Chehab 	s32 *hor_ptr_dvs, *ver_ptr_dvs, *hor_ptr_isp, *ver_ptr_isp;
2749d4fa1a1SMauro Carvalho Chehab 
2759d4fa1a1SMauro Carvalho Chehab 	assert(host_stats);
2769d4fa1a1SMauro Carvalho Chehab 	assert(host_stats->hor_proj);
2779d4fa1a1SMauro Carvalho Chehab 	assert(host_stats->ver_proj);
2789d4fa1a1SMauro Carvalho Chehab 	assert(isp_stats);
2799d4fa1a1SMauro Carvalho Chehab 	assert(isp_stats->hor_proj);
2809d4fa1a1SMauro Carvalho Chehab 	assert(isp_stats->ver_proj);
2819d4fa1a1SMauro Carvalho Chehab 
2829d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("hproj=%p, vproj=%p, haddr=%p, vaddr=%p",
2839d4fa1a1SMauro Carvalho Chehab 		     host_stats->hor_proj, host_stats->ver_proj,
2849d4fa1a1SMauro Carvalho Chehab 		     isp_stats->hor_proj, isp_stats->ver_proj);
2859d4fa1a1SMauro Carvalho Chehab 
2869d4fa1a1SMauro Carvalho Chehab 	hor_num_isp = host_stats->grid.aligned_height;
2879d4fa1a1SMauro Carvalho Chehab 	ver_num_isp = host_stats->grid.aligned_width;
2889d4fa1a1SMauro Carvalho Chehab 	hor_ptr_isp = isp_stats->hor_proj;
2899d4fa1a1SMauro Carvalho Chehab 	ver_ptr_isp = isp_stats->ver_proj;
2909d4fa1a1SMauro Carvalho Chehab 	hor_num_dvs = host_stats->grid.height;
2919d4fa1a1SMauro Carvalho Chehab 	ver_num_dvs = host_stats->grid.width;
2929d4fa1a1SMauro Carvalho Chehab 	hor_ptr_dvs = host_stats->hor_proj;
2939d4fa1a1SMauro Carvalho Chehab 	ver_ptr_dvs = host_stats->ver_proj;
2949d4fa1a1SMauro Carvalho Chehab 
2959d4fa1a1SMauro Carvalho Chehab 	for (i = 0; i < IA_CSS_DVS_NUM_COEF_TYPES; i++) {
2969d4fa1a1SMauro Carvalho Chehab 		memcpy(hor_ptr_dvs, hor_ptr_isp, hor_num_dvs * sizeof(int32_t));
2979d4fa1a1SMauro Carvalho Chehab 		hor_ptr_isp += hor_num_isp;
2989d4fa1a1SMauro Carvalho Chehab 		hor_ptr_dvs += hor_num_dvs;
2999d4fa1a1SMauro Carvalho Chehab 
3009d4fa1a1SMauro Carvalho Chehab 		memcpy(ver_ptr_dvs, ver_ptr_isp, ver_num_dvs * sizeof(int32_t));
3019d4fa1a1SMauro Carvalho Chehab 		ver_ptr_isp += ver_num_isp;
3029d4fa1a1SMauro Carvalho Chehab 		ver_ptr_dvs += ver_num_dvs;
3039d4fa1a1SMauro Carvalho Chehab 	}
3049d4fa1a1SMauro Carvalho Chehab 
3059d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("void");
3069d4fa1a1SMauro Carvalho Chehab }
3079d4fa1a1SMauro Carvalho Chehab 
3089d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_dvs_statistics *
ia_css_isp_dvs_statistics_allocate(const struct ia_css_dvs_grid_info * grid)3099d4fa1a1SMauro Carvalho Chehab ia_css_isp_dvs_statistics_allocate(
3109d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs_grid_info *grid)
3119d4fa1a1SMauro Carvalho Chehab {
3129d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_dvs_statistics *me;
3139d4fa1a1SMauro Carvalho Chehab 	int hor_size, ver_size;
3149d4fa1a1SMauro Carvalho Chehab 
3159d4fa1a1SMauro Carvalho Chehab 	assert(grid);
3169d4fa1a1SMauro Carvalho Chehab 
3179d4fa1a1SMauro Carvalho Chehab 	IA_CSS_ENTER("grid=%p", grid);
3189d4fa1a1SMauro Carvalho Chehab 
3199d4fa1a1SMauro Carvalho Chehab 	if (!grid->enable)
3209d4fa1a1SMauro Carvalho Chehab 		return NULL;
3219d4fa1a1SMauro Carvalho Chehab 
3229955d906SMauro Carvalho Chehab 	me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
3239d4fa1a1SMauro Carvalho Chehab 	if (!me)
3249d4fa1a1SMauro Carvalho Chehab 		goto err;
3259d4fa1a1SMauro Carvalho Chehab 
3269d4fa1a1SMauro Carvalho Chehab 	hor_size = CEIL_MUL(sizeof(int) * IA_CSS_DVS_NUM_COEF_TYPES *
3279d4fa1a1SMauro Carvalho Chehab 			    grid->aligned_height,
3289d4fa1a1SMauro Carvalho Chehab 			    HIVE_ISP_DDR_WORD_BYTES);
3299d4fa1a1SMauro Carvalho Chehab 	ver_size = CEIL_MUL(sizeof(int) * IA_CSS_DVS_NUM_COEF_TYPES *
3309d4fa1a1SMauro Carvalho Chehab 			    grid->aligned_width,
3319d4fa1a1SMauro Carvalho Chehab 			    HIVE_ISP_DDR_WORD_BYTES);
3329d4fa1a1SMauro Carvalho Chehab 
3339d4fa1a1SMauro Carvalho Chehab 	me->size = hor_size + ver_size;
334*4cc20c9cSHans de Goede 	me->data_ptr = hmm_alloc(me->size);
3359d4fa1a1SMauro Carvalho Chehab 	if (me->data_ptr == mmgr_NULL)
3369d4fa1a1SMauro Carvalho Chehab 		goto err;
3379d4fa1a1SMauro Carvalho Chehab 	me->hor_size = hor_size;
3389d4fa1a1SMauro Carvalho Chehab 	me->hor_proj = me->data_ptr;
3399d4fa1a1SMauro Carvalho Chehab 	me->ver_size = ver_size;
3409d4fa1a1SMauro Carvalho Chehab 	me->ver_proj = me->data_ptr + hor_size;
3419d4fa1a1SMauro Carvalho Chehab 
3429d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("return=%p", me);
3439d4fa1a1SMauro Carvalho Chehab 
3449d4fa1a1SMauro Carvalho Chehab 	return me;
3459d4fa1a1SMauro Carvalho Chehab err:
3469d4fa1a1SMauro Carvalho Chehab 	ia_css_isp_dvs_statistics_free(me);
3479d4fa1a1SMauro Carvalho Chehab 
3489d4fa1a1SMauro Carvalho Chehab 	IA_CSS_LEAVE("return=%p", NULL);
3499d4fa1a1SMauro Carvalho Chehab 
3509d4fa1a1SMauro Carvalho Chehab 	return NULL;
3519d4fa1a1SMauro Carvalho Chehab }
3529d4fa1a1SMauro Carvalho Chehab 
3539d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_dvs_statistics_map *
ia_css_isp_dvs_statistics_map_allocate(const struct ia_css_isp_dvs_statistics * isp_stats,void * data_ptr)3549d4fa1a1SMauro Carvalho Chehab ia_css_isp_dvs_statistics_map_allocate(
3559d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_dvs_statistics *isp_stats,
3569d4fa1a1SMauro Carvalho Chehab     void *data_ptr)
3579d4fa1a1SMauro Carvalho Chehab {
3589d4fa1a1SMauro Carvalho Chehab 	struct ia_css_isp_dvs_statistics_map *me;
3599d4fa1a1SMauro Carvalho Chehab 	/* Windows compiler does not like adding sizes to a void *
3609d4fa1a1SMauro Carvalho Chehab 	 * so we use a local char * instead. */
3619d4fa1a1SMauro Carvalho Chehab 	char *base_ptr;
3629d4fa1a1SMauro Carvalho Chehab 
3639955d906SMauro Carvalho Chehab 	me = kvmalloc(sizeof(*me), GFP_KERNEL);
3649d4fa1a1SMauro Carvalho Chehab 	if (!me) {
3659d4fa1a1SMauro Carvalho Chehab 		IA_CSS_LOG("cannot allocate memory");
3669d4fa1a1SMauro Carvalho Chehab 		goto err;
3679d4fa1a1SMauro Carvalho Chehab 	}
3689d4fa1a1SMauro Carvalho Chehab 
3699d4fa1a1SMauro Carvalho Chehab 	me->data_ptr = data_ptr;
3709d4fa1a1SMauro Carvalho Chehab 	me->data_allocated = !data_ptr;
3719d4fa1a1SMauro Carvalho Chehab 
3729d4fa1a1SMauro Carvalho Chehab 	if (!me->data_ptr) {
3739955d906SMauro Carvalho Chehab 		me->data_ptr = kvmalloc(isp_stats->size, GFP_KERNEL);
3749d4fa1a1SMauro Carvalho Chehab 		if (!me->data_ptr) {
3759d4fa1a1SMauro Carvalho Chehab 			IA_CSS_LOG("cannot allocate memory");
3769d4fa1a1SMauro Carvalho Chehab 			goto err;
3779d4fa1a1SMauro Carvalho Chehab 		}
3789d4fa1a1SMauro Carvalho Chehab 	}
3799d4fa1a1SMauro Carvalho Chehab 	base_ptr = me->data_ptr;
3809d4fa1a1SMauro Carvalho Chehab 
3819d4fa1a1SMauro Carvalho Chehab 	me->size = isp_stats->size;
3829d4fa1a1SMauro Carvalho Chehab 	/* GCC complains when we assign a char * to a void *, so these
3839d4fa1a1SMauro Carvalho Chehab 	 * casts are necessary unfortunately. */
3849d4fa1a1SMauro Carvalho Chehab 	me->hor_proj = (void *)base_ptr;
3859d4fa1a1SMauro Carvalho Chehab 	me->ver_proj = (void *)(base_ptr + isp_stats->hor_size);
3869d4fa1a1SMauro Carvalho Chehab 
3879d4fa1a1SMauro Carvalho Chehab 	return me;
3889d4fa1a1SMauro Carvalho Chehab err:
3899955d906SMauro Carvalho Chehab 	kvfree(me);
3909d4fa1a1SMauro Carvalho Chehab 	return NULL;
3919d4fa1a1SMauro Carvalho Chehab }
3929d4fa1a1SMauro Carvalho Chehab 
3939d4fa1a1SMauro Carvalho Chehab void
ia_css_isp_dvs_statistics_map_free(struct ia_css_isp_dvs_statistics_map * me)3949d4fa1a1SMauro Carvalho Chehab ia_css_isp_dvs_statistics_map_free(struct ia_css_isp_dvs_statistics_map *me)
3959d4fa1a1SMauro Carvalho Chehab {
3969d4fa1a1SMauro Carvalho Chehab 	if (me) {
3979d4fa1a1SMauro Carvalho Chehab 		if (me->data_allocated)
3989955d906SMauro Carvalho Chehab 			kvfree(me->data_ptr);
3999955d906SMauro Carvalho Chehab 		kvfree(me);
4009d4fa1a1SMauro Carvalho Chehab 	}
4019d4fa1a1SMauro Carvalho Chehab }
4029d4fa1a1SMauro Carvalho Chehab 
4039d4fa1a1SMauro Carvalho Chehab void
ia_css_isp_dvs_statistics_free(struct ia_css_isp_dvs_statistics * me)4049d4fa1a1SMauro Carvalho Chehab ia_css_isp_dvs_statistics_free(struct ia_css_isp_dvs_statistics *me)
4059d4fa1a1SMauro Carvalho Chehab {
4069d4fa1a1SMauro Carvalho Chehab 	if (me) {
4079d4fa1a1SMauro Carvalho Chehab 		hmm_free(me->data_ptr);
4089955d906SMauro Carvalho Chehab 		kvfree(me);
4099d4fa1a1SMauro Carvalho Chehab 	}
4109d4fa1a1SMauro Carvalho Chehab }
4119d4fa1a1SMauro Carvalho Chehab 
ia_css_sdis_horicoef_debug_dtrace(const struct ia_css_dvs_coefficients * config,unsigned int level)4129d4fa1a1SMauro Carvalho Chehab void ia_css_sdis_horicoef_debug_dtrace(
4139d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs_coefficients *config, unsigned int level)
4149d4fa1a1SMauro Carvalho Chehab {
4159d4fa1a1SMauro Carvalho Chehab 	(void)config;
4169d4fa1a1SMauro Carvalho Chehab 	(void)level;
4179d4fa1a1SMauro Carvalho Chehab }
4189d4fa1a1SMauro Carvalho Chehab 
ia_css_sdis_vertcoef_debug_dtrace(const struct ia_css_dvs_coefficients * config,unsigned int level)4199d4fa1a1SMauro Carvalho Chehab void ia_css_sdis_vertcoef_debug_dtrace(
4209d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs_coefficients *config, unsigned int level)
4219d4fa1a1SMauro Carvalho Chehab {
4229d4fa1a1SMauro Carvalho Chehab 	(void)config;
4239d4fa1a1SMauro Carvalho Chehab 	(void)level;
4249d4fa1a1SMauro Carvalho Chehab }
4259d4fa1a1SMauro Carvalho Chehab 
ia_css_sdis_horiproj_debug_dtrace(const struct ia_css_dvs_coefficients * config,unsigned int level)4269d4fa1a1SMauro Carvalho Chehab void ia_css_sdis_horiproj_debug_dtrace(
4279d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs_coefficients *config, unsigned int level)
4289d4fa1a1SMauro Carvalho Chehab {
4299d4fa1a1SMauro Carvalho Chehab 	(void)config;
4309d4fa1a1SMauro Carvalho Chehab 	(void)level;
4319d4fa1a1SMauro Carvalho Chehab }
4329d4fa1a1SMauro Carvalho Chehab 
ia_css_sdis_vertproj_debug_dtrace(const struct ia_css_dvs_coefficients * config,unsigned int level)4339d4fa1a1SMauro Carvalho Chehab void ia_css_sdis_vertproj_debug_dtrace(
4349d4fa1a1SMauro Carvalho Chehab     const struct ia_css_dvs_coefficients *config, unsigned int level)
4359d4fa1a1SMauro Carvalho Chehab {
4369d4fa1a1SMauro Carvalho Chehab 	(void)config;
4379d4fa1a1SMauro Carvalho Chehab 	(void)level;
4389d4fa1a1SMauro Carvalho Chehab }
439