]> git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/dpdk/drivers/bus/vmbus/rte_vmbus_reg.h
import 15.2.0 Octopus source
[ceph.git] / ceph / src / seastar / dpdk / drivers / bus / vmbus / rte_vmbus_reg.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2018, Microsoft Corporation.
3 * All Rights Reserved.
4 */
5
6 #ifndef _VMBUS_REG_H_
7 #define _VMBUS_REG_H_
8
9 /*
10 * Hyper-V SynIC message format.
11 */
12 #define VMBUS_MSG_DSIZE_MAX 240
13 #define VMBUS_MSG_SIZE 256
14
15 struct vmbus_message {
16 uint32_t type; /* HYPERV_MSGTYPE_ */
17 uint8_t dsize; /* data size */
18 uint8_t flags; /* VMBUS_MSGFLAG_ */
19 uint16_t rsvd;
20 uint64_t id;
21 uint8_t data[VMBUS_MSG_DSIZE_MAX];
22 } __rte_packed;
23
24 #define VMBUS_MSGFLAG_PENDING 0x01
25
26 /*
27 * Hyper-V Monitor Notification Facility
28 */
29
30 struct vmbus_mon_trig {
31 uint32_t pending;
32 uint32_t armed;
33 } __rte_packed;
34
35 #define VMBUS_MONTRIGS_MAX 4
36 #define VMBUS_MONTRIG_LEN 32
37
38 /*
39 * Hyper-V Monitor Notification Facility
40 */
41 struct hyperv_mon_param {
42 uint32_t connid;
43 uint16_t evtflag_ofs;
44 uint16_t rsvd;
45 } __rte_packed;
46
47 struct vmbus_mon_page {
48 uint32_t state;
49 uint32_t rsvd1;
50
51 struct vmbus_mon_trig trigs[VMBUS_MONTRIGS_MAX];
52 uint8_t rsvd2[536];
53
54 uint16_t lat[VMBUS_MONTRIGS_MAX][VMBUS_MONTRIG_LEN];
55 uint8_t rsvd3[256];
56
57 struct hyperv_mon_param
58 param[VMBUS_MONTRIGS_MAX][VMBUS_MONTRIG_LEN];
59 uint8_t rsvd4[1984];
60 } __rte_packed;
61
62 /*
63 * Buffer ring
64 */
65
66 struct vmbus_bufring {
67 volatile uint32_t windex;
68 volatile uint32_t rindex;
69
70 /*
71 * Interrupt mask {0,1}
72 *
73 * For TX bufring, host set this to 1, when it is processing
74 * the TX bufring, so that we can safely skip the TX event
75 * notification to host.
76 *
77 * For RX bufring, once this is set to 1 by us, host will not
78 * further dispatch interrupts to us, even if there are data
79 * pending on the RX bufring. This effectively disables the
80 * interrupt of the channel to which this RX bufring is attached.
81 */
82 volatile uint32_t imask;
83
84 /*
85 * Win8 uses some of the reserved bits to implement
86 * interrupt driven flow management. On the send side
87 * we can request that the receiver interrupt the sender
88 * when the ring transitions from being full to being able
89 * to handle a message of size "pending_send_sz".
90 *
91 * Add necessary state for this enhancement.
92 */
93 volatile uint32_t pending_send;
94 uint32_t reserved1[12];
95
96 union {
97 struct {
98 uint32_t feat_pending_send_sz:1;
99 };
100 uint32_t value;
101 } feature_bits;
102
103 /* Pad it to PAGE_SIZE so that data starts on page boundary */
104 uint8_t reserved2[4028];
105
106 /*
107 * Ring data starts here + RingDataStartOffset
108 * !!! DO NOT place any fields below this !!!
109 */
110 uint8_t data[0];
111 } __rte_packed;
112
113 /*
114 * Channel packets
115 */
116
117 /* Channel packet flags */
118 #define VMBUS_CHANPKT_TYPE_INBAND 0x0006
119 #define VMBUS_CHANPKT_TYPE_RXBUF 0x0007
120 #define VMBUS_CHANPKT_TYPE_GPA 0x0009
121 #define VMBUS_CHANPKT_TYPE_COMP 0x000b
122
123 #define VMBUS_CHANPKT_FLAG_NONE 0
124 #define VMBUS_CHANPKT_FLAG_RC 0x0001 /* report completion */
125
126 #define VMBUS_CHANPKT_SIZE_SHIFT 3
127 #define VMBUS_CHANPKT_SIZE_ALIGN (1 << VMBUS_CHANPKT_SIZE_SHIFT)
128 #define VMBUS_CHANPKT_HLEN_MIN \
129 (sizeof(struct vmbus_chanpkt_hdr) >> VMBUS_CHANPKT_SIZE_SHIFT)
130
131 static inline uint32_t
132 vmbus_chanpkt_getlen(uint16_t pktlen)
133 {
134 return (uint32_t)pktlen << VMBUS_CHANPKT_SIZE_SHIFT;
135 }
136
137 /*
138 * GPA stuffs.
139 */
140 struct vmbus_gpa_range {
141 uint32_t len;
142 uint32_t ofs;
143 uint64_t page[0];
144 } __rte_packed;
145
146 /* This is actually vmbus_gpa_range.gpa_page[1] */
147 struct vmbus_gpa {
148 uint32_t len;
149 uint32_t ofs;
150 uint64_t page;
151 } __rte_packed;
152
153 struct vmbus_chanpkt_hdr {
154 uint16_t type; /* VMBUS_CHANPKT_TYPE_ */
155 uint16_t hlen; /* header len, in 8 bytes */
156 uint16_t tlen; /* total len, in 8 bytes */
157 uint16_t flags; /* VMBUS_CHANPKT_FLAG_ */
158 uint64_t xactid;
159 } __rte_packed;
160
161 static inline uint32_t
162 vmbus_chanpkt_datalen(const struct vmbus_chanpkt_hdr *pkt)
163 {
164 return vmbus_chanpkt_getlen(pkt->tlen)
165 - vmbus_chanpkt_getlen(pkt->hlen);
166 }
167
168 struct vmbus_chanpkt {
169 struct vmbus_chanpkt_hdr hdr;
170 } __rte_packed;
171
172 struct vmbus_rxbuf_desc {
173 uint32_t len;
174 uint32_t ofs;
175 } __rte_packed;
176
177 struct vmbus_chanpkt_rxbuf {
178 struct vmbus_chanpkt_hdr hdr;
179 uint16_t rxbuf_id;
180 uint16_t rsvd;
181 uint32_t rxbuf_cnt;
182 struct vmbus_rxbuf_desc rxbuf[];
183 } __rte_packed;
184
185 struct vmbus_chanpkt_sglist {
186 struct vmbus_chanpkt_hdr hdr;
187 uint32_t rsvd;
188 uint32_t gpa_cnt;
189 struct vmbus_gpa gpa[];
190 } __rte_packed;
191
192 /*
193 * Channel messages
194 * - Embedded in vmbus_message.msg_data, e.g. response and notification.
195 * - Embedded in hypercall_postmsg_in.hc_data, e.g. request.
196 */
197
198 #define VMBUS_CHANMSG_TYPE_CHOFFER 1 /* NOTE */
199 #define VMBUS_CHANMSG_TYPE_CHRESCIND 2 /* NOTE */
200 #define VMBUS_CHANMSG_TYPE_CHREQUEST 3 /* REQ */
201 #define VMBUS_CHANMSG_TYPE_CHOFFER_DONE 4 /* NOTE */
202 #define VMBUS_CHANMSG_TYPE_CHOPEN 5 /* REQ */
203 #define VMBUS_CHANMSG_TYPE_CHOPEN_RESP 6 /* RESP */
204 #define VMBUS_CHANMSG_TYPE_CHCLOSE 7 /* REQ */
205 #define VMBUS_CHANMSG_TYPE_GPADL_CONN 8 /* REQ */
206 #define VMBUS_CHANMSG_TYPE_GPADL_SUBCONN 9 /* REQ */
207 #define VMBUS_CHANMSG_TYPE_GPADL_CONNRESP 10 /* RESP */
208 #define VMBUS_CHANMSG_TYPE_GPADL_DISCONN 11 /* REQ */
209 #define VMBUS_CHANMSG_TYPE_GPADL_DISCONNRESP 12 /* RESP */
210 #define VMBUS_CHANMSG_TYPE_CHFREE 13 /* REQ */
211 #define VMBUS_CHANMSG_TYPE_CONNECT 14 /* REQ */
212 #define VMBUS_CHANMSG_TYPE_CONNECT_RESP 15 /* RESP */
213 #define VMBUS_CHANMSG_TYPE_DISCONNECT 16 /* REQ */
214 #define VMBUS_CHANMSG_TYPE_MAX 22
215
216 struct vmbus_chanmsg_hdr {
217 uint32_t type; /* VMBUS_CHANMSG_TYPE_ */
218 uint32_t rsvd;
219 } __rte_packed;
220
221 /* VMBUS_CHANMSG_TYPE_CONNECT */
222 struct vmbus_chanmsg_connect {
223 struct vmbus_chanmsg_hdr hdr;
224 uint32_t ver;
225 uint32_t rsvd;
226 uint64_t evtflags;
227 uint64_t mnf1;
228 uint64_t mnf2;
229 } __rte_packed;
230
231 /* VMBUS_CHANMSG_TYPE_CONNECT_RESP */
232 struct vmbus_chanmsg_connect_resp {
233 struct vmbus_chanmsg_hdr hdr;
234 uint8_t done;
235 } __rte_packed;
236
237 /* VMBUS_CHANMSG_TYPE_CHREQUEST */
238 struct vmbus_chanmsg_chrequest {
239 struct vmbus_chanmsg_hdr hdr;
240 } __rte_packed;
241
242 /* VMBUS_CHANMSG_TYPE_DISCONNECT */
243 struct vmbus_chanmsg_disconnect {
244 struct vmbus_chanmsg_hdr hdr;
245 } __rte_packed;
246
247 /* VMBUS_CHANMSG_TYPE_CHOPEN */
248 struct vmbus_chanmsg_chopen {
249 struct vmbus_chanmsg_hdr hdr;
250 uint32_t chanid;
251 uint32_t openid;
252 uint32_t gpadl;
253 uint32_t vcpuid;
254 uint32_t txbr_pgcnt;
255 #define VMBUS_CHANMSG_CHOPEN_UDATA_SIZE 120
256 uint8_t udata[VMBUS_CHANMSG_CHOPEN_UDATA_SIZE];
257 } __rte_packed;
258
259 /* VMBUS_CHANMSG_TYPE_CHOPEN_RESP */
260 struct vmbus_chanmsg_chopen_resp {
261 struct vmbus_chanmsg_hdr hdr;
262 uint32_t chanid;
263 uint32_t openid;
264 uint32_t status;
265 } __rte_packed;
266
267 /* VMBUS_CHANMSG_TYPE_GPADL_CONN */
268 struct vmbus_chanmsg_gpadl_conn {
269 struct vmbus_chanmsg_hdr hdr;
270 uint32_t chanid;
271 uint32_t gpadl;
272 uint16_t range_len;
273 uint16_t range_cnt;
274 struct vmbus_gpa_range range;
275 } __rte_packed;
276
277 #define VMBUS_CHANMSG_GPADL_CONN_PGMAX 26
278
279 /* VMBUS_CHANMSG_TYPE_GPADL_SUBCONN */
280 struct vmbus_chanmsg_gpadl_subconn {
281 struct vmbus_chanmsg_hdr hdr;
282 uint32_t msgno;
283 uint32_t gpadl;
284 uint64_t gpa_page[];
285 } __rte_packed;
286
287 #define VMBUS_CHANMSG_GPADL_SUBCONN_PGMAX 28
288
289 /* VMBUS_CHANMSG_TYPE_GPADL_CONNRESP */
290 struct vmbus_chanmsg_gpadl_connresp {
291 struct vmbus_chanmsg_hdr hdr;
292 uint32_t chanid;
293 uint32_t gpadl;
294 uint32_t status;
295 } __rte_packed;
296
297 /* VMBUS_CHANMSG_TYPE_CHCLOSE */
298 struct vmbus_chanmsg_chclose {
299 struct vmbus_chanmsg_hdr hdr;
300 uint32_t chanid;
301 } __rte_packed;
302
303 /* VMBUS_CHANMSG_TYPE_GPADL_DISCONN */
304 struct vmbus_chanmsg_gpadl_disconn {
305 struct vmbus_chanmsg_hdr hdr;
306 uint32_t chanid;
307 uint32_t gpadl;
308 } __rte_packed;
309
310 /* VMBUS_CHANMSG_TYPE_CHFREE */
311 struct vmbus_chanmsg_chfree {
312 struct vmbus_chanmsg_hdr hdr;
313 uint32_t chanid;
314 } __rte_packed;
315
316 /* VMBUS_CHANMSG_TYPE_CHRESCIND */
317 struct vmbus_chanmsg_chrescind {
318 struct vmbus_chanmsg_hdr hdr;
319 uint32_t chanid;
320 } __rte_packed;
321
322 /* VMBUS_CHANMSG_TYPE_CHOFFER */
323 struct vmbus_chanmsg_choffer {
324 struct vmbus_chanmsg_hdr hdr;
325 rte_uuid_t chtype;
326 rte_uuid_t chinst;
327 uint64_t chlat; /* unit: 100ns */
328 uint32_t chrev;
329 uint32_t svrctx_sz;
330 uint16_t chflags;
331 uint16_t mmio_sz; /* unit: MB */
332 uint8_t udata[120];
333 uint16_t subidx;
334 uint16_t rsvd;
335 uint32_t chanid;
336 uint8_t montrig;
337 uint8_t flags1; /* VMBUS_CHOFFER_FLAG1_ */
338 uint16_t flags2;
339 uint32_t connid;
340 } __rte_packed;
341
342 #define VMBUS_CHOFFER_FLAG1_HASMNF 0x01
343
344 #endif /* !_VMBUS_REG_H_ */