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