158294ee6SAndrew Rybchenko /*- 2244cfa79SAndrew Rybchenko * BSD LICENSE 3244cfa79SAndrew Rybchenko * 4244cfa79SAndrew Rybchenko * Copyright (c) 2016-2017 Solarflare Communications Inc. 558294ee6SAndrew Rybchenko * All rights reserved. 658294ee6SAndrew Rybchenko * 758294ee6SAndrew Rybchenko * This software was jointly developed between OKTET Labs (under contract 858294ee6SAndrew Rybchenko * for Solarflare) and Solarflare Communications, Inc. 958294ee6SAndrew Rybchenko * 1058294ee6SAndrew Rybchenko * Redistribution and use in source and binary forms, with or without 1158294ee6SAndrew Rybchenko * modification, are permitted provided that the following conditions are met: 1258294ee6SAndrew Rybchenko * 1358294ee6SAndrew Rybchenko * 1. Redistributions of source code must retain the above copyright notice, 1458294ee6SAndrew Rybchenko * this list of conditions and the following disclaimer. 1558294ee6SAndrew Rybchenko * 2. Redistributions in binary form must reproduce the above copyright notice, 1658294ee6SAndrew Rybchenko * this list of conditions and the following disclaimer in the documentation 1758294ee6SAndrew Rybchenko * and/or other materials provided with the distribution. 1858294ee6SAndrew Rybchenko * 1958294ee6SAndrew Rybchenko * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2058294ee6SAndrew Rybchenko * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 2158294ee6SAndrew Rybchenko * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2258294ee6SAndrew Rybchenko * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2358294ee6SAndrew Rybchenko * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2458294ee6SAndrew Rybchenko * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2558294ee6SAndrew Rybchenko * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2658294ee6SAndrew Rybchenko * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2758294ee6SAndrew Rybchenko * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2858294ee6SAndrew Rybchenko * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 2958294ee6SAndrew Rybchenko * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3058294ee6SAndrew Rybchenko */ 3158294ee6SAndrew Rybchenko 3258294ee6SAndrew Rybchenko #ifndef _SFC_EV_H_ 3358294ee6SAndrew Rybchenko #define _SFC_EV_H_ 3458294ee6SAndrew Rybchenko 35*dbdc8241SAndrew Rybchenko #include <rte_ethdev.h> 36*dbdc8241SAndrew Rybchenko 3758294ee6SAndrew Rybchenko #include "efx.h" 3858294ee6SAndrew Rybchenko 39*dbdc8241SAndrew Rybchenko #include "sfc.h" 40*dbdc8241SAndrew Rybchenko 4158294ee6SAndrew Rybchenko #ifdef __cplusplus 4258294ee6SAndrew Rybchenko extern "C" { 4358294ee6SAndrew Rybchenko #endif 4458294ee6SAndrew Rybchenko 4558294ee6SAndrew Rybchenko /* Number of entries in the management event queue */ 4658294ee6SAndrew Rybchenko #define SFC_MGMT_EVQ_ENTRIES (EFX_EVQ_MINNEVS) 4758294ee6SAndrew Rybchenko 4858294ee6SAndrew Rybchenko struct sfc_adapter; 49df1bfde4SAndrew Rybchenko struct sfc_dp_rxq; 50*dbdc8241SAndrew Rybchenko struct sfc_dp_txq; 5158294ee6SAndrew Rybchenko 5258294ee6SAndrew Rybchenko enum sfc_evq_state { 5358294ee6SAndrew Rybchenko SFC_EVQ_UNINITIALIZED = 0, 5458294ee6SAndrew Rybchenko SFC_EVQ_INITIALIZED, 5558294ee6SAndrew Rybchenko SFC_EVQ_STARTING, 5658294ee6SAndrew Rybchenko SFC_EVQ_STARTED, 5758294ee6SAndrew Rybchenko 5858294ee6SAndrew Rybchenko SFC_EVQ_NSTATES 5958294ee6SAndrew Rybchenko }; 6058294ee6SAndrew Rybchenko 6158294ee6SAndrew Rybchenko struct sfc_evq { 6258294ee6SAndrew Rybchenko /* Used on datapath */ 6358294ee6SAndrew Rybchenko efx_evq_t *common; 647965557eSAndrew Rybchenko const efx_ev_callbacks_t *callbacks; 6558294ee6SAndrew Rybchenko unsigned int read_ptr; 6658294ee6SAndrew Rybchenko boolean_t exception; 6758294ee6SAndrew Rybchenko efsys_mem_t mem; 68df1bfde4SAndrew Rybchenko struct sfc_dp_rxq *dp_rxq; 69*dbdc8241SAndrew Rybchenko struct sfc_dp_txq *dp_txq; 7058294ee6SAndrew Rybchenko 7158294ee6SAndrew Rybchenko /* Not used on datapath */ 7258294ee6SAndrew Rybchenko struct sfc_adapter *sa; 7358294ee6SAndrew Rybchenko unsigned int evq_index; 7458294ee6SAndrew Rybchenko enum sfc_evq_state init_state; 7558294ee6SAndrew Rybchenko }; 7658294ee6SAndrew Rybchenko 7758294ee6SAndrew Rybchenko struct sfc_evq_info { 7858294ee6SAndrew Rybchenko /* Maximum number of EVQ entries taken into account when buffer 7958294ee6SAndrew Rybchenko * table space is allocated. 8058294ee6SAndrew Rybchenko */ 8158294ee6SAndrew Rybchenko unsigned int max_entries; 8258294ee6SAndrew Rybchenko /* Real number of EVQ entries, less or equal to max_entries */ 8358294ee6SAndrew Rybchenko unsigned int entries; 84c22d3c50SAndrew Rybchenko /* Event queue creation flags */ 85c22d3c50SAndrew Rybchenko uint32_t flags; 8658294ee6SAndrew Rybchenko /* NUMA-aware EVQ data structure used on datapath */ 8758294ee6SAndrew Rybchenko struct sfc_evq *evq; 8858294ee6SAndrew Rybchenko }; 8958294ee6SAndrew Rybchenko 9058294ee6SAndrew Rybchenko /* 9158294ee6SAndrew Rybchenko * Functions below define event queue to transmit/receive queue and vice 9258294ee6SAndrew Rybchenko * versa mapping. 9358294ee6SAndrew Rybchenko */ 9458294ee6SAndrew Rybchenko 9558294ee6SAndrew Rybchenko static inline unsigned int 9658294ee6SAndrew Rybchenko sfc_ev_qcount(struct sfc_adapter *sa) 9758294ee6SAndrew Rybchenko { 9858294ee6SAndrew Rybchenko const struct rte_eth_dev_data *dev_data = sa->eth_dev->data; 9958294ee6SAndrew Rybchenko 10058294ee6SAndrew Rybchenko /* 10158294ee6SAndrew Rybchenko * One management EVQ for global events. 10258294ee6SAndrew Rybchenko * Own EVQ for each Tx and Rx queue. 10358294ee6SAndrew Rybchenko */ 10458294ee6SAndrew Rybchenko return 1 + dev_data->nb_rx_queues + dev_data->nb_tx_queues; 10558294ee6SAndrew Rybchenko } 10658294ee6SAndrew Rybchenko 10758294ee6SAndrew Rybchenko static inline unsigned int 10858294ee6SAndrew Rybchenko sfc_evq_max_entries(struct sfc_adapter *sa, unsigned int sw_index) 10958294ee6SAndrew Rybchenko { 11058294ee6SAndrew Rybchenko unsigned int max_entries; 11158294ee6SAndrew Rybchenko 11258294ee6SAndrew Rybchenko if (sw_index == sa->mgmt_evq_index) 11358294ee6SAndrew Rybchenko max_entries = SFC_MGMT_EVQ_ENTRIES; 11458294ee6SAndrew Rybchenko else if (sw_index <= sa->eth_dev->data->nb_rx_queues) 11558294ee6SAndrew Rybchenko max_entries = EFX_RXQ_MAXNDESCS; 11658294ee6SAndrew Rybchenko else 11758294ee6SAndrew Rybchenko max_entries = efx_nic_cfg_get(sa->nic)->enc_txq_max_ndescs; 11858294ee6SAndrew Rybchenko 11958294ee6SAndrew Rybchenko return max_entries; 12058294ee6SAndrew Rybchenko } 12158294ee6SAndrew Rybchenko 12258294ee6SAndrew Rybchenko static inline unsigned int 12358294ee6SAndrew Rybchenko sfc_evq_index_by_rxq_sw_index(__rte_unused struct sfc_adapter *sa, 12458294ee6SAndrew Rybchenko unsigned int rxq_sw_index) 12558294ee6SAndrew Rybchenko { 12658294ee6SAndrew Rybchenko return 1 + rxq_sw_index; 12758294ee6SAndrew Rybchenko } 12858294ee6SAndrew Rybchenko 12958294ee6SAndrew Rybchenko static inline unsigned int 13058294ee6SAndrew Rybchenko sfc_evq_index_by_txq_sw_index(struct sfc_adapter *sa, unsigned int txq_sw_index) 13158294ee6SAndrew Rybchenko { 13258294ee6SAndrew Rybchenko return 1 + sa->eth_dev->data->nb_rx_queues + txq_sw_index; 13358294ee6SAndrew Rybchenko } 13458294ee6SAndrew Rybchenko 13558294ee6SAndrew Rybchenko int sfc_ev_init(struct sfc_adapter *sa); 13658294ee6SAndrew Rybchenko void sfc_ev_fini(struct sfc_adapter *sa); 13758294ee6SAndrew Rybchenko int sfc_ev_start(struct sfc_adapter *sa); 13858294ee6SAndrew Rybchenko void sfc_ev_stop(struct sfc_adapter *sa); 13958294ee6SAndrew Rybchenko 14058294ee6SAndrew Rybchenko int sfc_ev_qinit(struct sfc_adapter *sa, unsigned int sw_index, 14158294ee6SAndrew Rybchenko unsigned int entries, int socket_id); 14258294ee6SAndrew Rybchenko void sfc_ev_qfini(struct sfc_adapter *sa, unsigned int sw_index); 14358294ee6SAndrew Rybchenko int sfc_ev_qstart(struct sfc_adapter *sa, unsigned int sw_index); 14458294ee6SAndrew Rybchenko void sfc_ev_qstop(struct sfc_adapter *sa, unsigned int sw_index); 14558294ee6SAndrew Rybchenko 14658294ee6SAndrew Rybchenko int sfc_ev_qprime(struct sfc_evq *evq); 14758294ee6SAndrew Rybchenko void sfc_ev_qpoll(struct sfc_evq *evq); 14858294ee6SAndrew Rybchenko 1499a75f75cSAndrew Rybchenko void sfc_ev_mgmt_qpoll(struct sfc_adapter *sa); 1509a75f75cSAndrew Rybchenko 15158294ee6SAndrew Rybchenko #ifdef __cplusplus 15258294ee6SAndrew Rybchenko } 15358294ee6SAndrew Rybchenko #endif 15458294ee6SAndrew Rybchenko #endif /* _SFC_EV_H_ */ 155