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 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 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 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 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 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