xref: /dpdk/examples/vhost/main.h (revision 53d3f4778c1dbdebbef6c5e94e772b24f0998d35)
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>
11*53d3f477SJiayu 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;
25a68ba8e0SCheng Jiang 	uint64_t	rx_atomic;
26a68ba8e0SCheng Jiang 	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 
35e571e6b4SHuawei Xie struct 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;
55b9f23beeSCheng Jiang 	uint16_t pkts_inflight;
56ca059fa5SYuanhan Liu 	struct rte_vhost_memory *mem;
5756fe86f8SYuanhan Liu 	struct device_statistics stats;
5897daf19eSYuanhan Liu 	TAILQ_ENTRY(vhost_dev) global_vdev_entry;
5997daf19eSYuanhan Liu 	TAILQ_ENTRY(vhost_dev) lcore_vdev_entry;
60ca059fa5SYuanhan Liu 
61ca059fa5SYuanhan Liu #define MAX_QUEUE_PAIRS	4
62ca059fa5SYuanhan Liu 	struct vhost_queue queues[MAX_QUEUE_PAIRS * 2];
63e571e6b4SHuawei Xie } __rte_cache_aligned;
64e571e6b4SHuawei Xie 
6545657a5cSYuanhan Liu TAILQ_HEAD(vhost_dev_tailq_list, vhost_dev);
6645657a5cSYuanhan Liu 
6745657a5cSYuanhan Liu 
6845657a5cSYuanhan Liu #define REQUEST_DEV_REMOVAL	1
6945657a5cSYuanhan Liu #define ACK_DEV_REMOVAL		0
70d19533e8SHuawei Xie 
71d19533e8SHuawei Xie /*
72d19533e8SHuawei Xie  * Structure containing data core specific information.
73d19533e8SHuawei Xie  */
7445657a5cSYuanhan Liu struct lcore_info {
7545657a5cSYuanhan Liu 	uint32_t		device_num;
76d19533e8SHuawei Xie 
7745657a5cSYuanhan Liu 	/* Flag to synchronize device removal. */
7845657a5cSYuanhan Liu 	volatile uint8_t	dev_removal_flag;
7945657a5cSYuanhan Liu 
8045657a5cSYuanhan Liu 	struct vhost_dev_tailq_list vdev_list;
81d19533e8SHuawei Xie };
82d19533e8SHuawei Xie 
83*53d3f477SJiayu Hu struct dma_info {
84*53d3f477SJiayu Hu 	struct rte_pci_addr addr;
85*53d3f477SJiayu Hu 	int16_t dev_id;
86*53d3f477SJiayu Hu 	bool async_enabled;
87*53d3f477SJiayu Hu };
88*53d3f477SJiayu Hu 
89*53d3f477SJiayu Hu struct dma_for_vhost {
90*53d3f477SJiayu Hu 	struct dma_info dmas[RTE_MAX_QUEUES_PER_PORT * 2];
91*53d3f477SJiayu Hu };
92*53d3f477SJiayu Hu 
93ca059fa5SYuanhan Liu /* we implement non-extra virtio net features */
94ca059fa5SYuanhan Liu #define VIRTIO_NET_FEATURES	0
95ca059fa5SYuanhan Liu 
96ca059fa5SYuanhan Liu void vs_vhost_net_setup(struct vhost_dev *dev);
97ca059fa5SYuanhan Liu void vs_vhost_net_remove(struct vhost_dev *dev);
98ca059fa5SYuanhan Liu uint16_t vs_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id,
99ca059fa5SYuanhan Liu 			 struct rte_mbuf **pkts, uint32_t count);
100ca059fa5SYuanhan Liu 
101ca059fa5SYuanhan Liu uint16_t vs_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id,
102ca059fa5SYuanhan Liu 			 struct rte_mempool *mbuf_pool,
103ca059fa5SYuanhan Liu 			 struct rte_mbuf **pkts, uint16_t count);
104d19533e8SHuawei Xie #endif /* _MAIN_H_ */
105