1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * Copyright(c) 2010-2015 Intel Corporation
3a9643ea8Slogwang  */
4a9643ea8Slogwang 
5a9643ea8Slogwang #ifndef _VIRTIO_ETHDEV_H_
6a9643ea8Slogwang #define _VIRTIO_ETHDEV_H_
7a9643ea8Slogwang 
8a9643ea8Slogwang #include <stdint.h>
9a9643ea8Slogwang 
10a9643ea8Slogwang #include "virtio_pci.h"
11a9643ea8Slogwang 
12a9643ea8Slogwang #ifndef PAGE_SIZE
13a9643ea8Slogwang #define PAGE_SIZE 4096
14a9643ea8Slogwang #endif
15a9643ea8Slogwang 
162bfe3f2eSlogwang #define VIRTIO_MAX_RX_QUEUES 128U
172bfe3f2eSlogwang #define VIRTIO_MAX_TX_QUEUES 128U
18a9643ea8Slogwang #define VIRTIO_MAX_MAC_ADDRS 64
19a9643ea8Slogwang #define VIRTIO_MIN_RX_BUFSIZE 64
202bfe3f2eSlogwang #define VIRTIO_MAX_RX_PKTLEN  9728U
21a9643ea8Slogwang 
22a9643ea8Slogwang /* Features desired/implemented by this driver. */
232bfe3f2eSlogwang #define VIRTIO_PMD_DEFAULT_GUEST_FEATURES	\
24a9643ea8Slogwang 	(1u << VIRTIO_NET_F_MAC		  |	\
25a9643ea8Slogwang 	 1u << VIRTIO_NET_F_STATUS	  |	\
26a9643ea8Slogwang 	 1u << VIRTIO_NET_F_MQ		  |	\
27a9643ea8Slogwang 	 1u << VIRTIO_NET_F_CTRL_MAC_ADDR |	\
28a9643ea8Slogwang 	 1u << VIRTIO_NET_F_CTRL_VQ	  |	\
29a9643ea8Slogwang 	 1u << VIRTIO_NET_F_CTRL_RX	  |	\
30a9643ea8Slogwang 	 1u << VIRTIO_NET_F_CTRL_VLAN	  |	\
31a9643ea8Slogwang 	 1u << VIRTIO_NET_F_MRG_RXBUF	  |	\
322bfe3f2eSlogwang 	 1u << VIRTIO_NET_F_MTU	| \
33d30ea906Sjfb8856606 	 1ULL << VIRTIO_NET_F_GUEST_ANNOUNCE |	\
342bfe3f2eSlogwang 	 1u << VIRTIO_RING_F_INDIRECT_DESC |    \
352bfe3f2eSlogwang 	 1ULL << VIRTIO_F_VERSION_1       |	\
36d30ea906Sjfb8856606 	 1ULL << VIRTIO_F_IN_ORDER        |	\
374418919fSjohnjiang 	 1ULL << VIRTIO_F_RING_PACKED	  |	\
384418919fSjohnjiang 	 1ULL << VIRTIO_F_IOMMU_PLATFORM  |	\
39*2d9fd380Sjfb8856606 	 1ULL << VIRTIO_F_ORDER_PLATFORM  |	\
40*2d9fd380Sjfb8856606 	 1ULL << VIRTIO_F_NOTIFICATION_DATA | \
41*2d9fd380Sjfb8856606 	 1ULL << VIRTIO_NET_F_SPEED_DUPLEX)
42a9643ea8Slogwang 
432bfe3f2eSlogwang #define VIRTIO_PMD_SUPPORTED_GUEST_FEATURES	\
442bfe3f2eSlogwang 	(VIRTIO_PMD_DEFAULT_GUEST_FEATURES |	\
452bfe3f2eSlogwang 	 1u << VIRTIO_NET_F_GUEST_CSUM	   |	\
462bfe3f2eSlogwang 	 1u << VIRTIO_NET_F_GUEST_TSO4     |	\
47d30ea906Sjfb8856606 	 1u << VIRTIO_NET_F_GUEST_TSO6     |	\
48d30ea906Sjfb8856606 	 1u << VIRTIO_NET_F_CSUM           |	\
49d30ea906Sjfb8856606 	 1u << VIRTIO_NET_F_HOST_TSO4      |	\
50d30ea906Sjfb8856606 	 1u << VIRTIO_NET_F_HOST_TSO6)
51d30ea906Sjfb8856606 
521646932aSjfb8856606 extern const struct eth_dev_ops virtio_user_secondary_eth_dev_ops;
531646932aSjfb8856606 
54a9643ea8Slogwang /*
55a9643ea8Slogwang  * CQ function prototype
56a9643ea8Slogwang  */
57a9643ea8Slogwang void virtio_dev_cq_start(struct rte_eth_dev *dev);
58a9643ea8Slogwang 
59a9643ea8Slogwang /*
60a9643ea8Slogwang  * RX/TX function prototypes
61a9643ea8Slogwang  */
62a9643ea8Slogwang 
632bfe3f2eSlogwang int virtio_dev_rx_queue_done(void *rxq, uint16_t offset);
64a9643ea8Slogwang 
65a9643ea8Slogwang int  virtio_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
66a9643ea8Slogwang 		uint16_t nb_rx_desc, unsigned int socket_id,
67a9643ea8Slogwang 		const struct rte_eth_rxconf *rx_conf,
68a9643ea8Slogwang 		struct rte_mempool *mb_pool);
69a9643ea8Slogwang 
702bfe3f2eSlogwang int virtio_dev_rx_queue_setup_finish(struct rte_eth_dev *dev,
712bfe3f2eSlogwang 				uint16_t rx_queue_id);
72a9643ea8Slogwang 
73a9643ea8Slogwang int  virtio_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
74a9643ea8Slogwang 		uint16_t nb_tx_desc, unsigned int socket_id,
75a9643ea8Slogwang 		const struct rte_eth_txconf *tx_conf);
76a9643ea8Slogwang 
772bfe3f2eSlogwang int virtio_dev_tx_queue_setup_finish(struct rte_eth_dev *dev,
782bfe3f2eSlogwang 				uint16_t tx_queue_id);
79a9643ea8Slogwang 
80a9643ea8Slogwang uint16_t virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
81a9643ea8Slogwang 		uint16_t nb_pkts);
824418919fSjohnjiang uint16_t virtio_recv_pkts_packed(void *rx_queue, struct rte_mbuf **rx_pkts,
834418919fSjohnjiang 		uint16_t nb_pkts);
84a9643ea8Slogwang 
85a9643ea8Slogwang uint16_t virtio_recv_mergeable_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
86a9643ea8Slogwang 		uint16_t nb_pkts);
87a9643ea8Slogwang 
884418919fSjohnjiang uint16_t virtio_recv_mergeable_pkts_packed(void *rx_queue,
894418919fSjohnjiang 		struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
904418919fSjohnjiang 
914418919fSjohnjiang uint16_t virtio_recv_pkts_inorder(void *rx_queue,
92d30ea906Sjfb8856606 		struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
93d30ea906Sjfb8856606 
944b05018fSfengbojiang uint16_t virtio_xmit_pkts_prepare(void *tx_queue, struct rte_mbuf **tx_pkts,
954b05018fSfengbojiang 		uint16_t nb_pkts);
964b05018fSfengbojiang 
97a9643ea8Slogwang uint16_t virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
98a9643ea8Slogwang 		uint16_t nb_pkts);
994418919fSjohnjiang uint16_t virtio_xmit_pkts_packed(void *tx_queue, struct rte_mbuf **tx_pkts,
1004418919fSjohnjiang 		uint16_t nb_pkts);
101a9643ea8Slogwang 
102d30ea906Sjfb8856606 uint16_t virtio_xmit_pkts_inorder(void *tx_queue, struct rte_mbuf **tx_pkts,
103d30ea906Sjfb8856606 		uint16_t nb_pkts);
104d30ea906Sjfb8856606 
105a9643ea8Slogwang uint16_t virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
106a9643ea8Slogwang 		uint16_t nb_pkts);
107a9643ea8Slogwang 
108*2d9fd380Sjfb8856606 uint16_t virtio_recv_pkts_packed_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
109*2d9fd380Sjfb8856606 		uint16_t nb_pkts);
110*2d9fd380Sjfb8856606 
111*2d9fd380Sjfb8856606 uint16_t virtio_xmit_pkts_packed_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
112*2d9fd380Sjfb8856606 		uint16_t nb_pkts);
113*2d9fd380Sjfb8856606 
114a9643ea8Slogwang int eth_virtio_dev_init(struct rte_eth_dev *eth_dev);
115a9643ea8Slogwang 
1162bfe3f2eSlogwang void virtio_interrupt_handler(void *param);
117a9643ea8Slogwang 
118d30ea906Sjfb8856606 int virtio_dev_pause(struct rte_eth_dev *dev);
119d30ea906Sjfb8856606 void virtio_dev_resume(struct rte_eth_dev *dev);
120d30ea906Sjfb8856606 int virtio_inject_pkts(struct rte_eth_dev *dev, struct rte_mbuf **tx_pkts,
121d30ea906Sjfb8856606 		int nb_pkts);
122d30ea906Sjfb8856606 
123a9643ea8Slogwang #endif /* _VIRTIO_ETHDEV_H_ */
124