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 
7 #include "fifo_monitor.h"
8 
9 #include <type_support.h>
10 #include "device_access.h"
11 
12 #include <bits.h>
13 
14 #include "gp_device.h"
15 
16 #include "assert_support.h"
17 
18 #ifndef __INLINE_FIFO_MONITOR__
19 #define STORAGE_CLASS_FIFO_MONITOR_DATA static const
20 #else
21 #define STORAGE_CLASS_FIFO_MONITOR_DATA const
22 #endif /* __INLINE_FIFO_MONITOR__ */
23 
24 STORAGE_CLASS_FIFO_MONITOR_DATA unsigned int FIFO_SWITCH_ADDR[N_FIFO_SWITCH] = {
25 	_REG_GP_SWITCH_IF_ADDR,
26 	_REG_GP_SWITCH_GDC1_ADDR,
27 	_REG_GP_SWITCH_GDC2_ADDR
28 };
29 
30 #ifndef __INLINE_FIFO_MONITOR__
31 #include "fifo_monitor_private.h"
32 #endif /* __INLINE_FIFO_MONITOR__ */
33 
34 static inline bool fifo_monitor_status_valid(
35     const fifo_monitor_ID_t		ID,
36     const unsigned int			reg,
37     const unsigned int			port_id);
38 
39 static inline bool fifo_monitor_status_accept(
40     const fifo_monitor_ID_t		ID,
41     const unsigned int			reg,
42     const unsigned int			port_id);
43 
fifo_channel_get_state(const fifo_monitor_ID_t ID,const fifo_channel_t channel_id,fifo_channel_state_t * state)44 void fifo_channel_get_state(
45     const fifo_monitor_ID_t		ID,
46     const fifo_channel_t		channel_id,
47     fifo_channel_state_t		*state)
48 {
49 	assert(channel_id < N_FIFO_CHANNEL);
50 	assert(state);
51 
52 	switch (channel_id) {
53 	case FIFO_CHANNEL_ISP0_TO_SP0:
54 		state->src_valid   = fifo_monitor_status_valid(ID,
55 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
56 				     ISP_STR_MON_PORT_SND_SP); /* ISP_STR_MON_PORT_ISP2SP */
57 		state->fifo_accept = fifo_monitor_status_accept(ID,
58 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
59 				     ISP_STR_MON_PORT_SND_SP);
60 		state->fifo_valid  = fifo_monitor_status_valid(ID,
61 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
62 				     SP_STR_MON_PORT_RCV_ISP); /* ISP_STR_MON_PORT_SP2ISP */
63 		state->sink_accept = fifo_monitor_status_accept(ID,
64 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
65 				     SP_STR_MON_PORT_RCV_ISP);
66 		break;
67 	case FIFO_CHANNEL_SP0_TO_ISP0:
68 		state->src_valid   = fifo_monitor_status_valid(ID,
69 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
70 				     SP_STR_MON_PORT_SND_ISP); /* ISP_STR_MON_PORT_SP2ISP */
71 		state->fifo_accept = fifo_monitor_status_accept(ID,
72 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
73 				     SP_STR_MON_PORT_SND_ISP);
74 		state->fifo_valid  = fifo_monitor_status_valid(ID,
75 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
76 				     ISP_STR_MON_PORT_RCV_SP); /* ISP_STR_MON_PORT_ISP2SP */
77 		state->sink_accept = fifo_monitor_status_accept(ID,
78 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
79 				     ISP_STR_MON_PORT_RCV_SP);
80 		break;
81 	case FIFO_CHANNEL_ISP0_TO_IF0:
82 		state->src_valid   = fifo_monitor_status_valid(ID,
83 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
84 				     ISP_STR_MON_PORT_SND_PIF_A); /* ISP_STR_MON_PORT_ISP2PIFA */
85 		state->fifo_accept = fifo_monitor_status_accept(ID,
86 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
87 				     ISP_STR_MON_PORT_SND_PIF_A);
88 		state->fifo_valid  = fifo_monitor_status_valid(ID,
89 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
90 				     MOD_STR_MON_PORT_RCV_PIF_A); /* MOD_STR_MON_PORT_CELLS2PIFA */
91 		state->sink_accept = fifo_monitor_status_accept(ID,
92 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
93 				     MOD_STR_MON_PORT_RCV_PIF_A);
94 		break;
95 	case FIFO_CHANNEL_IF0_TO_ISP0:
96 		state->src_valid   = fifo_monitor_status_valid(ID,
97 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
98 				     MOD_STR_MON_PORT_SND_PIF_A); /* MOD_STR_MON_PORT_PIFA2CELLS */
99 		state->fifo_accept = fifo_monitor_status_accept(ID,
100 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
101 				     MOD_STR_MON_PORT_SND_PIF_A);
102 		state->fifo_valid  = fifo_monitor_status_valid(ID,
103 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
104 				     ISP_STR_MON_PORT_RCV_PIF_A); /* ISP_STR_MON_PORT_PIFA2ISP */
105 		state->sink_accept = fifo_monitor_status_accept(ID,
106 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
107 				     ISP_STR_MON_PORT_RCV_PIF_A);
108 		break;
109 	case FIFO_CHANNEL_ISP0_TO_IF1:
110 		state->src_valid   = fifo_monitor_status_valid(ID,
111 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
112 				     ISP_STR_MON_PORT_SND_PIF_B); /* ISP_STR_MON_PORT_ISP2PIFA */
113 		state->fifo_accept = fifo_monitor_status_accept(ID,
114 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
115 				     ISP_STR_MON_PORT_SND_PIF_B);
116 		state->fifo_valid  = fifo_monitor_status_valid(ID,
117 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
118 				     MOD_STR_MON_PORT_RCV_PIF_B); /* MOD_STR_MON_PORT_CELLS2PIFB */
119 		state->sink_accept = fifo_monitor_status_accept(ID,
120 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
121 				     MOD_STR_MON_PORT_RCV_PIF_B);
122 		break;
123 	case FIFO_CHANNEL_IF1_TO_ISP0:
124 		state->src_valid   = fifo_monitor_status_valid(ID,
125 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
126 				     MOD_STR_MON_PORT_SND_PIF_B); /* MOD_STR_MON_PORT_PIFB2CELLS */
127 		state->fifo_accept = fifo_monitor_status_accept(ID,
128 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
129 				     MOD_STR_MON_PORT_SND_PIF_B);
130 		state->fifo_valid  = fifo_monitor_status_valid(ID,
131 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
132 				     ISP_STR_MON_PORT_RCV_PIF_B); /* ISP_STR_MON_PORT_PIFB2ISP */
133 		state->sink_accept = fifo_monitor_status_accept(ID,
134 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
135 				     ISP_STR_MON_PORT_RCV_PIF_B);
136 		break;
137 	case FIFO_CHANNEL_ISP0_TO_DMA0:
138 		state->src_valid   = fifo_monitor_status_valid(ID,
139 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
140 				     ISP_STR_MON_PORT_SND_DMA); /* ISP_STR_MON_PORT_ISP2DMA */
141 		state->fifo_accept = fifo_monitor_status_accept(ID,
142 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
143 				     ISP_STR_MON_PORT_SND_DMA);
144 		state->fifo_valid  = fifo_monitor_status_valid(ID,
145 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
146 				     MOD_STR_MON_PORT_RCV_DMA_FR_ISP); /* MOD_STR_MON_PORT_ISP2DMA */
147 		state->sink_accept = fifo_monitor_status_accept(ID,
148 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
149 				     MOD_STR_MON_PORT_RCV_DMA_FR_ISP);
150 		break;
151 	case FIFO_CHANNEL_DMA0_TO_ISP0:
152 		state->src_valid   = fifo_monitor_status_valid(ID,
153 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
154 				     MOD_STR_MON_PORT_SND_DMA2ISP); /* MOD_STR_MON_PORT_DMA2ISP */
155 		state->fifo_accept = fifo_monitor_status_accept(ID,
156 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
157 				     MOD_STR_MON_PORT_SND_DMA2ISP);
158 		state->fifo_valid  = fifo_monitor_status_valid(ID,
159 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
160 				     ISP_STR_MON_PORT_RCV_DMA); /* ISP_STR_MON_PORT_DMA2ISP */
161 		state->sink_accept = fifo_monitor_status_accept(ID,
162 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
163 				     ISP_STR_MON_PORT_RCV_DMA);
164 		break;
165 	case FIFO_CHANNEL_ISP0_TO_GDC0:
166 		state->src_valid   = fifo_monitor_status_valid(ID,
167 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
168 				     ISP_STR_MON_PORT_SND_GDC); /* ISP_STR_MON_PORT_ISP2GDC1 */
169 		state->fifo_accept = fifo_monitor_status_accept(ID,
170 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
171 				     ISP_STR_MON_PORT_SND_GDC);
172 		state->fifo_valid  = fifo_monitor_status_valid(ID,
173 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
174 				     MOD_STR_MON_PORT_RCV_GDC); /* MOD_STR_MON_PORT_CELLS2GDC1 */
175 		state->sink_accept = fifo_monitor_status_accept(ID,
176 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
177 				     MOD_STR_MON_PORT_RCV_GDC);
178 		break;
179 	case FIFO_CHANNEL_GDC0_TO_ISP0:
180 		state->fifo_valid  = fifo_monitor_status_valid(ID,
181 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
182 				     MOD_STR_MON_PORT_SND_GDC); /* MOD_STR_MON_PORT_GDC12CELLS */
183 		state->sink_accept = fifo_monitor_status_accept(ID,
184 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
185 				     MOD_STR_MON_PORT_SND_GDC);
186 		state->src_valid   = fifo_monitor_status_valid(ID,
187 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
188 				     ISP_STR_MON_PORT_RCV_GDC); /* ISP_STR_MON_PORT_GDC12ISP */
189 		state->fifo_accept = fifo_monitor_status_accept(ID,
190 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
191 				     ISP_STR_MON_PORT_RCV_GDC);
192 		break;
193 	case FIFO_CHANNEL_ISP0_TO_GDC1:
194 		state->src_valid   = fifo_monitor_status_valid(ID,
195 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
196 				     ISP_STR_MON_PORT_ISP2GDC2);
197 		state->fifo_accept = fifo_monitor_status_accept(ID,
198 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
199 				     ISP_STR_MON_PORT_ISP2GDC2);
200 		state->fifo_valid  = fifo_monitor_status_valid(ID,
201 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
202 				     MOD_STR_MON_PORT_CELLS2GDC2);
203 		state->sink_accept = fifo_monitor_status_accept(ID,
204 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
205 				     MOD_STR_MON_PORT_CELLS2GDC2);
206 		break;
207 	case FIFO_CHANNEL_GDC1_TO_ISP0:
208 		state->fifo_valid  = fifo_monitor_status_valid(ID,
209 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
210 				     MOD_STR_MON_PORT_GDC22CELLS);
211 		state->sink_accept = fifo_monitor_status_accept(ID,
212 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
213 				     MOD_STR_MON_PORT_GDC22CELLS);
214 		state->src_valid   = fifo_monitor_status_valid(ID,
215 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
216 				     ISP_STR_MON_PORT_GDC22ISP);
217 		state->fifo_accept = fifo_monitor_status_accept(ID,
218 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
219 				     ISP_STR_MON_PORT_GDC22ISP);
220 		break;
221 	case FIFO_CHANNEL_ISP0_TO_HOST0:
222 		state->src_valid   = fifo_monitor_status_valid(ID,
223 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
224 				     ISP_STR_MON_PORT_SND_GPD); /* ISP_STR_MON_PORT_ISP2GPD */
225 		state->fifo_accept = fifo_monitor_status_accept(ID,
226 				     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
227 				     ISP_STR_MON_PORT_SND_GPD);
228 		{
229 			hrt_data	value = ia_css_device_load_uint32(0x0000000000380014ULL);
230 
231 			state->fifo_valid  = !_hrt_get_bit(value, 0);
232 			state->sink_accept = false; /* no monitor connected */
233 		}
234 		break;
235 	case FIFO_CHANNEL_HOST0_TO_ISP0: {
236 		hrt_data	value = ia_css_device_load_uint32(0x000000000038001CULL);
237 
238 		state->fifo_valid  = false; /* no monitor connected */
239 		state->sink_accept = !_hrt_get_bit(value, 0);
240 	}
241 	state->src_valid   = fifo_monitor_status_valid(ID,
242 			     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
243 				     ISP_STR_MON_PORT_RCV_GPD); /* ISP_STR_MON_PORT_FA2ISP */
244 	state->fifo_accept = fifo_monitor_status_accept(ID,
245 			     HIVE_GP_REGS_ISP_STREAM_STAT_IDX,
246 			     ISP_STR_MON_PORT_RCV_GPD);
247 	break;
248 	case FIFO_CHANNEL_SP0_TO_IF0:
249 		state->src_valid   = fifo_monitor_status_valid(ID,
250 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
251 				     SP_STR_MON_PORT_SND_PIF_A); /* SP_STR_MON_PORT_SP2PIFA */
252 		state->fifo_accept = fifo_monitor_status_accept(ID,
253 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
254 				     SP_STR_MON_PORT_SND_PIF_A);
255 		state->fifo_valid  = fifo_monitor_status_valid(ID,
256 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
257 				     MOD_STR_MON_PORT_RCV_PIF_A); /* MOD_STR_MON_PORT_CELLS2PIFA */
258 		state->sink_accept = fifo_monitor_status_accept(ID,
259 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
260 				     MOD_STR_MON_PORT_RCV_PIF_A);
261 		break;
262 	case FIFO_CHANNEL_IF0_TO_SP0:
263 		state->src_valid   = fifo_monitor_status_valid(ID,
264 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
265 				     MOD_STR_MON_PORT_SND_PIF_A); /* MOD_STR_MON_PORT_PIFA2CELLS */
266 		state->fifo_accept = fifo_monitor_status_accept(ID,
267 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
268 				     MOD_STR_MON_PORT_SND_PIF_A);
269 		state->fifo_valid  = fifo_monitor_status_valid(ID,
270 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
271 				     SP_STR_MON_PORT_RCV_PIF_A); /* SP_STR_MON_PORT_PIFA2SP */
272 		state->sink_accept = fifo_monitor_status_accept(ID,
273 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
274 				     SP_STR_MON_PORT_RCV_PIF_A);
275 		break;
276 	case FIFO_CHANNEL_SP0_TO_IF1:
277 		state->src_valid   = fifo_monitor_status_valid(ID,
278 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
279 				     SP_STR_MON_PORT_SND_PIF_B); /* SP_STR_MON_PORT_SP2PIFB */
280 		state->fifo_accept = fifo_monitor_status_accept(ID,
281 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
282 				     SP_STR_MON_PORT_SND_PIF_B);
283 		state->fifo_valid  = fifo_monitor_status_valid(ID,
284 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
285 				     MOD_STR_MON_PORT_RCV_PIF_B); /* MOD_STR_MON_PORT_CELLS2PIFB */
286 		state->sink_accept = fifo_monitor_status_accept(ID,
287 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
288 				     MOD_STR_MON_PORT_RCV_PIF_B);
289 		break;
290 	case FIFO_CHANNEL_IF1_TO_SP0:
291 		state->src_valid   = fifo_monitor_status_valid(ID,
292 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
293 				     MOD_STR_MON_PORT_SND_PIF_B); /* MOD_STR_MON_PORT_PIFB2CELLS */
294 		state->fifo_accept = fifo_monitor_status_accept(ID,
295 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
296 				     MOD_STR_MON_PORT_SND_PIF_B);
297 		state->fifo_valid  = fifo_monitor_status_valid(ID,
298 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
299 				     ISP_STR_MON_PORT_RCV_PIF_B); /* SP_STR_MON_PORT_PIFB2SP */
300 		state->sink_accept = fifo_monitor_status_accept(ID,
301 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
302 				     ISP_STR_MON_PORT_RCV_PIF_B);
303 		break;
304 	case FIFO_CHANNEL_SP0_TO_IF2:
305 		state->src_valid   = fifo_monitor_status_valid(ID,
306 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
307 				     SP_STR_MON_PORT_SND_SIF); /* SP_STR_MON_PORT_SP2SIF */
308 		state->fifo_accept = fifo_monitor_status_accept(ID,
309 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
310 				     SP_STR_MON_PORT_SND_SIF);
311 		state->fifo_valid  = fifo_monitor_status_valid(ID,
312 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
313 				     MOD_STR_MON_PORT_RCV_SIF); /* MOD_STR_MON_PORT_SP2SIF */
314 		state->sink_accept = fifo_monitor_status_accept(ID,
315 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
316 				     MOD_STR_MON_PORT_RCV_SIF);
317 		break;
318 	case FIFO_CHANNEL_IF2_TO_SP0:
319 		state->src_valid   = fifo_monitor_status_valid(ID,
320 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
321 				     MOD_STR_MON_PORT_SND_SIF); /* MOD_STR_MON_PORT_SIF2SP */
322 		state->fifo_accept = fifo_monitor_status_accept(ID,
323 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
324 				     MOD_STR_MON_PORT_SND_SIF);
325 		state->fifo_valid  = fifo_monitor_status_valid(ID,
326 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
327 				     SP_STR_MON_PORT_RCV_SIF); /* SP_STR_MON_PORT_SIF2SP */
328 		state->sink_accept = fifo_monitor_status_accept(ID,
329 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
330 				     SP_STR_MON_PORT_RCV_SIF);
331 		break;
332 	case FIFO_CHANNEL_SP0_TO_DMA0:
333 		state->src_valid   = fifo_monitor_status_valid(ID,
334 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
335 				     SP_STR_MON_PORT_SND_DMA); /* SP_STR_MON_PORT_SP2DMA */
336 		state->fifo_accept = fifo_monitor_status_accept(ID,
337 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
338 				     SP_STR_MON_PORT_SND_DMA);
339 		state->fifo_valid  = fifo_monitor_status_valid(ID,
340 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
341 				     MOD_STR_MON_PORT_RCV_DMA_FR_SP); /* MOD_STR_MON_PORT_SP2DMA */
342 		state->sink_accept = fifo_monitor_status_accept(ID,
343 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
344 				     MOD_STR_MON_PORT_RCV_DMA_FR_SP);
345 		break;
346 	case FIFO_CHANNEL_DMA0_TO_SP0:
347 		state->src_valid   = fifo_monitor_status_valid(ID,
348 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
349 				     MOD_STR_MON_PORT_SND_DMA2SP); /* MOD_STR_MON_PORT_DMA2SP */
350 		state->fifo_accept = fifo_monitor_status_accept(ID,
351 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
352 				     MOD_STR_MON_PORT_SND_DMA2SP);
353 		state->fifo_valid  = fifo_monitor_status_valid(ID,
354 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
355 				     SP_STR_MON_PORT_RCV_DMA); /* SP_STR_MON_PORT_DMA2SP */
356 		state->sink_accept = fifo_monitor_status_accept(ID,
357 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
358 				     SP_STR_MON_PORT_RCV_DMA);
359 		break;
360 	case FIFO_CHANNEL_SP0_TO_GDC0:
361 		state->src_valid   = fifo_monitor_status_valid(ID,
362 				     HIVE_GP_REGS_SP_STREAM_STAT_B_IDX,
363 				     SP_STR_MON_PORT_B_SP2GDC1);
364 		state->fifo_accept = fifo_monitor_status_accept(ID,
365 				     HIVE_GP_REGS_SP_STREAM_STAT_B_IDX,
366 				     SP_STR_MON_PORT_B_SP2GDC1);
367 		state->fifo_valid  = fifo_monitor_status_valid(ID,
368 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
369 				     MOD_STR_MON_PORT_CELLS2GDC1);
370 		state->sink_accept = fifo_monitor_status_accept(ID,
371 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
372 				     MOD_STR_MON_PORT_CELLS2GDC1);
373 		break;
374 	case FIFO_CHANNEL_GDC0_TO_SP0:
375 		state->fifo_valid  = fifo_monitor_status_valid(ID,
376 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
377 				     MOD_STR_MON_PORT_GDC12CELLS);
378 		state->sink_accept = fifo_monitor_status_accept(ID,
379 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
380 				     MOD_STR_MON_PORT_GDC12CELLS);
381 		state->src_valid   = fifo_monitor_status_valid(ID,
382 				     HIVE_GP_REGS_SP_STREAM_STAT_B_IDX,
383 				     SP_STR_MON_PORT_B_GDC12SP);
384 		state->fifo_accept = fifo_monitor_status_accept(ID,
385 				     HIVE_GP_REGS_SP_STREAM_STAT_B_IDX,
386 				     SP_STR_MON_PORT_B_GDC12SP);
387 		break;
388 	case FIFO_CHANNEL_SP0_TO_GDC1:
389 		state->src_valid   = fifo_monitor_status_valid(ID,
390 				     HIVE_GP_REGS_SP_STREAM_STAT_B_IDX,
391 				     SP_STR_MON_PORT_B_SP2GDC2);
392 		state->fifo_accept = fifo_monitor_status_accept(ID,
393 				     HIVE_GP_REGS_SP_STREAM_STAT_B_IDX,
394 				     SP_STR_MON_PORT_B_SP2GDC2);
395 		state->fifo_valid  = fifo_monitor_status_valid(ID,
396 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
397 				     MOD_STR_MON_PORT_CELLS2GDC2);
398 		state->sink_accept = fifo_monitor_status_accept(ID,
399 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
400 				     MOD_STR_MON_PORT_CELLS2GDC2);
401 		break;
402 	case FIFO_CHANNEL_GDC1_TO_SP0:
403 		state->fifo_valid  = fifo_monitor_status_valid(ID,
404 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
405 				     MOD_STR_MON_PORT_GDC22CELLS);
406 		state->sink_accept = fifo_monitor_status_accept(ID,
407 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
408 				     MOD_STR_MON_PORT_GDC22CELLS);
409 		state->src_valid   = fifo_monitor_status_valid(ID,
410 				     HIVE_GP_REGS_SP_STREAM_STAT_B_IDX,
411 				     SP_STR_MON_PORT_B_GDC22SP);
412 		state->fifo_accept = fifo_monitor_status_accept(ID,
413 				     HIVE_GP_REGS_SP_STREAM_STAT_B_IDX,
414 				     SP_STR_MON_PORT_B_GDC22SP);
415 		break;
416 	case FIFO_CHANNEL_SP0_TO_HOST0:
417 		state->src_valid   = fifo_monitor_status_valid(ID,
418 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
419 				     SP_STR_MON_PORT_SND_GPD); /* SP_STR_MON_PORT_SP2GPD */
420 		state->fifo_accept = fifo_monitor_status_accept(ID,
421 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
422 				     SP_STR_MON_PORT_SND_GPD);
423 		{
424 			hrt_data	value = ia_css_device_load_uint32(0x0000000000380010ULL);
425 
426 			state->fifo_valid  = !_hrt_get_bit(value, 0);
427 			state->sink_accept = false; /* no monitor connected */
428 		}
429 		break;
430 	case FIFO_CHANNEL_HOST0_TO_SP0: {
431 		hrt_data	value = ia_css_device_load_uint32(0x0000000000380018ULL);
432 
433 		state->fifo_valid  = false; /* no monitor connected */
434 		state->sink_accept = !_hrt_get_bit(value, 0);
435 	}
436 	state->src_valid   = fifo_monitor_status_valid(ID,
437 			     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
438 				     SP_STR_MON_PORT_RCV_GPD); /* SP_STR_MON_PORT_FA2SP */
439 	state->fifo_accept = fifo_monitor_status_accept(ID,
440 			     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
441 			     SP_STR_MON_PORT_RCV_GPD);
442 	break;
443 	case FIFO_CHANNEL_SP0_TO_STREAM2MEM0:
444 		state->src_valid   = fifo_monitor_status_valid(ID,
445 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
446 				     SP_STR_MON_PORT_SND_MC); /* SP_STR_MON_PORT_SP2MC */
447 		state->fifo_accept = fifo_monitor_status_accept(ID,
448 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
449 				     SP_STR_MON_PORT_SND_MC);
450 		state->fifo_valid  = fifo_monitor_status_valid(ID,
451 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
452 				     MOD_STR_MON_PORT_RCV_MC); /* MOD_STR_MON_PORT_SP2MC */
453 		state->sink_accept = fifo_monitor_status_accept(ID,
454 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
455 				     MOD_STR_MON_PORT_RCV_MC);
456 		break;
457 	case FIFO_CHANNEL_STREAM2MEM0_TO_SP0:
458 		state->fifo_valid  = fifo_monitor_status_valid(ID,
459 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
460 				     MOD_STR_MON_PORT_SND_MC); /* SP_STR_MON_PORT_MC2SP */
461 		state->sink_accept = fifo_monitor_status_accept(ID,
462 				     HIVE_GP_REGS_MOD_STREAM_STAT_IDX,
463 				     MOD_STR_MON_PORT_SND_MC);
464 		state->src_valid   = fifo_monitor_status_valid(ID,
465 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
466 				     SP_STR_MON_PORT_RCV_MC); /* MOD_STR_MON_PORT_MC2SP */
467 		state->fifo_accept = fifo_monitor_status_accept(ID,
468 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
469 				     SP_STR_MON_PORT_RCV_MC);
470 		break;
471 	case FIFO_CHANNEL_SP0_TO_INPUT_SYSTEM0:
472 		state->src_valid   = fifo_monitor_status_valid(ID,
473 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
474 				     SP_STR_MON_PORT_SP2ISYS);
475 		state->fifo_accept = fifo_monitor_status_accept(ID,
476 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
477 				     SP_STR_MON_PORT_SP2ISYS);
478 		state->fifo_valid  = false;
479 		state->sink_accept = false;
480 		break;
481 	case FIFO_CHANNEL_INPUT_SYSTEM0_TO_SP0:
482 		state->fifo_valid  = false;
483 		state->sink_accept = false;
484 		state->src_valid   = fifo_monitor_status_valid(ID,
485 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
486 				     SP_STR_MON_PORT_ISYS2SP);
487 		state->fifo_accept = fifo_monitor_status_accept(ID,
488 				     HIVE_GP_REGS_SP_STREAM_STAT_IDX,
489 				     SP_STR_MON_PORT_ISYS2SP);
490 		break;
491 	default:
492 		assert(0);
493 		break;
494 	}
495 
496 	return;
497 }
498 
fifo_switch_get_state(const fifo_monitor_ID_t ID,const fifo_switch_t switch_id,fifo_switch_state_t * state)499 void fifo_switch_get_state(
500     const fifo_monitor_ID_t		ID,
501     const fifo_switch_t			switch_id,
502     fifo_switch_state_t			*state)
503 {
504 	hrt_data		data = (hrt_data)-1;
505 
506 	assert(ID == FIFO_MONITOR0_ID);
507 	assert(switch_id < N_FIFO_SWITCH);
508 	assert(state);
509 
510 	(void)ID;
511 
512 	data = gp_device_reg_load(GP_DEVICE0_ID, FIFO_SWITCH_ADDR[switch_id]);
513 
514 	state->is_none = (data == HIVE_ISP_CSS_STREAM_SWITCH_NONE);
515 	state->is_sp = (data == HIVE_ISP_CSS_STREAM_SWITCH_SP);
516 	state->is_isp = (data == HIVE_ISP_CSS_STREAM_SWITCH_ISP);
517 
518 	return;
519 }
520 
fifo_monitor_get_state(const fifo_monitor_ID_t ID,fifo_monitor_state_t * state)521 void fifo_monitor_get_state(
522     const fifo_monitor_ID_t		ID,
523     fifo_monitor_state_t		*state)
524 {
525 	fifo_channel_t	ch_id;
526 	fifo_switch_t	sw_id;
527 
528 	assert(ID < N_FIFO_MONITOR_ID);
529 	assert(state);
530 
531 	for (ch_id = 0; ch_id < N_FIFO_CHANNEL; ch_id++) {
532 		fifo_channel_get_state(ID, ch_id,
533 				       &state->fifo_channels[ch_id]);
534 	}
535 
536 	for (sw_id = 0; sw_id < N_FIFO_SWITCH; sw_id++) {
537 		fifo_switch_get_state(ID, sw_id,
538 				      &state->fifo_switches[sw_id]);
539 	}
540 	return;
541 }
542 
fifo_monitor_status_valid(const fifo_monitor_ID_t ID,const unsigned int reg,const unsigned int port_id)543 static inline bool fifo_monitor_status_valid(
544     const fifo_monitor_ID_t		ID,
545     const unsigned int			reg,
546     const unsigned int			port_id)
547 {
548 	hrt_data	data = fifo_monitor_reg_load(ID, reg);
549 
550 	return (data >> (((port_id * 2) + _hive_str_mon_valid_offset))) & 0x1;
551 }
552 
fifo_monitor_status_accept(const fifo_monitor_ID_t ID,const unsigned int reg,const unsigned int port_id)553 static inline bool fifo_monitor_status_accept(
554     const fifo_monitor_ID_t		ID,
555     const unsigned int			reg,
556     const unsigned int			port_id)
557 {
558 	hrt_data	data = fifo_monitor_reg_load(ID, reg);
559 
560 	return (data >> (((port_id * 2) + _hive_str_mon_accept_offset))) & 0x1;
561 }
562