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 
16662fb4fcSMauro Carvalho Chehab #include <linux/string.h> /* for memcpy() */
17662fb4fcSMauro Carvalho Chehab 
189d4fa1a1SMauro Carvalho Chehab #include "system_global.h"
199d4fa1a1SMauro Carvalho Chehab 
20641c2292SMauro Carvalho Chehab #ifdef ISP2401
219d4fa1a1SMauro Carvalho Chehab 
229d4fa1a1SMauro Carvalho Chehab #include "ia_css_isys.h"
239d4fa1a1SMauro Carvalho Chehab #include "ia_css_debug.h"
249d4fa1a1SMauro Carvalho Chehab #include "math_support.h"
259d4fa1a1SMauro Carvalho Chehab #include "virtual_isys.h"
269d4fa1a1SMauro Carvalho Chehab #include "isp.h"
279d4fa1a1SMauro Carvalho Chehab #include "sh_css_defs.h"
289d4fa1a1SMauro Carvalho Chehab 
299d4fa1a1SMauro Carvalho Chehab /*************************************************
309d4fa1a1SMauro Carvalho Chehab  *
319d4fa1a1SMauro Carvalho Chehab  * Forwarded Declaration
329d4fa1a1SMauro Carvalho Chehab  *
339d4fa1a1SMauro Carvalho Chehab  *************************************************/
349d4fa1a1SMauro Carvalho Chehab 
359d4fa1a1SMauro Carvalho Chehab static bool create_input_system_channel(
36284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t	*cfg,
379d4fa1a1SMauro Carvalho Chehab     bool			metadata,
389d4fa1a1SMauro Carvalho Chehab     input_system_channel_t	*channel);
399d4fa1a1SMauro Carvalho Chehab 
409d4fa1a1SMauro Carvalho Chehab static void destroy_input_system_channel(
419d4fa1a1SMauro Carvalho Chehab     input_system_channel_t	*channel);
429d4fa1a1SMauro Carvalho Chehab 
439d4fa1a1SMauro Carvalho Chehab static bool create_input_system_input_port(
44284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t		*cfg,
459d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*input_port);
469d4fa1a1SMauro Carvalho Chehab 
479d4fa1a1SMauro Carvalho Chehab static void destroy_input_system_input_port(
489d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*input_port);
499d4fa1a1SMauro Carvalho Chehab 
509d4fa1a1SMauro Carvalho Chehab static bool calculate_input_system_channel_cfg(
519d4fa1a1SMauro Carvalho Chehab     input_system_channel_t		*channel,
529d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*input_port,
53284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t		*isys_cfg,
549d4fa1a1SMauro Carvalho Chehab     input_system_channel_cfg_t	*channel_cfg,
559d4fa1a1SMauro Carvalho Chehab     bool metadata);
569d4fa1a1SMauro Carvalho Chehab 
579d4fa1a1SMauro Carvalho Chehab static bool calculate_input_system_input_port_cfg(
589d4fa1a1SMauro Carvalho Chehab     input_system_channel_t		*channel,
599d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*input_port,
60284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t		*isys_cfg,
619d4fa1a1SMauro Carvalho Chehab     input_system_input_port_cfg_t	*input_port_cfg);
629d4fa1a1SMauro Carvalho Chehab 
639d4fa1a1SMauro Carvalho Chehab static bool acquire_sid(
649d4fa1a1SMauro Carvalho Chehab     stream2mmio_ID_t	stream2mmio,
659d4fa1a1SMauro Carvalho Chehab     stream2mmio_sid_ID_t	*sid);
669d4fa1a1SMauro Carvalho Chehab 
679d4fa1a1SMauro Carvalho Chehab static void release_sid(
689d4fa1a1SMauro Carvalho Chehab     stream2mmio_ID_t	stream2mmio,
699d4fa1a1SMauro Carvalho Chehab     stream2mmio_sid_ID_t	*sid);
709d4fa1a1SMauro Carvalho Chehab 
719d4fa1a1SMauro Carvalho Chehab static bool acquire_ib_buffer(
729d4fa1a1SMauro Carvalho Chehab     s32 bits_per_pixel,
739d4fa1a1SMauro Carvalho Chehab     s32 pixels_per_line,
749d4fa1a1SMauro Carvalho Chehab     s32 lines_per_frame,
759d4fa1a1SMauro Carvalho Chehab     s32 align_in_bytes,
769d4fa1a1SMauro Carvalho Chehab     bool online,
77284be891SMauro Carvalho Chehab     isp2401_ib_buffer_t *buf);
789d4fa1a1SMauro Carvalho Chehab 
799d4fa1a1SMauro Carvalho Chehab static void release_ib_buffer(
80284be891SMauro Carvalho Chehab     isp2401_ib_buffer_t *buf);
819d4fa1a1SMauro Carvalho Chehab 
829d4fa1a1SMauro Carvalho Chehab static bool acquire_dma_channel(
839d4fa1a1SMauro Carvalho Chehab     isys2401_dma_ID_t	dma_id,
849d4fa1a1SMauro Carvalho Chehab     isys2401_dma_channel	*channel);
859d4fa1a1SMauro Carvalho Chehab 
869d4fa1a1SMauro Carvalho Chehab static void release_dma_channel(
879d4fa1a1SMauro Carvalho Chehab     isys2401_dma_ID_t	dma_id,
889d4fa1a1SMauro Carvalho Chehab     isys2401_dma_channel	*channel);
899d4fa1a1SMauro Carvalho Chehab 
909d4fa1a1SMauro Carvalho Chehab static bool acquire_be_lut_entry(
919d4fa1a1SMauro Carvalho Chehab     csi_rx_backend_ID_t		backend,
929d4fa1a1SMauro Carvalho Chehab     csi_mipi_packet_type_t		packet_type,
939d4fa1a1SMauro Carvalho Chehab     csi_rx_backend_lut_entry_t	*entry);
949d4fa1a1SMauro Carvalho Chehab 
959d4fa1a1SMauro Carvalho Chehab static void release_be_lut_entry(
969d4fa1a1SMauro Carvalho Chehab     csi_rx_backend_ID_t		backend,
979d4fa1a1SMauro Carvalho Chehab     csi_mipi_packet_type_t		packet_type,
989d4fa1a1SMauro Carvalho Chehab     csi_rx_backend_lut_entry_t	*entry);
999d4fa1a1SMauro Carvalho Chehab 
1009d4fa1a1SMauro Carvalho Chehab static bool calculate_tpg_cfg(
1019d4fa1a1SMauro Carvalho Chehab     input_system_channel_t		*channel,
1029d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*input_port,
103284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t		*isys_cfg,
1049d4fa1a1SMauro Carvalho Chehab     pixelgen_tpg_cfg_t		*cfg);
1059d4fa1a1SMauro Carvalho Chehab 
1069d4fa1a1SMauro Carvalho Chehab static bool calculate_prbs_cfg(
1079d4fa1a1SMauro Carvalho Chehab     input_system_channel_t		*channel,
1089d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*input_port,
109284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t		*isys_cfg,
1109d4fa1a1SMauro Carvalho Chehab     pixelgen_prbs_cfg_t		*cfg);
1119d4fa1a1SMauro Carvalho Chehab 
1129d4fa1a1SMauro Carvalho Chehab static bool calculate_fe_cfg(
113284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
1149d4fa1a1SMauro Carvalho Chehab     csi_rx_frontend_cfg_t		*cfg);
1159d4fa1a1SMauro Carvalho Chehab 
1169d4fa1a1SMauro Carvalho Chehab static bool calculate_be_cfg(
1179d4fa1a1SMauro Carvalho Chehab     const input_system_input_port_t	*input_port,
118284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
1199d4fa1a1SMauro Carvalho Chehab     bool				metadata,
1209d4fa1a1SMauro Carvalho Chehab     csi_rx_backend_cfg_t		*cfg);
1219d4fa1a1SMauro Carvalho Chehab 
1229d4fa1a1SMauro Carvalho Chehab static bool calculate_stream2mmio_cfg(
123284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
1249d4fa1a1SMauro Carvalho Chehab     bool				metadata,
1259d4fa1a1SMauro Carvalho Chehab     stream2mmio_cfg_t		*cfg);
1269d4fa1a1SMauro Carvalho Chehab 
1279d4fa1a1SMauro Carvalho Chehab static bool calculate_ibuf_ctrl_cfg(
1289d4fa1a1SMauro Carvalho Chehab     const input_system_channel_t	*channel,
1299d4fa1a1SMauro Carvalho Chehab     const input_system_input_port_t	*input_port,
130284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
1319d4fa1a1SMauro Carvalho Chehab     ibuf_ctrl_cfg_t			*cfg);
1329d4fa1a1SMauro Carvalho Chehab 
1339d4fa1a1SMauro Carvalho Chehab static bool calculate_isys2401_dma_cfg(
1349d4fa1a1SMauro Carvalho Chehab     const input_system_channel_t	*channel,
135284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
1369d4fa1a1SMauro Carvalho Chehab     isys2401_dma_cfg_t		*cfg);
1379d4fa1a1SMauro Carvalho Chehab 
1389d4fa1a1SMauro Carvalho Chehab static bool calculate_isys2401_dma_port_cfg(
139284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
1409d4fa1a1SMauro Carvalho Chehab     bool				raw_packed,
1419d4fa1a1SMauro Carvalho Chehab     bool				metadata,
1429d4fa1a1SMauro Carvalho Chehab     isys2401_dma_port_cfg_t		*cfg);
1439d4fa1a1SMauro Carvalho Chehab 
1449d4fa1a1SMauro Carvalho Chehab static csi_mipi_packet_type_t get_csi_mipi_packet_type(
1459d4fa1a1SMauro Carvalho Chehab     int32_t data_type);
1469d4fa1a1SMauro Carvalho Chehab 
1479d4fa1a1SMauro Carvalho Chehab static int32_t calculate_stride(
1489d4fa1a1SMauro Carvalho Chehab     s32 bits_per_pixel,
1499d4fa1a1SMauro Carvalho Chehab     s32 pixels_per_line,
1509d4fa1a1SMauro Carvalho Chehab     bool	raw_packed,
1519d4fa1a1SMauro Carvalho Chehab     int32_t	align_in_bytes);
1529d4fa1a1SMauro Carvalho Chehab 
1539d4fa1a1SMauro Carvalho Chehab /* end of Forwarded Declaration */
1549d4fa1a1SMauro Carvalho Chehab 
1559d4fa1a1SMauro Carvalho Chehab /**************************************************
1569d4fa1a1SMauro Carvalho Chehab  *
1579d4fa1a1SMauro Carvalho Chehab  * Public Methods
1589d4fa1a1SMauro Carvalho Chehab  *
1599d4fa1a1SMauro Carvalho Chehab  **************************************************/
ia_css_isys_stream_create(ia_css_isys_descr_t * isys_stream_descr,ia_css_isys_stream_h isys_stream,uint32_t isys_stream_id)1609d4fa1a1SMauro Carvalho Chehab ia_css_isys_error_t ia_css_isys_stream_create(
1619d4fa1a1SMauro Carvalho Chehab     ia_css_isys_descr_t	*isys_stream_descr,
1629d4fa1a1SMauro Carvalho Chehab     ia_css_isys_stream_h	isys_stream,
1639d4fa1a1SMauro Carvalho Chehab     uint32_t isys_stream_id)
1649d4fa1a1SMauro Carvalho Chehab {
1659d4fa1a1SMauro Carvalho Chehab 	ia_css_isys_error_t rc;
1669d4fa1a1SMauro Carvalho Chehab 
1679d4fa1a1SMauro Carvalho Chehab 	if (!isys_stream_descr || !isys_stream ||
1689d4fa1a1SMauro Carvalho Chehab 	    isys_stream_id >= SH_CSS_MAX_ISYS_CHANNEL_NODES)
1699d4fa1a1SMauro Carvalho Chehab 		return	false;
1709d4fa1a1SMauro Carvalho Chehab 
1719d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
1729d4fa1a1SMauro Carvalho Chehab 			    "ia_css_isys_stream_create() enter:\n");
1739d4fa1a1SMauro Carvalho Chehab 
1749d4fa1a1SMauro Carvalho Chehab 	/*Reset isys_stream to 0*/
1759d4fa1a1SMauro Carvalho Chehab 	memset(isys_stream, 0, sizeof(*isys_stream));
1769d4fa1a1SMauro Carvalho Chehab 	isys_stream->enable_metadata = isys_stream_descr->metadata.enable;
1779d4fa1a1SMauro Carvalho Chehab 	isys_stream->id = isys_stream_id;
1789d4fa1a1SMauro Carvalho Chehab 
1799d4fa1a1SMauro Carvalho Chehab 	isys_stream->linked_isys_stream_id = isys_stream_descr->linked_isys_stream_id;
1809d4fa1a1SMauro Carvalho Chehab 	rc = create_input_system_input_port(isys_stream_descr,
1819d4fa1a1SMauro Carvalho Chehab 					    &isys_stream->input_port);
182*c606970dSAditya Srivastava 	if (!rc)
1839d4fa1a1SMauro Carvalho Chehab 		return false;
1849d4fa1a1SMauro Carvalho Chehab 
1859d4fa1a1SMauro Carvalho Chehab 	rc = create_input_system_channel(isys_stream_descr, false,
1869d4fa1a1SMauro Carvalho Chehab 					 &isys_stream->channel);
187*c606970dSAditya Srivastava 	if (!rc) {
1889d4fa1a1SMauro Carvalho Chehab 		destroy_input_system_input_port(&isys_stream->input_port);
1899d4fa1a1SMauro Carvalho Chehab 		return false;
1909d4fa1a1SMauro Carvalho Chehab 	}
1919d4fa1a1SMauro Carvalho Chehab 
1929d4fa1a1SMauro Carvalho Chehab 	/* create metadata channel */
1939d4fa1a1SMauro Carvalho Chehab 	if (isys_stream_descr->metadata.enable) {
1949d4fa1a1SMauro Carvalho Chehab 		rc = create_input_system_channel(isys_stream_descr, true,
1959d4fa1a1SMauro Carvalho Chehab 						 &isys_stream->md_channel);
196*c606970dSAditya Srivastava 		if (!rc) {
1979d4fa1a1SMauro Carvalho Chehab 			destroy_input_system_input_port(&isys_stream->input_port);
1989d4fa1a1SMauro Carvalho Chehab 			destroy_input_system_channel(&isys_stream->channel);
1999d4fa1a1SMauro Carvalho Chehab 			return false;
2009d4fa1a1SMauro Carvalho Chehab 		}
2019d4fa1a1SMauro Carvalho Chehab 	}
2029d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
2039d4fa1a1SMauro Carvalho Chehab 			    "ia_css_isys_stream_create() leave:\n");
2049d4fa1a1SMauro Carvalho Chehab 
2059d4fa1a1SMauro Carvalho Chehab 	return true;
2069d4fa1a1SMauro Carvalho Chehab }
2079d4fa1a1SMauro Carvalho Chehab 
ia_css_isys_stream_destroy(ia_css_isys_stream_h isys_stream)2089d4fa1a1SMauro Carvalho Chehab void ia_css_isys_stream_destroy(
2099d4fa1a1SMauro Carvalho Chehab     ia_css_isys_stream_h	isys_stream)
2109d4fa1a1SMauro Carvalho Chehab {
2119d4fa1a1SMauro Carvalho Chehab 	destroy_input_system_input_port(&isys_stream->input_port);
2129d4fa1a1SMauro Carvalho Chehab 	destroy_input_system_channel(&isys_stream->channel);
2139d4fa1a1SMauro Carvalho Chehab 	if (isys_stream->enable_metadata) {
2149d4fa1a1SMauro Carvalho Chehab 		/* Destroy metadata channel only if its allocated*/
2159d4fa1a1SMauro Carvalho Chehab 		destroy_input_system_channel(&isys_stream->md_channel);
2169d4fa1a1SMauro Carvalho Chehab 	}
2179d4fa1a1SMauro Carvalho Chehab }
2189d4fa1a1SMauro Carvalho Chehab 
ia_css_isys_stream_calculate_cfg(ia_css_isys_stream_h isys_stream,ia_css_isys_descr_t * isys_stream_descr,ia_css_isys_stream_cfg_t * isys_stream_cfg)2199d4fa1a1SMauro Carvalho Chehab ia_css_isys_error_t ia_css_isys_stream_calculate_cfg(
2209d4fa1a1SMauro Carvalho Chehab     ia_css_isys_stream_h		isys_stream,
2219d4fa1a1SMauro Carvalho Chehab     ia_css_isys_descr_t		*isys_stream_descr,
2229d4fa1a1SMauro Carvalho Chehab     ia_css_isys_stream_cfg_t	*isys_stream_cfg)
2239d4fa1a1SMauro Carvalho Chehab {
2249d4fa1a1SMauro Carvalho Chehab 	ia_css_isys_error_t rc;
2259d4fa1a1SMauro Carvalho Chehab 
2269d4fa1a1SMauro Carvalho Chehab 	if (!isys_stream_cfg		||
2279d4fa1a1SMauro Carvalho Chehab 	    !isys_stream_descr	||
2289d4fa1a1SMauro Carvalho Chehab 	    !isys_stream)
2299d4fa1a1SMauro Carvalho Chehab 		return false;
2309d4fa1a1SMauro Carvalho Chehab 
2319d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
2329d4fa1a1SMauro Carvalho Chehab 			    "ia_css_isys_stream_calculate_cfg() enter:\n");
2339d4fa1a1SMauro Carvalho Chehab 
2349d4fa1a1SMauro Carvalho Chehab 	rc  = calculate_input_system_channel_cfg(
2359d4fa1a1SMauro Carvalho Chehab 		  &isys_stream->channel,
2369d4fa1a1SMauro Carvalho Chehab 		  &isys_stream->input_port,
2379d4fa1a1SMauro Carvalho Chehab 		  isys_stream_descr,
2389d4fa1a1SMauro Carvalho Chehab 		  &isys_stream_cfg->channel_cfg,
2399d4fa1a1SMauro Carvalho Chehab 		  false);
240*c606970dSAditya Srivastava 	if (!rc)
2419d4fa1a1SMauro Carvalho Chehab 		return false;
2429d4fa1a1SMauro Carvalho Chehab 
2439d4fa1a1SMauro Carvalho Chehab 	/* configure metadata channel */
2449d4fa1a1SMauro Carvalho Chehab 	if (isys_stream_descr->metadata.enable) {
2459d4fa1a1SMauro Carvalho Chehab 		isys_stream_cfg->enable_metadata = true;
2469d4fa1a1SMauro Carvalho Chehab 		rc  = calculate_input_system_channel_cfg(
2479d4fa1a1SMauro Carvalho Chehab 			  &isys_stream->md_channel,
2489d4fa1a1SMauro Carvalho Chehab 			  &isys_stream->input_port,
2499d4fa1a1SMauro Carvalho Chehab 			  isys_stream_descr,
2509d4fa1a1SMauro Carvalho Chehab 			  &isys_stream_cfg->md_channel_cfg,
2519d4fa1a1SMauro Carvalho Chehab 			  true);
252*c606970dSAditya Srivastava 		if (!rc)
2539d4fa1a1SMauro Carvalho Chehab 			return false;
2549d4fa1a1SMauro Carvalho Chehab 	}
2559d4fa1a1SMauro Carvalho Chehab 
2569d4fa1a1SMauro Carvalho Chehab 	rc = calculate_input_system_input_port_cfg(
2579d4fa1a1SMauro Carvalho Chehab 		 &isys_stream->channel,
2589d4fa1a1SMauro Carvalho Chehab 		 &isys_stream->input_port,
2599d4fa1a1SMauro Carvalho Chehab 		 isys_stream_descr,
2609d4fa1a1SMauro Carvalho Chehab 		 &isys_stream_cfg->input_port_cfg);
261*c606970dSAditya Srivastava 	if (!rc)
2629d4fa1a1SMauro Carvalho Chehab 		return false;
2639d4fa1a1SMauro Carvalho Chehab 
2649d4fa1a1SMauro Carvalho Chehab 	isys_stream->valid = 1;
2659d4fa1a1SMauro Carvalho Chehab 	isys_stream_cfg->valid = 1;
2669d4fa1a1SMauro Carvalho Chehab 	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
2679d4fa1a1SMauro Carvalho Chehab 			    "ia_css_isys_stream_calculate_cfg() leave:\n");
2689d4fa1a1SMauro Carvalho Chehab 	return rc;
2699d4fa1a1SMauro Carvalho Chehab }
2709d4fa1a1SMauro Carvalho Chehab 
2719d4fa1a1SMauro Carvalho Chehab /* end of Public Methods */
2729d4fa1a1SMauro Carvalho Chehab 
2739d4fa1a1SMauro Carvalho Chehab /**************************************************
2749d4fa1a1SMauro Carvalho Chehab  *
2759d4fa1a1SMauro Carvalho Chehab  * Private Methods
2769d4fa1a1SMauro Carvalho Chehab  *
2779d4fa1a1SMauro Carvalho Chehab  **************************************************/
create_input_system_channel(isp2401_input_system_cfg_t * cfg,bool metadata,input_system_channel_t * me)2789d4fa1a1SMauro Carvalho Chehab static bool create_input_system_channel(
279284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t	*cfg,
2809d4fa1a1SMauro Carvalho Chehab     bool			metadata,
2819d4fa1a1SMauro Carvalho Chehab     input_system_channel_t	*me)
2829d4fa1a1SMauro Carvalho Chehab {
2839d4fa1a1SMauro Carvalho Chehab 	bool rc = true;
2849d4fa1a1SMauro Carvalho Chehab 
2859d4fa1a1SMauro Carvalho Chehab 	me->dma_id = ISYS2401_DMA0_ID;
2869d4fa1a1SMauro Carvalho Chehab 
2879d4fa1a1SMauro Carvalho Chehab 	switch (cfg->input_port_id) {
2889d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_CSI_PORT0_ID:
2899d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_PIXELGEN_PORT0_ID:
2909d4fa1a1SMauro Carvalho Chehab 		me->stream2mmio_id = STREAM2MMIO0_ID;
2919d4fa1a1SMauro Carvalho Chehab 		me->ibuf_ctrl_id = IBUF_CTRL0_ID;
2929d4fa1a1SMauro Carvalho Chehab 		break;
2939d4fa1a1SMauro Carvalho Chehab 
2949d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_CSI_PORT1_ID:
2959d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_PIXELGEN_PORT1_ID:
2969d4fa1a1SMauro Carvalho Chehab 		me->stream2mmio_id = STREAM2MMIO1_ID;
2979d4fa1a1SMauro Carvalho Chehab 		me->ibuf_ctrl_id = IBUF_CTRL1_ID;
2989d4fa1a1SMauro Carvalho Chehab 		break;
2999d4fa1a1SMauro Carvalho Chehab 
3009d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_CSI_PORT2_ID:
3019d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_PIXELGEN_PORT2_ID:
3029d4fa1a1SMauro Carvalho Chehab 		me->stream2mmio_id = STREAM2MMIO2_ID;
3039d4fa1a1SMauro Carvalho Chehab 		me->ibuf_ctrl_id = IBUF_CTRL2_ID;
3049d4fa1a1SMauro Carvalho Chehab 		break;
3059d4fa1a1SMauro Carvalho Chehab 	default:
3069d4fa1a1SMauro Carvalho Chehab 		rc = false;
3079d4fa1a1SMauro Carvalho Chehab 		break;
3089d4fa1a1SMauro Carvalho Chehab 	}
3099d4fa1a1SMauro Carvalho Chehab 
3109d4fa1a1SMauro Carvalho Chehab 	if (!rc)
3119d4fa1a1SMauro Carvalho Chehab 		return false;
3129d4fa1a1SMauro Carvalho Chehab 
3139d4fa1a1SMauro Carvalho Chehab 	if (!acquire_sid(me->stream2mmio_id, &me->stream2mmio_sid_id)) {
3149d4fa1a1SMauro Carvalho Chehab 		return false;
3159d4fa1a1SMauro Carvalho Chehab 	}
3169d4fa1a1SMauro Carvalho Chehab 
3179d4fa1a1SMauro Carvalho Chehab 	if (!acquire_ib_buffer(
3189d4fa1a1SMauro Carvalho Chehab 		metadata ? cfg->metadata.bits_per_pixel :
3199d4fa1a1SMauro Carvalho Chehab 		cfg->input_port_resolution.bits_per_pixel,
3209d4fa1a1SMauro Carvalho Chehab 		metadata ? cfg->metadata.pixels_per_line :
3219d4fa1a1SMauro Carvalho Chehab 		cfg->input_port_resolution.pixels_per_line,
3229d4fa1a1SMauro Carvalho Chehab 		metadata ? cfg->metadata.lines_per_frame :
3239d4fa1a1SMauro Carvalho Chehab 		cfg->input_port_resolution.lines_per_frame,
3249d4fa1a1SMauro Carvalho Chehab 		metadata ? cfg->metadata.align_req_in_bytes :
3259d4fa1a1SMauro Carvalho Chehab 		cfg->input_port_resolution.align_req_in_bytes,
3269d4fa1a1SMauro Carvalho Chehab 		cfg->online,
3279d4fa1a1SMauro Carvalho Chehab 		&me->ib_buffer)) {
3289d4fa1a1SMauro Carvalho Chehab 		release_sid(me->stream2mmio_id, &me->stream2mmio_sid_id);
3299d4fa1a1SMauro Carvalho Chehab 		return false;
3309d4fa1a1SMauro Carvalho Chehab 	}
3319d4fa1a1SMauro Carvalho Chehab 
3329d4fa1a1SMauro Carvalho Chehab 	if (!acquire_dma_channel(me->dma_id, &me->dma_channel)) {
3339d4fa1a1SMauro Carvalho Chehab 		release_sid(me->stream2mmio_id, &me->stream2mmio_sid_id);
3349d4fa1a1SMauro Carvalho Chehab 		release_ib_buffer(&me->ib_buffer);
3359d4fa1a1SMauro Carvalho Chehab 		return false;
3369d4fa1a1SMauro Carvalho Chehab 	}
3379d4fa1a1SMauro Carvalho Chehab 
3389d4fa1a1SMauro Carvalho Chehab 	return true;
3399d4fa1a1SMauro Carvalho Chehab }
3409d4fa1a1SMauro Carvalho Chehab 
destroy_input_system_channel(input_system_channel_t * me)3419d4fa1a1SMauro Carvalho Chehab static void destroy_input_system_channel(
3429d4fa1a1SMauro Carvalho Chehab     input_system_channel_t	*me)
3439d4fa1a1SMauro Carvalho Chehab {
3449d4fa1a1SMauro Carvalho Chehab 	release_sid(me->stream2mmio_id,
3459d4fa1a1SMauro Carvalho Chehab 		    &me->stream2mmio_sid_id);
3469d4fa1a1SMauro Carvalho Chehab 
3479d4fa1a1SMauro Carvalho Chehab 	release_ib_buffer(&me->ib_buffer);
3489d4fa1a1SMauro Carvalho Chehab 
3499d4fa1a1SMauro Carvalho Chehab 	release_dma_channel(me->dma_id, &me->dma_channel);
3509d4fa1a1SMauro Carvalho Chehab }
3519d4fa1a1SMauro Carvalho Chehab 
create_input_system_input_port(isp2401_input_system_cfg_t * cfg,input_system_input_port_t * me)3529d4fa1a1SMauro Carvalho Chehab static bool create_input_system_input_port(
353284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t		*cfg,
3549d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*me)
3559d4fa1a1SMauro Carvalho Chehab {
3569d4fa1a1SMauro Carvalho Chehab 	csi_mipi_packet_type_t packet_type;
3579d4fa1a1SMauro Carvalho Chehab 	bool rc = true;
3589d4fa1a1SMauro Carvalho Chehab 
3599d4fa1a1SMauro Carvalho Chehab 	switch (cfg->input_port_id) {
3609d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_CSI_PORT0_ID:
3619d4fa1a1SMauro Carvalho Chehab 		me->csi_rx.frontend_id = CSI_RX_FRONTEND0_ID;
3629d4fa1a1SMauro Carvalho Chehab 		me->csi_rx.backend_id = CSI_RX_BACKEND0_ID;
3639d4fa1a1SMauro Carvalho Chehab 
3649d4fa1a1SMauro Carvalho Chehab 		packet_type = get_csi_mipi_packet_type(cfg->csi_port_attr.fmt_type);
3659d4fa1a1SMauro Carvalho Chehab 		me->csi_rx.packet_type = packet_type;
3669d4fa1a1SMauro Carvalho Chehab 
3679d4fa1a1SMauro Carvalho Chehab 		rc = acquire_be_lut_entry(
3689d4fa1a1SMauro Carvalho Chehab 			 me->csi_rx.backend_id,
3699d4fa1a1SMauro Carvalho Chehab 			 packet_type,
3709d4fa1a1SMauro Carvalho Chehab 			 &me->csi_rx.backend_lut_entry);
3719d4fa1a1SMauro Carvalho Chehab 		break;
3729d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_PIXELGEN_PORT0_ID:
3739d4fa1a1SMauro Carvalho Chehab 		me->pixelgen.pixelgen_id = PIXELGEN0_ID;
3749d4fa1a1SMauro Carvalho Chehab 		break;
3759d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_CSI_PORT1_ID:
3769d4fa1a1SMauro Carvalho Chehab 		me->csi_rx.frontend_id = CSI_RX_FRONTEND1_ID;
3779d4fa1a1SMauro Carvalho Chehab 		me->csi_rx.backend_id = CSI_RX_BACKEND1_ID;
3789d4fa1a1SMauro Carvalho Chehab 
3799d4fa1a1SMauro Carvalho Chehab 		packet_type = get_csi_mipi_packet_type(cfg->csi_port_attr.fmt_type);
3809d4fa1a1SMauro Carvalho Chehab 		me->csi_rx.packet_type = packet_type;
3819d4fa1a1SMauro Carvalho Chehab 
3829d4fa1a1SMauro Carvalho Chehab 		rc = acquire_be_lut_entry(
3839d4fa1a1SMauro Carvalho Chehab 			 me->csi_rx.backend_id,
3849d4fa1a1SMauro Carvalho Chehab 			 packet_type,
3859d4fa1a1SMauro Carvalho Chehab 			 &me->csi_rx.backend_lut_entry);
3869d4fa1a1SMauro Carvalho Chehab 		break;
3879d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_PIXELGEN_PORT1_ID:
3889d4fa1a1SMauro Carvalho Chehab 		me->pixelgen.pixelgen_id = PIXELGEN1_ID;
3899d4fa1a1SMauro Carvalho Chehab 
3909d4fa1a1SMauro Carvalho Chehab 		break;
3919d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_CSI_PORT2_ID:
3929d4fa1a1SMauro Carvalho Chehab 		me->csi_rx.frontend_id = CSI_RX_FRONTEND2_ID;
3939d4fa1a1SMauro Carvalho Chehab 		me->csi_rx.backend_id = CSI_RX_BACKEND2_ID;
3949d4fa1a1SMauro Carvalho Chehab 
3959d4fa1a1SMauro Carvalho Chehab 		packet_type = get_csi_mipi_packet_type(cfg->csi_port_attr.fmt_type);
3969d4fa1a1SMauro Carvalho Chehab 		me->csi_rx.packet_type = packet_type;
3979d4fa1a1SMauro Carvalho Chehab 
3989d4fa1a1SMauro Carvalho Chehab 		rc = acquire_be_lut_entry(
3999d4fa1a1SMauro Carvalho Chehab 			 me->csi_rx.backend_id,
4009d4fa1a1SMauro Carvalho Chehab 			 packet_type,
4019d4fa1a1SMauro Carvalho Chehab 			 &me->csi_rx.backend_lut_entry);
4029d4fa1a1SMauro Carvalho Chehab 		break;
4039d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_PIXELGEN_PORT2_ID:
4049d4fa1a1SMauro Carvalho Chehab 		me->pixelgen.pixelgen_id = PIXELGEN2_ID;
4059d4fa1a1SMauro Carvalho Chehab 		break;
4069d4fa1a1SMauro Carvalho Chehab 	default:
4079d4fa1a1SMauro Carvalho Chehab 		rc = false;
4089d4fa1a1SMauro Carvalho Chehab 		break;
4099d4fa1a1SMauro Carvalho Chehab 	}
4109d4fa1a1SMauro Carvalho Chehab 
4119d4fa1a1SMauro Carvalho Chehab 	me->source_type = cfg->mode;
4129d4fa1a1SMauro Carvalho Chehab 
4139d4fa1a1SMauro Carvalho Chehab 	/* for metadata */
4149d4fa1a1SMauro Carvalho Chehab 	me->metadata.packet_type = CSI_MIPI_PACKET_TYPE_UNDEFINED;
4159d4fa1a1SMauro Carvalho Chehab 	if (rc && cfg->metadata.enable) {
4169d4fa1a1SMauro Carvalho Chehab 		me->metadata.packet_type = get_csi_mipi_packet_type(
4179d4fa1a1SMauro Carvalho Chehab 					       cfg->metadata.fmt_type);
4189d4fa1a1SMauro Carvalho Chehab 		rc = acquire_be_lut_entry(
4199d4fa1a1SMauro Carvalho Chehab 			 me->csi_rx.backend_id,
4209d4fa1a1SMauro Carvalho Chehab 			 me->metadata.packet_type,
4219d4fa1a1SMauro Carvalho Chehab 			 &me->metadata.backend_lut_entry);
4229d4fa1a1SMauro Carvalho Chehab 	}
4239d4fa1a1SMauro Carvalho Chehab 
4249d4fa1a1SMauro Carvalho Chehab 	return rc;
4259d4fa1a1SMauro Carvalho Chehab }
4269d4fa1a1SMauro Carvalho Chehab 
destroy_input_system_input_port(input_system_input_port_t * me)4279d4fa1a1SMauro Carvalho Chehab static void destroy_input_system_input_port(
4289d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*me)
4299d4fa1a1SMauro Carvalho Chehab {
4309d4fa1a1SMauro Carvalho Chehab 	if (me->source_type == INPUT_SYSTEM_SOURCE_TYPE_SENSOR) {
4319d4fa1a1SMauro Carvalho Chehab 		release_be_lut_entry(
4329d4fa1a1SMauro Carvalho Chehab 		    me->csi_rx.backend_id,
4339d4fa1a1SMauro Carvalho Chehab 		    me->csi_rx.packet_type,
4349d4fa1a1SMauro Carvalho Chehab 		    &me->csi_rx.backend_lut_entry);
4359d4fa1a1SMauro Carvalho Chehab 	}
4369d4fa1a1SMauro Carvalho Chehab 
4379d4fa1a1SMauro Carvalho Chehab 	if (me->metadata.packet_type != CSI_MIPI_PACKET_TYPE_UNDEFINED) {
4389d4fa1a1SMauro Carvalho Chehab 		/*Free the backend lut allocated for metadata*/
4399d4fa1a1SMauro Carvalho Chehab 		release_be_lut_entry(
4409d4fa1a1SMauro Carvalho Chehab 		    me->csi_rx.backend_id,
4419d4fa1a1SMauro Carvalho Chehab 		    me->metadata.packet_type,
4429d4fa1a1SMauro Carvalho Chehab 		    &me->metadata.backend_lut_entry);
4439d4fa1a1SMauro Carvalho Chehab 	}
4449d4fa1a1SMauro Carvalho Chehab }
4459d4fa1a1SMauro Carvalho Chehab 
calculate_input_system_channel_cfg(input_system_channel_t * channel,input_system_input_port_t * input_port,isp2401_input_system_cfg_t * isys_cfg,input_system_channel_cfg_t * channel_cfg,bool metadata)4469d4fa1a1SMauro Carvalho Chehab static bool calculate_input_system_channel_cfg(
4479d4fa1a1SMauro Carvalho Chehab     input_system_channel_t		*channel,
4489d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*input_port,
449284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t		*isys_cfg,
4509d4fa1a1SMauro Carvalho Chehab     input_system_channel_cfg_t	*channel_cfg,
4519d4fa1a1SMauro Carvalho Chehab     bool metadata)
4529d4fa1a1SMauro Carvalho Chehab {
4539d4fa1a1SMauro Carvalho Chehab 	bool rc;
4549d4fa1a1SMauro Carvalho Chehab 
4559d4fa1a1SMauro Carvalho Chehab 	rc = calculate_stream2mmio_cfg(isys_cfg, metadata,
4569d4fa1a1SMauro Carvalho Chehab 				       &channel_cfg->stream2mmio_cfg);
4579d4fa1a1SMauro Carvalho Chehab 	if (!rc)
4589d4fa1a1SMauro Carvalho Chehab 		return false;
4599d4fa1a1SMauro Carvalho Chehab 
4609d4fa1a1SMauro Carvalho Chehab 	rc = calculate_ibuf_ctrl_cfg(
4619d4fa1a1SMauro Carvalho Chehab 		 channel,
4629d4fa1a1SMauro Carvalho Chehab 		 input_port,
4639d4fa1a1SMauro Carvalho Chehab 		 isys_cfg,
4649d4fa1a1SMauro Carvalho Chehab 		 &channel_cfg->ibuf_ctrl_cfg);
4659d4fa1a1SMauro Carvalho Chehab 	if (!rc)
4669d4fa1a1SMauro Carvalho Chehab 		return false;
4679d4fa1a1SMauro Carvalho Chehab 	if (metadata)
4689d4fa1a1SMauro Carvalho Chehab 		channel_cfg->ibuf_ctrl_cfg.stores_per_frame =
4699d4fa1a1SMauro Carvalho Chehab 		    isys_cfg->metadata.lines_per_frame;
4709d4fa1a1SMauro Carvalho Chehab 
4719d4fa1a1SMauro Carvalho Chehab 	rc = calculate_isys2401_dma_cfg(
4729d4fa1a1SMauro Carvalho Chehab 		 channel,
4739d4fa1a1SMauro Carvalho Chehab 		 isys_cfg,
4749d4fa1a1SMauro Carvalho Chehab 		 &channel_cfg->dma_cfg);
4759d4fa1a1SMauro Carvalho Chehab 	if (!rc)
4769d4fa1a1SMauro Carvalho Chehab 		return false;
4779d4fa1a1SMauro Carvalho Chehab 
4789d4fa1a1SMauro Carvalho Chehab 	rc = calculate_isys2401_dma_port_cfg(
4799d4fa1a1SMauro Carvalho Chehab 		 isys_cfg,
4809d4fa1a1SMauro Carvalho Chehab 		 false,
4819d4fa1a1SMauro Carvalho Chehab 		 metadata,
4829d4fa1a1SMauro Carvalho Chehab 		 &channel_cfg->dma_src_port_cfg);
4839d4fa1a1SMauro Carvalho Chehab 	if (!rc)
4849d4fa1a1SMauro Carvalho Chehab 		return false;
4859d4fa1a1SMauro Carvalho Chehab 
4869d4fa1a1SMauro Carvalho Chehab 	rc = calculate_isys2401_dma_port_cfg(
4879d4fa1a1SMauro Carvalho Chehab 		 isys_cfg,
4889d4fa1a1SMauro Carvalho Chehab 		 isys_cfg->raw_packed,
4899d4fa1a1SMauro Carvalho Chehab 		 metadata,
4909d4fa1a1SMauro Carvalho Chehab 		 &channel_cfg->dma_dest_port_cfg);
4919d4fa1a1SMauro Carvalho Chehab 	if (!rc)
4929d4fa1a1SMauro Carvalho Chehab 		return false;
4939d4fa1a1SMauro Carvalho Chehab 
4949d4fa1a1SMauro Carvalho Chehab 	return true;
4959d4fa1a1SMauro Carvalho Chehab }
4969d4fa1a1SMauro Carvalho Chehab 
calculate_input_system_input_port_cfg(input_system_channel_t * channel,input_system_input_port_t * input_port,isp2401_input_system_cfg_t * isys_cfg,input_system_input_port_cfg_t * input_port_cfg)4979d4fa1a1SMauro Carvalho Chehab static bool calculate_input_system_input_port_cfg(
4989d4fa1a1SMauro Carvalho Chehab     input_system_channel_t		*channel,
4999d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*input_port,
500284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t		*isys_cfg,
5019d4fa1a1SMauro Carvalho Chehab     input_system_input_port_cfg_t	*input_port_cfg)
5029d4fa1a1SMauro Carvalho Chehab {
5039d4fa1a1SMauro Carvalho Chehab 	bool rc;
5049d4fa1a1SMauro Carvalho Chehab 
5059d4fa1a1SMauro Carvalho Chehab 	switch (input_port->source_type) {
5069d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_SOURCE_TYPE_SENSOR:
5079d4fa1a1SMauro Carvalho Chehab 		rc  = calculate_fe_cfg(
5089d4fa1a1SMauro Carvalho Chehab 			  isys_cfg,
5099d4fa1a1SMauro Carvalho Chehab 			  &input_port_cfg->csi_rx_cfg.frontend_cfg);
5109d4fa1a1SMauro Carvalho Chehab 
5119d4fa1a1SMauro Carvalho Chehab 		rc &= calculate_be_cfg(
5129d4fa1a1SMauro Carvalho Chehab 			  input_port,
5139d4fa1a1SMauro Carvalho Chehab 			  isys_cfg,
5149d4fa1a1SMauro Carvalho Chehab 			  false,
5159d4fa1a1SMauro Carvalho Chehab 			  &input_port_cfg->csi_rx_cfg.backend_cfg);
5169d4fa1a1SMauro Carvalho Chehab 
5179d4fa1a1SMauro Carvalho Chehab 		if (rc && isys_cfg->metadata.enable)
5189d4fa1a1SMauro Carvalho Chehab 			rc &= calculate_be_cfg(input_port, isys_cfg, true,
5199d4fa1a1SMauro Carvalho Chehab 					       &input_port_cfg->csi_rx_cfg.md_backend_cfg);
5209d4fa1a1SMauro Carvalho Chehab 		break;
5219d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_SOURCE_TYPE_TPG:
5229d4fa1a1SMauro Carvalho Chehab 		rc = calculate_tpg_cfg(
5239d4fa1a1SMauro Carvalho Chehab 			 channel,
5249d4fa1a1SMauro Carvalho Chehab 			 input_port,
5259d4fa1a1SMauro Carvalho Chehab 			 isys_cfg,
5269d4fa1a1SMauro Carvalho Chehab 			 &input_port_cfg->pixelgen_cfg.tpg_cfg);
5279d4fa1a1SMauro Carvalho Chehab 		break;
5289d4fa1a1SMauro Carvalho Chehab 	case INPUT_SYSTEM_SOURCE_TYPE_PRBS:
5299d4fa1a1SMauro Carvalho Chehab 		rc = calculate_prbs_cfg(
5309d4fa1a1SMauro Carvalho Chehab 			 channel,
5319d4fa1a1SMauro Carvalho Chehab 			 input_port,
5329d4fa1a1SMauro Carvalho Chehab 			 isys_cfg,
5339d4fa1a1SMauro Carvalho Chehab 			 &input_port_cfg->pixelgen_cfg.prbs_cfg);
5349d4fa1a1SMauro Carvalho Chehab 		break;
5359d4fa1a1SMauro Carvalho Chehab 	default:
5369d4fa1a1SMauro Carvalho Chehab 		rc = false;
5379d4fa1a1SMauro Carvalho Chehab 		break;
5389d4fa1a1SMauro Carvalho Chehab 	}
5399d4fa1a1SMauro Carvalho Chehab 
5409d4fa1a1SMauro Carvalho Chehab 	return rc;
5419d4fa1a1SMauro Carvalho Chehab }
5429d4fa1a1SMauro Carvalho Chehab 
acquire_sid(stream2mmio_ID_t stream2mmio,stream2mmio_sid_ID_t * sid)5439d4fa1a1SMauro Carvalho Chehab static bool acquire_sid(
5449d4fa1a1SMauro Carvalho Chehab     stream2mmio_ID_t	stream2mmio,
5459d4fa1a1SMauro Carvalho Chehab     stream2mmio_sid_ID_t	*sid)
5469d4fa1a1SMauro Carvalho Chehab {
5479d4fa1a1SMauro Carvalho Chehab 	return ia_css_isys_stream2mmio_sid_rmgr_acquire(stream2mmio, sid);
5489d4fa1a1SMauro Carvalho Chehab }
5499d4fa1a1SMauro Carvalho Chehab 
release_sid(stream2mmio_ID_t stream2mmio,stream2mmio_sid_ID_t * sid)5509d4fa1a1SMauro Carvalho Chehab static void release_sid(
5519d4fa1a1SMauro Carvalho Chehab     stream2mmio_ID_t	stream2mmio,
5529d4fa1a1SMauro Carvalho Chehab     stream2mmio_sid_ID_t	*sid)
5539d4fa1a1SMauro Carvalho Chehab {
5549d4fa1a1SMauro Carvalho Chehab 	ia_css_isys_stream2mmio_sid_rmgr_release(stream2mmio, sid);
5559d4fa1a1SMauro Carvalho Chehab }
5569d4fa1a1SMauro Carvalho Chehab 
5579d4fa1a1SMauro Carvalho Chehab /* See also: ia_css_dma_configure_from_info() */
calculate_stride(s32 bits_per_pixel,s32 pixels_per_line,bool raw_packed,int32_t align_in_bytes)5589d4fa1a1SMauro Carvalho Chehab static int32_t calculate_stride(
5599d4fa1a1SMauro Carvalho Chehab     s32 bits_per_pixel,
5609d4fa1a1SMauro Carvalho Chehab     s32 pixels_per_line,
5619d4fa1a1SMauro Carvalho Chehab     bool	raw_packed,
5629d4fa1a1SMauro Carvalho Chehab     int32_t align_in_bytes)
5639d4fa1a1SMauro Carvalho Chehab {
5649d4fa1a1SMauro Carvalho Chehab 	s32 bytes_per_line;
5659d4fa1a1SMauro Carvalho Chehab 	s32 pixels_per_word;
5669d4fa1a1SMauro Carvalho Chehab 	s32 words_per_line;
5679d4fa1a1SMauro Carvalho Chehab 	s32 pixels_per_line_padded;
5689d4fa1a1SMauro Carvalho Chehab 
5699d4fa1a1SMauro Carvalho Chehab 	pixels_per_line_padded = CEIL_MUL(pixels_per_line, align_in_bytes);
5709d4fa1a1SMauro Carvalho Chehab 
5719d4fa1a1SMauro Carvalho Chehab 	if (!raw_packed)
5729d4fa1a1SMauro Carvalho Chehab 		bits_per_pixel = CEIL_MUL(bits_per_pixel, 8);
5739d4fa1a1SMauro Carvalho Chehab 
5749d4fa1a1SMauro Carvalho Chehab 	pixels_per_word = HIVE_ISP_DDR_WORD_BITS / bits_per_pixel;
5759d4fa1a1SMauro Carvalho Chehab 	words_per_line  = ceil_div(pixels_per_line_padded, pixels_per_word);
5769d4fa1a1SMauro Carvalho Chehab 	bytes_per_line  = HIVE_ISP_DDR_WORD_BYTES * words_per_line;
5779d4fa1a1SMauro Carvalho Chehab 
5789d4fa1a1SMauro Carvalho Chehab 	return bytes_per_line;
5799d4fa1a1SMauro Carvalho Chehab }
5809d4fa1a1SMauro Carvalho Chehab 
acquire_ib_buffer(s32 bits_per_pixel,s32 pixels_per_line,s32 lines_per_frame,s32 align_in_bytes,bool online,isp2401_ib_buffer_t * buf)5819d4fa1a1SMauro Carvalho Chehab static bool acquire_ib_buffer(
5829d4fa1a1SMauro Carvalho Chehab     s32 bits_per_pixel,
5839d4fa1a1SMauro Carvalho Chehab     s32 pixels_per_line,
5849d4fa1a1SMauro Carvalho Chehab     s32 lines_per_frame,
5859d4fa1a1SMauro Carvalho Chehab     s32 align_in_bytes,
5869d4fa1a1SMauro Carvalho Chehab     bool online,
587284be891SMauro Carvalho Chehab     isp2401_ib_buffer_t *buf)
5889d4fa1a1SMauro Carvalho Chehab {
5899d4fa1a1SMauro Carvalho Chehab 	buf->stride = calculate_stride(bits_per_pixel, pixels_per_line, false,
5909d4fa1a1SMauro Carvalho Chehab 				       align_in_bytes);
5919d4fa1a1SMauro Carvalho Chehab 	if (online)
5929d4fa1a1SMauro Carvalho Chehab 		buf->lines = 4; /* use double buffering for online usecases */
5939d4fa1a1SMauro Carvalho Chehab 	else
5949d4fa1a1SMauro Carvalho Chehab 		buf->lines = 2;
5959d4fa1a1SMauro Carvalho Chehab 
5969d4fa1a1SMauro Carvalho Chehab 	(void)(lines_per_frame);
5979d4fa1a1SMauro Carvalho Chehab 	return ia_css_isys_ibuf_rmgr_acquire(buf->stride * buf->lines,
5989d4fa1a1SMauro Carvalho Chehab 					     &buf->start_addr);
5999d4fa1a1SMauro Carvalho Chehab }
6009d4fa1a1SMauro Carvalho Chehab 
release_ib_buffer(isp2401_ib_buffer_t * buf)6019d4fa1a1SMauro Carvalho Chehab static void release_ib_buffer(
602284be891SMauro Carvalho Chehab     isp2401_ib_buffer_t *buf)
6039d4fa1a1SMauro Carvalho Chehab {
6049d4fa1a1SMauro Carvalho Chehab 	ia_css_isys_ibuf_rmgr_release(&buf->start_addr);
6059d4fa1a1SMauro Carvalho Chehab }
6069d4fa1a1SMauro Carvalho Chehab 
acquire_dma_channel(isys2401_dma_ID_t dma_id,isys2401_dma_channel * channel)6079d4fa1a1SMauro Carvalho Chehab static bool acquire_dma_channel(
6089d4fa1a1SMauro Carvalho Chehab     isys2401_dma_ID_t	dma_id,
6099d4fa1a1SMauro Carvalho Chehab     isys2401_dma_channel	*channel)
6109d4fa1a1SMauro Carvalho Chehab {
6119d4fa1a1SMauro Carvalho Chehab 	return ia_css_isys_dma_channel_rmgr_acquire(dma_id, channel);
6129d4fa1a1SMauro Carvalho Chehab }
6139d4fa1a1SMauro Carvalho Chehab 
release_dma_channel(isys2401_dma_ID_t dma_id,isys2401_dma_channel * channel)6149d4fa1a1SMauro Carvalho Chehab static void release_dma_channel(
6159d4fa1a1SMauro Carvalho Chehab     isys2401_dma_ID_t	dma_id,
6169d4fa1a1SMauro Carvalho Chehab     isys2401_dma_channel	*channel)
6179d4fa1a1SMauro Carvalho Chehab {
6189d4fa1a1SMauro Carvalho Chehab 	ia_css_isys_dma_channel_rmgr_release(dma_id, channel);
6199d4fa1a1SMauro Carvalho Chehab }
6209d4fa1a1SMauro Carvalho Chehab 
acquire_be_lut_entry(csi_rx_backend_ID_t backend,csi_mipi_packet_type_t packet_type,csi_rx_backend_lut_entry_t * entry)6219d4fa1a1SMauro Carvalho Chehab static bool acquire_be_lut_entry(
6229d4fa1a1SMauro Carvalho Chehab     csi_rx_backend_ID_t		backend,
6239d4fa1a1SMauro Carvalho Chehab     csi_mipi_packet_type_t		packet_type,
6249d4fa1a1SMauro Carvalho Chehab     csi_rx_backend_lut_entry_t	*entry)
6259d4fa1a1SMauro Carvalho Chehab {
6269d4fa1a1SMauro Carvalho Chehab 	return ia_css_isys_csi_rx_lut_rmgr_acquire(backend, packet_type, entry);
6279d4fa1a1SMauro Carvalho Chehab }
6289d4fa1a1SMauro Carvalho Chehab 
release_be_lut_entry(csi_rx_backend_ID_t backend,csi_mipi_packet_type_t packet_type,csi_rx_backend_lut_entry_t * entry)6299d4fa1a1SMauro Carvalho Chehab static void release_be_lut_entry(
6309d4fa1a1SMauro Carvalho Chehab     csi_rx_backend_ID_t		backend,
6319d4fa1a1SMauro Carvalho Chehab     csi_mipi_packet_type_t		packet_type,
6329d4fa1a1SMauro Carvalho Chehab     csi_rx_backend_lut_entry_t	*entry)
6339d4fa1a1SMauro Carvalho Chehab {
6349d4fa1a1SMauro Carvalho Chehab 	ia_css_isys_csi_rx_lut_rmgr_release(backend, packet_type, entry);
6359d4fa1a1SMauro Carvalho Chehab }
6369d4fa1a1SMauro Carvalho Chehab 
calculate_tpg_cfg(input_system_channel_t * channel,input_system_input_port_t * input_port,isp2401_input_system_cfg_t * isys_cfg,pixelgen_tpg_cfg_t * cfg)6379d4fa1a1SMauro Carvalho Chehab static bool calculate_tpg_cfg(
6389d4fa1a1SMauro Carvalho Chehab     input_system_channel_t		*channel,
6399d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*input_port,
640284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t		*isys_cfg,
6419d4fa1a1SMauro Carvalho Chehab     pixelgen_tpg_cfg_t		*cfg)
6429d4fa1a1SMauro Carvalho Chehab {
643662fb4fcSMauro Carvalho Chehab 	memcpy(cfg, &isys_cfg->tpg_port_attr, sizeof(pixelgen_tpg_cfg_t));
6449d4fa1a1SMauro Carvalho Chehab 
6459d4fa1a1SMauro Carvalho Chehab 	return true;
6469d4fa1a1SMauro Carvalho Chehab }
6479d4fa1a1SMauro Carvalho Chehab 
calculate_prbs_cfg(input_system_channel_t * channel,input_system_input_port_t * input_port,isp2401_input_system_cfg_t * isys_cfg,pixelgen_prbs_cfg_t * cfg)6489d4fa1a1SMauro Carvalho Chehab static bool calculate_prbs_cfg(
6499d4fa1a1SMauro Carvalho Chehab     input_system_channel_t		*channel,
6509d4fa1a1SMauro Carvalho Chehab     input_system_input_port_t	*input_port,
651284be891SMauro Carvalho Chehab     isp2401_input_system_cfg_t		*isys_cfg,
6529d4fa1a1SMauro Carvalho Chehab     pixelgen_prbs_cfg_t		*cfg)
6539d4fa1a1SMauro Carvalho Chehab {
654662fb4fcSMauro Carvalho Chehab 	memcpy(cfg, &isys_cfg->prbs_port_attr, sizeof(pixelgen_prbs_cfg_t));
6559d4fa1a1SMauro Carvalho Chehab 
6569d4fa1a1SMauro Carvalho Chehab 	return true;
6579d4fa1a1SMauro Carvalho Chehab }
6589d4fa1a1SMauro Carvalho Chehab 
calculate_fe_cfg(const isp2401_input_system_cfg_t * isys_cfg,csi_rx_frontend_cfg_t * cfg)6599d4fa1a1SMauro Carvalho Chehab static bool calculate_fe_cfg(
660284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
6619d4fa1a1SMauro Carvalho Chehab     csi_rx_frontend_cfg_t		*cfg)
6629d4fa1a1SMauro Carvalho Chehab {
6639d4fa1a1SMauro Carvalho Chehab 	cfg->active_lanes = isys_cfg->csi_port_attr.active_lanes;
6649d4fa1a1SMauro Carvalho Chehab 	return true;
6659d4fa1a1SMauro Carvalho Chehab }
6669d4fa1a1SMauro Carvalho Chehab 
calculate_be_cfg(const input_system_input_port_t * input_port,const isp2401_input_system_cfg_t * isys_cfg,bool metadata,csi_rx_backend_cfg_t * cfg)6679d4fa1a1SMauro Carvalho Chehab static bool calculate_be_cfg(
6689d4fa1a1SMauro Carvalho Chehab     const input_system_input_port_t	*input_port,
669284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
6709d4fa1a1SMauro Carvalho Chehab     bool				metadata,
6719d4fa1a1SMauro Carvalho Chehab     csi_rx_backend_cfg_t		*cfg)
6729d4fa1a1SMauro Carvalho Chehab {
673662fb4fcSMauro Carvalho Chehab 	memcpy(&cfg->lut_entry,
674662fb4fcSMauro Carvalho Chehab 	      metadata ? &input_port->metadata.backend_lut_entry :
675662fb4fcSMauro Carvalho Chehab 			 &input_port->csi_rx.backend_lut_entry,
6769d4fa1a1SMauro Carvalho Chehab 	      sizeof(csi_rx_backend_lut_entry_t));
6779d4fa1a1SMauro Carvalho Chehab 
6789d4fa1a1SMauro Carvalho Chehab 	cfg->csi_mipi_cfg.virtual_channel = isys_cfg->csi_port_attr.ch_id;
6799d4fa1a1SMauro Carvalho Chehab 	if (metadata) {
6809d4fa1a1SMauro Carvalho Chehab 		cfg->csi_mipi_packet_type = get_csi_mipi_packet_type(
6819d4fa1a1SMauro Carvalho Chehab 						isys_cfg->metadata.fmt_type);
6829d4fa1a1SMauro Carvalho Chehab 		cfg->csi_mipi_cfg.comp_enable = false;
6839d4fa1a1SMauro Carvalho Chehab 		cfg->csi_mipi_cfg.data_type = isys_cfg->metadata.fmt_type;
6849d4fa1a1SMauro Carvalho Chehab 	} else {
6859d4fa1a1SMauro Carvalho Chehab 		cfg->csi_mipi_packet_type = get_csi_mipi_packet_type(
6869d4fa1a1SMauro Carvalho Chehab 						isys_cfg->csi_port_attr.fmt_type);
6879d4fa1a1SMauro Carvalho Chehab 		cfg->csi_mipi_cfg.data_type = isys_cfg->csi_port_attr.fmt_type;
6889d4fa1a1SMauro Carvalho Chehab 		cfg->csi_mipi_cfg.comp_enable = isys_cfg->csi_port_attr.comp_enable;
6899d4fa1a1SMauro Carvalho Chehab 		cfg->csi_mipi_cfg.comp_scheme = isys_cfg->csi_port_attr.comp_scheme;
6909d4fa1a1SMauro Carvalho Chehab 		cfg->csi_mipi_cfg.comp_predictor = isys_cfg->csi_port_attr.comp_predictor;
6919d4fa1a1SMauro Carvalho Chehab 		cfg->csi_mipi_cfg.comp_bit_idx = cfg->csi_mipi_cfg.data_type -
6929d4fa1a1SMauro Carvalho Chehab 						 MIPI_FORMAT_CUSTOM0;
6939d4fa1a1SMauro Carvalho Chehab 	}
6949d4fa1a1SMauro Carvalho Chehab 
6959d4fa1a1SMauro Carvalho Chehab 	return true;
6969d4fa1a1SMauro Carvalho Chehab }
6979d4fa1a1SMauro Carvalho Chehab 
calculate_stream2mmio_cfg(const isp2401_input_system_cfg_t * isys_cfg,bool metadata,stream2mmio_cfg_t * cfg)6989d4fa1a1SMauro Carvalho Chehab static bool calculate_stream2mmio_cfg(
699284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
7009d4fa1a1SMauro Carvalho Chehab     bool				metadata,
7019d4fa1a1SMauro Carvalho Chehab     stream2mmio_cfg_t		*cfg
7029d4fa1a1SMauro Carvalho Chehab )
7039d4fa1a1SMauro Carvalho Chehab {
7049d4fa1a1SMauro Carvalho Chehab 	cfg->bits_per_pixel = metadata ? isys_cfg->metadata.bits_per_pixel :
7059d4fa1a1SMauro Carvalho Chehab 			      isys_cfg->input_port_resolution.bits_per_pixel;
7069d4fa1a1SMauro Carvalho Chehab 
7079d4fa1a1SMauro Carvalho Chehab 	cfg->enable_blocking =
7089d4fa1a1SMauro Carvalho Chehab 	    ((isys_cfg->mode == INPUT_SYSTEM_SOURCE_TYPE_TPG) ||
7099d4fa1a1SMauro Carvalho Chehab 	     (isys_cfg->mode == INPUT_SYSTEM_SOURCE_TYPE_PRBS));
7109d4fa1a1SMauro Carvalho Chehab 
7119d4fa1a1SMauro Carvalho Chehab 	return true;
7129d4fa1a1SMauro Carvalho Chehab }
7139d4fa1a1SMauro Carvalho Chehab 
calculate_ibuf_ctrl_cfg(const input_system_channel_t * channel,const input_system_input_port_t * input_port,const isp2401_input_system_cfg_t * isys_cfg,ibuf_ctrl_cfg_t * cfg)7149d4fa1a1SMauro Carvalho Chehab static bool calculate_ibuf_ctrl_cfg(
7159d4fa1a1SMauro Carvalho Chehab     const input_system_channel_t	*channel,
7169d4fa1a1SMauro Carvalho Chehab     const input_system_input_port_t	*input_port,
717284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
7189d4fa1a1SMauro Carvalho Chehab     ibuf_ctrl_cfg_t			*cfg)
7199d4fa1a1SMauro Carvalho Chehab {
7209d4fa1a1SMauro Carvalho Chehab 	const s32 bits_per_byte = 8;
7219d4fa1a1SMauro Carvalho Chehab 	s32 bits_per_pixel;
7229d4fa1a1SMauro Carvalho Chehab 	s32 bytes_per_pixel;
7239d4fa1a1SMauro Carvalho Chehab 	s32 left_padding;
7249d4fa1a1SMauro Carvalho Chehab 
7259d4fa1a1SMauro Carvalho Chehab 	(void)input_port;
7269d4fa1a1SMauro Carvalho Chehab 
7279d4fa1a1SMauro Carvalho Chehab 	bits_per_pixel = isys_cfg->input_port_resolution.bits_per_pixel;
7289d4fa1a1SMauro Carvalho Chehab 	bytes_per_pixel = ceil_div(bits_per_pixel, bits_per_byte);
7299d4fa1a1SMauro Carvalho Chehab 
7309d4fa1a1SMauro Carvalho Chehab 	left_padding = CEIL_MUL(isys_cfg->output_port_attr.left_padding, ISP_VEC_NELEMS)
7319d4fa1a1SMauro Carvalho Chehab 		       * bytes_per_pixel;
7329d4fa1a1SMauro Carvalho Chehab 
7339d4fa1a1SMauro Carvalho Chehab 	cfg->online	= isys_cfg->online;
7349d4fa1a1SMauro Carvalho Chehab 
7359d4fa1a1SMauro Carvalho Chehab 	cfg->dma_cfg.channel	= channel->dma_channel;
7369d4fa1a1SMauro Carvalho Chehab 	cfg->dma_cfg.cmd	= _DMA_V2_MOVE_A2B_NO_SYNC_CHK_COMMAND;
7379d4fa1a1SMauro Carvalho Chehab 
7389d4fa1a1SMauro Carvalho Chehab 	cfg->dma_cfg.shift_returned_items	= 0;
7399d4fa1a1SMauro Carvalho Chehab 	cfg->dma_cfg.elems_per_word_in_ibuf	= 0;
7409d4fa1a1SMauro Carvalho Chehab 	cfg->dma_cfg.elems_per_word_in_dest	= 0;
7419d4fa1a1SMauro Carvalho Chehab 
7429d4fa1a1SMauro Carvalho Chehab 	cfg->ib_buffer.start_addr		= channel->ib_buffer.start_addr;
7439d4fa1a1SMauro Carvalho Chehab 	cfg->ib_buffer.stride			= channel->ib_buffer.stride;
7449d4fa1a1SMauro Carvalho Chehab 	cfg->ib_buffer.lines			= channel->ib_buffer.lines;
7459d4fa1a1SMauro Carvalho Chehab 
7469d4fa1a1SMauro Carvalho Chehab 	/*
7479d4fa1a1SMauro Carvalho Chehab 	#ifndef ISP2401
7489d4fa1a1SMauro Carvalho Chehab 	 * zhengjie.lu@intel.com:
7499d4fa1a1SMauro Carvalho Chehab 	#endif
7509d4fa1a1SMauro Carvalho Chehab 	 * "dest_buf_cfg" should be part of the input system output
7519d4fa1a1SMauro Carvalho Chehab 	 * port configuration.
7529d4fa1a1SMauro Carvalho Chehab 	 *
7539d4fa1a1SMauro Carvalho Chehab 	 * TODO: move "dest_buf_cfg" to the input system output
7549d4fa1a1SMauro Carvalho Chehab 	 * port configuration.
7559d4fa1a1SMauro Carvalho Chehab 	 */
7569d4fa1a1SMauro Carvalho Chehab 
7579d4fa1a1SMauro Carvalho Chehab 	/* input_buf addr only available in sched mode;
7589d4fa1a1SMauro Carvalho Chehab 	   this buffer is allocated in isp, crun mode addr
7599d4fa1a1SMauro Carvalho Chehab 	   can be passed by after ISP allocation */
7609d4fa1a1SMauro Carvalho Chehab 	if (cfg->online) {
7619d4fa1a1SMauro Carvalho Chehab 		cfg->dest_buf_cfg.start_addr	= ISP_INPUT_BUF_START_ADDR + left_padding;
7629d4fa1a1SMauro Carvalho Chehab 		cfg->dest_buf_cfg.stride	= bytes_per_pixel
7639d4fa1a1SMauro Carvalho Chehab 					      * isys_cfg->output_port_attr.max_isp_input_width;
7649d4fa1a1SMauro Carvalho Chehab 		cfg->dest_buf_cfg.lines		= LINES_OF_ISP_INPUT_BUF;
7659d4fa1a1SMauro Carvalho Chehab 	} else if (isys_cfg->raw_packed) {
7669d4fa1a1SMauro Carvalho Chehab 		cfg->dest_buf_cfg.stride	= calculate_stride(bits_per_pixel,
7679d4fa1a1SMauro Carvalho Chehab 					      isys_cfg->input_port_resolution.pixels_per_line,
7689d4fa1a1SMauro Carvalho Chehab 					      isys_cfg->raw_packed,
7699d4fa1a1SMauro Carvalho Chehab 					      isys_cfg->input_port_resolution.align_req_in_bytes);
7709d4fa1a1SMauro Carvalho Chehab 	} else {
7719d4fa1a1SMauro Carvalho Chehab 		cfg->dest_buf_cfg.stride	= channel->ib_buffer.stride;
7729d4fa1a1SMauro Carvalho Chehab 	}
7739d4fa1a1SMauro Carvalho Chehab 
7749d4fa1a1SMauro Carvalho Chehab 	/*
7759d4fa1a1SMauro Carvalho Chehab 	#ifndef ISP2401
7769d4fa1a1SMauro Carvalho Chehab 	 * zhengjie.lu@intel.com:
7779d4fa1a1SMauro Carvalho Chehab 	#endif
7789d4fa1a1SMauro Carvalho Chehab 	 * "items_per_store" is hard coded as "1", which is ONLY valid
7799d4fa1a1SMauro Carvalho Chehab 	 * when the CSI-MIPI long packet is transferred.
7809d4fa1a1SMauro Carvalho Chehab 	 *
7819d4fa1a1SMauro Carvalho Chehab 	 * TODO: After the 1st stage of MERR+,  make the proper solution to
7829d4fa1a1SMauro Carvalho Chehab 	 * configure "items_per_store" so that it can also handle the CSI-MIPI
7839d4fa1a1SMauro Carvalho Chehab 	 * short packet.
7849d4fa1a1SMauro Carvalho Chehab 	 */
7859d4fa1a1SMauro Carvalho Chehab 	cfg->items_per_store		= 1;
7869d4fa1a1SMauro Carvalho Chehab 
7879d4fa1a1SMauro Carvalho Chehab 	cfg->stores_per_frame		= isys_cfg->input_port_resolution.lines_per_frame;
7889d4fa1a1SMauro Carvalho Chehab 
7899d4fa1a1SMauro Carvalho Chehab 	cfg->stream2mmio_cfg.sync_cmd	= _STREAM2MMIO_CMD_TOKEN_SYNC_FRAME;
7909d4fa1a1SMauro Carvalho Chehab 
7919d4fa1a1SMauro Carvalho Chehab 	/* TODO: Define conditions as when to use store words vs store packets */
7929d4fa1a1SMauro Carvalho Chehab 	cfg->stream2mmio_cfg.store_cmd	= _STREAM2MMIO_CMD_TOKEN_STORE_PACKETS;
7939d4fa1a1SMauro Carvalho Chehab 
7949d4fa1a1SMauro Carvalho Chehab 	return true;
7959d4fa1a1SMauro Carvalho Chehab }
7969d4fa1a1SMauro Carvalho Chehab 
calculate_isys2401_dma_cfg(const input_system_channel_t * channel,const isp2401_input_system_cfg_t * isys_cfg,isys2401_dma_cfg_t * cfg)7979d4fa1a1SMauro Carvalho Chehab static bool calculate_isys2401_dma_cfg(
7989d4fa1a1SMauro Carvalho Chehab     const input_system_channel_t	*channel,
799284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
8009d4fa1a1SMauro Carvalho Chehab     isys2401_dma_cfg_t		*cfg)
8019d4fa1a1SMauro Carvalho Chehab {
8029d4fa1a1SMauro Carvalho Chehab 	cfg->channel	= channel->dma_channel;
8039d4fa1a1SMauro Carvalho Chehab 
8049d4fa1a1SMauro Carvalho Chehab 	/* only online/sensor mode goto vmem
8059d4fa1a1SMauro Carvalho Chehab 	   offline/buffered_sensor, tpg and prbs will go to ddr */
8069d4fa1a1SMauro Carvalho Chehab 	if (isys_cfg->online)
8079d4fa1a1SMauro Carvalho Chehab 		cfg->connection = isys2401_dma_ibuf_to_vmem_connection;
8089d4fa1a1SMauro Carvalho Chehab 	else
8099d4fa1a1SMauro Carvalho Chehab 		cfg->connection = isys2401_dma_ibuf_to_ddr_connection;
8109d4fa1a1SMauro Carvalho Chehab 
8119d4fa1a1SMauro Carvalho Chehab 	cfg->extension	= isys2401_dma_zero_extension;
8129d4fa1a1SMauro Carvalho Chehab 	cfg->height	= 1;
8139d4fa1a1SMauro Carvalho Chehab 
8149d4fa1a1SMauro Carvalho Chehab 	return true;
8159d4fa1a1SMauro Carvalho Chehab }
8169d4fa1a1SMauro Carvalho Chehab 
8179d4fa1a1SMauro Carvalho Chehab /* See also: ia_css_dma_configure_from_info() */
calculate_isys2401_dma_port_cfg(const isp2401_input_system_cfg_t * isys_cfg,bool raw_packed,bool metadata,isys2401_dma_port_cfg_t * cfg)8189d4fa1a1SMauro Carvalho Chehab static bool calculate_isys2401_dma_port_cfg(
819284be891SMauro Carvalho Chehab     const isp2401_input_system_cfg_t	*isys_cfg,
8209d4fa1a1SMauro Carvalho Chehab     bool				raw_packed,
8219d4fa1a1SMauro Carvalho Chehab     bool				metadata,
8229d4fa1a1SMauro Carvalho Chehab     isys2401_dma_port_cfg_t		*cfg)
8239d4fa1a1SMauro Carvalho Chehab {
8249d4fa1a1SMauro Carvalho Chehab 	s32 bits_per_pixel;
8259d4fa1a1SMauro Carvalho Chehab 	s32 pixels_per_line;
8269d4fa1a1SMauro Carvalho Chehab 	s32 align_req_in_bytes;
8279d4fa1a1SMauro Carvalho Chehab 
8289d4fa1a1SMauro Carvalho Chehab 	/* TODO: Move metadata away from isys_cfg to application layer */
8299d4fa1a1SMauro Carvalho Chehab 	if (metadata) {
8309d4fa1a1SMauro Carvalho Chehab 		bits_per_pixel = isys_cfg->metadata.bits_per_pixel;
8319d4fa1a1SMauro Carvalho Chehab 		pixels_per_line = isys_cfg->metadata.pixels_per_line;
8329d4fa1a1SMauro Carvalho Chehab 		align_req_in_bytes = isys_cfg->metadata.align_req_in_bytes;
8339d4fa1a1SMauro Carvalho Chehab 	} else {
8349d4fa1a1SMauro Carvalho Chehab 		bits_per_pixel = isys_cfg->input_port_resolution.bits_per_pixel;
8359d4fa1a1SMauro Carvalho Chehab 		pixels_per_line = isys_cfg->input_port_resolution.pixels_per_line;
8369d4fa1a1SMauro Carvalho Chehab 		align_req_in_bytes = isys_cfg->input_port_resolution.align_req_in_bytes;
8379d4fa1a1SMauro Carvalho Chehab 	}
8389d4fa1a1SMauro Carvalho Chehab 
8399d4fa1a1SMauro Carvalho Chehab 	cfg->stride	= calculate_stride(bits_per_pixel, pixels_per_line, raw_packed,
8409d4fa1a1SMauro Carvalho Chehab 				       align_req_in_bytes);
8419d4fa1a1SMauro Carvalho Chehab 
8429d4fa1a1SMauro Carvalho Chehab 	if (!raw_packed)
8439d4fa1a1SMauro Carvalho Chehab 		bits_per_pixel = CEIL_MUL(bits_per_pixel, 8);
8449d4fa1a1SMauro Carvalho Chehab 
8459d4fa1a1SMauro Carvalho Chehab 	cfg->elements	= HIVE_ISP_DDR_WORD_BITS / bits_per_pixel;
8469d4fa1a1SMauro Carvalho Chehab 	cfg->cropping	= 0;
8479d4fa1a1SMauro Carvalho Chehab 	cfg->width	= CEIL_DIV(cfg->stride, HIVE_ISP_DDR_WORD_BYTES);
8489d4fa1a1SMauro Carvalho Chehab 
8499d4fa1a1SMauro Carvalho Chehab 	return true;
8509d4fa1a1SMauro Carvalho Chehab }
8519d4fa1a1SMauro Carvalho Chehab 
get_csi_mipi_packet_type(int32_t data_type)8529d4fa1a1SMauro Carvalho Chehab static csi_mipi_packet_type_t get_csi_mipi_packet_type(
8539d4fa1a1SMauro Carvalho Chehab     int32_t data_type)
8549d4fa1a1SMauro Carvalho Chehab {
8559d4fa1a1SMauro Carvalho Chehab 	csi_mipi_packet_type_t packet_type;
8569d4fa1a1SMauro Carvalho Chehab 
8579d4fa1a1SMauro Carvalho Chehab 	packet_type = CSI_MIPI_PACKET_TYPE_RESERVED;
8589d4fa1a1SMauro Carvalho Chehab 
8599d4fa1a1SMauro Carvalho Chehab 	if (data_type >= 0 && data_type <= MIPI_FORMAT_SHORT8)
8609d4fa1a1SMauro Carvalho Chehab 		packet_type = CSI_MIPI_PACKET_TYPE_SHORT;
8619d4fa1a1SMauro Carvalho Chehab 
8629d4fa1a1SMauro Carvalho Chehab 	if (data_type > MIPI_FORMAT_SHORT8 && data_type <= N_MIPI_FORMAT)
8639d4fa1a1SMauro Carvalho Chehab 		packet_type = CSI_MIPI_PACKET_TYPE_LONG;
8649d4fa1a1SMauro Carvalho Chehab 
8659d4fa1a1SMauro Carvalho Chehab 	return packet_type;
8669d4fa1a1SMauro Carvalho Chehab }
8679d4fa1a1SMauro Carvalho Chehab 
8689d4fa1a1SMauro Carvalho Chehab /* end of Private Methods */
8699d4fa1a1SMauro Carvalho Chehab #endif
870