1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Support for Intel Camera Imaging ISP subsystem.
4  * Copyright (c) 2010-2015, Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  */
15 
16 #include "system_global.h"
17 
18 #ifdef USE_INPUT_SYSTEM_VERSION_2
19 
20 #include "input_formatter.h"
21 #include <type_support.h>
22 #include "gp_device.h"
23 
24 #include "assert_support.h"
25 
26 #ifndef __INLINE_INPUT_FORMATTER__
27 #include "input_formatter_private.h"
28 #endif /* __INLINE_INPUT_FORMATTER__ */
29 
30 const hrt_address HIVE_IF_SRST_ADDRESS[N_INPUT_FORMATTER_ID] = {
31 	INPUT_FORMATTER0_SRST_OFFSET,
32 	INPUT_FORMATTER1_SRST_OFFSET,
33 	INPUT_FORMATTER2_SRST_OFFSET,
34 	INPUT_FORMATTER3_SRST_OFFSET
35 };
36 
37 const hrt_data HIVE_IF_SRST_MASK[N_INPUT_FORMATTER_ID] = {
38 	INPUT_FORMATTER0_SRST_MASK,
39 	INPUT_FORMATTER1_SRST_MASK,
40 	INPUT_FORMATTER2_SRST_MASK,
41 	INPUT_FORMATTER3_SRST_MASK
42 };
43 
44 const u8 HIVE_IF_SWITCH_CODE[N_INPUT_FORMATTER_ID] = {
45 	HIVE_INPUT_SWITCH_SELECT_IF_PRIM,
46 	HIVE_INPUT_SWITCH_SELECT_IF_PRIM,
47 	HIVE_INPUT_SWITCH_SELECT_IF_SEC,
48 	HIVE_INPUT_SWITCH_SELECT_STR_TO_MEM
49 };
50 
51 /* MW Should be part of system_global.h, where we have the main enumeration */
52 static const bool HIVE_IF_BIN_COPY[N_INPUT_FORMATTER_ID] = {
53 	false, false, false, true
54 };
55 
56 void input_formatter_rst(
57     const input_formatter_ID_t		ID)
58 {
59 	hrt_address	addr;
60 	hrt_data	rst;
61 
62 	assert(ID < N_INPUT_FORMATTER_ID);
63 
64 	addr = HIVE_IF_SRST_ADDRESS[ID];
65 	rst = HIVE_IF_SRST_MASK[ID];
66 
67 	/* TEMPORARY HACK: THIS RESET BREAKS THE METADATA FEATURE
68 	 * WICH USES THE STREAM2MEMRY BLOCK.
69 	 * MUST BE FIXED PROPERLY
70 	 */
71 	if (!HIVE_IF_BIN_COPY[ID]) {
72 		input_formatter_reg_store(ID, addr, rst);
73 	}
74 
75 	return;
76 }
77 
78 unsigned int input_formatter_get_alignment(
79     const input_formatter_ID_t		ID)
80 {
81 	assert(ID < N_INPUT_FORMATTER_ID);
82 
83 	return input_formatter_alignment[ID];
84 }
85 
86 void input_formatter_set_fifo_blocking_mode(
87     const input_formatter_ID_t		ID,
88     const bool						enable)
89 {
90 	assert(ID < N_INPUT_FORMATTER_ID);
91 
92 	/* cnd_input_formatter_reg_store() */
93 	if (!HIVE_IF_BIN_COPY[ID]) {
94 		input_formatter_reg_store(ID,
95 					  HIVE_IF_BLOCK_FIFO_NO_REQ_ADDRESS, enable);
96 	}
97 	return;
98 }
99 
100 void input_formatter_get_switch_state(
101     const input_formatter_ID_t		ID,
102     input_formatter_switch_state_t	*state)
103 {
104 	assert(ID < N_INPUT_FORMATTER_ID);
105 	assert(state);
106 
107 	/* We'll change this into an intelligent function to get switch info per IF */
108 	(void)ID;
109 
110 	state->if_input_switch_lut_reg[0] = gp_device_reg_load(GP_DEVICE0_ID,
111 					    _REG_GP_IFMT_input_switch_lut_reg0);
112 	state->if_input_switch_lut_reg[1] = gp_device_reg_load(GP_DEVICE0_ID,
113 					    _REG_GP_IFMT_input_switch_lut_reg1);
114 	state->if_input_switch_lut_reg[2] = gp_device_reg_load(GP_DEVICE0_ID,
115 					    _REG_GP_IFMT_input_switch_lut_reg2);
116 	state->if_input_switch_lut_reg[3] = gp_device_reg_load(GP_DEVICE0_ID,
117 					    _REG_GP_IFMT_input_switch_lut_reg3);
118 	state->if_input_switch_lut_reg[4] = gp_device_reg_load(GP_DEVICE0_ID,
119 					    _REG_GP_IFMT_input_switch_lut_reg4);
120 	state->if_input_switch_lut_reg[5] = gp_device_reg_load(GP_DEVICE0_ID,
121 					    _REG_GP_IFMT_input_switch_lut_reg5);
122 	state->if_input_switch_lut_reg[6] = gp_device_reg_load(GP_DEVICE0_ID,
123 					    _REG_GP_IFMT_input_switch_lut_reg6);
124 	state->if_input_switch_lut_reg[7] = gp_device_reg_load(GP_DEVICE0_ID,
125 					    _REG_GP_IFMT_input_switch_lut_reg7);
126 	state->if_input_switch_fsync_lut = gp_device_reg_load(GP_DEVICE0_ID,
127 					   _REG_GP_IFMT_input_switch_fsync_lut);
128 	state->if_input_switch_ch_id_fmt_type = gp_device_reg_load(GP_DEVICE0_ID,
129 						_REG_GP_IFMT_input_switch_ch_id_fmt_type);
130 
131 	return;
132 }
133 
134 void input_formatter_get_state(
135     const input_formatter_ID_t		ID,
136     input_formatter_state_t			*state)
137 {
138 	assert(ID < N_INPUT_FORMATTER_ID);
139 	assert(state);
140 	/*
141 		state->reset = input_formatter_reg_load(ID,
142 			HIVE_IF_RESET_ADDRESS);
143 	 */
144 	state->start_line = input_formatter_reg_load(ID,
145 			    HIVE_IF_START_LINE_ADDRESS);
146 	state->start_column = input_formatter_reg_load(ID,
147 			      HIVE_IF_START_COLUMN_ADDRESS);
148 	state->cropped_height = input_formatter_reg_load(ID,
149 				HIVE_IF_CROPPED_HEIGHT_ADDRESS);
150 	state->cropped_width = input_formatter_reg_load(ID,
151 			       HIVE_IF_CROPPED_WIDTH_ADDRESS);
152 	state->ver_decimation = input_formatter_reg_load(ID,
153 				HIVE_IF_VERTICAL_DECIMATION_ADDRESS);
154 	state->hor_decimation = input_formatter_reg_load(ID,
155 				HIVE_IF_HORIZONTAL_DECIMATION_ADDRESS);
156 	state->hor_deinterleaving = input_formatter_reg_load(ID,
157 				    HIVE_IF_H_DEINTERLEAVING_ADDRESS);
158 	state->left_padding = input_formatter_reg_load(ID,
159 			      HIVE_IF_LEFTPADDING_WIDTH_ADDRESS);
160 	state->eol_offset = input_formatter_reg_load(ID,
161 			    HIVE_IF_END_OF_LINE_OFFSET_ADDRESS);
162 	state->vmem_start_address = input_formatter_reg_load(ID,
163 				    HIVE_IF_VMEM_START_ADDRESS_ADDRESS);
164 	state->vmem_end_address = input_formatter_reg_load(ID,
165 				  HIVE_IF_VMEM_END_ADDRESS_ADDRESS);
166 	state->vmem_increment = input_formatter_reg_load(ID,
167 				HIVE_IF_VMEM_INCREMENT_ADDRESS);
168 	state->is_yuv420 = input_formatter_reg_load(ID,
169 			   HIVE_IF_YUV_420_FORMAT_ADDRESS);
170 	state->vsync_active_low = input_formatter_reg_load(ID,
171 				  HIVE_IF_VSYNCK_ACTIVE_LOW_ADDRESS);
172 	state->hsync_active_low = input_formatter_reg_load(ID,
173 				  HIVE_IF_HSYNCK_ACTIVE_LOW_ADDRESS);
174 	state->allow_fifo_overflow = input_formatter_reg_load(ID,
175 				     HIVE_IF_ALLOW_FIFO_OVERFLOW_ADDRESS);
176 	state->block_fifo_when_no_req = input_formatter_reg_load(ID,
177 					HIVE_IF_BLOCK_FIFO_NO_REQ_ADDRESS);
178 	state->ver_deinterleaving = input_formatter_reg_load(ID,
179 				    HIVE_IF_V_DEINTERLEAVING_ADDRESS);
180 	/* FSM */
181 	state->fsm_sync_status = input_formatter_reg_load(ID,
182 				 HIVE_IF_FSM_SYNC_STATUS);
183 	state->fsm_sync_counter = input_formatter_reg_load(ID,
184 				  HIVE_IF_FSM_SYNC_COUNTER);
185 	state->fsm_crop_status = input_formatter_reg_load(ID,
186 				 HIVE_IF_FSM_CROP_STATUS);
187 	state->fsm_crop_line_counter = input_formatter_reg_load(ID,
188 				       HIVE_IF_FSM_CROP_LINE_COUNTER);
189 	state->fsm_crop_pixel_counter = input_formatter_reg_load(ID,
190 					HIVE_IF_FSM_CROP_PIXEL_COUNTER);
191 	state->fsm_deinterleaving_index = input_formatter_reg_load(ID,
192 					  HIVE_IF_FSM_DEINTERLEAVING_IDX);
193 	state->fsm_dec_h_counter = input_formatter_reg_load(ID,
194 				   HIVE_IF_FSM_DECIMATION_H_COUNTER);
195 	state->fsm_dec_v_counter = input_formatter_reg_load(ID,
196 				   HIVE_IF_FSM_DECIMATION_V_COUNTER);
197 	state->fsm_dec_block_v_counter = input_formatter_reg_load(ID,
198 					 HIVE_IF_FSM_DECIMATION_BLOCK_V_COUNTER);
199 	state->fsm_padding_status = input_formatter_reg_load(ID,
200 				    HIVE_IF_FSM_PADDING_STATUS);
201 	state->fsm_padding_elem_counter = input_formatter_reg_load(ID,
202 					  HIVE_IF_FSM_PADDING_ELEMENT_COUNTER);
203 	state->fsm_vector_support_error = input_formatter_reg_load(ID,
204 					  HIVE_IF_FSM_VECTOR_SUPPORT_ERROR);
205 	state->fsm_vector_buffer_full = input_formatter_reg_load(ID,
206 					HIVE_IF_FSM_VECTOR_SUPPORT_BUFF_FULL);
207 	state->vector_support = input_formatter_reg_load(ID,
208 				HIVE_IF_FSM_VECTOR_SUPPORT);
209 	state->sensor_data_lost = input_formatter_reg_load(ID,
210 				  HIVE_IF_FIFO_SENSOR_STATUS);
211 
212 	return;
213 }
214 
215 void input_formatter_bin_get_state(
216     const input_formatter_ID_t		ID,
217     input_formatter_bin_state_t		*state)
218 {
219 	assert(ID < N_INPUT_FORMATTER_ID);
220 	assert(state);
221 
222 	state->reset = input_formatter_reg_load(ID,
223 						HIVE_STR2MEM_SOFT_RESET_REG_ADDRESS);
224 	state->input_endianness = input_formatter_reg_load(ID,
225 				  HIVE_STR2MEM_INPUT_ENDIANNESS_REG_ADDRESS);
226 	state->output_endianness = input_formatter_reg_load(ID,
227 				   HIVE_STR2MEM_OUTPUT_ENDIANNESS_REG_ADDRESS);
228 	state->bitswap = input_formatter_reg_load(ID,
229 			 HIVE_STR2MEM_BIT_SWAPPING_REG_ADDRESS);
230 	state->block_synch = input_formatter_reg_load(ID,
231 			     HIVE_STR2MEM_BLOCK_SYNC_LEVEL_REG_ADDRESS);
232 	state->packet_synch = input_formatter_reg_load(ID,
233 			      HIVE_STR2MEM_PACKET_SYNC_LEVEL_REG_ADDRESS);
234 	state->readpostwrite_synch = input_formatter_reg_load(ID,
235 				     HIVE_STR2MEM_READ_POST_WRITE_SYNC_ENABLE_REG_ADDRESS);
236 	state->is_2ppc = input_formatter_reg_load(ID,
237 			 HIVE_STR2MEM_DUAL_BYTE_INPUTS_ENABLED_REG_ADDRESS);
238 	state->en_status_update = input_formatter_reg_load(ID,
239 				  HIVE_STR2MEM_EN_STAT_UPDATE_ADDRESS);
240 	return;
241 }
242 #endif
243