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 __out uint32_t *rss_contextp); 265 266 LIBEFX_INTERNAL 267 extern __checkReturn efx_rc_t 268 rhead_rx_scale_context_free( 269 __in efx_nic_t *enp, 270 __in uint32_t rss_context); 271 272 LIBEFX_INTERNAL 273 extern __checkReturn efx_rc_t 274 rhead_rx_scale_mode_set( 275 __in efx_nic_t *enp, 276 __in uint32_t rss_context, 277 __in efx_rx_hash_alg_t alg, 278 __in efx_rx_hash_type_t type, 279 __in boolean_t insert); 280 281 LIBEFX_INTERNAL 282 extern __checkReturn efx_rc_t 283 rhead_rx_scale_key_set( 284 __in efx_nic_t *enp, 285 __in uint32_t rss_context, 286 __in_ecount(n) uint8_t *key, 287 __in size_t n); 288 289 LIBEFX_INTERNAL 290 extern __checkReturn efx_rc_t 291 rhead_rx_scale_tbl_set( 292 __in efx_nic_t *enp, 293 __in uint32_t rss_context, 294 __in_ecount(n) unsigned int *table, 295 __in size_t n); 296 297 LIBEFX_INTERNAL 298 extern __checkReturn uint32_t 299 rhead_rx_prefix_hash( 300 __in efx_nic_t *enp, 301 __in efx_rx_hash_alg_t func, 302 __in uint8_t *buffer); 303 304 #endif /* EFSYS_OPT_RX_SCALE */ 305 306 LIBEFX_INTERNAL 307 extern __checkReturn efx_rc_t 308 rhead_rx_prefix_pktlen( 309 __in efx_nic_t *enp, 310 __in uint8_t *buffer, 311 __out uint16_t *lengthp); 312 313 LIBEFX_INTERNAL 314 extern void 315 rhead_rx_qpost( 316 __in efx_rxq_t *erp, 317 __in_ecount(ndescs) efsys_dma_addr_t *addrp, 318 __in size_t size, 319 __in unsigned int ndescs, 320 __in unsigned int completed, 321 __in unsigned int added); 322 323 LIBEFX_INTERNAL 324 extern void 325 rhead_rx_qpush( 326 __in efx_rxq_t *erp, 327 __in unsigned int added, 328 __inout unsigned int *pushedp); 329 330 LIBEFX_INTERNAL 331 extern __checkReturn efx_rc_t 332 rhead_rx_qflush( 333 __in efx_rxq_t *erp); 334 335 LIBEFX_INTERNAL 336 extern void 337 rhead_rx_qenable( 338 __in efx_rxq_t *erp); 339 340 union efx_rxq_type_data_u; 341 342 LIBEFX_INTERNAL 343 extern __checkReturn efx_rc_t 344 rhead_rx_qcreate( 345 __in efx_nic_t *enp, 346 __in unsigned int index, 347 __in unsigned int label, 348 __in efx_rxq_type_t type, 349 __in const union efx_rxq_type_data_u *type_data, 350 __in efsys_mem_t *esmp, 351 __in size_t ndescs, 352 __in uint32_t id, 353 __in unsigned int flags, 354 __in efx_evq_t *eep, 355 __in efx_rxq_t *erp); 356 357 LIBEFX_INTERNAL 358 extern void 359 rhead_rx_qdestroy( 360 __in efx_rxq_t *erp); 361 362 363 /* TX */ 364 365 LIBEFX_INTERNAL 366 extern __checkReturn efx_rc_t 367 rhead_tx_init( 368 __in efx_nic_t *enp); 369 370 LIBEFX_INTERNAL 371 extern void 372 rhead_tx_fini( 373 __in efx_nic_t *enp); 374 375 LIBEFX_INTERNAL 376 extern __checkReturn efx_rc_t 377 rhead_tx_qcreate( 378 __in efx_nic_t *enp, 379 __in unsigned int index, 380 __in unsigned int label, 381 __in efsys_mem_t *esmp, 382 __in size_t ndescs, 383 __in uint32_t id, 384 __in uint16_t flags, 385 __in efx_evq_t *eep, 386 __in efx_txq_t *etp, 387 __out unsigned int *addedp); 388 389 LIBEFX_INTERNAL 390 extern void 391 rhead_tx_qdestroy( 392 __in efx_txq_t *etp); 393 394 LIBEFX_INTERNAL 395 extern __checkReturn efx_rc_t 396 rhead_tx_qpost( 397 __in efx_txq_t *etp, 398 __in_ecount(ndescs) efx_buffer_t *ebp, 399 __in unsigned int ndescs, 400 __in unsigned int completed, 401 __inout unsigned int *addedp); 402 403 LIBEFX_INTERNAL 404 extern void 405 rhead_tx_qpush( 406 __in efx_txq_t *etp, 407 __in unsigned int added, 408 __in unsigned int pushed); 409 410 LIBEFX_INTERNAL 411 extern __checkReturn efx_rc_t 412 rhead_tx_qpace( 413 __in efx_txq_t *etp, 414 __in unsigned int ns); 415 416 LIBEFX_INTERNAL 417 extern __checkReturn efx_rc_t 418 rhead_tx_qflush( 419 __in efx_txq_t *etp); 420 421 LIBEFX_INTERNAL 422 extern void 423 rhead_tx_qenable( 424 __in efx_txq_t *etp); 425 426 LIBEFX_INTERNAL 427 extern __checkReturn efx_rc_t 428 rhead_tx_qdesc_post( 429 __in efx_txq_t *etp, 430 __in_ecount(n) efx_desc_t *ed, 431 __in unsigned int n, 432 __in unsigned int completed, 433 __inout unsigned int *addedp); 434 435 #if EFSYS_OPT_QSTATS 436 437 LIBEFX_INTERNAL 438 extern void 439 rhead_tx_qstats_update( 440 __in efx_txq_t *etp, 441 __inout_ecount(TX_NQSTATS) efsys_stat_t *stat); 442 443 #endif /* EFSYS_OPT_QSTATS */ 444 445 #if EFSYS_OPT_TUNNEL 446 447 LIBEFX_INTERNAL 448 extern __checkReturn efx_rc_t 449 rhead_tunnel_reconfigure( 450 __in efx_nic_t *enp); 451 452 LIBEFX_INTERNAL 453 extern void 454 rhead_tunnel_fini( 455 __in efx_nic_t *enp); 456 457 #endif /* EFSYS_OPT_TUNNEL */ 458 459 #if EFSYS_OPT_PCI 460 461 /* 462 * Perform discovery of function control window by looking for a 463 * EF100 locator in Xilinx capabilities tables. 464 */ 465 LIBEFX_INTERNAL 466 extern __checkReturn efx_rc_t 467 rhead_pci_nic_membar_lookup( 468 __in efsys_pci_config_t *espcp, 469 __in const efx_pci_ops_t *epop, 470 __out efx_bar_region_t *ebrp); 471 472 #endif /* EFSYS_OPT_PCI */ 473 474 LIBEFX_INTERNAL 475 extern __checkReturn efx_rc_t 476 rhead_nic_xilinx_cap_tbl_read_ef100_locator( 477 __in efsys_bar_t *esbp, 478 __in efsys_dma_addr_t offset, 479 __out efx_bar_region_t *ebrp); 480 481 #if EFSYS_OPT_VIRTIO 482 483 LIBEFX_INTERNAL 484 extern __checkReturn efx_rc_t 485 rhead_virtio_qstart( 486 __in efx_virtio_vq_t *evvp, 487 __in efx_virtio_vq_cfg_t *evvcp, 488 __in_opt efx_virtio_vq_dyncfg_t *evvdp); 489 490 LIBEFX_INTERNAL 491 extern __checkReturn efx_rc_t 492 rhead_virtio_qstop( 493 __in efx_virtio_vq_t *evvp, 494 __out_opt efx_virtio_vq_dyncfg_t *evvdp); 495 496 LIBEFX_INTERNAL 497 extern __checkReturn efx_rc_t 498 rhead_virtio_get_doorbell_offset( 499 __in efx_virtio_vq_t *evvp, 500 __out uint32_t *offsetp); 501 502 LIBEFX_INTERNAL 503 extern __checkReturn efx_rc_t 504 rhead_virtio_get_features( 505 __in efx_nic_t *enp, 506 __in efx_virtio_device_type_t type, 507 __out uint64_t *featuresp); 508 509 LIBEFX_INTERNAL 510 extern __checkReturn efx_rc_t 511 rhead_virtio_verify_features( 512 __in efx_nic_t *enp, 513 __in efx_virtio_device_type_t type, 514 __in uint64_t features); 515 516 #endif /* EFSYS_OPT_VIRTIO */ 517 518 #ifdef __cplusplus 519 } 520 #endif 521 522 #endif /* _SYS_RHEAD_IMPL_H */ 523