xref: /dpdk/drivers/net/sfc/sfc_ev.h (revision dbdc82416b723b1f089bdcea99d5441016aa724d)
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