xref: /freebsd/sys/dev/hyperv/vmbus/vmbus_reg.h (revision 1c4f5adba92947a5faa1836449a621502a1678b8)
1 /*-
2  * Copyright (c) 2016 Microsoft Corp.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice unmodified, this list of conditions, and the following
10  *    disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28 
29 #ifndef _VMBUS_REG_H_
30 #define _VMBUS_REG_H_
31 
32 #include <sys/param.h>
33 #include <dev/hyperv/vmbus/hyperv_reg.h>
34 #include <dev/hyperv/include/hyperv.h> /* XXX for hyperv_guid */
35 
36 /*
37  * Hyper-V SynIC message format.
38  */
39 
40 #define VMBUS_MSG_DSIZE_MAX		240
41 #define VMBUS_MSG_SIZE			256
42 
43 struct vmbus_message {
44 	uint32_t	msg_type;	/* HYPERV_MSGTYPE_ */
45 	uint8_t		msg_dsize;	/* data size */
46 	uint8_t		msg_flags;	/* VMBUS_MSGFLAG_ */
47 	uint16_t	msg_rsvd;
48 	uint64_t	msg_id;
49 	uint8_t		msg_data[VMBUS_MSG_DSIZE_MAX];
50 } __packed;
51 CTASSERT(sizeof(struct vmbus_message) == VMBUS_MSG_SIZE);
52 
53 #define VMBUS_MSGFLAG_PENDING		0x01
54 
55 /*
56  * Hyper-V SynIC event flags
57  */
58 
59 #ifdef __LP64__
60 #define VMBUS_EVTFLAGS_MAX	32
61 #define VMBUS_EVTFLAG_SHIFT	6
62 #else
63 #define VMBUS_EVTFLAGS_MAX	64
64 #define VMBUS_EVTFLAG_SHIFT	5
65 #endif
66 #define VMBUS_EVTFLAG_LEN	(1 << VMBUS_EVTFLAG_SHIFT)
67 #define VMBUS_EVTFLAG_MASK	(VMBUS_EVTFLAG_LEN - 1)
68 #define VMBUS_EVTFLAGS_SIZE	256
69 
70 struct vmbus_evtflags {
71 	u_long		evt_flags[VMBUS_EVTFLAGS_MAX];
72 } __packed;
73 CTASSERT(sizeof(struct vmbus_evtflags) == VMBUS_EVTFLAGS_SIZE);
74 
75 /*
76  * Hyper-V Monitor Notification Facility
77  */
78 
79 struct vmbus_mon_trig {
80 	uint32_t	mt_pending;
81 	uint32_t	mt_armed;
82 } __packed;
83 
84 #define VMBUS_MONTRIGS_MAX	4
85 #define VMBUS_MONTRIG_LEN	32
86 
87 struct vmbus_mnf {
88 	uint32_t	mnf_state;
89 	uint32_t	mnf_rsvd1;
90 
91 	struct vmbus_mon_trig mnf_trigs[VMBUS_MONTRIGS_MAX];
92 	uint8_t		mnf_rsvd2[536];
93 
94 	uint16_t	mnf_lat[VMBUS_MONTRIGS_MAX][VMBUS_MONTRIG_LEN];
95 	uint8_t		mnf_rsvd3[256];
96 
97 	struct hyperv_mon_param
98 			mnf_param[VMBUS_MONTRIGS_MAX][VMBUS_MONTRIG_LEN];
99 	uint8_t		mnf_rsvd4[1984];
100 } __packed;
101 CTASSERT(sizeof(struct vmbus_mnf) == PAGE_SIZE);
102 
103 /*
104  * Channel
105  */
106 
107 #define VMBUS_CHAN_MAX_COMPAT	256
108 #define VMBUS_CHAN_MAX		(VMBUS_EVTFLAG_LEN * VMBUS_EVTFLAGS_MAX)
109 
110 /*
111  * GPA range.
112  */
113 struct vmbus_gpa_range {
114 	uint32_t	gpa_len;
115 	uint32_t	gpa_ofs;
116 	uint64_t	gpa_page[];
117 } __packed;
118 
119 /*
120  * Channel messages
121  * - Embedded in vmbus_message.msg_data, e.g. response and notification.
122  * - Embedded in hypercall_postmsg_in.hc_data, e.g. request.
123  */
124 
125 #define VMBUS_CHANMSG_TYPE_CHOFFER		1	/* NOTE */
126 #define VMBUS_CHANMSG_TYPE_CHRESCIND		2	/* NOTE */
127 #define VMBUS_CHANMSG_TYPE_CHREQUEST		3	/* REQ */
128 #define VMBUS_CHANMSG_TYPE_CHOFFER_DONE		4	/* NOTE */
129 #define VMBUS_CHANMSG_TYPE_CHOPEN		5	/* REQ */
130 #define VMBUS_CHANMSG_TYPE_CHOPEN_RESP		6	/* RESP */
131 #define VMBUS_CHANMSG_TYPE_CHCLOSE		7	/* REQ */
132 #define VMBUS_CHANMSG_TYPE_GPADL_CONN		8	/* REQ */
133 #define VMBUS_CHANMSG_TYPE_GPADL_SUBCONN	9	/* REQ */
134 #define VMBUS_CHANMSG_TYPE_GPADL_CONNRESP	10	/* RESP */
135 #define VMBUS_CHANMSG_TYPE_GPADL_DISCONN	11	/* REQ */
136 #define VMBUS_CHANMSG_TYPE_GPADL_DISCONNRESP	12	/* RESP */
137 #define VMBUS_CHANMSG_TYPE_CHFREE		13	/* REQ */
138 #define VMBUS_CHANMSG_TYPE_CONNECT		14	/* REQ */
139 #define VMBUS_CHANMSG_TYPE_CONNECT_RESP		15	/* RESP */
140 #define VMBUS_CHANMSG_TYPE_DISCONNECT		16	/* REQ */
141 #define VMBUS_CHANMSG_TYPE_MAX			22
142 
143 struct vmbus_chanmsg_hdr {
144 	uint32_t	chm_type;	/* VMBUS_CHANMSG_TYPE_ */
145 	uint32_t	chm_rsvd;
146 } __packed;
147 
148 /* VMBUS_CHANMSG_TYPE_CONNECT */
149 struct vmbus_chanmsg_connect {
150 	struct vmbus_chanmsg_hdr chm_hdr;
151 	uint32_t	chm_ver;
152 	uint32_t	chm_rsvd;
153 	uint64_t	chm_evtflags;
154 	uint64_t	chm_mnf1;
155 	uint64_t	chm_mnf2;
156 } __packed;
157 
158 /* VMBUS_CHANMSG_TYPE_CONNECT_RESP */
159 struct vmbus_chanmsg_connect_resp {
160 	struct vmbus_chanmsg_hdr chm_hdr;
161 	uint8_t		chm_done;
162 } __packed;
163 
164 /* VMBUS_CHANMSG_TYPE_CHREQUEST */
165 struct vmbus_chanmsg_chrequest {
166 	struct vmbus_chanmsg_hdr chm_hdr;
167 } __packed;
168 
169 /* VMBUS_CHANMSG_TYPE_DISCONNECT */
170 struct vmbus_chanmsg_disconnect {
171 	struct vmbus_chanmsg_hdr chm_hdr;
172 } __packed;
173 
174 /* VMBUS_CHANMSG_TYPE_CHOPEN */
175 struct vmbus_chanmsg_chopen {
176 	struct vmbus_chanmsg_hdr chm_hdr;
177 	uint32_t	chm_chanid;
178 	uint32_t	chm_openid;
179 	uint32_t	chm_gpadl;
180 	uint32_t	chm_vcpuid;
181 	uint32_t	chm_rxbr_pgofs;
182 #define VMBUS_CHANMSG_CHOPEN_UDATA_SIZE	120
183 	uint8_t		chm_udata[VMBUS_CHANMSG_CHOPEN_UDATA_SIZE];
184 } __packed;
185 
186 /* VMBUS_CHANMSG_TYPE_CHOPEN_RESP */
187 struct vmbus_chanmsg_chopen_resp {
188 	struct vmbus_chanmsg_hdr chm_hdr;
189 	uint32_t	chm_chanid;
190 	uint32_t	chm_openid;
191 	uint32_t	chm_status;
192 } __packed;
193 
194 /* VMBUS_CHANMSG_TYPE_GPADL_CONN */
195 struct vmbus_chanmsg_gpadl_conn {
196 	struct vmbus_chanmsg_hdr chm_hdr;
197 	uint32_t	chm_chanid;
198 	uint32_t	chm_gpadl;
199 	uint16_t	chm_range_len;
200 	uint16_t	chm_range_cnt;
201 	struct vmbus_gpa_range chm_range;
202 } __packed;
203 
204 #define VMBUS_CHANMSG_GPADL_CONN_PGMAX		26
205 CTASSERT(__offsetof(struct vmbus_chanmsg_gpadl_conn,
206     chm_range.gpa_page[VMBUS_CHANMSG_GPADL_CONN_PGMAX]) <=
207     HYPERCALL_POSTMSGIN_DSIZE_MAX);
208 
209 /* VMBUS_CHANMSG_TYPE_GPADL_SUBCONN */
210 struct vmbus_chanmsg_gpadl_subconn {
211 	struct vmbus_chanmsg_hdr chm_hdr;
212 	uint32_t	chm_msgno;
213 	uint32_t	chm_gpadl;
214 	uint64_t	chm_gpa_page[];
215 } __packed;
216 
217 #define VMBUS_CHANMSG_GPADL_SUBCONN_PGMAX	28
218 CTASSERT(__offsetof(struct vmbus_chanmsg_gpadl_subconn,
219     chm_gpa_page[VMBUS_CHANMSG_GPADL_SUBCONN_PGMAX]) <=
220     HYPERCALL_POSTMSGIN_DSIZE_MAX);
221 
222 /* VMBUS_CHANMSG_TYPE_GPADL_CONNRESP */
223 struct vmbus_chanmsg_gpadl_connresp {
224 	struct vmbus_chanmsg_hdr chm_hdr;
225 	uint32_t	chm_chanid;
226 	uint32_t	chm_gpadl;
227 	uint32_t	chm_status;
228 } __packed;
229 
230 /* VMBUS_CHANMSG_TYPE_CHCLOSE */
231 struct vmbus_chanmsg_chclose {
232 	struct vmbus_chanmsg_hdr chm_hdr;
233 	uint32_t	chm_chanid;
234 } __packed;
235 
236 /* VMBUS_CHANMSG_TYPE_GPADL_DISCONN */
237 struct vmbus_chanmsg_gpadl_disconn {
238 	struct vmbus_chanmsg_hdr chm_hdr;
239 	uint32_t	chm_chanid;
240 	uint32_t	chm_gpadl;
241 } __packed;
242 
243 /* VMBUS_CHANMSG_TYPE_CHFREE */
244 struct vmbus_chanmsg_chfree {
245 	struct vmbus_chanmsg_hdr chm_hdr;
246 	uint32_t	chm_chanid;
247 } __packed;
248 
249 /* VMBUS_CHANMSG_TYPE_CHRESCIND */
250 struct vmbus_chanmsg_chrescind {
251 	struct vmbus_chanmsg_hdr chm_hdr;
252 	uint32_t	chm_chanid;
253 } __packed;
254 
255 /* VMBUS_CHANMSG_TYPE_CHOFFER */
256 struct vmbus_chanmsg_choffer {
257 	struct vmbus_chanmsg_hdr chm_hdr;
258 	struct hyperv_guid chm_chtype;
259 	struct hyperv_guid chm_chinst;
260 	uint64_t	chm_chlat;	/* unit: 100ns */
261 	uint32_t	chm_chrev;
262 	uint32_t	chm_svrctx_sz;
263 	uint16_t	chm_chflags;
264 	uint16_t	chm_mmio_sz;	/* unit: MB */
265 	uint8_t		chm_udata[120];
266 	uint16_t	chm_subidx;
267 	uint16_t	chm_rsvd;
268 	uint32_t	chm_chanid;
269 	uint8_t		chm_montrig;
270 	uint8_t		chm_flags1;	/* VMBUS_CHOFFER_FLAG1_ */
271 	uint16_t	chm_flags2;
272 	uint32_t	chm_connid;
273 } __packed;
274 CTASSERT(sizeof(struct vmbus_chanmsg_choffer) <= VMBUS_MSG_DSIZE_MAX);
275 
276 #define VMBUS_CHOFFER_FLAG1_HASMNF	0x01
277 
278 #endif	/* !_VMBUS_REG_H_ */
279