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