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