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