vmbus_reg.h revision 307310
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: stable/11/sys/dev/hyperv/vmbus/vmbus_reg.h 307310 2016-10-14 09:10:41Z sephe $
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
35/*
36 * Hyper-V SynIC message format.
37 */
38
39#define VMBUS_MSG_DSIZE_MAX		240
40#define VMBUS_MSG_SIZE			256
41
42struct vmbus_message {
43	uint32_t	msg_type;	/* HYPERV_MSGTYPE_ */
44	uint8_t		msg_dsize;	/* data size */
45	uint8_t		msg_flags;	/* VMBUS_MSGFLAG_ */
46	uint16_t	msg_rsvd;
47	uint64_t	msg_id;
48	uint8_t		msg_data[VMBUS_MSG_DSIZE_MAX];
49} __packed;
50CTASSERT(sizeof(struct vmbus_message) == VMBUS_MSG_SIZE);
51
52#define VMBUS_MSGFLAG_PENDING		0x01
53
54/*
55 * Hyper-V SynIC event flags
56 */
57
58#ifdef __LP64__
59#define VMBUS_EVTFLAGS_MAX	32
60#define VMBUS_EVTFLAG_SHIFT	6
61#else
62#define VMBUS_EVTFLAGS_MAX	64
63#define VMBUS_EVTFLAG_SHIFT	5
64#endif
65#define VMBUS_EVTFLAG_LEN	(1 << VMBUS_EVTFLAG_SHIFT)
66#define VMBUS_EVTFLAG_MASK	(VMBUS_EVTFLAG_LEN - 1)
67#define VMBUS_EVTFLAGS_SIZE	256
68
69struct vmbus_evtflags {
70	u_long		evt_flags[VMBUS_EVTFLAGS_MAX];
71} __packed;
72CTASSERT(sizeof(struct vmbus_evtflags) == VMBUS_EVTFLAGS_SIZE);
73
74/*
75 * Hyper-V Monitor Notification Facility
76 */
77
78struct vmbus_mon_trig {
79	uint32_t	mt_pending;
80	uint32_t	mt_armed;
81} __packed;
82
83#define VMBUS_MONTRIGS_MAX	4
84#define VMBUS_MONTRIG_LEN	32
85
86struct vmbus_mnf {
87	uint32_t	mnf_state;
88	uint32_t	mnf_rsvd1;
89
90	struct vmbus_mon_trig mnf_trigs[VMBUS_MONTRIGS_MAX];
91	uint8_t		mnf_rsvd2[536];
92
93	uint16_t	mnf_lat[VMBUS_MONTRIGS_MAX][VMBUS_MONTRIG_LEN];
94	uint8_t		mnf_rsvd3[256];
95
96	struct hyperv_mon_param
97			mnf_param[VMBUS_MONTRIGS_MAX][VMBUS_MONTRIG_LEN];
98	uint8_t		mnf_rsvd4[1984];
99} __packed;
100CTASSERT(sizeof(struct vmbus_mnf) == PAGE_SIZE);
101
102/*
103 * Channel
104 */
105
106#define VMBUS_CHAN_MAX_COMPAT	256
107#define VMBUS_CHAN_MAX		(VMBUS_EVTFLAG_LEN * VMBUS_EVTFLAGS_MAX)
108
109/*
110 * GPA range.
111 */
112struct vmbus_gpa_range {
113	uint32_t	gpa_len;
114	uint32_t	gpa_ofs;
115	uint64_t	gpa_page[];
116} __packed;
117
118/*
119 * Channel messages
120 * - Embedded in vmbus_message.msg_data, e.g. response.
121 * - Embedded in hypercall_postmsg_in.hc_data, e.g. request.
122 */
123
124#define VMBUS_CHANMSG_TYPE_CHREQUEST		3	/* REQ */
125#define VMBUS_CHANMSG_TYPE_CHOPEN		5	/* REQ */
126#define VMBUS_CHANMSG_TYPE_CHOPEN_RESP		6	/* RESP */
127#define VMBUS_CHANMSG_TYPE_CHCLOSE		7	/* REQ */
128#define VMBUS_CHANMSG_TYPE_GPADL_CONN		8	/* REQ */
129#define VMBUS_CHANMSG_TYPE_GPADL_SUBCONN	9	/* REQ */
130#define VMBUS_CHANMSG_TYPE_GPADL_CONNRESP	10	/* RESP */
131#define VMBUS_CHANMSG_TYPE_GPADL_DISCONN	11	/* REQ */
132#define VMBUS_CHANMSG_TYPE_GPADL_DISCONNRESP	12	/* RESP */
133#define VMBUS_CHANMSG_TYPE_CHFREE		13	/* REQ */
134#define VMBUS_CHANMSG_TYPE_CONNECT		14	/* REQ */
135#define VMBUS_CHANMSG_TYPE_CONNECT_RESP		15	/* RESP */
136#define VMBUS_CHANMSG_TYPE_DISCONNECT		16	/* REQ */
137
138struct vmbus_chanmsg_hdr {
139	uint32_t	chm_type;	/* VMBUS_CHANMSG_TYPE_ */
140	uint32_t	chm_rsvd;
141} __packed;
142
143/* VMBUS_CHANMSG_TYPE_CONNECT */
144struct vmbus_chanmsg_connect {
145	struct vmbus_chanmsg_hdr chm_hdr;
146	uint32_t	chm_ver;
147	uint32_t	chm_rsvd;
148	uint64_t	chm_evtflags;
149	uint64_t	chm_mnf1;
150	uint64_t	chm_mnf2;
151} __packed;
152
153/* VMBUS_CHANMSG_TYPE_CONNECT_RESP */
154struct vmbus_chanmsg_connect_resp {
155	struct vmbus_chanmsg_hdr chm_hdr;
156	uint8_t		chm_done;
157} __packed;
158
159/* VMBUS_CHANMSG_TYPE_CHREQUEST */
160struct vmbus_chanmsg_chrequest {
161	struct vmbus_chanmsg_hdr chm_hdr;
162} __packed;
163
164/* VMBUS_CHANMSG_TYPE_DISCONNECT */
165struct vmbus_chanmsg_disconnect {
166	struct vmbus_chanmsg_hdr chm_hdr;
167} __packed;
168
169/* VMBUS_CHANMSG_TYPE_CHOPEN */
170struct vmbus_chanmsg_chopen {
171	struct vmbus_chanmsg_hdr chm_hdr;
172	uint32_t	chm_chanid;
173	uint32_t	chm_openid;
174	uint32_t	chm_gpadl;
175	uint32_t	chm_vcpuid;
176	uint32_t	chm_rxbr_pgofs;
177#define VMBUS_CHANMSG_CHOPEN_UDATA_SIZE	120
178	uint8_t		chm_udata[VMBUS_CHANMSG_CHOPEN_UDATA_SIZE];
179} __packed;
180
181/* VMBUS_CHANMSG_TYPE_CHOPEN_RESP */
182struct vmbus_chanmsg_chopen_resp {
183	struct vmbus_chanmsg_hdr chm_hdr;
184	uint32_t	chm_chanid;
185	uint32_t	chm_openid;
186	uint32_t	chm_status;
187} __packed;
188
189/* VMBUS_CHANMSG_TYPE_GPADL_CONN */
190struct vmbus_chanmsg_gpadl_conn {
191	struct vmbus_chanmsg_hdr chm_hdr;
192	uint32_t	chm_chanid;
193	uint32_t	chm_gpadl;
194	uint16_t	chm_range_len;
195	uint16_t	chm_range_cnt;
196	struct vmbus_gpa_range chm_range;
197} __packed;
198
199#define VMBUS_CHANMSG_GPADL_CONN_PGMAX		26
200CTASSERT(__offsetof(struct vmbus_chanmsg_gpadl_conn,
201    chm_range.gpa_page[VMBUS_CHANMSG_GPADL_CONN_PGMAX]) <=
202    HYPERCALL_POSTMSGIN_DSIZE_MAX);
203
204/* VMBUS_CHANMSG_TYPE_GPADL_SUBCONN */
205struct vmbus_chanmsg_gpadl_subconn {
206	struct vmbus_chanmsg_hdr chm_hdr;
207	uint32_t	chm_msgno;
208	uint32_t	chm_gpadl;
209	uint64_t	chm_gpa_page[];
210} __packed;
211
212#define VMBUS_CHANMSG_GPADL_SUBCONN_PGMAX	28
213CTASSERT(__offsetof(struct vmbus_chanmsg_gpadl_subconn,
214    chm_gpa_page[VMBUS_CHANMSG_GPADL_SUBCONN_PGMAX]) <=
215    HYPERCALL_POSTMSGIN_DSIZE_MAX);
216
217/* VMBUS_CHANMSG_TYPE_GPADL_CONNRESP */
218struct vmbus_chanmsg_gpadl_connresp {
219	struct vmbus_chanmsg_hdr chm_hdr;
220	uint32_t	chm_chanid;
221	uint32_t	chm_gpadl;
222	uint32_t	chm_status;
223} __packed;
224
225/* VMBUS_CHANMSG_TYPE_CHCLOSE */
226struct vmbus_chanmsg_chclose {
227	struct vmbus_chanmsg_hdr chm_hdr;
228	uint32_t	chm_chanid;
229} __packed;
230
231/* VMBUS_CHANMSG_TYPE_GPADL_DISCONN */
232struct vmbus_chanmsg_gpadl_disconn {
233	struct vmbus_chanmsg_hdr chm_hdr;
234	uint32_t	chm_chanid;
235	uint32_t	chm_gpadl;
236} __packed;
237
238/* VMBUS_CHANMSG_TYPE_CHFREE */
239struct vmbus_chanmsg_chfree {
240	struct vmbus_chanmsg_hdr chm_hdr;
241	uint32_t	chm_chanid;
242} __packed;
243
244#endif	/* !_VMBUS_REG_H_ */
245