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