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