dpdk/drivers/common/sfc_efx/base/rhead_impl.h
<<
>>
Prefs
   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
  11extern "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
  42LIBEFX_INTERNAL
  43extern  __checkReturn   efx_rc_t
  44rhead_board_cfg(
  45        __in            efx_nic_t *enp);
  46
  47LIBEFX_INTERNAL
  48extern  __checkReturn   efx_rc_t
  49rhead_nic_probe(
  50        __in            efx_nic_t *enp);
  51
  52LIBEFX_INTERNAL
  53extern  __checkReturn   efx_rc_t
  54rhead_nic_set_drv_limits(
  55        __inout         efx_nic_t *enp,
  56        __in            efx_drv_limits_t *edlp);
  57
  58LIBEFX_INTERNAL
  59extern  __checkReturn   efx_rc_t
  60rhead_nic_get_vi_pool(
  61        __in            efx_nic_t *enp,
  62        __out           uint32_t *vi_countp);
  63
  64LIBEFX_INTERNAL
  65extern  __checkReturn   efx_rc_t
  66rhead_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
  72LIBEFX_INTERNAL
  73extern  __checkReturn   efx_rc_t
  74rhead_nic_reset(
  75        __in            efx_nic_t *enp);
  76
  77LIBEFX_INTERNAL
  78extern  __checkReturn   efx_rc_t
  79rhead_nic_init(
  80        __in            efx_nic_t *enp);
  81
  82LIBEFX_INTERNAL
  83extern  __checkReturn   boolean_t
  84rhead_nic_hw_unavailable(
  85        __in            efx_nic_t *enp);
  86
  87LIBEFX_INTERNAL
  88extern                  void
  89rhead_nic_set_hw_unavailable(
  90        __in            efx_nic_t *enp);
  91
  92#if EFSYS_OPT_DIAG
  93
  94LIBEFX_INTERNAL
  95extern  __checkReturn   efx_rc_t
  96rhead_nic_register_test(
  97        __in            efx_nic_t *enp);
  98
  99#endif  /* EFSYS_OPT_DIAG */
 100
 101LIBEFX_INTERNAL
 102extern                  void
 103rhead_nic_fini(
 104        __in            efx_nic_t *enp);
 105
 106LIBEFX_INTERNAL
 107extern                  void
 108rhead_nic_unprobe(
 109        __in            efx_nic_t *enp);
 110
 111
 112/* EV */
 113
 114LIBEFX_INTERNAL
 115extern  __checkReturn   efx_rc_t
 116rhead_ev_init(
 117        __in            efx_nic_t *enp);
 118
 119LIBEFX_INTERNAL
 120extern                  void
 121rhead_ev_fini(
 122        __in            efx_nic_t *enp);
 123
 124LIBEFX_INTERNAL
 125extern  __checkReturn   efx_rc_t
 126rhead_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
 136LIBEFX_INTERNAL
 137extern                  void
 138rhead_ev_qdestroy(
 139        __in            efx_evq_t *eep);
 140
 141LIBEFX_INTERNAL
 142extern  __checkReturn   efx_rc_t
 143rhead_ev_qprime(
 144        __in            efx_evq_t *eep,
 145        __in            unsigned int count);
 146
 147LIBEFX_INTERNAL
 148extern                  void
 149rhead_ev_qpost(
 150        __in    efx_evq_t *eep,
 151        __in    uint16_t data);
 152
 153LIBEFX_INTERNAL
 154extern                  void
 155rhead_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
 161LIBEFX_INTERNAL
 162extern  __checkReturn   efx_rc_t
 163rhead_ev_qmoderate(
 164        __in            efx_evq_t *eep,
 165        __in            unsigned int us);
 166
 167#if EFSYS_OPT_QSTATS
 168
 169LIBEFX_INTERNAL
 170extern                  void
 171rhead_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
 180LIBEFX_INTERNAL
 181extern  __checkReturn   efx_rc_t
 182rhead_intr_init(
 183        __in            efx_nic_t *enp,
 184        __in            efx_intr_type_t type,
 185        __in            efsys_mem_t *esmp);
 186
 187LIBEFX_INTERNAL
 188extern                  void
 189rhead_intr_enable(
 190        __in            efx_nic_t *enp);
 191
 192LIBEFX_INTERNAL
 193extern                  void
 194rhead_intr_disable(
 195        __in            efx_nic_t *enp);
 196
 197LIBEFX_INTERNAL
 198extern                  void
 199rhead_intr_disable_unlocked(
 200        __in            efx_nic_t *enp);
 201
 202LIBEFX_INTERNAL
 203extern  __checkReturn   efx_rc_t
 204rhead_intr_trigger(
 205        __in            efx_nic_t *enp,
 206        __in            unsigned int level);
 207
 208LIBEFX_INTERNAL
 209extern                  void
 210rhead_intr_status_line(
 211        __in            efx_nic_t *enp,
 212        __out           boolean_t *fatalp,
 213        __out           uint32_t *qmaskp);
 214
 215LIBEFX_INTERNAL
 216extern                  void
 217rhead_intr_status_message(
 218        __in            efx_nic_t *enp,
 219        __in            unsigned int message,
 220        __out           boolean_t *fatalp);
 221
 222LIBEFX_INTERNAL
 223extern                  void
 224rhead_intr_fatal(
 225        __in            efx_nic_t *enp);
 226
 227LIBEFX_INTERNAL
 228extern                  void
 229rhead_intr_fini(
 230        __in            efx_nic_t *enp);
 231
 232
 233/* RX */
 234
 235LIBEFX_INTERNAL
 236extern  __checkReturn   efx_rc_t
 237rhead_rx_init(
 238        __in            efx_nic_t *enp);
 239
 240LIBEFX_INTERNAL
 241extern                  void
 242rhead_rx_fini(
 243        __in            efx_nic_t *enp);
 244
 245#if EFSYS_OPT_RX_SCATTER
 246
 247LIBEFX_INTERNAL
 248extern  __checkReturn   efx_rc_t
 249rhead_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
 257LIBEFX_INTERNAL
 258extern  __checkReturn   efx_rc_t
 259rhead_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
 265LIBEFX_INTERNAL
 266extern  __checkReturn   efx_rc_t
 267rhead_rx_scale_context_free(
 268        __in            efx_nic_t *enp,
 269        __in            uint32_t rss_context);
 270
 271LIBEFX_INTERNAL
 272extern  __checkReturn   efx_rc_t
 273rhead_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
 280LIBEFX_INTERNAL
 281extern  __checkReturn   efx_rc_t
 282rhead_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
 288LIBEFX_INTERNAL
 289extern  __checkReturn   efx_rc_t
 290rhead_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
 296LIBEFX_INTERNAL
 297extern  __checkReturn   uint32_t
 298rhead_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
 305LIBEFX_INTERNAL
 306extern  __checkReturn   efx_rc_t
 307rhead_rx_prefix_pktlen(
 308        __in            efx_nic_t *enp,
 309        __in            uint8_t *buffer,
 310        __out           uint16_t *lengthp);
 311
 312LIBEFX_INTERNAL
 313extern                          void
 314rhead_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
 322LIBEFX_INTERNAL
 323extern                  void
 324rhead_rx_qpush(
 325        __in            efx_rxq_t *erp,
 326        __in            unsigned int added,
 327        __inout         unsigned int *pushedp);
 328
 329LIBEFX_INTERNAL
 330extern  __checkReturn   efx_rc_t
 331rhead_rx_qflush(
 332        __in            efx_rxq_t *erp);
 333
 334LIBEFX_INTERNAL
 335extern          void
 336rhead_rx_qenable(
 337        __in            efx_rxq_t *erp);
 338
 339union efx_rxq_type_data_u;
 340
 341LIBEFX_INTERNAL
 342extern  __checkReturn   efx_rc_t
 343rhead_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
 356LIBEFX_INTERNAL
 357extern                  void
 358rhead_rx_qdestroy(
 359        __in            efx_rxq_t *erp);
 360
 361
 362/* TX */
 363
 364LIBEFX_INTERNAL
 365extern  __checkReturn   efx_rc_t
 366rhead_tx_init(
 367        __in            efx_nic_t *enp);
 368
 369LIBEFX_INTERNAL
 370extern                  void
 371rhead_tx_fini(
 372        __in            efx_nic_t *enp);
 373
 374LIBEFX_INTERNAL
 375extern  __checkReturn   efx_rc_t
 376rhead_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
 388LIBEFX_INTERNAL
 389extern          void
 390rhead_tx_qdestroy(
 391        __in            efx_txq_t *etp);
 392
 393LIBEFX_INTERNAL
 394extern  __checkReturn           efx_rc_t
 395rhead_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
 402LIBEFX_INTERNAL
 403extern                  void
 404rhead_tx_qpush(
 405        __in            efx_txq_t *etp,
 406        __in            unsigned int added,
 407        __in            unsigned int pushed);
 408
 409LIBEFX_INTERNAL
 410extern  __checkReturn   efx_rc_t
 411rhead_tx_qpace(
 412        __in            efx_txq_t *etp,
 413        __in            unsigned int ns);
 414
 415LIBEFX_INTERNAL
 416extern  __checkReturn   efx_rc_t
 417rhead_tx_qflush(
 418        __in            efx_txq_t *etp);
 419
 420LIBEFX_INTERNAL
 421extern                  void
 422rhead_tx_qenable(
 423        __in            efx_txq_t *etp);
 424
 425LIBEFX_INTERNAL
 426extern  __checkReturn   efx_rc_t
 427rhead_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
 436LIBEFX_INTERNAL
 437extern                  void
 438rhead_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
 446LIBEFX_INTERNAL
 447extern  __checkReturn   efx_rc_t
 448rhead_tunnel_reconfigure(
 449        __in            efx_nic_t *enp);
 450
 451LIBEFX_INTERNAL
 452extern                  void
 453rhead_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 */
 464LIBEFX_INTERNAL
 465extern  __checkReturn                   efx_rc_t
 466rhead_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
 473LIBEFX_INTERNAL
 474extern  __checkReturn                   efx_rc_t
 475rhead_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#if EFSYS_OPT_VIRTIO
 481
 482LIBEFX_INTERNAL
 483extern  __checkReturn                   efx_rc_t
 484rhead_virtio_qstart(
 485        __in                            efx_virtio_vq_t *evvp,
 486        __in                            efx_virtio_vq_cfg_t *evvcp,
 487        __in_opt                        efx_virtio_vq_dyncfg_t *evvdp);
 488
 489LIBEFX_INTERNAL
 490extern  __checkReturn                   efx_rc_t
 491rhead_virtio_qstop(
 492        __in                            efx_virtio_vq_t *evvp,
 493        __out_opt                       efx_virtio_vq_dyncfg_t *evvdp);
 494
 495LIBEFX_INTERNAL
 496extern  __checkReturn                   efx_rc_t
 497rhead_virtio_get_doorbell_offset(
 498        __in                            efx_virtio_vq_t *evvp,
 499        __out                           uint32_t *offsetp);
 500
 501LIBEFX_INTERNAL
 502extern  __checkReturn                   efx_rc_t
 503rhead_virtio_get_features(
 504        __in                            efx_nic_t *enp,
 505        __in                            efx_virtio_device_type_t type,
 506        __out                           uint64_t *featuresp);
 507
 508LIBEFX_INTERNAL
 509extern  __checkReturn                   efx_rc_t
 510rhead_virtio_verify_features(
 511        __in                            efx_nic_t *enp,
 512        __in                            efx_virtio_device_type_t type,
 513        __in                            uint64_t features);
 514
 515#endif /* EFSYS_OPT_VIRTIO */
 516
 517#ifdef  __cplusplus
 518}
 519#endif
 520
 521#endif  /* _SYS_RHEAD_IMPL_H */
 522