Branch data Line data Source code
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 : 0 : uint32_t rindex = br->vbr->rindex;
147 : :
148 [ # # # # ]: 0 : if (windex >= rindex)
149 : 0 : return br->dsize - (windex - rindex);
150 : : else
151 : 0 : return rindex - windex;
152 : : }
153 : :
154 : : static inline uint32_t
155 : : vmbus_br_availread(const struct vmbus_br *br)
156 : : {
157 [ # # # # : 0 : 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_ */
|