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