1 /* SPDX-License-Identifier: BSD-3-Clause 2 * 3 * Copyright(c) 2019-2020 Xilinx, Inc. 4 * Copyright(c) 2018-2019 Solarflare Communications Inc. 5 */ 6 7 #ifndef _SYS_RHEAD_IMPL_H 8 #define _SYS_RHEAD_IMPL_H 9 10 #ifdef __cplusplus 11 extern "C" { 12 #endif 13 14 15 /* 16 * Riverhead requires physically contiguous event rings (so, just one 17 * DMA address is sufficient to represent it), but MCDI interface is still 18 * in terms of 4k size 4k-aligned DMA buffers. 19 */ 20 #define RHEAD_EVQ_MAXNBUFS 32 21 22 #define RHEAD_EVQ_MAXNEVS 16384 23 #define RHEAD_EVQ_MINNEVS 256 24 25 #define RHEAD_RXQ_MAXNDESCS 16384 26 #define RHEAD_RXQ_MINNDESCS 256 27 28 #define RHEAD_TXQ_MAXNDESCS 16384 29 #define RHEAD_TXQ_MINNDESCS 256 30 31 #define RHEAD_EVQ_DESC_SIZE (sizeof (efx_qword_t)) 32 #define RHEAD_RXQ_DESC_SIZE (sizeof (efx_qword_t)) 33 #define RHEAD_TXQ_DESC_SIZE (sizeof (efx_oword_t)) 34 35 #if EFSYS_OPT_EV_EXTENDED_WIDTH 36 #define RHEAD_EVQ_EW_DESC_SIZE (sizeof (efx_xword_t)) 37 #endif 38 39 40 /* NIC */ 41 42 LIBEFX_INTERNAL 43 extern __checkReturn efx_rc_t 44 rhead_board_cfg( 45 __in efx_nic_t *enp); 46 47 LIBEFX_INTERNAL 48 extern __checkReturn efx_rc_t 49 rhead_nic_probe( 50 __in efx_nic_t *enp); 51 52 LIBEFX_INTERNAL 53 extern __checkReturn efx_rc_t 54 rhead_nic_set_drv_limits( 55 __inout efx_nic_t *enp, 56 __in efx_drv_limits_t *edlp); 57 58 LIBEFX_INTERNAL 59 extern __checkReturn efx_rc_t 60 rhead_nic_get_vi_pool( 61 __in efx_nic_t *enp, 62 __out uint32_t *vi_countp); 63 64 LIBEFX_INTERNAL 65 extern __checkReturn efx_rc_t 66 rhead_nic_get_bar_region( 67 __in efx_nic_t *enp, 68 __in efx_nic_region_t region, 69 __out uint32_t *offsetp, 70 __out size_t *sizep); 71 72 LIBEFX_INTERNAL 73 extern __checkReturn efx_rc_t 74 rhead_nic_reset( 75 __in efx_nic_t *enp); 76 77 LIBEFX_INTERNAL 78 extern __checkReturn efx_rc_t 79 rhead_nic_init( 80 __in efx_nic_t *enp); 81 82 LIBEFX_INTERNAL 83 extern __checkReturn boolean_t 84 rhead_nic_hw_unavailable( 85 __in efx_nic_t *enp); 86 87 LIBEFX_INTERNAL 88 extern void 89 rhead_nic_set_hw_unavailable( 90 __in efx_nic_t *enp); 91 92 #if EFSYS_OPT_DIAG 93 94 LIBEFX_INTERNAL 95 extern __checkReturn efx_rc_t 96 rhead_nic_register_test( 97 __in efx_nic_t *enp); 98 99 #endif /* EFSYS_OPT_DIAG */ 100 101 LIBEFX_INTERNAL 102 extern void 103 rhead_nic_fini( 104 __in efx_nic_t *enp); 105 106 LIBEFX_INTERNAL 107 extern void 108 rhead_nic_unprobe( 109 __in efx_nic_t *enp); 110 111 112 /* EV */ 113 114 LIBEFX_INTERNAL 115 extern __checkReturn efx_rc_t 116 rhead_ev_init( 117 __in efx_nic_t *enp); 118 119 LIBEFX_INTERNAL 120 extern void 121 rhead_ev_fini( 122 __in efx_nic_t *enp); 123 124 LIBEFX_INTERNAL 125 extern __checkReturn efx_rc_t 126 rhead_ev_qcreate( 127 __in efx_nic_t *enp, 128 __in unsigned int index, 129 __in efsys_mem_t *esmp, 130 __in size_t ndescs, 131 __in uint32_t id, 132 __in uint32_t us, 133 __in uint32_t flags, 134 __in efx_evq_t *eep); 135 136 LIBEFX_INTERNAL 137 extern void 138 rhead_ev_qdestroy( 139 __in efx_evq_t *eep); 140 141 LIBEFX_INTERNAL 142 extern __checkReturn efx_rc_t 143 rhead_ev_qprime( 144 __in efx_evq_t *eep, 145 __in unsigned int count); 146 147 LIBEFX_INTERNAL 148 extern void 149 rhead_ev_qpost( 150 __in efx_evq_t *eep, 151 __in uint16_t data); 152 153 LIBEFX_INTERNAL 154 extern void 155 rhead_ev_qpoll( 156 __in efx_evq_t *eep, 157 __inout unsigned int *countp, 158 __in const efx_ev_callbacks_t *eecp, 159 __in_opt void *arg); 160 161 LIBEFX_INTERNAL 162 extern __checkReturn efx_rc_t 163 rhead_ev_qmoderate( 164 __in efx_evq_t *eep, 165 __in unsigned int us); 166 167 #if EFSYS_OPT_QSTATS 168 169 LIBEFX_INTERNAL 170 extern void 171 rhead_ev_qstats_update( 172 __in efx_evq_t *eep, 173 __inout_ecount(EV_NQSTATS) efsys_stat_t *stat); 174 175 #endif /* EFSYS_OPT_QSTATS */ 176 177 178 /* INTR */ 179 180 LIBEFX_INTERNAL 181 extern __checkReturn efx_rc_t 182 rhead_intr_init( 183 __in efx_nic_t *enp, 184 __in efx_intr_type_t type, 185 __in efsys_mem_t *esmp); 186 187 LIBEFX_INTERNAL 188 extern void 189 rhead_intr_enable( 190 __in efx_nic_t *enp); 191 192 LIBEFX_INTERNAL 193 extern void 194 rhead_intr_disable( 195 __in efx_nic_t *enp); 196 197 LIBEFX_INTERNAL 198 extern void 199 rhead_intr_disable_unlocked( 200 __in efx_nic_t *enp); 201 202 LIBEFX_INTERNAL 203 extern __checkReturn efx_rc_t 204 rhead_intr_trigger( 205 __in efx_nic_t *enp, 206 __in unsigned int level); 207 208 LIBEFX_INTERNAL 209 extern void 210 rhead_intr_status_line( 211 __in efx_nic_t *enp, 212 __out boolean_t *fatalp, 213 __out uint32_t *qmaskp); 214 215 LIBEFX_INTERNAL 216 extern void 217 rhead_intr_status_message( 218 __in efx_nic_t *enp, 219 __in unsigned int message, 220 __out boolean_t *fatalp); 221 222 LIBEFX_INTERNAL 223 extern void 224 rhead_intr_fatal( 225 __in efx_nic_t *enp); 226 227 LIBEFX_INTERNAL 228 extern void 229 rhead_intr_fini( 230 __in efx_nic_t *enp); 231 232 233 /* RX */ 234 235 LIBEFX_INTERNAL 236 extern __checkReturn efx_rc_t 237 rhead_rx_init( 238 __in efx_nic_t *enp); 239 240 LIBEFX_INTERNAL 241 extern void 242 rhead_rx_fini( 243 __in efx_nic_t *enp); 244 245 #if EFSYS_OPT_RX_SCATTER 246 247 LIBEFX_INTERNAL 248 extern __checkReturn efx_rc_t 249 rhead_rx_scatter_enable( 250 __in efx_nic_t *enp, 251 __in unsigned int buf_size); 252 253 #endif /* EFSYS_OPT_RX_SCATTER */ 254 255 #if EFSYS_OPT_RX_SCALE 256 257 LIBEFX_INTERNAL 258 extern __checkReturn efx_rc_t 259 rhead_rx_scale_context_alloc( 260 __in efx_nic_t *enp, 261 __in efx_rx_scale_context_type_t type, 262 __in uint32_t num_queues, 263 __out uint32_t *rss_contextp); 264 265 LIBEFX_INTERNAL 266 extern __checkReturn efx_rc_t 267 rhead_rx_scale_context_free( 268 __in efx_nic_t *enp, 269 __in uint32_t rss_context); 270 271 LIBEFX_INTERNAL 272 extern __checkReturn efx_rc_t 273 rhead_rx_scale_mode_set( 274 __in efx_nic_t *enp, 275 __in uint32_t rss_context, 276 __in efx_rx_hash_alg_t alg, 277 __in efx_rx_hash_type_t type, 278 __in boolean_t insert); 279 280 LIBEFX_INTERNAL 281 extern __checkReturn efx_rc_t 282 rhead_rx_scale_key_set( 283 __in efx_nic_t *enp, 284 __in uint32_t rss_context, 285 __in_ecount(n) uint8_t *key, 286 __in size_t n); 287 288 LIBEFX_INTERNAL 289 extern __checkReturn efx_rc_t 290 rhead_rx_scale_tbl_set( 291 __in efx_nic_t *enp, 292 __in uint32_t rss_context, 293 __in_ecount(n) unsigned int *table, 294 __in size_t n); 295 296 LIBEFX_INTERNAL 297 extern __checkReturn uint32_t 298 rhead_rx_prefix_hash( 299 __in efx_nic_t *enp, 300 __in efx_rx_hash_alg_t func, 301 __in uint8_t *buffer); 302 303 #endif /* EFSYS_OPT_RX_SCALE */ 304 305 LIBEFX_INTERNAL 306 extern __checkReturn efx_rc_t 307 rhead_rx_prefix_pktlen( 308 __in efx_nic_t *enp, 309 __in uint8_t *buffer, 310 __out uint16_t *lengthp); 311 312 LIBEFX_INTERNAL 313 extern void 314 rhead_rx_qpost( 315 __in efx_rxq_t *erp, 316 __in_ecount(ndescs) efsys_dma_addr_t *addrp, 317 __in size_t size, 318 __in unsigned int ndescs, 319 __in unsigned int completed, 320 __in unsigned int added); 321 322 LIBEFX_INTERNAL 323 extern void 324 rhead_rx_qpush( 325 __in efx_rxq_t *erp, 326 __in unsigned int added, 327 __inout unsigned int *pushedp); 328 329 LIBEFX_INTERNAL 330 extern __checkReturn efx_rc_t 331 rhead_rx_qflush( 332 __in efx_rxq_t *erp); 333 334 LIBEFX_INTERNAL 335 extern void 336 rhead_rx_qenable( 337 __in efx_rxq_t *erp); 338 339 union efx_rxq_type_data_u; 340 341 LIBEFX_INTERNAL 342 extern __checkReturn efx_rc_t 343 rhead_rx_qcreate( 344 __in efx_nic_t *enp, 345 __in unsigned int index, 346 __in unsigned int label, 347 __in efx_rxq_type_t type, 348 __in const union efx_rxq_type_data_u *type_data, 349 __in efsys_mem_t *esmp, 350 __in size_t ndescs, 351 __in uint32_t id, 352 __in unsigned int flags, 353 __in efx_evq_t *eep, 354 __in efx_rxq_t *erp); 355 356 LIBEFX_INTERNAL 357 extern void 358 rhead_rx_qdestroy( 359 __in efx_rxq_t *erp); 360 361 362 /* TX */ 363 364 LIBEFX_INTERNAL 365 extern __checkReturn efx_rc_t 366 rhead_tx_init( 367 __in efx_nic_t *enp); 368 369 LIBEFX_INTERNAL 370 extern void 371 rhead_tx_fini( 372 __in efx_nic_t *enp); 373 374 LIBEFX_INTERNAL 375 extern __checkReturn efx_rc_t 376 rhead_tx_qcreate( 377 __in efx_nic_t *enp, 378 __in unsigned int index, 379 __in unsigned int label, 380 __in efsys_mem_t *esmp, 381 __in size_t ndescs, 382 __in uint32_t id, 383 __in uint16_t flags, 384 __in efx_evq_t *eep, 385 __in efx_txq_t *etp, 386 __out unsigned int *addedp); 387 388 LIBEFX_INTERNAL 389 extern void 390 rhead_tx_qdestroy( 391 __in efx_txq_t *etp); 392 393 LIBEFX_INTERNAL 394 extern __checkReturn efx_rc_t 395 rhead_tx_qpost( 396 __in efx_txq_t *etp, 397 __in_ecount(ndescs) efx_buffer_t *ebp, 398 __in unsigned int ndescs, 399 __in unsigned int completed, 400 __inout unsigned int *addedp); 401 402 LIBEFX_INTERNAL 403 extern void 404 rhead_tx_qpush( 405 __in efx_txq_t *etp, 406 __in unsigned int added, 407 __in unsigned int pushed); 408 409 LIBEFX_INTERNAL 410 extern __checkReturn efx_rc_t 411 rhead_tx_qpace( 412 __in efx_txq_t *etp, 413 __in unsigned int ns); 414 415 LIBEFX_INTERNAL 416 extern __checkReturn efx_rc_t 417 rhead_tx_qflush( 418 __in efx_txq_t *etp); 419 420 LIBEFX_INTERNAL 421 extern void 422 rhead_tx_qenable( 423 __in efx_txq_t *etp); 424 425 LIBEFX_INTERNAL 426 extern __checkReturn efx_rc_t 427 rhead_tx_qdesc_post( 428 __in efx_txq_t *etp, 429 __in_ecount(n) efx_desc_t *ed, 430 __in unsigned int n, 431 __in unsigned int completed, 432 __inout unsigned int *addedp); 433 434 #if EFSYS_OPT_QSTATS 435 436 LIBEFX_INTERNAL 437 extern void 438 rhead_tx_qstats_update( 439 __in efx_txq_t *etp, 440 __inout_ecount(TX_NQSTATS) efsys_stat_t *stat); 441 442 #endif /* EFSYS_OPT_QSTATS */ 443 444 #if EFSYS_OPT_TUNNEL 445 446 LIBEFX_INTERNAL 447 extern __checkReturn efx_rc_t 448 rhead_tunnel_reconfigure( 449 __in efx_nic_t *enp); 450 451 LIBEFX_INTERNAL 452 extern void 453 rhead_tunnel_fini( 454 __in efx_nic_t *enp); 455 456 #endif /* EFSYS_OPT_TUNNEL */ 457 458 #if EFSYS_OPT_PCI 459 460 /* 461 * Perform discovery of function control window by looking for a 462 * EF100 locator in Xilinx capabilities tables. 463 */ 464 LIBEFX_INTERNAL 465 extern __checkReturn efx_rc_t 466 rhead_pci_nic_membar_lookup( 467 __in efsys_pci_config_t *espcp, 468 __in const efx_pci_ops_t *epop, 469 __out efx_bar_region_t *ebrp); 470 471 #endif /* EFSYS_OPT_PCI */ 472 473 LIBEFX_INTERNAL 474 extern __checkReturn efx_rc_t 475 rhead_nic_xilinx_cap_tbl_read_ef100_locator( 476 __in efsys_bar_t *esbp, 477 __in efsys_dma_addr_t offset, 478 __out efx_bar_region_t *ebrp); 479 480 #ifdef __cplusplus 481 } 482 #endif 483 484 #endif /* _SYS_RHEAD_IMPL_H */ 485