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