1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2018, Microsoft Corporation.
6 #ifndef _VMBUS_PRIVATE_H_
7 #define _VMBUS_PRIVATE_H_
12 #include <rte_vmbus_reg.h>
15 #define PAGE_SIZE 4096
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", \
24 struct vmbus_bufring *vbr;
26 uint32_t windex; /* next available location */
29 #define UIO_NAME_MAX 64
32 void *addr; /* user mmap of resource */
33 uint64_t size; /* length */
37 * For multi-process we need to reproduce all vmbus mappings in secondary
38 * processes, so save them in a tailq.
40 struct mapped_vmbus_resource {
41 TAILQ_ENTRY(mapped_vmbus_resource) next;
45 struct vmbus_map maps[VMBUS_MAX_RESOURCE];
49 TAILQ_HEAD(mapped_vmbus_res_list, mapped_vmbus_resource);
51 #define HV_MON_TRIG_LEN 32
52 #define HV_MON_TRIG_MAX 4
54 struct vmbus_channel {
55 STAILQ_HEAD(, vmbus_channel) subchannel_list;
56 STAILQ_ENTRY(vmbus_channel) next;
57 const struct rte_vmbus_device *device;
63 uint16_t subchannel_id;
67 #define VMBUS_MAX_CHANNELS 64
69 int vmbus_chan_create(const struct rte_vmbus_device *device,
70 uint16_t relid, uint16_t subid, uint8_t monitor_id,
71 struct vmbus_channel **new_chan);
73 void vmbus_add_device(struct rte_vmbus_device *vmbus_dev);
74 void vmbus_insert_device(struct rte_vmbus_device *exist_vmbus_dev,
75 struct rte_vmbus_device *new_vmbus_dev);
76 void vmbus_remove_device(struct rte_vmbus_device *vmbus_device);
78 void vmbus_uio_irq_control(struct rte_vmbus_device *dev, int32_t onoff);
79 int vmbus_uio_irq_read(struct rte_vmbus_device *dev);
81 int vmbus_uio_map_resource(struct rte_vmbus_device *dev);
82 void vmbus_uio_unmap_resource(struct rte_vmbus_device *dev);
84 int vmbus_uio_alloc_resource(struct rte_vmbus_device *dev,
85 struct mapped_vmbus_resource **uio_res);
86 void vmbus_uio_free_resource(struct rte_vmbus_device *dev,
87 struct mapped_vmbus_resource *uio_res);
89 struct mapped_vmbus_resource *
90 vmbus_uio_find_resource(const struct rte_vmbus_device *dev);
91 int vmbus_uio_map_resource_by_index(struct rte_vmbus_device *dev, int res_idx,
92 struct mapped_vmbus_resource *uio_res,
95 void *vmbus_map_resource(void *requested_addr, int fd, off_t offset,
96 size_t size, int additional_flags);
97 void vmbus_unmap_resource(void *requested_addr, size_t size);
99 bool vmbus_uio_subchannels_supported(const struct rte_vmbus_device *dev,
100 const struct vmbus_channel *chan);
101 int vmbus_uio_get_subchan(struct vmbus_channel *primary,
102 struct vmbus_channel **subchan);
103 int vmbus_uio_map_rings(struct vmbus_channel *chan);
105 void vmbus_br_setup(struct vmbus_br *br, void *buf, unsigned int blen);
107 /* Amount of space available for write */
108 static inline uint32_t
109 vmbus_br_availwrite(const struct vmbus_br *br, uint32_t windex)
111 uint32_t rindex = br->vbr->rindex;
113 if (windex >= rindex)
114 return br->dsize - (windex - rindex);
116 return rindex - windex;
119 static inline uint32_t
120 vmbus_br_availread(const struct vmbus_br *br)
122 return br->dsize - vmbus_br_availwrite(br, br->vbr->windex);
125 int vmbus_txbr_write(struct vmbus_br *tbr, const struct iovec iov[], int iovlen,
128 int vmbus_rxbr_peek(const struct vmbus_br *rbr, void *data, size_t dlen);
130 int vmbus_rxbr_read(struct vmbus_br *rbr, void *data, size_t dlen, size_t hlen);
132 #endif /* _VMBUS_PRIVATE_H_ */