xref: /dpdk/drivers/net/sfc/sfc_rx.h (revision a9a238e9f57dd4363535bfb78c0c5c762522014a)
144c0947bSAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
2244cfa79SAndrew Rybchenko  *
398d26ef7SAndrew Rybchenko  * Copyright(c) 2019-2021 Xilinx, Inc.
4a0147be5SAndrew Rybchenko  * Copyright(c) 2016-2019 Solarflare Communications Inc.
5a8e64c6bSAndrew Rybchenko  *
6a8e64c6bSAndrew Rybchenko  * This software was jointly developed between OKTET Labs (under contract
7a8e64c6bSAndrew Rybchenko  * for Solarflare) and Solarflare Communications, Inc.
8a8e64c6bSAndrew Rybchenko  */
9a8e64c6bSAndrew Rybchenko 
10a8e64c6bSAndrew Rybchenko #ifndef _SFC_RX_H
11a8e64c6bSAndrew Rybchenko #define _SFC_RX_H
12a8e64c6bSAndrew Rybchenko 
13ce35b05cSAndrew Rybchenko #include <rte_mbuf.h>
14ce35b05cSAndrew Rybchenko #include <rte_mempool.h>
15df96fd0dSBruce Richardson #include <ethdev_driver.h>
16ce35b05cSAndrew Rybchenko 
17ce35b05cSAndrew Rybchenko #include "efx.h"
18ce35b05cSAndrew Rybchenko 
19df1bfde4SAndrew Rybchenko #include "sfc_dp_rx.h"
20df1bfde4SAndrew Rybchenko 
21a8e64c6bSAndrew Rybchenko #ifdef __cplusplus
22a8e64c6bSAndrew Rybchenko extern "C" {
23a8e64c6bSAndrew Rybchenko #endif
24a8e64c6bSAndrew Rybchenko 
25a8e64c6bSAndrew Rybchenko struct sfc_adapter;
26ce35b05cSAndrew Rybchenko struct sfc_evq;
27ce35b05cSAndrew Rybchenko 
28ce35b05cSAndrew Rybchenko /**
29ce35b05cSAndrew Rybchenko  * Software Rx descriptor information associated with hardware Rx
30ce35b05cSAndrew Rybchenko  * descriptor.
31ce35b05cSAndrew Rybchenko  */
32df1bfde4SAndrew Rybchenko struct sfc_efx_rx_sw_desc {
33ce35b05cSAndrew Rybchenko 	struct rte_mbuf		*mbuf;
34ce35b05cSAndrew Rybchenko 	unsigned int		flags;
35ce35b05cSAndrew Rybchenko 	unsigned int		size;
36ce35b05cSAndrew Rybchenko };
37ce35b05cSAndrew Rybchenko 
38ce35b05cSAndrew Rybchenko /** Receive queue state bits */
39ce35b05cSAndrew Rybchenko enum sfc_rxq_state_bit {
40ce35b05cSAndrew Rybchenko 	SFC_RXQ_INITIALIZED_BIT = 0,
41ce35b05cSAndrew Rybchenko #define SFC_RXQ_INITIALIZED	(1 << SFC_RXQ_INITIALIZED_BIT)
4228944ac0SAndrew Rybchenko 	SFC_RXQ_STARTED_BIT,
4328944ac0SAndrew Rybchenko #define SFC_RXQ_STARTED		(1 << SFC_RXQ_STARTED_BIT)
4428944ac0SAndrew Rybchenko 	SFC_RXQ_FLUSHING_BIT,
4528944ac0SAndrew Rybchenko #define SFC_RXQ_FLUSHING	(1 << SFC_RXQ_FLUSHING_BIT)
4628944ac0SAndrew Rybchenko 	SFC_RXQ_FLUSHED_BIT,
4728944ac0SAndrew Rybchenko #define SFC_RXQ_FLUSHED		(1 << SFC_RXQ_FLUSHED_BIT)
4828944ac0SAndrew Rybchenko 	SFC_RXQ_FLUSH_FAILED_BIT,
4928944ac0SAndrew Rybchenko #define SFC_RXQ_FLUSH_FAILED	(1 << SFC_RXQ_FLUSH_FAILED_BIT)
50ce35b05cSAndrew Rybchenko };
51ce35b05cSAndrew Rybchenko 
52ce35b05cSAndrew Rybchenko /**
534e8938ddSAndrew Rybchenko  * Receive queue control primary process-only information.
54ce35b05cSAndrew Rybchenko  */
55ce35b05cSAndrew Rybchenko struct sfc_rxq {
56ce35b05cSAndrew Rybchenko 	struct sfc_evq		*evq;
57ce35b05cSAndrew Rybchenko 	efx_rxq_t		*common;
58ce35b05cSAndrew Rybchenko 	efsys_mem_t		mem;
59ce35b05cSAndrew Rybchenko 	unsigned int		hw_index;
60390f9b8dSAndrew Rybchenko 	uint16_t		buf_size;
61ce35b05cSAndrew Rybchenko };
62ce35b05cSAndrew Rybchenko 
63df1bfde4SAndrew Rybchenko struct sfc_rxq *sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq);
64df1bfde4SAndrew Rybchenko 
65df1bfde4SAndrew Rybchenko /**
66df1bfde4SAndrew Rybchenko  * Receive queue information used on libefx-based data path.
67df1bfde4SAndrew Rybchenko  * Allocated on the socket specified on the queue setup.
68df1bfde4SAndrew Rybchenko  */
69df1bfde4SAndrew Rybchenko struct sfc_efx_rxq {
70df1bfde4SAndrew Rybchenko 	/* Used on data path */
71df1bfde4SAndrew Rybchenko 	struct sfc_evq			*evq;
72df1bfde4SAndrew Rybchenko 	unsigned int			flags;
73df1bfde4SAndrew Rybchenko #define SFC_EFX_RXQ_FLAG_STARTED	0x1
74df1bfde4SAndrew Rybchenko #define SFC_EFX_RXQ_FLAG_RUNNING	0x2
75df1bfde4SAndrew Rybchenko #define SFC_EFX_RXQ_FLAG_RSS_HASH	0x4
764279b54eSGeorgiy Levashov #define SFC_EFX_RXQ_FLAG_INTR_EN	0x8
77df1bfde4SAndrew Rybchenko 	unsigned int			ptr_mask;
78df1bfde4SAndrew Rybchenko 	unsigned int			pending;
79df1bfde4SAndrew Rybchenko 	unsigned int			completed;
80df1bfde4SAndrew Rybchenko 	uint16_t			batch_max;
81df1bfde4SAndrew Rybchenko 	uint16_t			prefix_size;
82df1bfde4SAndrew Rybchenko 	struct sfc_efx_rx_sw_desc	*sw_desc;
83df1bfde4SAndrew Rybchenko 
84df1bfde4SAndrew Rybchenko 	/* Used on refill */
85df1bfde4SAndrew Rybchenko 	unsigned int			added;
86df1bfde4SAndrew Rybchenko 	unsigned int			pushed;
87e5595ee2SAndrew Rybchenko 	unsigned int			max_fill_level;
88df1bfde4SAndrew Rybchenko 	unsigned int			refill_threshold;
89df1bfde4SAndrew Rybchenko 	uint16_t			buf_size;
90df1bfde4SAndrew Rybchenko 	struct rte_mempool		*refill_mb_pool;
91df1bfde4SAndrew Rybchenko 	efx_rxq_t			*common;
92df1bfde4SAndrew Rybchenko 
93df1bfde4SAndrew Rybchenko 	/* Datapath receive queue anchor */
94df1bfde4SAndrew Rybchenko 	struct sfc_dp_rxq		dp;
95df1bfde4SAndrew Rybchenko };
96df1bfde4SAndrew Rybchenko 
97df1bfde4SAndrew Rybchenko static inline struct sfc_efx_rxq *
sfc_efx_rxq_by_dp_rxq(struct sfc_dp_rxq * dp_rxq)98df1bfde4SAndrew Rybchenko sfc_efx_rxq_by_dp_rxq(struct sfc_dp_rxq *dp_rxq)
99df1bfde4SAndrew Rybchenko {
100df1bfde4SAndrew Rybchenko 	return container_of(dp_rxq, struct sfc_efx_rxq, dp);
101df1bfde4SAndrew Rybchenko }
102df1bfde4SAndrew Rybchenko 
103a8e64c6bSAndrew Rybchenko /**
104a8e64c6bSAndrew Rybchenko  * Receive queue information used during setup/release only.
105a8e64c6bSAndrew Rybchenko  * Allocated on the same socket as adapter data.
106a8e64c6bSAndrew Rybchenko  */
107a8e64c6bSAndrew Rybchenko struct sfc_rxq_info {
1082e42d78dSAndrew Rybchenko 	unsigned int		state;
109a8e64c6bSAndrew Rybchenko 	unsigned int		max_entries;
110ce35b05cSAndrew Rybchenko 	unsigned int		entries;
111ce35b05cSAndrew Rybchenko 	efx_rxq_type_t		type;
112d882d617SAndrew Rybchenko 	unsigned int		type_flags;
113bfea01bcSAndrew Rybchenko 	struct sfc_dp_rxq	*dp;
114ac7af396SAndrew Rybchenko 	boolean_t		deferred_start;
115ac7af396SAndrew Rybchenko 	boolean_t		deferred_started;
1165befcecbSAndrew Rybchenko 	unsigned int		refill_threshold;
1175befcecbSAndrew Rybchenko 	struct rte_mempool	*refill_mb_pool;
11892a15fc5SIgor Romanov 	unsigned int		rxq_flags;
119a8e64c6bSAndrew Rybchenko };
120a8e64c6bSAndrew Rybchenko 
1212e42d78dSAndrew Rybchenko struct sfc_rxq_info *sfc_rxq_info_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq);
12209cafbddSIgor Romanov struct sfc_rxq_info *sfc_rxq_info_by_ethdev_qid(struct sfc_adapter_shared *sas,
12309cafbddSIgor Romanov 						sfc_ethdev_qid_t ethdev_qid);
12409cafbddSIgor Romanov struct sfc_rxq *sfc_rxq_ctrl_by_ethdev_qid(struct sfc_adapter *sa,
12509cafbddSIgor Romanov 					   sfc_ethdev_qid_t ethdev_qid);
1262e42d78dSAndrew Rybchenko 
127f7637d4dSAndrew Rybchenko int sfc_rx_configure(struct sfc_adapter *sa);
128f7637d4dSAndrew Rybchenko void sfc_rx_close(struct sfc_adapter *sa);
12928944ac0SAndrew Rybchenko int sfc_rx_start(struct sfc_adapter *sa);
13028944ac0SAndrew Rybchenko void sfc_rx_stop(struct sfc_adapter *sa);
131a8e64c6bSAndrew Rybchenko 
132b8cf5ba5SIgor Romanov int sfc_rx_qinit_info(struct sfc_adapter *sa, sfc_sw_index_t sw_index,
133b8cf5ba5SIgor Romanov 		      unsigned int extra_efx_type_flags);
134ce35b05cSAndrew Rybchenko int sfc_rx_qinit(struct sfc_adapter *sa, unsigned int rx_queue_id,
135ce35b05cSAndrew Rybchenko 		 uint16_t nb_rx_desc, unsigned int socket_id,
136ce35b05cSAndrew Rybchenko 		 const struct rte_eth_rxconf *rx_conf,
137ce35b05cSAndrew Rybchenko 		 struct rte_mempool *mb_pool);
13809cafbddSIgor Romanov void sfc_rx_qfini(struct sfc_adapter *sa, sfc_sw_index_t sw_index);
13909cafbddSIgor Romanov int sfc_rx_qstart(struct sfc_adapter *sa, sfc_sw_index_t sw_index);
14009cafbddSIgor Romanov void sfc_rx_qstop(struct sfc_adapter *sa, sfc_sw_index_t sw_index);
14128944ac0SAndrew Rybchenko 
142cd8da5e8SIvan Malov uint64_t sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa);
143ff6a1197SIvan Malov uint64_t sfc_rx_get_queue_offload_caps(struct sfc_adapter *sa);
144cd8da5e8SIvan Malov 
1452e42d78dSAndrew Rybchenko void sfc_rx_qflush_done(struct sfc_rxq_info *rxq_info);
1462e42d78dSAndrew Rybchenko void sfc_rx_qflush_failed(struct sfc_rxq_info *rxq_info);
147ce35b05cSAndrew Rybchenko 
148*a9a238e9SIgor Romanov unsigned int sfc_rx_get_pushed(struct sfc_adapter *sa,
149*a9a238e9SIgor Romanov 			       struct sfc_dp_rxq *dp_rxq);
150*a9a238e9SIgor Romanov 
15101764b20SIvan Malov int sfc_rx_hash_init(struct sfc_adapter *sa);
15201764b20SIvan Malov void sfc_rx_hash_fini(struct sfc_adapter *sa);
15301764b20SIvan Malov int sfc_rx_hf_rte_to_efx(struct sfc_adapter *sa, uint64_t rte,
15401764b20SIvan Malov 			 efx_rx_hash_type_t *efx);
155e295f175SAndrew Rybchenko uint64_t sfc_rx_hf_efx_to_rte(struct sfc_rss *rss, efx_rx_hash_type_t efx);
1566c0cc77aSIgor Romanov boolean_t sfc_rx_check_scatter(size_t pdu, size_t rx_buf_size,
1576c0cc77aSIgor Romanov 			       uint32_t rx_prefix_size,
1586c0cc77aSIgor Romanov 			       boolean_t rx_scatter_enabled,
159d41a6268SIgor Romanov 			       uint32_t rx_scatter_max,
1606c0cc77aSIgor Romanov 			       const char **error);
1614ec1fc3bSIvan Malov 
162a8e64c6bSAndrew Rybchenko #ifdef __cplusplus
163a8e64c6bSAndrew Rybchenko }
164a8e64c6bSAndrew Rybchenko #endif
165a8e64c6bSAndrew Rybchenko #endif  /* _SFC_RX_H */
166