1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 2018, Microsoft Corporation. 3 * All Rights Reserved. 4 */ 5 6 #ifndef _VMBUS_PRIVATE_H_ 7 #define _VMBUS_PRIVATE_H_ 8 9 #include <stdbool.h> 10 #include <sys/uio.h> 11 12 #include <bus_driver.h> 13 #include <bus_vmbus_driver.h> 14 #include <rte_log.h> 15 #include <rte_eal_paging.h> 16 #include <rte_vmbus_reg.h> 17 18 /** 19 * Structure describing the VM bus 20 */ 21 struct rte_vmbus_bus { 22 struct rte_bus bus; /**< Inherit the generic class */ 23 RTE_TAILQ_HEAD(, rte_vmbus_device) device_list; /**< List of devices */ 24 RTE_TAILQ_HEAD(, rte_vmbus_driver) driver_list; /**< List of drivers */ 25 }; 26 27 extern struct rte_vmbus_bus rte_vmbus_bus; 28 29 /* VMBus iterators */ 30 #define FOREACH_DEVICE_ON_VMBUS(p) \ 31 RTE_TAILQ_FOREACH(p, &(rte_vmbus_bus.device_list), next) 32 33 #define FOREACH_DRIVER_ON_VMBUS(p) \ 34 RTE_TAILQ_FOREACH(p, &(rte_vmbus_bus.driver_list), next) 35 36 extern int vmbus_logtype_bus; 37 #define RTE_LOGTYPE_VMBUS_BUS vmbus_logtype_bus 38 #define VMBUS_LOG(level, ...) \ 39 RTE_LOG_LINE_PREFIX(level, VMBUS_BUS, "%s(): ", __func__, __VA_ARGS__) 40 41 struct vmbus_br { 42 struct vmbus_bufring *vbr; 43 uint32_t dsize; 44 uint32_t windex; /* next available location */ 45 }; 46 47 #define UIO_NAME_MAX 64 48 49 struct vmbus_map { 50 void *addr; /* user mmap of resource */ 51 uint64_t size; /* length */ 52 }; 53 54 #define UIO_MAX_SUBCHANNEL 128 55 struct subchannel_map { 56 uint16_t relid; 57 void *addr; 58 uint64_t size; 59 }; 60 61 /* 62 * For multi-process we need to reproduce all vmbus mappings in secondary 63 * processes, so save them in a tailq. 64 */ 65 struct mapped_vmbus_resource { 66 TAILQ_ENTRY(mapped_vmbus_resource) next; 67 68 rte_uuid_t id; 69 70 int nb_maps; 71 struct vmbus_map maps[VMBUS_MAX_RESOURCE]; 72 73 char path[PATH_MAX]; 74 75 int nb_subchannels; 76 struct subchannel_map subchannel_maps[UIO_MAX_SUBCHANNEL]; 77 }; 78 79 TAILQ_HEAD(mapped_vmbus_res_list, mapped_vmbus_resource); 80 81 #define HV_MON_TRIG_LEN 32 82 #define HV_MON_TRIG_MAX 4 83 84 struct vmbus_channel { 85 STAILQ_HEAD(, vmbus_channel) subchannel_list; 86 STAILQ_ENTRY(vmbus_channel) next; 87 const struct rte_vmbus_device *device; 88 89 struct vmbus_br rxbr; 90 struct vmbus_br txbr; 91 92 uint16_t relid; 93 uint16_t subchannel_id; 94 uint8_t monitor_id; 95 96 struct vmbus_mon_page *monitor_page; 97 }; 98 99 #define VMBUS_MAX_CHANNELS 64 100 101 struct rte_devargs * 102 vmbus_devargs_lookup(struct rte_vmbus_device *dev); 103 104 int vmbus_chan_create(const struct rte_vmbus_device *device, 105 uint16_t relid, uint16_t subid, uint8_t monitor_id, 106 struct vmbus_channel **new_chan); 107 108 void vmbus_add_device(struct rte_vmbus_device *vmbus_dev); 109 void vmbus_insert_device(struct rte_vmbus_device *exist_vmbus_dev, 110 struct rte_vmbus_device *new_vmbus_dev); 111 void vmbus_remove_device(struct rte_vmbus_device *vmbus_device); 112 113 void vmbus_uio_irq_control(struct rte_vmbus_device *dev, int32_t onoff); 114 int vmbus_uio_irq_read(struct rte_vmbus_device *dev); 115 116 int vmbus_uio_map_resource(struct rte_vmbus_device *dev); 117 void vmbus_uio_unmap_resource(struct rte_vmbus_device *dev); 118 119 int vmbus_uio_alloc_resource(struct rte_vmbus_device *dev, 120 struct mapped_vmbus_resource **uio_res); 121 void vmbus_uio_free_resource(struct rte_vmbus_device *dev, 122 struct mapped_vmbus_resource *uio_res); 123 124 struct mapped_vmbus_resource * 125 vmbus_uio_find_resource(const struct rte_vmbus_device *dev); 126 int vmbus_uio_map_resource_by_index(struct rte_vmbus_device *dev, int res_idx, 127 struct mapped_vmbus_resource *uio_res, 128 int flags); 129 130 void *vmbus_map_resource(void *requested_addr, int fd, off_t offset, 131 size_t size, int additional_flags); 132 void vmbus_unmap_resource(void *requested_addr, size_t size); 133 134 bool vmbus_uio_subchannels_supported(const struct rte_vmbus_device *dev, 135 const struct vmbus_channel *chan); 136 int vmbus_uio_get_subchan(struct vmbus_channel *primary, 137 struct vmbus_channel **subchan); 138 int vmbus_uio_map_rings(struct vmbus_channel *chan); 139 140 void vmbus_br_setup(struct vmbus_br *br, void *buf, unsigned int blen); 141 142 /* Amount of space available for write */ 143 static inline uint32_t 144 vmbus_br_availwrite(const struct vmbus_br *br, uint32_t windex) 145 { 146 uint32_t rindex = br->vbr->rindex; 147 148 if (windex >= rindex) 149 return br->dsize - (windex - rindex); 150 else 151 return rindex - windex; 152 } 153 154 static inline uint32_t 155 vmbus_br_availread(const struct vmbus_br *br) 156 { 157 return br->dsize - vmbus_br_availwrite(br, br->vbr->windex); 158 } 159 160 int vmbus_txbr_write(struct vmbus_br *tbr, const struct iovec iov[], int iovlen, 161 bool *need_sig); 162 163 int vmbus_rxbr_peek(const struct vmbus_br *rbr, void *data, size_t dlen); 164 165 int vmbus_rxbr_read(struct vmbus_br *rbr, void *data, size_t dlen, size_t hlen); 166 167 #endif /* _VMBUS_PRIVATE_H_ */ 168