1 /* SPDX-License-Identifier: BSD-3-Clause 2 * 3 * Copyright(c) 2019-2021 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 uint32_t irq, 135 __in efx_evq_t *eep); 136 137 LIBEFX_INTERNAL 138 extern void 139 rhead_ev_qdestroy( 140 __in efx_evq_t *eep); 141 142 LIBEFX_INTERNAL 143 extern __checkReturn efx_rc_t 144 rhead_ev_qprime( 145 __in efx_evq_t *eep, 146 __in unsigned int count); 147 148 LIBEFX_INTERNAL 149 extern void 150 rhead_ev_qpost( 151 __in efx_evq_t *eep, 152 __in uint16_t data); 153 154 LIBEFX_INTERNAL 155 extern void 156 rhead_ev_qpoll( 157 __in efx_evq_t *eep, 158 __inout unsigned int *countp, 159 __in const efx_ev_callbacks_t *eecp, 160 __in_opt void *arg); 161 162 LIBEFX_INTERNAL 163 extern __checkReturn efx_rc_t 164 rhead_ev_qmoderate( 165 __in efx_evq_t *eep, 166 __in unsigned int us); 167 168 #if EFSYS_OPT_QSTATS 169 170 LIBEFX_INTERNAL 171 extern void 172 rhead_ev_qstats_update( 173 __in efx_evq_t *eep, 174 __inout_ecount(EV_NQSTATS) efsys_stat_t *stat); 175 176 #endif /* EFSYS_OPT_QSTATS */ 177 178 179 /* INTR */ 180 181 LIBEFX_INTERNAL 182 extern __checkReturn efx_rc_t 183 rhead_intr_init( 184 __in efx_nic_t *enp, 185 __in efx_intr_type_t type, 186 __in efsys_mem_t *esmp); 187 188 LIBEFX_INTERNAL 189 extern void 190 rhead_intr_enable( 191 __in efx_nic_t *enp); 192 193 LIBEFX_INTERNAL 194 extern void 195 rhead_intr_disable( 196 __in efx_nic_t *enp); 197 198 LIBEFX_INTERNAL 199 extern void 200 rhead_intr_disable_unlocked( 201 __in efx_nic_t *enp); 202 203 LIBEFX_INTERNAL 204 extern __checkReturn efx_rc_t 205 rhead_intr_trigger( 206 __in efx_nic_t *enp, 207 __in unsigned int level); 208 209 LIBEFX_INTERNAL 210 extern void 211 rhead_intr_status_line( 212 __in efx_nic_t *enp, 213 __out boolean_t *fatalp, 214 __out uint32_t *qmaskp); 215 216 LIBEFX_INTERNAL 217 extern void 218 rhead_intr_status_message( 219 __in efx_nic_t *enp, 220 __in unsigned int message, 221 __out boolean_t *fatalp); 222 223 LIBEFX_INTERNAL 224 extern void 225 rhead_intr_fatal( 226 __in efx_nic_t *enp); 227 228 LIBEFX_INTERNAL 229 extern void 230 rhead_intr_fini( 231 __in efx_nic_t *enp); 232 233 234 /* RX */ 235 236 LIBEFX_INTERNAL 237 extern __checkReturn efx_rc_t 238 rhead_rx_init( 239 __in efx_nic_t *enp); 240 241 LIBEFX_INTERNAL 242 extern void 243 rhead_rx_fini( 244 __in efx_nic_t *enp); 245 246 #if EFSYS_OPT_RX_SCATTER 247 248 LIBEFX_INTERNAL 249 extern __checkReturn efx_rc_t 250 rhead_rx_scatter_enable( 251 __in efx_nic_t *enp, 252 __in unsigned int buf_size); 253 254 #endif /* EFSYS_OPT_RX_SCATTER */ 255 256 #if EFSYS_OPT_RX_SCALE 257 258 LIBEFX_INTERNAL 259 extern __checkReturn efx_rc_t 260 rhead_rx_scale_context_alloc( 261 __in efx_nic_t *enp, 262 __in efx_rx_scale_context_type_t type, 263 __in uint32_t num_queues, 264 __in uint32_t table_nentries, 265 __out uint32_t *rss_contextp); 266 267 LIBEFX_INTERNAL 268 extern __checkReturn efx_rc_t 269 rhead_rx_scale_context_free( 270 __in efx_nic_t *enp, 271 __in uint32_t rss_context); 272 273 LIBEFX_INTERNAL 274 extern __checkReturn efx_rc_t 275 rhead_rx_scale_mode_set( 276 __in efx_nic_t *enp, 277 __in uint32_t rss_context, 278 __in efx_rx_hash_alg_t alg, 279 __in efx_rx_hash_type_t type, 280 __in boolean_t insert); 281 282 LIBEFX_INTERNAL 283 extern __checkReturn efx_rc_t 284 rhead_rx_scale_key_set( 285 __in efx_nic_t *enp, 286 __in uint32_t rss_context, 287 __in_ecount(n) uint8_t *key, 288 __in size_t n); 289 290 LIBEFX_INTERNAL 291 extern __checkReturn efx_rc_t 292 rhead_rx_scale_tbl_set( 293 __in efx_nic_t *enp, 294 __in uint32_t rss_context, 295 __in_ecount(nentries) unsigned int *table, 296 __in size_t nentries); 297 298 LIBEFX_INTERNAL 299 extern __checkReturn uint32_t 300 rhead_rx_prefix_hash( 301 __in efx_nic_t *enp, 302 __in efx_rx_hash_alg_t func, 303 __in uint8_t *buffer); 304 305 #endif /* EFSYS_OPT_RX_SCALE */ 306 307 LIBEFX_INTERNAL 308 extern __checkReturn efx_rc_t 309 rhead_rx_prefix_pktlen( 310 __in efx_nic_t *enp, 311 __in uint8_t *buffer, 312 __out uint16_t *lengthp); 313 314 LIBEFX_INTERNAL 315 extern void 316 rhead_rx_qpost( 317 __in efx_rxq_t *erp, 318 __in_ecount(ndescs) efsys_dma_addr_t *addrp, 319 __in size_t size, 320 __in unsigned int ndescs, 321 __in unsigned int completed, 322 __in unsigned int added); 323 324 LIBEFX_INTERNAL 325 extern void 326 rhead_rx_qpush( 327 __in efx_rxq_t *erp, 328 __in unsigned int added, 329 __inout unsigned int *pushedp); 330 331 LIBEFX_INTERNAL 332 extern __checkReturn efx_rc_t 333 rhead_rx_qflush( 334 __in efx_rxq_t *erp); 335 336 LIBEFX_INTERNAL 337 extern void 338 rhead_rx_qenable( 339 __in efx_rxq_t *erp); 340 341 union efx_rxq_type_data_u; 342 343 LIBEFX_INTERNAL 344 extern __checkReturn efx_rc_t 345 rhead_rx_qcreate( 346 __in efx_nic_t *enp, 347 __in unsigned int index, 348 __in unsigned int label, 349 __in efx_rxq_type_t type, 350 __in const union efx_rxq_type_data_u *type_data, 351 __in efsys_mem_t *esmp, 352 __in size_t ndescs, 353 __in uint32_t id, 354 __in unsigned int flags, 355 __in efx_evq_t *eep, 356 __in efx_rxq_t *erp); 357 358 LIBEFX_INTERNAL 359 extern void 360 rhead_rx_qdestroy( 361 __in efx_rxq_t *erp); 362 363 364 /* TX */ 365 366 LIBEFX_INTERNAL 367 extern __checkReturn efx_rc_t 368 rhead_tx_init( 369 __in efx_nic_t *enp); 370 371 LIBEFX_INTERNAL 372 extern void 373 rhead_tx_fini( 374 __in efx_nic_t *enp); 375 376 LIBEFX_INTERNAL 377 extern __checkReturn efx_rc_t 378 rhead_tx_qcreate( 379 __in efx_nic_t *enp, 380 __in unsigned int index, 381 __in unsigned int label, 382 __in efsys_mem_t *esmp, 383 __in size_t ndescs, 384 __in uint32_t id, 385 __in uint16_t flags, 386 __in efx_evq_t *eep, 387 __in efx_txq_t *etp, 388 __out unsigned int *addedp); 389 390 LIBEFX_INTERNAL 391 extern void 392 rhead_tx_qdestroy( 393 __in efx_txq_t *etp); 394 395 LIBEFX_INTERNAL 396 extern __checkReturn efx_rc_t 397 rhead_tx_qpost( 398 __in efx_txq_t *etp, 399 __in_ecount(ndescs) efx_buffer_t *ebp, 400 __in unsigned int ndescs, 401 __in unsigned int completed, 402 __inout unsigned int *addedp); 403 404 LIBEFX_INTERNAL 405 extern void 406 rhead_tx_qpush( 407 __in efx_txq_t *etp, 408 __in unsigned int added, 409 __in unsigned int pushed); 410 411 LIBEFX_INTERNAL 412 extern __checkReturn efx_rc_t 413 rhead_tx_qpace( 414 __in efx_txq_t *etp, 415 __in unsigned int ns); 416 417 LIBEFX_INTERNAL 418 extern __checkReturn efx_rc_t 419 rhead_tx_qflush( 420 __in efx_txq_t *etp); 421 422 LIBEFX_INTERNAL 423 extern void 424 rhead_tx_qenable( 425 __in efx_txq_t *etp); 426 427 LIBEFX_INTERNAL 428 extern __checkReturn efx_rc_t 429 rhead_tx_qdesc_post( 430 __in efx_txq_t *etp, 431 __in_ecount(n) efx_desc_t *ed, 432 __in unsigned int n, 433 __in unsigned int completed, 434 __inout unsigned int *addedp); 435 436 #if EFSYS_OPT_QSTATS 437 438 LIBEFX_INTERNAL 439 extern void 440 rhead_tx_qstats_update( 441 __in efx_txq_t *etp, 442 __inout_ecount(TX_NQSTATS) efsys_stat_t *stat); 443 444 #endif /* EFSYS_OPT_QSTATS */ 445 446 #if EFSYS_OPT_TUNNEL 447 448 LIBEFX_INTERNAL 449 extern __checkReturn efx_rc_t 450 rhead_tunnel_reconfigure( 451 __in efx_nic_t *enp); 452 453 LIBEFX_INTERNAL 454 extern void 455 rhead_tunnel_fini( 456 __in efx_nic_t *enp); 457 458 #endif /* EFSYS_OPT_TUNNEL */ 459 460 #if EFSYS_OPT_PCI 461 462 /* 463 * Perform discovery of function control window by looking for a 464 * EF100 locator in Xilinx capabilities tables. 465 */ 466 LIBEFX_INTERNAL 467 extern __checkReturn efx_rc_t 468 rhead_pci_nic_membar_lookup( 469 __in efsys_pci_config_t *espcp, 470 __in const efx_pci_ops_t *epop, 471 __out efx_bar_region_t *ebrp); 472 473 #endif /* EFSYS_OPT_PCI */ 474 475 LIBEFX_INTERNAL 476 extern __checkReturn efx_rc_t 477 rhead_nic_xilinx_cap_tbl_read_ef100_locator( 478 __in efsys_bar_t *esbp, 479 __in efsys_dma_addr_t offset, 480 __out efx_bar_region_t *ebrp); 481 482 #if EFSYS_OPT_VIRTIO 483 484 LIBEFX_INTERNAL 485 extern __checkReturn efx_rc_t 486 rhead_virtio_qstart( 487 __in efx_virtio_vq_t *evvp, 488 __in efx_virtio_vq_cfg_t *evvcp, 489 __in_opt efx_virtio_vq_dyncfg_t *evvdp); 490 491 LIBEFX_INTERNAL 492 extern __checkReturn efx_rc_t 493 rhead_virtio_qstop( 494 __in efx_virtio_vq_t *evvp, 495 __out_opt efx_virtio_vq_dyncfg_t *evvdp); 496 497 LIBEFX_INTERNAL 498 extern __checkReturn efx_rc_t 499 rhead_virtio_get_doorbell_offset( 500 __in efx_virtio_vq_t *evvp, 501 __out uint32_t *offsetp); 502 503 LIBEFX_INTERNAL 504 extern __checkReturn efx_rc_t 505 rhead_virtio_get_features( 506 __in efx_nic_t *enp, 507 __in efx_virtio_device_type_t type, 508 __out uint64_t *featuresp); 509 510 LIBEFX_INTERNAL 511 extern __checkReturn efx_rc_t 512 rhead_virtio_verify_features( 513 __in efx_nic_t *enp, 514 __in efx_virtio_device_type_t type, 515 __in uint64_t features); 516 517 #endif /* EFSYS_OPT_VIRTIO */ 518 519 #ifdef __cplusplus 520 } 521 #endif 522 523 #endif /* _SYS_RHEAD_IMPL_H */ 524