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 #include <rte_log.h> 12 #include <rte_eal_paging.h> 13 #include <rte_vmbus_reg.h> 14 #include <rte_bus_vmbus.h> 15 16 extern struct rte_vmbus_bus rte_vmbus_bus; 17 18 extern int vmbus_logtype_bus; 19 #define VMBUS_LOG(level, fmt, args...) \ 20 rte_log(RTE_LOG_ ## level, vmbus_logtype_bus, "%s(): " fmt "\n", \ 21 __func__, ##args) 22 23 struct vmbus_br { 24 struct vmbus_bufring *vbr; 25 uint32_t dsize; 26 uint32_t windex; /* next available location */ 27 }; 28 29 #define UIO_NAME_MAX 64 30 31 struct vmbus_map { 32 void *addr; /* user mmap of resource */ 33 uint64_t size; /* length */ 34 }; 35 36 /* 37 * For multi-process we need to reproduce all vmbus mappings in secondary 38 * processes, so save them in a tailq. 39 */ 40 struct mapped_vmbus_resource { 41 TAILQ_ENTRY(mapped_vmbus_resource) next; 42 43 rte_uuid_t id; 44 int nb_maps; 45 struct vmbus_channel *primary; 46 struct vmbus_map maps[VMBUS_MAX_RESOURCE]; 47 char path[PATH_MAX]; 48 }; 49 50 TAILQ_HEAD(mapped_vmbus_res_list, mapped_vmbus_resource); 51 52 #define HV_MON_TRIG_LEN 32 53 #define HV_MON_TRIG_MAX 4 54 55 struct vmbus_channel { 56 STAILQ_HEAD(, vmbus_channel) subchannel_list; 57 STAILQ_ENTRY(vmbus_channel) next; 58 const struct rte_vmbus_device *device; 59 60 struct vmbus_br rxbr; 61 struct vmbus_br txbr; 62 63 uint16_t relid; 64 uint16_t subchannel_id; 65 uint8_t monitor_id; 66 }; 67 68 #define VMBUS_MAX_CHANNELS 64 69 70 struct rte_devargs * 71 vmbus_devargs_lookup(struct rte_vmbus_device *dev); 72 73 int vmbus_chan_create(const struct rte_vmbus_device *device, 74 uint16_t relid, uint16_t subid, uint8_t monitor_id, 75 struct vmbus_channel **new_chan); 76 77 void vmbus_add_device(struct rte_vmbus_device *vmbus_dev); 78 void vmbus_insert_device(struct rte_vmbus_device *exist_vmbus_dev, 79 struct rte_vmbus_device *new_vmbus_dev); 80 void vmbus_remove_device(struct rte_vmbus_device *vmbus_device); 81 82 void vmbus_uio_irq_control(struct rte_vmbus_device *dev, int32_t onoff); 83 int vmbus_uio_irq_read(struct rte_vmbus_device *dev); 84 85 int vmbus_uio_map_resource(struct rte_vmbus_device *dev); 86 void vmbus_uio_unmap_resource(struct rte_vmbus_device *dev); 87 88 int vmbus_uio_alloc_resource(struct rte_vmbus_device *dev, 89 struct mapped_vmbus_resource **uio_res); 90 void vmbus_uio_free_resource(struct rte_vmbus_device *dev, 91 struct mapped_vmbus_resource *uio_res); 92 93 struct mapped_vmbus_resource * 94 vmbus_uio_find_resource(const struct rte_vmbus_device *dev); 95 int vmbus_uio_map_resource_by_index(struct rte_vmbus_device *dev, int res_idx, 96 struct mapped_vmbus_resource *uio_res, 97 int flags); 98 99 void *vmbus_map_resource(void *requested_addr, int fd, off_t offset, 100 size_t size, int additional_flags); 101 void vmbus_unmap_resource(void *requested_addr, size_t size); 102 103 bool vmbus_uio_subchannels_supported(const struct rte_vmbus_device *dev, 104 const struct vmbus_channel *chan); 105 int vmbus_uio_get_subchan(struct vmbus_channel *primary, 106 struct vmbus_channel **subchan); 107 int vmbus_uio_map_rings(struct vmbus_channel *chan); 108 int vmbus_uio_map_secondary_subchan(const struct rte_vmbus_device *dev, 109 const struct vmbus_channel *chan); 110 111 void vmbus_br_setup(struct vmbus_br *br, void *buf, unsigned int blen); 112 113 /* Amount of space available for write */ 114 static inline uint32_t 115 vmbus_br_availwrite(const struct vmbus_br *br, uint32_t windex) 116 { 117 uint32_t rindex = br->vbr->rindex; 118 119 if (windex >= rindex) 120 return br->dsize - (windex - rindex); 121 else 122 return rindex - windex; 123 } 124 125 static inline uint32_t 126 vmbus_br_availread(const struct vmbus_br *br) 127 { 128 return br->dsize - vmbus_br_availwrite(br, br->vbr->windex); 129 } 130 131 int vmbus_txbr_write(struct vmbus_br *tbr, const struct iovec iov[], int iovlen, 132 bool *need_sig); 133 134 int vmbus_rxbr_peek(const struct vmbus_br *rbr, void *data, size_t dlen); 135 136 int vmbus_rxbr_read(struct vmbus_br *rbr, void *data, size_t dlen, size_t hlen); 137 138 #endif /* _VMBUS_PRIVATE_H_ */ 139