X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fcommon%2Fsfc_efx%2Fbase%2Frhead_impl.h;h=dd38ded7751ce3fc1363e62387ae1914e5844379;hb=c4f4a0e60dcb2a3877a4a751d7641fa1d9c46c29;hp=e25a871cb345928363274cebfbf3764fb2375013;hpb=3c1c5cc4a7860bb8dd211919a4e946b2a8c43c3c;p=dpdk.git diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h index e25a871cb3..dd38ded775 100644 --- a/drivers/common/sfc_efx/base/rhead_impl.h +++ b/drivers/common/sfc_efx/base/rhead_impl.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * - * Copyright(c) 2019-2020 Xilinx, Inc. + * Copyright(c) 2019-2021 Xilinx, Inc. * Copyright(c) 2018-2019 Solarflare Communications Inc. */ @@ -12,6 +12,13 @@ extern "C" { #endif +/* + * Riverhead requires physically contiguous event rings (so, just one + * DMA address is sufficient to represent it), but MCDI interface is still + * in terms of 4k size 4k-aligned DMA buffers. + */ +#define RHEAD_EVQ_MAXNBUFS 32 + #define RHEAD_EVQ_MAXNEVS 16384 #define RHEAD_EVQ_MINNEVS 256 @@ -25,6 +32,10 @@ extern "C" { #define RHEAD_RXQ_DESC_SIZE (sizeof (efx_qword_t)) #define RHEAD_TXQ_DESC_SIZE (sizeof (efx_oword_t)) +#if EFSYS_OPT_EV_EXTENDED_WIDTH +#define RHEAD_EVQ_EW_DESC_SIZE (sizeof (efx_xword_t)) +#endif + /* NIC */ @@ -98,6 +109,412 @@ rhead_nic_unprobe( __in efx_nic_t *enp); +/* EV */ + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_ev_init( + __in efx_nic_t *enp); + +LIBEFX_INTERNAL +extern void +rhead_ev_fini( + __in efx_nic_t *enp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_ev_qcreate( + __in efx_nic_t *enp, + __in unsigned int index, + __in efsys_mem_t *esmp, + __in size_t ndescs, + __in uint32_t id, + __in uint32_t us, + __in uint32_t flags, + __in uint32_t irq, + __in efx_evq_t *eep); + +LIBEFX_INTERNAL +extern void +rhead_ev_qdestroy( + __in efx_evq_t *eep); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_ev_qprime( + __in efx_evq_t *eep, + __in unsigned int count); + +LIBEFX_INTERNAL +extern void +rhead_ev_qpost( + __in efx_evq_t *eep, + __in uint16_t data); + +LIBEFX_INTERNAL +extern void +rhead_ev_qpoll( + __in efx_evq_t *eep, + __inout unsigned int *countp, + __in const efx_ev_callbacks_t *eecp, + __in_opt void *arg); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_ev_qmoderate( + __in efx_evq_t *eep, + __in unsigned int us); + +#if EFSYS_OPT_QSTATS + +LIBEFX_INTERNAL +extern void +rhead_ev_qstats_update( + __in efx_evq_t *eep, + __inout_ecount(EV_NQSTATS) efsys_stat_t *stat); + +#endif /* EFSYS_OPT_QSTATS */ + + +/* INTR */ + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_intr_init( + __in efx_nic_t *enp, + __in efx_intr_type_t type, + __in efsys_mem_t *esmp); + +LIBEFX_INTERNAL +extern void +rhead_intr_enable( + __in efx_nic_t *enp); + +LIBEFX_INTERNAL +extern void +rhead_intr_disable( + __in efx_nic_t *enp); + +LIBEFX_INTERNAL +extern void +rhead_intr_disable_unlocked( + __in efx_nic_t *enp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_intr_trigger( + __in efx_nic_t *enp, + __in unsigned int level); + +LIBEFX_INTERNAL +extern void +rhead_intr_status_line( + __in efx_nic_t *enp, + __out boolean_t *fatalp, + __out uint32_t *qmaskp); + +LIBEFX_INTERNAL +extern void +rhead_intr_status_message( + __in efx_nic_t *enp, + __in unsigned int message, + __out boolean_t *fatalp); + +LIBEFX_INTERNAL +extern void +rhead_intr_fatal( + __in efx_nic_t *enp); + +LIBEFX_INTERNAL +extern void +rhead_intr_fini( + __in efx_nic_t *enp); + + +/* RX */ + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_rx_init( + __in efx_nic_t *enp); + +LIBEFX_INTERNAL +extern void +rhead_rx_fini( + __in efx_nic_t *enp); + +#if EFSYS_OPT_RX_SCATTER + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_rx_scatter_enable( + __in efx_nic_t *enp, + __in unsigned int buf_size); + +#endif /* EFSYS_OPT_RX_SCATTER */ + +#if EFSYS_OPT_RX_SCALE + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_rx_scale_context_alloc( + __in efx_nic_t *enp, + __in efx_rx_scale_context_type_t type, + __in uint32_t num_queues, + __out uint32_t *rss_contextp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_rx_scale_context_free( + __in efx_nic_t *enp, + __in uint32_t rss_context); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_rx_scale_mode_set( + __in efx_nic_t *enp, + __in uint32_t rss_context, + __in efx_rx_hash_alg_t alg, + __in efx_rx_hash_type_t type, + __in boolean_t insert); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_rx_scale_key_set( + __in efx_nic_t *enp, + __in uint32_t rss_context, + __in_ecount(n) uint8_t *key, + __in size_t n); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_rx_scale_tbl_set( + __in efx_nic_t *enp, + __in uint32_t rss_context, + __in_ecount(n) unsigned int *table, + __in size_t n); + +LIBEFX_INTERNAL +extern __checkReturn uint32_t +rhead_rx_prefix_hash( + __in efx_nic_t *enp, + __in efx_rx_hash_alg_t func, + __in uint8_t *buffer); + +#endif /* EFSYS_OPT_RX_SCALE */ + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_rx_prefix_pktlen( + __in efx_nic_t *enp, + __in uint8_t *buffer, + __out uint16_t *lengthp); + +LIBEFX_INTERNAL +extern void +rhead_rx_qpost( + __in efx_rxq_t *erp, + __in_ecount(ndescs) efsys_dma_addr_t *addrp, + __in size_t size, + __in unsigned int ndescs, + __in unsigned int completed, + __in unsigned int added); + +LIBEFX_INTERNAL +extern void +rhead_rx_qpush( + __in efx_rxq_t *erp, + __in unsigned int added, + __inout unsigned int *pushedp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_rx_qflush( + __in efx_rxq_t *erp); + +LIBEFX_INTERNAL +extern void +rhead_rx_qenable( + __in efx_rxq_t *erp); + +union efx_rxq_type_data_u; + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_rx_qcreate( + __in efx_nic_t *enp, + __in unsigned int index, + __in unsigned int label, + __in efx_rxq_type_t type, + __in const union efx_rxq_type_data_u *type_data, + __in efsys_mem_t *esmp, + __in size_t ndescs, + __in uint32_t id, + __in unsigned int flags, + __in efx_evq_t *eep, + __in efx_rxq_t *erp); + +LIBEFX_INTERNAL +extern void +rhead_rx_qdestroy( + __in efx_rxq_t *erp); + + +/* TX */ + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_tx_init( + __in efx_nic_t *enp); + +LIBEFX_INTERNAL +extern void +rhead_tx_fini( + __in efx_nic_t *enp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_tx_qcreate( + __in efx_nic_t *enp, + __in unsigned int index, + __in unsigned int label, + __in efsys_mem_t *esmp, + __in size_t ndescs, + __in uint32_t id, + __in uint16_t flags, + __in efx_evq_t *eep, + __in efx_txq_t *etp, + __out unsigned int *addedp); + +LIBEFX_INTERNAL +extern void +rhead_tx_qdestroy( + __in efx_txq_t *etp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_tx_qpost( + __in efx_txq_t *etp, + __in_ecount(ndescs) efx_buffer_t *ebp, + __in unsigned int ndescs, + __in unsigned int completed, + __inout unsigned int *addedp); + +LIBEFX_INTERNAL +extern void +rhead_tx_qpush( + __in efx_txq_t *etp, + __in unsigned int added, + __in unsigned int pushed); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_tx_qpace( + __in efx_txq_t *etp, + __in unsigned int ns); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_tx_qflush( + __in efx_txq_t *etp); + +LIBEFX_INTERNAL +extern void +rhead_tx_qenable( + __in efx_txq_t *etp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_tx_qdesc_post( + __in efx_txq_t *etp, + __in_ecount(n) efx_desc_t *ed, + __in unsigned int n, + __in unsigned int completed, + __inout unsigned int *addedp); + +#if EFSYS_OPT_QSTATS + +LIBEFX_INTERNAL +extern void +rhead_tx_qstats_update( + __in efx_txq_t *etp, + __inout_ecount(TX_NQSTATS) efsys_stat_t *stat); + +#endif /* EFSYS_OPT_QSTATS */ + +#if EFSYS_OPT_TUNNEL + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_tunnel_reconfigure( + __in efx_nic_t *enp); + +LIBEFX_INTERNAL +extern void +rhead_tunnel_fini( + __in efx_nic_t *enp); + +#endif /* EFSYS_OPT_TUNNEL */ + +#if EFSYS_OPT_PCI + +/* + * Perform discovery of function control window by looking for a + * EF100 locator in Xilinx capabilities tables. + */ +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_pci_nic_membar_lookup( + __in efsys_pci_config_t *espcp, + __in const efx_pci_ops_t *epop, + __out efx_bar_region_t *ebrp); + +#endif /* EFSYS_OPT_PCI */ + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_nic_xilinx_cap_tbl_read_ef100_locator( + __in efsys_bar_t *esbp, + __in efsys_dma_addr_t offset, + __out efx_bar_region_t *ebrp); + +#if EFSYS_OPT_VIRTIO + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_virtio_qstart( + __in efx_virtio_vq_t *evvp, + __in efx_virtio_vq_cfg_t *evvcp, + __in_opt efx_virtio_vq_dyncfg_t *evvdp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_virtio_qstop( + __in efx_virtio_vq_t *evvp, + __out_opt efx_virtio_vq_dyncfg_t *evvdp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_virtio_get_doorbell_offset( + __in efx_virtio_vq_t *evvp, + __out uint32_t *offsetp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_virtio_get_features( + __in efx_nic_t *enp, + __in efx_virtio_device_type_t type, + __out uint64_t *featuresp); + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +rhead_virtio_verify_features( + __in efx_nic_t *enp, + __in efx_virtio_device_type_t type, + __in uint64_t features); + +#endif /* EFSYS_OPT_VIRTIO */ + #ifdef __cplusplus } #endif