xref: /dpdk/drivers/bus/vmbus/private.h (revision 2b843cac232eb3f2fa79e4254e21766817e2019f)
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