xref: /dpdk/drivers/net/gve/gve_ethdev.h (revision eb8ec5c3452a35e02dbb928b19d6c394e5e7e658)
1457967cdSJunfeng Guo /* SPDX-License-Identifier: BSD-3-Clause
2457967cdSJunfeng Guo  * Copyright(C) 2022 Intel Corporation
3457967cdSJunfeng Guo  */
4457967cdSJunfeng Guo 
5457967cdSJunfeng Guo #ifndef _GVE_ETHDEV_H_
6457967cdSJunfeng Guo #define _GVE_ETHDEV_H_
7457967cdSJunfeng Guo 
8457967cdSJunfeng Guo #include <ethdev_driver.h>
9457967cdSJunfeng Guo #include <ethdev_pci.h>
10457967cdSJunfeng Guo #include <rte_ether.h>
11baa9c550SDavid Marchand #include <rte_pci.h>
12457967cdSJunfeng Guo 
13457967cdSJunfeng Guo #include "base/gve.h"
14457967cdSJunfeng Guo 
15abf1242fSJunfeng Guo /* TODO: this is a workaround to ensure that Tx complq is enough */
16abf1242fSJunfeng Guo #define DQO_TX_MULTIPLIER 4
17abf1242fSJunfeng Guo 
18*eb8ec5c3SJoshua Washington #define GVE_DEFAULT_MAX_RING_SIZE	1024
19*eb8ec5c3SJoshua Washington #define GVE_DEFAULT_MIN_RX_RING_SIZE	512
20*eb8ec5c3SJoshua Washington #define GVE_DEFAULT_MIN_TX_RING_SIZE	256
21*eb8ec5c3SJoshua Washington 
225e9933c9SRushil Gupta #define GVE_DEFAULT_RX_FREE_THRESH	64
23a14d391cSJunfeng Guo #define GVE_DEFAULT_TX_FREE_THRESH	32
24a14d391cSJunfeng Guo #define GVE_DEFAULT_TX_RS_THRESH	32
25457967cdSJunfeng Guo #define GVE_TX_MAX_FREE_SZ		512
26457967cdSJunfeng Guo 
27835021a8SJoshua Washington #define GVE_RX_BUF_ALIGN_DQO		128
28835021a8SJoshua Washington #define GVE_RX_MIN_BUF_SIZE_DQO		1024
29835021a8SJoshua Washington #define GVE_RX_MAX_BUF_SIZE_DQO		((16 * 1024) - GVE_RX_BUF_ALIGN_DQO)
308493b4edSRushil Gupta #define GVE_MAX_QUEUE_SIZE_DQO		4096
31835021a8SJoshua Washington 
32835021a8SJoshua Washington #define GVE_RX_BUF_ALIGN_GQI		2048
33835021a8SJoshua Washington #define GVE_RX_MIN_BUF_SIZE_GQI		2048
34835021a8SJoshua Washington #define GVE_RX_MAX_BUF_SIZE_GQI		4096
35457967cdSJunfeng Guo 
3663ef5456SJoshua Washington #define GVE_RSS_HASH_KEY_SIZE 40
3763ef5456SJoshua Washington #define GVE_RSS_INDIR_SIZE 128
3863ef5456SJoshua Washington 
3939dde93aSJunfeng Guo #define GVE_TX_CKSUM_OFFLOAD_MASK (		\
4039dde93aSJunfeng Guo 		RTE_MBUF_F_TX_L4_MASK  |	\
4139dde93aSJunfeng Guo 		RTE_MBUF_F_TX_TCP_SEG)
4239dde93aSJunfeng Guo 
43f2a9e162SRushil Gupta #define GVE_TX_CKSUM_OFFLOAD_MASK_DQO (		\
44f2a9e162SRushil Gupta 		GVE_TX_CKSUM_OFFLOAD_MASK |	\
45f2a9e162SRushil Gupta 		RTE_MBUF_F_TX_IP_CKSUM)
46f2a9e162SRushil Gupta 
47d6ac6f45SJoshua Washington #define GVE_RTE_RSS_OFFLOAD_ALL (	\
4861f77e67SJoshua Washington 	RTE_ETH_RSS_IPV4 |		\
4961f77e67SJoshua Washington 	RTE_ETH_RSS_NONFRAG_IPV4_TCP |	\
5061f77e67SJoshua Washington 	RTE_ETH_RSS_IPV6 |		\
5161f77e67SJoshua Washington 	RTE_ETH_RSS_IPV6_EX |		\
5261f77e67SJoshua Washington 	RTE_ETH_RSS_NONFRAG_IPV6_TCP |	\
53179f293bSJoshua Washington 	RTE_ETH_RSS_IPV6_TCP_EX |	\
54179f293bSJoshua Washington 	RTE_ETH_RSS_NONFRAG_IPV4_UDP |	\
55179f293bSJoshua Washington 	RTE_ETH_RSS_NONFRAG_IPV6_UDP |	\
56179f293bSJoshua Washington 	RTE_ETH_RSS_IPV6_UDP_EX)
5761f77e67SJoshua Washington 
58457967cdSJunfeng Guo /* A list of pages registered with the device during setup and used by a queue
59457967cdSJunfeng Guo  * as buffers
60457967cdSJunfeng Guo  */
61457967cdSJunfeng Guo struct gve_queue_page_list {
62457967cdSJunfeng Guo 	uint32_t id; /* unique id */
63457967cdSJunfeng Guo 	uint32_t num_entries;
64457967cdSJunfeng Guo 	dma_addr_t *page_buses; /* the dma addrs of the pages */
65457967cdSJunfeng Guo 	const struct rte_memzone *mz;
66457967cdSJunfeng Guo };
67457967cdSJunfeng Guo 
68457967cdSJunfeng Guo /* A TX desc ring entry */
69457967cdSJunfeng Guo union gve_tx_desc {
70457967cdSJunfeng Guo 	struct gve_tx_pkt_desc pkt; /* first desc for a packet */
71457967cdSJunfeng Guo 	struct gve_tx_seg_desc seg; /* subsequent descs for a packet */
72457967cdSJunfeng Guo };
73457967cdSJunfeng Guo 
74a14d391cSJunfeng Guo /* Tx desc for DQO format */
75a14d391cSJunfeng Guo union gve_tx_desc_dqo {
76a14d391cSJunfeng Guo 	struct gve_tx_pkt_desc_dqo pkt;
77a14d391cSJunfeng Guo 	struct gve_tx_tso_context_desc_dqo tso_ctx;
78a14d391cSJunfeng Guo 	struct gve_tx_general_context_desc_dqo general_ctx;
79a14d391cSJunfeng Guo };
80a14d391cSJunfeng Guo 
81a46583cfSJunfeng Guo /* Offload features */
82a46583cfSJunfeng Guo union gve_tx_offload {
83a46583cfSJunfeng Guo 	uint64_t data;
84a46583cfSJunfeng Guo 	struct {
85a46583cfSJunfeng Guo 		uint64_t l2_len:7; /* L2 (MAC) Header Length. */
86a46583cfSJunfeng Guo 		uint64_t l3_len:9; /* L3 (IP) Header Length. */
87a46583cfSJunfeng Guo 		uint64_t l4_len:8; /* L4 Header Length. */
88a46583cfSJunfeng Guo 		uint64_t tso_segsz:16; /* TCP TSO segment size */
89a46583cfSJunfeng Guo 		/* uint64_t unused : 24; */
90a46583cfSJunfeng Guo 	};
91a46583cfSJunfeng Guo };
92a46583cfSJunfeng Guo 
934bec2d0bSJunfeng Guo struct gve_tx_iovec {
944bec2d0bSJunfeng Guo 	uint32_t iov_base; /* offset in fifo */
954bec2d0bSJunfeng Guo 	uint32_t iov_len;
964bec2d0bSJunfeng Guo };
974bec2d0bSJunfeng Guo 
98c222ea9cSLevend Sayar struct gve_tx_stats {
99c222ea9cSLevend Sayar 	uint64_t packets;
100c222ea9cSLevend Sayar 	uint64_t bytes;
101c222ea9cSLevend Sayar 	uint64_t errors;
102c222ea9cSLevend Sayar };
103c222ea9cSLevend Sayar 
104c222ea9cSLevend Sayar struct gve_rx_stats {
105c222ea9cSLevend Sayar 	uint64_t packets;
106c222ea9cSLevend Sayar 	uint64_t bytes;
107c222ea9cSLevend Sayar 	uint64_t errors;
108c222ea9cSLevend Sayar 	uint64_t no_mbufs;
109c222ea9cSLevend Sayar 	uint64_t no_mbufs_bulk;
110458b53deSRushil Gupta 	uint64_t imissed;
111c222ea9cSLevend Sayar };
112c222ea9cSLevend Sayar 
113c222ea9cSLevend Sayar struct gve_xstats_name_offset {
114c222ea9cSLevend Sayar 	char name[RTE_ETH_XSTATS_NAME_SIZE];
115c222ea9cSLevend Sayar 	unsigned int offset;
116c222ea9cSLevend Sayar };
117c222ea9cSLevend Sayar 
118457967cdSJunfeng Guo struct gve_tx_queue {
119457967cdSJunfeng Guo 	volatile union gve_tx_desc *tx_desc_ring;
120457967cdSJunfeng Guo 	const struct rte_memzone *mz;
121457967cdSJunfeng Guo 	uint64_t tx_ring_phys_addr;
1224bec2d0bSJunfeng Guo 	struct rte_mbuf **sw_ring;
1234bec2d0bSJunfeng Guo 	volatile rte_be32_t *qtx_tail;
1244bec2d0bSJunfeng Guo 	volatile rte_be32_t *qtx_head;
125457967cdSJunfeng Guo 
1264bec2d0bSJunfeng Guo 	uint32_t tx_tail;
127457967cdSJunfeng Guo 	uint16_t nb_tx_desc;
1284bec2d0bSJunfeng Guo 	uint16_t nb_free;
129a14d391cSJunfeng Guo 	uint16_t nb_used;
1304bec2d0bSJunfeng Guo 	uint32_t next_to_clean;
1314bec2d0bSJunfeng Guo 	uint16_t free_thresh;
132a14d391cSJunfeng Guo 	uint16_t rs_thresh;
133457967cdSJunfeng Guo 
134457967cdSJunfeng Guo 	/* Only valid for DQO_QPL queue format */
1354bec2d0bSJunfeng Guo 	uint16_t sw_tail;
1364bec2d0bSJunfeng Guo 	uint16_t sw_ntc;
1374bec2d0bSJunfeng Guo 	uint16_t sw_nb_free;
1384bec2d0bSJunfeng Guo 	uint32_t fifo_size;
1394bec2d0bSJunfeng Guo 	uint32_t fifo_head;
1404bec2d0bSJunfeng Guo 	uint32_t fifo_avail;
1414bec2d0bSJunfeng Guo 	uint64_t fifo_base;
142457967cdSJunfeng Guo 	struct gve_queue_page_list *qpl;
1434bec2d0bSJunfeng Guo 	struct gve_tx_iovec *iov_ring;
144457967cdSJunfeng Guo 
1454f6b1dd8SJunfeng Guo 	/* stats items */
146c222ea9cSLevend Sayar 	struct gve_tx_stats stats;
1474f6b1dd8SJunfeng Guo 
148457967cdSJunfeng Guo 	uint16_t port_id;
149457967cdSJunfeng Guo 	uint16_t queue_id;
150457967cdSJunfeng Guo 
151457967cdSJunfeng Guo 	uint16_t ntfy_id;
152457967cdSJunfeng Guo 	volatile rte_be32_t *ntfy_addr;
153457967cdSJunfeng Guo 
154457967cdSJunfeng Guo 	struct gve_priv *hw;
155457967cdSJunfeng Guo 	const struct rte_memzone *qres_mz;
156457967cdSJunfeng Guo 	struct gve_queue_resources *qres;
157457967cdSJunfeng Guo 
158abf1242fSJunfeng Guo 	/* newly added for DQO */
159a14d391cSJunfeng Guo 	volatile union gve_tx_desc_dqo *tx_ring;
160a14d391cSJunfeng Guo 	struct gve_tx_compl_desc *compl_ring;
161a14d391cSJunfeng Guo 	const struct rte_memzone *compl_ring_mz;
162abf1242fSJunfeng Guo 	uint64_t compl_ring_phys_addr;
163a14d391cSJunfeng Guo 	uint32_t complq_tail;
164a14d391cSJunfeng Guo 	uint16_t sw_size;
165a14d391cSJunfeng Guo 	uint8_t cur_gen_bit;
166a14d391cSJunfeng Guo 	uint32_t last_desc_cleaned;
167a14d391cSJunfeng Guo 	void **txqs;
1684022f999SJunfeng Guo 	uint16_t re_cnt;
169abf1242fSJunfeng Guo 
170457967cdSJunfeng Guo 	/* Only valid for DQO_RDA queue format */
171457967cdSJunfeng Guo 	struct gve_tx_queue *complq;
1724bec2d0bSJunfeng Guo 
1734bec2d0bSJunfeng Guo 	uint8_t is_gqi_qpl;
174457967cdSJunfeng Guo };
175457967cdSJunfeng Guo 
176496d4d2cSJunfeng Guo struct gve_rx_ctx {
177496d4d2cSJunfeng Guo 	struct rte_mbuf *mbuf_head;
178496d4d2cSJunfeng Guo 	struct rte_mbuf *mbuf_tail;
179496d4d2cSJunfeng Guo 	uint16_t total_frags;
180496d4d2cSJunfeng Guo 	bool drop_pkt;
181496d4d2cSJunfeng Guo };
182496d4d2cSJunfeng Guo 
183457967cdSJunfeng Guo struct gve_rx_queue {
184457967cdSJunfeng Guo 	volatile struct gve_rx_desc *rx_desc_ring;
185457967cdSJunfeng Guo 	volatile union gve_rx_data_slot *rx_data_ring;
186457967cdSJunfeng Guo 	const struct rte_memzone *mz;
187457967cdSJunfeng Guo 	const struct rte_memzone *data_mz;
188457967cdSJunfeng Guo 	uint64_t rx_ring_phys_addr;
1894bec2d0bSJunfeng Guo 	struct rte_mbuf **sw_ring;
1904bec2d0bSJunfeng Guo 	struct rte_mempool *mpool;
191496d4d2cSJunfeng Guo 	struct gve_rx_ctx ctx;
192457967cdSJunfeng Guo 
1934bec2d0bSJunfeng Guo 	uint16_t rx_tail;
194457967cdSJunfeng Guo 	uint16_t nb_rx_desc;
1954bec2d0bSJunfeng Guo 	uint16_t expected_seqno; /* the next expected seqno */
1964bec2d0bSJunfeng Guo 	uint16_t free_thresh;
1971dc00f4fSJunfeng Guo 	uint16_t nb_rx_hold;
1984bec2d0bSJunfeng Guo 	uint32_t next_avail;
1994bec2d0bSJunfeng Guo 	uint32_t nb_avail;
200457967cdSJunfeng Guo 
2014bec2d0bSJunfeng Guo 	volatile rte_be32_t *qrx_tail;
202457967cdSJunfeng Guo 	volatile rte_be32_t *ntfy_addr;
203457967cdSJunfeng Guo 
204457967cdSJunfeng Guo 	/* only valid for GQI_QPL queue format */
205457967cdSJunfeng Guo 	struct gve_queue_page_list *qpl;
206457967cdSJunfeng Guo 
2074f6b1dd8SJunfeng Guo 	/* stats items */
208c222ea9cSLevend Sayar 	struct gve_rx_stats stats;
2094f6b1dd8SJunfeng Guo 
210457967cdSJunfeng Guo 	struct gve_priv *hw;
211457967cdSJunfeng Guo 	const struct rte_memzone *qres_mz;
212457967cdSJunfeng Guo 	struct gve_queue_resources *qres;
213457967cdSJunfeng Guo 
214457967cdSJunfeng Guo 	uint16_t port_id;
215457967cdSJunfeng Guo 	uint16_t queue_id;
216457967cdSJunfeng Guo 	uint16_t ntfy_id;
217457967cdSJunfeng Guo 	uint16_t rx_buf_len;
218457967cdSJunfeng Guo 
219abf1242fSJunfeng Guo 	/* newly added for DQO */
2201dc00f4fSJunfeng Guo 	volatile struct gve_rx_desc_dqo *rx_ring;
2211dc00f4fSJunfeng Guo 	struct gve_rx_compl_desc_dqo *compl_ring;
2221dc00f4fSJunfeng Guo 	const struct rte_memzone *compl_ring_mz;
223abf1242fSJunfeng Guo 	uint64_t compl_ring_phys_addr;
2241dc00f4fSJunfeng Guo 	uint8_t cur_gen_bit;
2251dc00f4fSJunfeng Guo 	uint16_t bufq_tail;
226abf1242fSJunfeng Guo 
227457967cdSJunfeng Guo 	/* Only valid for DQO_RDA queue format */
228457967cdSJunfeng Guo 	struct gve_rx_queue *bufq;
2294bec2d0bSJunfeng Guo 
2304bec2d0bSJunfeng Guo 	uint8_t is_gqi_qpl;
231457967cdSJunfeng Guo };
232457967cdSJunfeng Guo 
233457967cdSJunfeng Guo struct gve_priv {
234457967cdSJunfeng Guo 	struct gve_irq_db *irq_dbs; /* array of num_ntfy_blks */
235457967cdSJunfeng Guo 	const struct rte_memzone *irq_dbs_mz;
236457967cdSJunfeng Guo 	uint32_t mgmt_msix_idx;
237457967cdSJunfeng Guo 	rte_be32_t *cnt_array; /* array of num_event_counters */
238457967cdSJunfeng Guo 	const struct rte_memzone *cnt_array_mz;
239457967cdSJunfeng Guo 
240457967cdSJunfeng Guo 	uint16_t num_event_counters;
241*eb8ec5c3SJoshua Washington 
242*eb8ec5c3SJoshua Washington 	/* TX ring size default and limits. */
243*eb8ec5c3SJoshua Washington 	uint16_t default_tx_desc_cnt;
244b6af400eSJoshua Washington 	uint16_t max_tx_desc_cnt;
245*eb8ec5c3SJoshua Washington 	uint16_t min_tx_desc_cnt;
246*eb8ec5c3SJoshua Washington 
247*eb8ec5c3SJoshua Washington 	/* RX ring size default and limits. */
248*eb8ec5c3SJoshua Washington 	uint16_t default_rx_desc_cnt;
249b6af400eSJoshua Washington 	uint16_t max_rx_desc_cnt;
250*eb8ec5c3SJoshua Washington 	uint16_t min_rx_desc_cnt;
251*eb8ec5c3SJoshua Washington 
2526c6543b9SJoshua Washington 	uint16_t tx_pages_per_qpl;
253457967cdSJunfeng Guo 
254457967cdSJunfeng Guo 	/* Only valid for DQO_RDA queue format */
255457967cdSJunfeng Guo 	uint16_t tx_compq_size; /* tx completion queue size */
256457967cdSJunfeng Guo 	uint16_t rx_bufq_size; /* rx buff queue size */
257457967cdSJunfeng Guo 
258457967cdSJunfeng Guo 	uint64_t max_registered_pages;
259457967cdSJunfeng Guo 	uint64_t num_registered_pages; /* num pages registered with NIC */
260457967cdSJunfeng Guo 	uint16_t default_num_queues; /* default num queues to set up */
261457967cdSJunfeng Guo 	enum gve_queue_format queue_format; /* see enum gve_queue_format */
262457967cdSJunfeng Guo 	uint8_t enable_rsc;
263457967cdSJunfeng Guo 
264457967cdSJunfeng Guo 	uint16_t max_nb_txq;
265457967cdSJunfeng Guo 	uint16_t max_nb_rxq;
266457967cdSJunfeng Guo 	uint32_t num_ntfy_blks; /* spilt between TX and RX so must be even */
267457967cdSJunfeng Guo 
268457967cdSJunfeng Guo 	struct gve_registers __iomem *reg_bar0; /* see gve_register.h */
269457967cdSJunfeng Guo 	rte_be32_t __iomem *db_bar2; /* "array" of doorbells */
270457967cdSJunfeng Guo 	struct rte_pci_device *pci_dev;
271457967cdSJunfeng Guo 
272457967cdSJunfeng Guo 	/* Admin queue - see gve_adminq.h*/
273457967cdSJunfeng Guo 	union gve_adminq_command *adminq;
274457967cdSJunfeng Guo 	struct gve_dma_mem adminq_dma_mem;
275457967cdSJunfeng Guo 	uint32_t adminq_mask; /* masks prod_cnt to adminq size */
276457967cdSJunfeng Guo 	uint32_t adminq_prod_cnt; /* free-running count of AQ cmds executed */
277457967cdSJunfeng Guo 	uint32_t adminq_cmd_fail; /* free-running count of AQ cmds failed */
278457967cdSJunfeng Guo 	uint32_t adminq_timeouts; /* free-running count of AQ cmds timeouts */
279457967cdSJunfeng Guo 	/* free-running count of per AQ cmd executed */
280457967cdSJunfeng Guo 	uint32_t adminq_describe_device_cnt;
281457967cdSJunfeng Guo 	uint32_t adminq_cfg_device_resources_cnt;
282457967cdSJunfeng Guo 	uint32_t adminq_register_page_list_cnt;
283457967cdSJunfeng Guo 	uint32_t adminq_unregister_page_list_cnt;
284457967cdSJunfeng Guo 	uint32_t adminq_create_tx_queue_cnt;
285457967cdSJunfeng Guo 	uint32_t adminq_create_rx_queue_cnt;
286457967cdSJunfeng Guo 	uint32_t adminq_destroy_tx_queue_cnt;
287457967cdSJunfeng Guo 	uint32_t adminq_destroy_rx_queue_cnt;
288457967cdSJunfeng Guo 	uint32_t adminq_dcfg_device_resources_cnt;
289179f293bSJoshua Washington 	uint32_t adminq_cfg_rss_cnt;
290457967cdSJunfeng Guo 	uint32_t adminq_set_driver_parameter_cnt;
291457967cdSJunfeng Guo 	uint32_t adminq_report_stats_cnt;
292457967cdSJunfeng Guo 	uint32_t adminq_report_link_speed_cnt;
293457967cdSJunfeng Guo 	uint32_t adminq_get_ptype_map_cnt;
294748d0e7fSRushil Gupta 	uint32_t adminq_verify_driver_compatibility_cnt;
295457967cdSJunfeng Guo 	volatile uint32_t state_flags;
296457967cdSJunfeng Guo 
297457967cdSJunfeng Guo 	/* Gvnic device link speed from hypervisor. */
298457967cdSJunfeng Guo 	uint64_t link_speed;
299457967cdSJunfeng Guo 
300457967cdSJunfeng Guo 	uint16_t max_mtu;
301457967cdSJunfeng Guo 	struct rte_ether_addr dev_addr; /* mac address */
302457967cdSJunfeng Guo 
303457967cdSJunfeng Guo 	struct gve_tx_queue **txqs;
304457967cdSJunfeng Guo 	struct gve_rx_queue **rxqs;
305458b53deSRushil Gupta 
306458b53deSRushil Gupta 	uint32_t stats_report_len;
307458b53deSRushil Gupta 	const struct rte_memzone *stats_report_mem;
308458b53deSRushil Gupta 	uint16_t stats_start_idx; /* start index of array of stats written by NIC */
309458b53deSRushil Gupta 	uint16_t stats_end_idx; /* end index of array of stats written by NIC */
310d6ac6f45SJoshua Washington 
311d6ac6f45SJoshua Washington 	struct gve_rss_config rss_config;
312f2a9e162SRushil Gupta 	struct gve_ptype_lut *ptype_lut_dqo;
313457967cdSJunfeng Guo };
314457967cdSJunfeng Guo 
315457967cdSJunfeng Guo static inline bool
316457967cdSJunfeng Guo gve_is_gqi(struct gve_priv *priv)
317457967cdSJunfeng Guo {
318457967cdSJunfeng Guo 	return priv->queue_format == GVE_GQI_RDA_FORMAT ||
319457967cdSJunfeng Guo 		priv->queue_format == GVE_GQI_QPL_FORMAT;
320457967cdSJunfeng Guo }
321457967cdSJunfeng Guo 
322457967cdSJunfeng Guo static inline bool
323457967cdSJunfeng Guo gve_get_admin_queue_ok(struct gve_priv *priv)
324457967cdSJunfeng Guo {
325457967cdSJunfeng Guo 	return !!rte_bit_relaxed_get32(GVE_PRIV_FLAGS_ADMIN_QUEUE_OK,
326457967cdSJunfeng Guo 				       &priv->state_flags);
327457967cdSJunfeng Guo }
328457967cdSJunfeng Guo 
329457967cdSJunfeng Guo static inline void
330457967cdSJunfeng Guo gve_set_admin_queue_ok(struct gve_priv *priv)
331457967cdSJunfeng Guo {
332457967cdSJunfeng Guo 	rte_bit_relaxed_set32(GVE_PRIV_FLAGS_ADMIN_QUEUE_OK,
333457967cdSJunfeng Guo 			      &priv->state_flags);
334457967cdSJunfeng Guo }
335457967cdSJunfeng Guo 
336457967cdSJunfeng Guo static inline void
337457967cdSJunfeng Guo gve_clear_admin_queue_ok(struct gve_priv *priv)
338457967cdSJunfeng Guo {
339457967cdSJunfeng Guo 	rte_bit_relaxed_clear32(GVE_PRIV_FLAGS_ADMIN_QUEUE_OK,
340457967cdSJunfeng Guo 				&priv->state_flags);
341457967cdSJunfeng Guo }
342457967cdSJunfeng Guo 
343457967cdSJunfeng Guo static inline bool
344457967cdSJunfeng Guo gve_get_device_resources_ok(struct gve_priv *priv)
345457967cdSJunfeng Guo {
346457967cdSJunfeng Guo 	return !!rte_bit_relaxed_get32(GVE_PRIV_FLAGS_DEVICE_RESOURCES_OK,
347457967cdSJunfeng Guo 				       &priv->state_flags);
348457967cdSJunfeng Guo }
349457967cdSJunfeng Guo 
350457967cdSJunfeng Guo static inline void
351457967cdSJunfeng Guo gve_set_device_resources_ok(struct gve_priv *priv)
352457967cdSJunfeng Guo {
353457967cdSJunfeng Guo 	rte_bit_relaxed_set32(GVE_PRIV_FLAGS_DEVICE_RESOURCES_OK,
354457967cdSJunfeng Guo 			      &priv->state_flags);
355457967cdSJunfeng Guo }
356457967cdSJunfeng Guo 
357457967cdSJunfeng Guo static inline void
358457967cdSJunfeng Guo gve_clear_device_resources_ok(struct gve_priv *priv)
359457967cdSJunfeng Guo {
360457967cdSJunfeng Guo 	rte_bit_relaxed_clear32(GVE_PRIV_FLAGS_DEVICE_RESOURCES_OK,
361457967cdSJunfeng Guo 				&priv->state_flags);
362457967cdSJunfeng Guo }
363457967cdSJunfeng Guo 
364457967cdSJunfeng Guo static inline bool
365457967cdSJunfeng Guo gve_get_device_rings_ok(struct gve_priv *priv)
366457967cdSJunfeng Guo {
367457967cdSJunfeng Guo 	return !!rte_bit_relaxed_get32(GVE_PRIV_FLAGS_DEVICE_RINGS_OK,
368457967cdSJunfeng Guo 				       &priv->state_flags);
369457967cdSJunfeng Guo }
370457967cdSJunfeng Guo 
371457967cdSJunfeng Guo static inline void
372457967cdSJunfeng Guo gve_set_device_rings_ok(struct gve_priv *priv)
373457967cdSJunfeng Guo {
374457967cdSJunfeng Guo 	rte_bit_relaxed_set32(GVE_PRIV_FLAGS_DEVICE_RINGS_OK,
375457967cdSJunfeng Guo 			      &priv->state_flags);
376457967cdSJunfeng Guo }
377457967cdSJunfeng Guo 
378457967cdSJunfeng Guo static inline void
379457967cdSJunfeng Guo gve_clear_device_rings_ok(struct gve_priv *priv)
380457967cdSJunfeng Guo {
381457967cdSJunfeng Guo 	rte_bit_relaxed_clear32(GVE_PRIV_FLAGS_DEVICE_RINGS_OK,
382457967cdSJunfeng Guo 				&priv->state_flags);
383457967cdSJunfeng Guo }
384457967cdSJunfeng Guo 
3854bec2d0bSJunfeng Guo int
3864bec2d0bSJunfeng Guo gve_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id, uint16_t nb_desc,
3874bec2d0bSJunfeng Guo 		   unsigned int socket_id, const struct rte_eth_rxconf *conf,
3884bec2d0bSJunfeng Guo 		   struct rte_mempool *pool);
3894bec2d0bSJunfeng Guo int
3904bec2d0bSJunfeng Guo gve_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id, uint16_t nb_desc,
3914bec2d0bSJunfeng Guo 		   unsigned int socket_id, const struct rte_eth_txconf *conf);
3924bec2d0bSJunfeng Guo 
3934bec2d0bSJunfeng Guo void
39410d9e91aSJunfeng Guo gve_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid);
3954bec2d0bSJunfeng Guo 
3964bec2d0bSJunfeng Guo void
39710d9e91aSJunfeng Guo gve_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid);
3984bec2d0bSJunfeng Guo 
399b044845bSJunfeng Guo int
400b044845bSJunfeng Guo gve_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id);
401b044845bSJunfeng Guo 
402b044845bSJunfeng Guo int
403b044845bSJunfeng Guo gve_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id);
404b044845bSJunfeng Guo 
405b044845bSJunfeng Guo int
406b044845bSJunfeng Guo gve_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id);
407b044845bSJunfeng Guo 
408b044845bSJunfeng Guo int
409b044845bSJunfeng Guo gve_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id);
410b044845bSJunfeng Guo 
4114bec2d0bSJunfeng Guo void
4124bec2d0bSJunfeng Guo gve_stop_tx_queues(struct rte_eth_dev *dev);
4134bec2d0bSJunfeng Guo 
4144bec2d0bSJunfeng Guo void
4154bec2d0bSJunfeng Guo gve_stop_rx_queues(struct rte_eth_dev *dev);
4164bec2d0bSJunfeng Guo 
417a46583cfSJunfeng Guo uint16_t
418a46583cfSJunfeng Guo gve_rx_burst(void *rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
419a46583cfSJunfeng Guo 
420a46583cfSJunfeng Guo uint16_t
421a46583cfSJunfeng Guo gve_tx_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);
422a46583cfSJunfeng Guo 
423b044845bSJunfeng Guo void
424b044845bSJunfeng Guo gve_set_rx_function(struct rte_eth_dev *dev);
425b044845bSJunfeng Guo 
426b044845bSJunfeng Guo void
427b044845bSJunfeng Guo gve_set_tx_function(struct rte_eth_dev *dev);
428b044845bSJunfeng Guo 
4297f369975SJoshua Washington struct gve_queue_page_list *
4307f369975SJoshua Washington gve_setup_queue_page_list(struct gve_priv *priv, uint16_t queue_id, bool is_rx,
4317f369975SJoshua Washington 	uint32_t num_pages);
4327f369975SJoshua Washington int
4337f369975SJoshua Washington gve_teardown_queue_page_list(struct gve_priv *priv,
4347f369975SJoshua Washington 	struct gve_queue_page_list *qpl);
4357f369975SJoshua Washington 
436a14d391cSJunfeng Guo /* Below functions are used for DQO */
437a14d391cSJunfeng Guo 
438a14d391cSJunfeng Guo int
4391dc00f4fSJunfeng Guo gve_rx_queue_setup_dqo(struct rte_eth_dev *dev, uint16_t queue_id,
4401dc00f4fSJunfeng Guo 		       uint16_t nb_desc, unsigned int socket_id,
4411dc00f4fSJunfeng Guo 		       const struct rte_eth_rxconf *conf,
4421dc00f4fSJunfeng Guo 		       struct rte_mempool *pool);
4431dc00f4fSJunfeng Guo int
444a14d391cSJunfeng Guo gve_tx_queue_setup_dqo(struct rte_eth_dev *dev, uint16_t queue_id,
445a14d391cSJunfeng Guo 		       uint16_t nb_desc, unsigned int socket_id,
446a14d391cSJunfeng Guo 		       const struct rte_eth_txconf *conf);
447a14d391cSJunfeng Guo 
4481e27182eSJunfeng Guo void
4491e27182eSJunfeng Guo gve_tx_queue_release_dqo(struct rte_eth_dev *dev, uint16_t qid);
4501e27182eSJunfeng Guo 
4511e27182eSJunfeng Guo void
4521e27182eSJunfeng Guo gve_rx_queue_release_dqo(struct rte_eth_dev *dev, uint16_t qid);
4531e27182eSJunfeng Guo 
454b044845bSJunfeng Guo int
455b044845bSJunfeng Guo gve_rx_queue_start_dqo(struct rte_eth_dev *dev, uint16_t rx_queue_id);
456b044845bSJunfeng Guo 
457b044845bSJunfeng Guo int
458b044845bSJunfeng Guo gve_tx_queue_start_dqo(struct rte_eth_dev *dev, uint16_t tx_queue_id);
459b044845bSJunfeng Guo 
460b044845bSJunfeng Guo int
461b044845bSJunfeng Guo gve_rx_queue_stop_dqo(struct rte_eth_dev *dev, uint16_t rx_queue_id);
462b044845bSJunfeng Guo 
463b044845bSJunfeng Guo int
464b044845bSJunfeng Guo gve_tx_queue_stop_dqo(struct rte_eth_dev *dev, uint16_t tx_queue_id);
465b044845bSJunfeng Guo 
4661e27182eSJunfeng Guo void
4671e27182eSJunfeng Guo gve_stop_tx_queues_dqo(struct rte_eth_dev *dev);
4681e27182eSJunfeng Guo 
4691e27182eSJunfeng Guo void
4701e27182eSJunfeng Guo gve_stop_rx_queues_dqo(struct rte_eth_dev *dev);
4711e27182eSJunfeng Guo 
4724022f999SJunfeng Guo uint16_t
47345da16b5SJunfeng Guo gve_rx_burst_dqo(void *rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
47445da16b5SJunfeng Guo 
47545da16b5SJunfeng Guo uint16_t
4764022f999SJunfeng Guo gve_tx_burst_dqo(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);
4774022f999SJunfeng Guo 
478b044845bSJunfeng Guo void
479b044845bSJunfeng Guo gve_set_rx_function_dqo(struct rte_eth_dev *dev);
480b044845bSJunfeng Guo 
481b044845bSJunfeng Guo void
482b044845bSJunfeng Guo gve_set_tx_function_dqo(struct rte_eth_dev *dev);
483b044845bSJunfeng Guo 
484457967cdSJunfeng Guo #endif /* _GVE_ETHDEV_H_ */
485