xref: /dpdk/examples/vhost/main.h (revision 92e68d9c97730ede6539d8f4c5748065aae96134)
13998e2a0SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
23998e2a0SBruce Richardson  * Copyright(c) 2010-2017 Intel Corporation
3d19533e8SHuawei Xie  */
4d19533e8SHuawei Xie 
5d19533e8SHuawei Xie #ifndef _MAIN_H_
6d19533e8SHuawei Xie #define _MAIN_H_
7d19533e8SHuawei Xie 
845657a5cSYuanhan Liu #include <sys/queue.h>
945657a5cSYuanhan Liu 
10aca49772SYuanhan Liu #include <rte_ether.h>
1153d3f477SJiayu Hu #include <rte_pci.h>
12aca49772SYuanhan Liu 
13d19533e8SHuawei Xie /* Macros for printing using RTE_LOG */
14d19533e8SHuawei Xie #define RTE_LOGTYPE_VHOST_CONFIG RTE_LOGTYPE_USER1
15d19533e8SHuawei Xie #define RTE_LOGTYPE_VHOST_DATA   RTE_LOGTYPE_USER2
16d19533e8SHuawei Xie #define RTE_LOGTYPE_VHOST_PORT   RTE_LOGTYPE_USER3
17d19533e8SHuawei Xie 
18f53cf839SYuanhan Liu enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM};
19f53cf839SYuanhan Liu 
20ca059fa5SYuanhan Liu #define MAX_PKT_BURST 32		/* Max burst size for RX/TX */
21ca059fa5SYuanhan Liu 
2256fe86f8SYuanhan Liu struct device_statistics {
2356fe86f8SYuanhan Liu 	uint64_t	tx;
2456fe86f8SYuanhan Liu 	uint64_t	tx_total;
25*92e68d9cSTyler Retzlaff 	RTE_ATOMIC(uint64_t)	rx_atomic;
26*92e68d9cSTyler Retzlaff 	RTE_ATOMIC(uint64_t)	rx_total_atomic;
2756fe86f8SYuanhan Liu };
2856fe86f8SYuanhan Liu 
29ca059fa5SYuanhan Liu struct vhost_queue {
30ca059fa5SYuanhan Liu 	struct rte_vhost_vring	vr;
31ca059fa5SYuanhan Liu 	uint16_t		last_avail_idx;
32ca059fa5SYuanhan Liu 	uint16_t		last_used_idx;
33ca059fa5SYuanhan Liu };
34ca059fa5SYuanhan Liu 
357e06c0deSTyler Retzlaff struct __rte_cache_aligned vhost_dev {
36e571e6b4SHuawei Xie 	/**< Number of memory regions for gpa to hpa translation. */
37e571e6b4SHuawei Xie 	uint32_t nregions_hpa;
38e571e6b4SHuawei Xie 	/**< Device MAC address (Obtained on first TX packet). */
396d13ea8eSOlivier Matz 	struct rte_ether_addr mac_address;
40e571e6b4SHuawei Xie 	/**< RX VMDQ queue number. */
41e571e6b4SHuawei Xie 	uint16_t vmdq_rx_q;
42e571e6b4SHuawei Xie 	/**< Vlan tag assigned to the pool */
43e571e6b4SHuawei Xie 	uint32_t vlan_tag;
44e571e6b4SHuawei Xie 	/**< Data core that the device is added to. */
45e571e6b4SHuawei Xie 	uint16_t coreid;
46e571e6b4SHuawei Xie 	/**< A device is set as ready if the MAC address has been set. */
47e571e6b4SHuawei Xie 	volatile uint8_t ready;
48e571e6b4SHuawei Xie 	/**< Device is marked for removal from the data core. */
49e571e6b4SHuawei Xie 	volatile uint8_t remove;
5045657a5cSYuanhan Liu 
51e2a1dd12SYuanhan Liu 	int vid;
52ca059fa5SYuanhan Liu 	uint64_t features;
53ca059fa5SYuanhan Liu 	size_t hdr_len;
54ca059fa5SYuanhan Liu 	uint16_t nr_vrings;
55ca059fa5SYuanhan Liu 	struct rte_vhost_memory *mem;
5656fe86f8SYuanhan Liu 	struct device_statistics stats;
5797daf19eSYuanhan Liu 	TAILQ_ENTRY(vhost_dev) global_vdev_entry;
5897daf19eSYuanhan Liu 	TAILQ_ENTRY(vhost_dev) lcore_vdev_entry;
59ca059fa5SYuanhan Liu 
60ca059fa5SYuanhan Liu #define MAX_QUEUE_PAIRS	4
61ca059fa5SYuanhan Liu 	struct vhost_queue queues[MAX_QUEUE_PAIRS * 2];
627e06c0deSTyler Retzlaff };
63e571e6b4SHuawei Xie 
64a543dcb7SXuan Ding typedef uint16_t (*vhost_enqueue_burst_t)(struct vhost_dev *dev,
65a543dcb7SXuan Ding 			uint16_t queue_id, struct rte_mbuf **pkts,
66a543dcb7SXuan Ding 			uint32_t count);
67a543dcb7SXuan Ding 
68a543dcb7SXuan Ding typedef uint16_t (*vhost_dequeue_burst_t)(struct vhost_dev *dev,
69a543dcb7SXuan Ding 			uint16_t queue_id, struct rte_mempool *mbuf_pool,
70a543dcb7SXuan Ding 			struct rte_mbuf **pkts, uint16_t count);
71a543dcb7SXuan Ding 
72a543dcb7SXuan Ding struct vhost_queue_ops {
73a543dcb7SXuan Ding 	vhost_enqueue_burst_t enqueue_pkt_burst;
74a543dcb7SXuan Ding 	vhost_dequeue_burst_t dequeue_pkt_burst;
75a543dcb7SXuan Ding };
76a543dcb7SXuan Ding 
7745657a5cSYuanhan Liu TAILQ_HEAD(vhost_dev_tailq_list, vhost_dev);
7845657a5cSYuanhan Liu 
7945657a5cSYuanhan Liu 
8045657a5cSYuanhan Liu #define REQUEST_DEV_REMOVAL	1
8145657a5cSYuanhan Liu #define ACK_DEV_REMOVAL		0
82d19533e8SHuawei Xie 
83d19533e8SHuawei Xie /*
84d19533e8SHuawei Xie  * Structure containing data core specific information.
85d19533e8SHuawei Xie  */
8645657a5cSYuanhan Liu struct lcore_info {
8745657a5cSYuanhan Liu 	uint32_t		device_num;
88d19533e8SHuawei Xie 
8945657a5cSYuanhan Liu 	/* Flag to synchronize device removal. */
9045657a5cSYuanhan Liu 	volatile uint8_t	dev_removal_flag;
9145657a5cSYuanhan Liu 
9245657a5cSYuanhan Liu 	struct vhost_dev_tailq_list vdev_list;
93d19533e8SHuawei Xie };
94d19533e8SHuawei Xie 
9553d3f477SJiayu Hu struct dma_info {
9653d3f477SJiayu Hu 	struct rte_pci_addr addr;
9753d3f477SJiayu Hu 	int16_t dev_id;
9853d3f477SJiayu Hu 	bool async_enabled;
9953d3f477SJiayu Hu };
10053d3f477SJiayu Hu 
10153d3f477SJiayu Hu struct dma_for_vhost {
10253d3f477SJiayu Hu 	struct dma_info dmas[RTE_MAX_QUEUES_PER_PORT * 2];
103a543dcb7SXuan Ding 	uint32_t async_flag;
10453d3f477SJiayu Hu };
10553d3f477SJiayu Hu 
106ca059fa5SYuanhan Liu /* we implement non-extra virtio net features */
107ca059fa5SYuanhan Liu #define VIRTIO_NET_FEATURES	0
108ca059fa5SYuanhan Liu 
109ca059fa5SYuanhan Liu void vs_vhost_net_setup(struct vhost_dev *dev);
110ca059fa5SYuanhan Liu void vs_vhost_net_remove(struct vhost_dev *dev);
111ca059fa5SYuanhan Liu uint16_t vs_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id,
112ca059fa5SYuanhan Liu 			 struct rte_mbuf **pkts, uint32_t count);
113ca059fa5SYuanhan Liu 
114a543dcb7SXuan Ding uint16_t builtin_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id,
115a543dcb7SXuan Ding 			struct rte_mbuf **pkts, uint32_t count);
116a543dcb7SXuan Ding uint16_t builtin_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id,
117a543dcb7SXuan Ding 			struct rte_mempool *mbuf_pool,
118a543dcb7SXuan Ding 			struct rte_mbuf **pkts, uint16_t count);
119a543dcb7SXuan Ding uint16_t sync_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id,
120a543dcb7SXuan Ding 			 struct rte_mbuf **pkts, uint32_t count);
121a543dcb7SXuan Ding uint16_t sync_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id,
122a543dcb7SXuan Ding 			struct rte_mempool *mbuf_pool,
123a543dcb7SXuan Ding 			struct rte_mbuf **pkts, uint16_t count);
124a543dcb7SXuan Ding uint16_t async_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id,
125a543dcb7SXuan Ding 			 struct rte_mbuf **pkts, uint32_t count);
126a543dcb7SXuan Ding uint16_t async_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id,
127ca059fa5SYuanhan Liu 			struct rte_mempool *mbuf_pool,
128ca059fa5SYuanhan Liu 			struct rte_mbuf **pkts, uint16_t count);
129d19533e8SHuawei Xie #endif /* _MAIN_H_ */
130