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 #define UIO_MAX_SUBCHANNEL 128
37 struct subchannel_map {
38 uint16_t relid;
39 void *addr;
40 uint64_t size;
41 };
42
43 /*
44 * For multi-process we need to reproduce all vmbus mappings in secondary
45 * processes, so save them in a tailq.
46 */
47 struct mapped_vmbus_resource {
48 TAILQ_ENTRY(mapped_vmbus_resource) next;
49
50 rte_uuid_t id;
51
52 int nb_maps;
53 struct vmbus_map maps[VMBUS_MAX_RESOURCE];
54
55 char path[PATH_MAX];
56
57 int nb_subchannels;
58 struct subchannel_map subchannel_maps[UIO_MAX_SUBCHANNEL];
59 };
60
61 TAILQ_HEAD(mapped_vmbus_res_list, mapped_vmbus_resource);
62
63 #define HV_MON_TRIG_LEN 32
64 #define HV_MON_TRIG_MAX 4
65
66 struct vmbus_channel {
67 STAILQ_HEAD(, vmbus_channel) subchannel_list;
68 STAILQ_ENTRY(vmbus_channel) next;
69 const struct rte_vmbus_device *device;
70
71 struct vmbus_br rxbr;
72 struct vmbus_br txbr;
73
74 uint16_t relid;
75 uint16_t subchannel_id;
76 uint8_t monitor_id;
77 };
78
79 #define VMBUS_MAX_CHANNELS 64
80
81 struct rte_devargs *
82 vmbus_devargs_lookup(struct rte_vmbus_device *dev);
83
84 int vmbus_chan_create(const struct rte_vmbus_device *device,
85 uint16_t relid, uint16_t subid, uint8_t monitor_id,
86 struct vmbus_channel **new_chan);
87
88 void vmbus_add_device(struct rte_vmbus_device *vmbus_dev);
89 void vmbus_insert_device(struct rte_vmbus_device *exist_vmbus_dev,
90 struct rte_vmbus_device *new_vmbus_dev);
91 void vmbus_remove_device(struct rte_vmbus_device *vmbus_device);
92
93 void vmbus_uio_irq_control(struct rte_vmbus_device *dev, int32_t onoff);
94 int vmbus_uio_irq_read(struct rte_vmbus_device *dev);
95
96 int vmbus_uio_map_resource(struct rte_vmbus_device *dev);
97 void vmbus_uio_unmap_resource(struct rte_vmbus_device *dev);
98
99 int vmbus_uio_alloc_resource(struct rte_vmbus_device *dev,
100 struct mapped_vmbus_resource **uio_res);
101 void vmbus_uio_free_resource(struct rte_vmbus_device *dev,
102 struct mapped_vmbus_resource *uio_res);
103
104 struct mapped_vmbus_resource *
105 vmbus_uio_find_resource(const struct rte_vmbus_device *dev);
106 int vmbus_uio_map_resource_by_index(struct rte_vmbus_device *dev, int res_idx,
107 struct mapped_vmbus_resource *uio_res,
108 int flags);
109
110 void *vmbus_map_resource(void *requested_addr, int fd, off_t offset,
111 size_t size, int additional_flags);
112 void vmbus_unmap_resource(void *requested_addr, size_t size);
113
114 bool vmbus_uio_subchannels_supported(const struct rte_vmbus_device *dev,
115 const struct vmbus_channel *chan);
116 int vmbus_uio_get_subchan(struct vmbus_channel *primary,
117 struct vmbus_channel **subchan);
118 int vmbus_uio_map_rings(struct vmbus_channel *chan);
119
120 void vmbus_br_setup(struct vmbus_br *br, void *buf, unsigned int blen);
121
122 /* Amount of space available for write */
123 static inline uint32_t
vmbus_br_availwrite(const struct vmbus_br * br,uint32_t windex)124 vmbus_br_availwrite(const struct vmbus_br *br, uint32_t windex)
125 {
126 uint32_t rindex = br->vbr->rindex;
127
128 if (windex >= rindex)
129 return br->dsize - (windex - rindex);
130 else
131 return rindex - windex;
132 }
133
134 static inline uint32_t
vmbus_br_availread(const struct vmbus_br * br)135 vmbus_br_availread(const struct vmbus_br *br)
136 {
137 return br->dsize - vmbus_br_availwrite(br, br->vbr->windex);
138 }
139
140 int vmbus_txbr_write(struct vmbus_br *tbr, const struct iovec iov[], int iovlen,
141 bool *need_sig);
142
143 int vmbus_rxbr_peek(const struct vmbus_br *rbr, void *data, size_t dlen);
144
145 int vmbus_rxbr_read(struct vmbus_br *rbr, void *data, size_t dlen, size_t hlen);
146
147 #endif /* _VMBUS_PRIVATE_H_ */
148