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