xref: /netbsd-src/sys/dev/hyperv/hypervreg.h (revision fdd3eadbf8cee05009241809f2af18177a0997dc)
1*fdd3eadbSnonaka /*	$NetBSD: hypervreg.h,v 1.2 2022/05/20 13:55:17 nonaka Exp $	*/
250517e57Snonaka /*	$OpenBSD: hypervreg.h,v 1.10 2017/01/05 13:17:22 mikeb Exp $	*/
350517e57Snonaka 
450517e57Snonaka /*-
550517e57Snonaka  * Copyright (c) 2009-2012,2016 Microsoft Corp.
650517e57Snonaka  * Copyright (c) 2012 NetApp Inc.
750517e57Snonaka  * Copyright (c) 2012 Citrix Inc.
850517e57Snonaka  * All rights reserved.
950517e57Snonaka  *
1050517e57Snonaka  * Redistribution and use in source and binary forms, with or without
1150517e57Snonaka  * modification, are permitted provided that the following conditions
1250517e57Snonaka  * are met:
1350517e57Snonaka  * 1. Redistributions of source code must retain the above copyright
1450517e57Snonaka  *    notice unmodified, this list of conditions, and the following
1550517e57Snonaka  *    disclaimer.
1650517e57Snonaka  * 2. Redistributions in binary form must reproduce the above copyright
1750517e57Snonaka  *    notice, this list of conditions and the following disclaimer in the
1850517e57Snonaka  *    documentation and/or other materials provided with the distribution.
1950517e57Snonaka  *
2050517e57Snonaka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2150517e57Snonaka  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2250517e57Snonaka  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2350517e57Snonaka  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2450517e57Snonaka  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2550517e57Snonaka  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2650517e57Snonaka  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2750517e57Snonaka  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2850517e57Snonaka  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2950517e57Snonaka  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3050517e57Snonaka  */
3150517e57Snonaka 
3250517e57Snonaka #ifndef _HYPERVREG_H_
3350517e57Snonaka #define _HYPERVREG_H_
3450517e57Snonaka 
3550517e57Snonaka #if defined(_KERNEL)
3650517e57Snonaka 
3750517e57Snonaka #define VMBUS_CONNID_MESSAGE		1
3850517e57Snonaka #define VMBUS_CONNID_EVENT		2
3950517e57Snonaka #define VMBUS_SINT_MESSAGE		2
4050517e57Snonaka #define VMBUS_SINT_TIMER		4
4150517e57Snonaka 
4250517e57Snonaka struct hyperv_guid {
4350517e57Snonaka 	uint8_t		hv_guid[16];
4450517e57Snonaka } __packed;
4550517e57Snonaka 
4650517e57Snonaka /*
4750517e57Snonaka  * $FreeBSD: head/sys/dev/hyperv/vmbus/hyperv_reg.h 303283 2016-07-25 03:12:40Z sephe $
4850517e57Snonaka  */
4950517e57Snonaka 
5050517e57Snonaka /*
5150517e57Snonaka  * Hyper-V Monitor Notification Facility
5250517e57Snonaka  */
5350517e57Snonaka struct hyperv_mon_param {
5450517e57Snonaka 	uint32_t	mp_connid;
5550517e57Snonaka 	uint16_t	mp_evtflag_ofs;
5650517e57Snonaka 	uint16_t	mp_rsvd;
5750517e57Snonaka } __packed;
5850517e57Snonaka 
5950517e57Snonaka /*
6050517e57Snonaka  * Hyper-V message types
6150517e57Snonaka  */
6250517e57Snonaka #define HYPERV_MSGTYPE_NONE		0
6350517e57Snonaka #define HYPERV_MSGTYPE_CHANNEL		1
6450517e57Snonaka #define HYPERV_MSGTYPE_TIMER_EXPIRED	0x80000010
6550517e57Snonaka 
6650517e57Snonaka /*
6750517e57Snonaka  * Hypercall status codes
6850517e57Snonaka  */
6950517e57Snonaka #define HYPERCALL_STATUS_SUCCESS	0x0000
7050517e57Snonaka 
7150517e57Snonaka /*
7250517e57Snonaka  * Hypercall input values
7350517e57Snonaka  */
7450517e57Snonaka #define HYPERCALL_POST_MESSAGE		0x005c
7550517e57Snonaka #define HYPERCALL_SIGNAL_EVENT		0x005d
7650517e57Snonaka 
7750517e57Snonaka /*
7850517e57Snonaka  * Hypercall input parameters
7950517e57Snonaka  */
8050517e57Snonaka #define HYPERCALL_PARAM_ALIGN		8
8150517e57Snonaka #if 0
8250517e57Snonaka /*
8350517e57Snonaka  * XXX
8450517e57Snonaka  * <<Hypervisor Top Level Functional Specification 4.0b>> requires
8550517e57Snonaka  * input parameters size to be multiple of 8, however, many post
8650517e57Snonaka  * message input parameters do _not_ meet this requirement.
8750517e57Snonaka  */
8850517e57Snonaka #define HYPERCALL_PARAM_SIZE_ALIGN	8
8950517e57Snonaka #endif
9050517e57Snonaka 
9150517e57Snonaka /*
9250517e57Snonaka  * HYPERCALL_POST_MESSAGE
9350517e57Snonaka  */
9450517e57Snonaka #define HYPERCALL_POSTMSGIN_DSIZE_MAX	240
9550517e57Snonaka #define HYPERCALL_POSTMSGIN_SIZE	256
9650517e57Snonaka 
9750517e57Snonaka struct hyperv_hypercall_postmsg_in {
9850517e57Snonaka 	uint32_t	hc_connid;
9950517e57Snonaka 	uint32_t	hc_rsvd;
10050517e57Snonaka 	uint32_t	hc_msgtype;	/* VMBUS_MSGTYPE_ */
10150517e57Snonaka 	uint32_t	hc_dsize;
10250517e57Snonaka 	uint8_t		hc_data[HYPERCALL_POSTMSGIN_DSIZE_MAX];
10350517e57Snonaka } __packed;
10450517e57Snonaka __CTASSERT(sizeof(struct hyperv_hypercall_postmsg_in) == HYPERCALL_POSTMSGIN_SIZE);
10550517e57Snonaka 
10650517e57Snonaka /*
10750517e57Snonaka  * $FreeBSD: head/sys/dev/hyperv/include/vmbus.h 306389 2016-09-28 04:25:25Z sephe $
10850517e57Snonaka  */
10950517e57Snonaka 
11050517e57Snonaka /*
11150517e57Snonaka  * VMBUS version is 32 bit, upper 16 bit for major_number and lower
11250517e57Snonaka  * 16 bit for minor_number.
11350517e57Snonaka  *
11450517e57Snonaka  * 0.13  --  Windows Server 2008
11550517e57Snonaka  * 1.1   --  Windows 7
11650517e57Snonaka  * 2.4   --  Windows 8
11750517e57Snonaka  * 3.0   --  Windows 8.1
11850517e57Snonaka  * 4.0   --  Windows 10
11950517e57Snonaka  */
12050517e57Snonaka #define VMBUS_VERSION_WS2008		((0 << 16) | (13))
12150517e57Snonaka #define VMBUS_VERSION_WIN7		((1 << 16) | (1))
12250517e57Snonaka #define VMBUS_VERSION_WIN8		((2 << 16) | (4))
12350517e57Snonaka #define VMBUS_VERSION_WIN8_1		((3 << 16) | (0))
12450517e57Snonaka #define VMBUS_VERSION_WIN10		((4 << 16) | (0))
12550517e57Snonaka 
12650517e57Snonaka #define VMBUS_VERSION_MAJOR(ver)	(((uint32_t)(ver)) >> 16)
12750517e57Snonaka #define VMBUS_VERSION_MINOR(ver)	(((uint32_t)(ver)) & 0xffff)
12850517e57Snonaka 
12950517e57Snonaka /*
13050517e57Snonaka  * GPA stuffs.
13150517e57Snonaka  */
13250517e57Snonaka struct vmbus_gpa_range {
13350517e57Snonaka 	uint32_t	gpa_len;
13450517e57Snonaka 	uint32_t	gpa_ofs;
13550517e57Snonaka 	uint64_t	gpa_page[0];
13650517e57Snonaka } __packed;
13750517e57Snonaka 
13850517e57Snonaka /* This is actually vmbus_gpa_range.gpa_page[1] */
13950517e57Snonaka struct vmbus_gpa {
14050517e57Snonaka 	uint32_t	gpa_len;
14150517e57Snonaka 	uint32_t	gpa_ofs;
14250517e57Snonaka 	uint64_t	gpa_page;
14350517e57Snonaka } __packed;
14450517e57Snonaka 
14550517e57Snonaka #define VMBUS_CHANPKT_SIZE_SHIFT	3
14650517e57Snonaka 
14750517e57Snonaka #define VMBUS_CHANPKT_GETLEN(pktlen)	\
14850517e57Snonaka 	(((int)(pktlen)) << VMBUS_CHANPKT_SIZE_SHIFT)
14950517e57Snonaka 
15050517e57Snonaka struct vmbus_chanpkt_hdr {
15150517e57Snonaka 	uint16_t	cph_type;	/* VMBUS_CHANPKT_TYPE_ */
15250517e57Snonaka 	uint16_t	cph_hlen;	/* header len, in 8 bytes */
15350517e57Snonaka 	uint16_t	cph_tlen;	/* total len, in 8 bytes */
15450517e57Snonaka 	uint16_t	cph_flags;	/* VMBUS_CHANPKT_FLAG_ */
15550517e57Snonaka 	uint64_t	cph_tid;
15650517e57Snonaka } __packed;
15750517e57Snonaka 
15850517e57Snonaka #define VMBUS_CHANPKT_TYPE_INBAND	0x0006
15950517e57Snonaka #define VMBUS_CHANPKT_TYPE_RXBUF	0x0007
16050517e57Snonaka #define VMBUS_CHANPKT_TYPE_GPA		0x0009
16150517e57Snonaka #define VMBUS_CHANPKT_TYPE_COMP		0x000b
16250517e57Snonaka 
16350517e57Snonaka #define VMBUS_CHANPKT_FLAG_RC		0x0001	/* report completion */
16450517e57Snonaka 
16550517e57Snonaka #define VMBUS_CHANPKT_CONST_DATA(pkt)			\
16650517e57Snonaka 	((const void *)((const uint8_t *)(pkt) +	\
16750517e57Snonaka 	    VMBUS_CHANPKT_GETLEN((pkt)->cph_hlen)))
16850517e57Snonaka 
16950517e57Snonaka /*
17050517e57Snonaka  * $FreeBSD: head/sys/dev/hyperv/vmbus/vmbus_reg.h 305405 2016-09-05 03:21:31Z sephe $
17150517e57Snonaka  */
17250517e57Snonaka 
17350517e57Snonaka /*
17450517e57Snonaka  * Hyper-V SynIC message format.
17550517e57Snonaka  */
17650517e57Snonaka 
17750517e57Snonaka #define VMBUS_MSG_DSIZE_MAX		240
17850517e57Snonaka #define VMBUS_MSG_SIZE			256
17950517e57Snonaka 
18050517e57Snonaka struct vmbus_message {
18150517e57Snonaka 	uint32_t	msg_type;	/* VMBUS_MSGTYPE_ */
18250517e57Snonaka 	uint8_t		msg_dsize;	/* data size */
18350517e57Snonaka 	uint8_t		msg_flags;	/* VMBUS_MSGFLAG_ */
18450517e57Snonaka 	uint16_t	msg_rsvd;
18550517e57Snonaka 	uint64_t	msg_id;
18650517e57Snonaka 	uint8_t		msg_data[VMBUS_MSG_DSIZE_MAX];
18750517e57Snonaka } __packed;
18850517e57Snonaka 
18950517e57Snonaka #define VMBUS_MSGFLAG_PENDING		0x01
19050517e57Snonaka 
19150517e57Snonaka /*
19250517e57Snonaka  * Hyper-V SynIC event flags
19350517e57Snonaka  */
19450517e57Snonaka 
19550517e57Snonaka #define VMBUS_EVTFLAGS_SIZE	256
19650517e57Snonaka #define VMBUS_EVTFLAGS_MAX	((VMBUS_EVTFLAGS_SIZE / LONG_BIT) * 8)
19750517e57Snonaka #define VMBUS_EVTFLAG_LEN	LONG_BIT
19850517e57Snonaka #define VMBUS_EVTFLAG_MASK	(LONG_BIT - 1)
19950517e57Snonaka 
20050517e57Snonaka struct vmbus_evtflags {
20150517e57Snonaka 	ulong		evt_flags[VMBUS_EVTFLAGS_MAX];
20250517e57Snonaka } __packed;
20350517e57Snonaka 
20450517e57Snonaka /*
20550517e57Snonaka  * Hyper-V Monitor Notification Facility
20650517e57Snonaka  */
20750517e57Snonaka 
20850517e57Snonaka struct vmbus_mon_trig {
20950517e57Snonaka 	uint32_t	mt_pending;
21050517e57Snonaka 	uint32_t	mt_armed;
21150517e57Snonaka } __packed;
21250517e57Snonaka 
21350517e57Snonaka #define VMBUS_MONTRIGS_MAX	4
21450517e57Snonaka #define VMBUS_MONTRIG_LEN	32
21550517e57Snonaka 
21650517e57Snonaka struct vmbus_mnf {
21750517e57Snonaka 	uint32_t	mnf_state;
21850517e57Snonaka 	uint32_t	mnf_rsvd1;
21950517e57Snonaka 
22050517e57Snonaka 	struct vmbus_mon_trig
22150517e57Snonaka 			mnf_trigs[VMBUS_MONTRIGS_MAX];
22250517e57Snonaka 	uint8_t		mnf_rsvd2[536];
22350517e57Snonaka 
22450517e57Snonaka 	uint16_t	mnf_lat[VMBUS_MONTRIGS_MAX][VMBUS_MONTRIG_LEN];
22550517e57Snonaka 	uint8_t		mnf_rsvd3[256];
22650517e57Snonaka 
22750517e57Snonaka 	struct hyperv_mon_param
22850517e57Snonaka 			mnf_param[VMBUS_MONTRIGS_MAX][VMBUS_MONTRIG_LEN];
22950517e57Snonaka 	uint8_t		mnf_rsvd4[1984];
23050517e57Snonaka } __packed;
23150517e57Snonaka 
23250517e57Snonaka /*
23350517e57Snonaka  * Buffer ring
23450517e57Snonaka  */
23550517e57Snonaka struct vmbus_bufring {
23650517e57Snonaka 	/*
23750517e57Snonaka 	 * If br_windex == br_rindex, this bufring is empty; this
23850517e57Snonaka 	 * means we can _not_ write data to the bufring, if the
23950517e57Snonaka 	 * write is going to make br_windex same as br_rindex.
24050517e57Snonaka 	 */
24150517e57Snonaka 	volatile uint32_t	br_windex;
24250517e57Snonaka 	volatile uint32_t	br_rindex;
24350517e57Snonaka 
24450517e57Snonaka 	/*
24550517e57Snonaka 	 * Interrupt mask {0,1}
24650517e57Snonaka 	 *
24750517e57Snonaka 	 * For TX bufring, host set this to 1, when it is processing
24850517e57Snonaka 	 * the TX bufring, so that we can safely skip the TX event
24950517e57Snonaka 	 * notification to host.
25050517e57Snonaka 	 *
25150517e57Snonaka 	 * For RX bufring, once this is set to 1 by us, host will not
25250517e57Snonaka 	 * further dispatch interrupts to us, even if there are data
25350517e57Snonaka 	 * pending on the RX bufring.  This effectively disables the
25450517e57Snonaka 	 * interrupt of the channel to which this RX bufring is attached.
25550517e57Snonaka 	 */
25650517e57Snonaka 	volatile uint32_t	br_imask;
25750517e57Snonaka 
25850517e57Snonaka 	uint8_t			br_rsvd[4084];
25950517e57Snonaka 	uint8_t			br_data[0];
26050517e57Snonaka } __packed;
261*fdd3eadbSnonaka __CTASSERT(sizeof(struct vmbus_bufring) == PAGE_SIZE);
26250517e57Snonaka 
26350517e57Snonaka /*
26450517e57Snonaka  * Channel
26550517e57Snonaka  */
26650517e57Snonaka 
26750517e57Snonaka #define VMBUS_CHAN_MAX_COMPAT	256
26850517e57Snonaka #define VMBUS_CHAN_MAX		(VMBUS_EVTFLAG_LEN * VMBUS_EVTFLAGS_MAX)
26950517e57Snonaka 
27050517e57Snonaka /*
27150517e57Snonaka  * Channel packets
27250517e57Snonaka  */
27350517e57Snonaka 
27450517e57Snonaka #define VMBUS_CHANPKT_SIZE_ALIGN	(1 << VMBUS_CHANPKT_SIZE_SHIFT)
27550517e57Snonaka 
27650517e57Snonaka #define VMBUS_CHANPKT_SETLEN(pktlen, len)		\
27750517e57Snonaka do {							\
27850517e57Snonaka 	(pktlen) = (len) >> VMBUS_CHANPKT_SIZE_SHIFT;	\
27950517e57Snonaka } while (0)
28050517e57Snonaka 
28150517e57Snonaka struct vmbus_chanpkt {
28250517e57Snonaka 	struct vmbus_chanpkt_hdr cp_hdr;
28350517e57Snonaka } __packed;
28450517e57Snonaka 
28550517e57Snonaka struct vmbus_chanpkt_sglist {
28650517e57Snonaka 	struct vmbus_chanpkt_hdr cp_hdr;
28750517e57Snonaka 	uint32_t	cp_rsvd;
28850517e57Snonaka 	uint32_t	cp_gpa_cnt;
28950517e57Snonaka 	struct vmbus_gpa cp_gpa[0];
29050517e57Snonaka } __packed;
29150517e57Snonaka 
29250517e57Snonaka struct vmbus_chanpkt_prplist {
29350517e57Snonaka 	struct vmbus_chanpkt_hdr cp_hdr;
29450517e57Snonaka 	uint32_t	cp_rsvd;
29550517e57Snonaka 	uint32_t	cp_range_cnt;
29650517e57Snonaka 	struct vmbus_gpa_range cp_range[0];
29750517e57Snonaka } __packed;
29850517e57Snonaka 
29950517e57Snonaka /*
30050517e57Snonaka  * Channel messages
30150517e57Snonaka  * - Embedded in vmbus_message.msg_data, e.g. response and notification.
30250517e57Snonaka  * - Embedded in hyperv_hypercall_postmsg_in.hc_data, e.g. request.
30350517e57Snonaka  */
30450517e57Snonaka 
30550517e57Snonaka #define VMBUS_CHANMSG_CHOFFER			1	/* NOTE */
30650517e57Snonaka #define VMBUS_CHANMSG_CHRESCIND			2	/* NOTE */
30750517e57Snonaka #define VMBUS_CHANMSG_CHREQUEST			3	/* REQ */
30850517e57Snonaka #define VMBUS_CHANMSG_CHOFFER_DONE		4	/* NOTE */
30950517e57Snonaka #define VMBUS_CHANMSG_CHOPEN			5	/* REQ */
31050517e57Snonaka #define VMBUS_CHANMSG_CHOPEN_RESP		6	/* RESP */
31150517e57Snonaka #define VMBUS_CHANMSG_CHCLOSE			7	/* REQ */
31250517e57Snonaka #define VMBUS_CHANMSG_GPADL_CONN		8	/* REQ */
31350517e57Snonaka #define VMBUS_CHANMSG_GPADL_SUBCONN		9	/* REQ */
31450517e57Snonaka #define VMBUS_CHANMSG_GPADL_CONNRESP		10	/* RESP */
31550517e57Snonaka #define VMBUS_CHANMSG_GPADL_DISCONN		11	/* REQ */
31650517e57Snonaka #define VMBUS_CHANMSG_GPADL_DISCONNRESP		12	/* RESP */
31750517e57Snonaka #define VMBUS_CHANMSG_CHFREE			13	/* REQ */
31850517e57Snonaka #define VMBUS_CHANMSG_CONNECT			14	/* REQ */
31950517e57Snonaka #define VMBUS_CHANMSG_CONNECT_RESP		15	/* RESP */
32050517e57Snonaka #define VMBUS_CHANMSG_DISCONNECT		16	/* REQ */
32150517e57Snonaka #define VMBUS_CHANMSG_COUNT			17
32250517e57Snonaka #define VMBUS_CHANMSG_MAX			22
32350517e57Snonaka 
32450517e57Snonaka struct vmbus_chanmsg_hdr {
32550517e57Snonaka 	uint32_t	chm_type;	/* VMBUS_CHANMSG_* */
32650517e57Snonaka 	uint32_t	chm_rsvd;
32750517e57Snonaka } __packed;
32850517e57Snonaka 
32950517e57Snonaka /* VMBUS_CHANMSG_CONNECT */
33050517e57Snonaka struct vmbus_chanmsg_connect {
33150517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
33250517e57Snonaka 	uint32_t	chm_ver;
33350517e57Snonaka 	uint32_t	chm_rsvd;
33450517e57Snonaka 	uint64_t	chm_evtflags;
33550517e57Snonaka 	uint64_t	chm_mnf1;
33650517e57Snonaka 	uint64_t	chm_mnf2;
33750517e57Snonaka } __packed;
33850517e57Snonaka 
33950517e57Snonaka /* VMBUS_CHANMSG_CONNECT_RESP */
34050517e57Snonaka struct vmbus_chanmsg_connect_resp {
34150517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
34250517e57Snonaka 	uint8_t		chm_done;
34350517e57Snonaka } __packed;
34450517e57Snonaka 
34550517e57Snonaka /* VMBUS_CHANMSG_CHREQUEST */
34650517e57Snonaka struct vmbus_chanmsg_chrequest {
34750517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
34850517e57Snonaka } __packed;
34950517e57Snonaka 
35050517e57Snonaka /* VMBUS_CHANMSG_DISCONNECT */
35150517e57Snonaka struct vmbus_chanmsg_disconnect {
35250517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
35350517e57Snonaka } __packed;
35450517e57Snonaka 
35550517e57Snonaka /* VMBUS_CHANMSG_CHOPEN */
35650517e57Snonaka struct vmbus_chanmsg_chopen {
35750517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
35850517e57Snonaka 	uint32_t	chm_chanid;
35950517e57Snonaka 	uint32_t	chm_openid;
36050517e57Snonaka 	uint32_t	chm_gpadl;
36150517e57Snonaka 	uint32_t	chm_vcpuid;
36250517e57Snonaka 	uint32_t	chm_txbr_pgcnt;
36350517e57Snonaka #define VMBUS_CHANMSG_CHOPEN_UDATA_SIZE	120
36450517e57Snonaka 	uint8_t		chm_udata[VMBUS_CHANMSG_CHOPEN_UDATA_SIZE];
36550517e57Snonaka } __packed;
36650517e57Snonaka 
36750517e57Snonaka /* VMBUS_CHANMSG_CHOPEN_RESP */
36850517e57Snonaka struct vmbus_chanmsg_chopen_resp {
36950517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
37050517e57Snonaka 	uint32_t	chm_chanid;
37150517e57Snonaka 	uint32_t	chm_openid;
37250517e57Snonaka 	uint32_t	chm_status;
37350517e57Snonaka } __packed;
37450517e57Snonaka 
37550517e57Snonaka /* VMBUS_CHANMSG_GPADL_CONN */
37650517e57Snonaka struct vmbus_chanmsg_gpadl_conn {
37750517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
37850517e57Snonaka 	uint32_t	chm_chanid;
37950517e57Snonaka 	uint32_t	chm_gpadl;
38050517e57Snonaka 	uint16_t	chm_range_len;
38150517e57Snonaka 	uint16_t	chm_range_cnt;
38250517e57Snonaka 	struct vmbus_gpa_range chm_range;
38350517e57Snonaka } __packed;
38450517e57Snonaka 
38550517e57Snonaka #define VMBUS_CHANMSG_GPADL_CONN_PGMAX		26
38650517e57Snonaka 
38750517e57Snonaka /* VMBUS_CHANMSG_GPADL_SUBCONN */
38850517e57Snonaka struct vmbus_chanmsg_gpadl_subconn {
38950517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
39050517e57Snonaka 	uint32_t	chm_msgno;
39150517e57Snonaka 	uint32_t	chm_gpadl;
39250517e57Snonaka 	uint64_t	chm_gpa_page[0];
39350517e57Snonaka } __packed;
39450517e57Snonaka 
39550517e57Snonaka #define VMBUS_CHANMSG_GPADL_SUBCONN_PGMAX	28
39650517e57Snonaka 
39750517e57Snonaka /* VMBUS_CHANMSG_GPADL_CONNRESP */
39850517e57Snonaka struct vmbus_chanmsg_gpadl_connresp {
39950517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
40050517e57Snonaka 	uint32_t	chm_chanid;
40150517e57Snonaka 	uint32_t	chm_gpadl;
40250517e57Snonaka 	uint32_t	chm_status;
40350517e57Snonaka } __packed;
40450517e57Snonaka 
40550517e57Snonaka /* VMBUS_CHANMSG_CHCLOSE */
40650517e57Snonaka struct vmbus_chanmsg_chclose {
40750517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
40850517e57Snonaka 	uint32_t	chm_chanid;
40950517e57Snonaka } __packed;
41050517e57Snonaka 
41150517e57Snonaka /* VMBUS_CHANMSG_GPADL_DISCONN */
41250517e57Snonaka struct vmbus_chanmsg_gpadl_disconn {
41350517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
41450517e57Snonaka 	uint32_t	chm_chanid;
41550517e57Snonaka 	uint32_t	chm_gpadl;
41650517e57Snonaka } __packed;
41750517e57Snonaka 
41850517e57Snonaka /* VMBUS_CHANMSG_CHFREE */
41950517e57Snonaka struct vmbus_chanmsg_chfree {
42050517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
42150517e57Snonaka 	uint32_t	chm_chanid;
42250517e57Snonaka } __packed;
42350517e57Snonaka 
42450517e57Snonaka /* VMBUS_CHANMSG_CHRESCIND */
42550517e57Snonaka struct vmbus_chanmsg_chrescind {
42650517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
42750517e57Snonaka 	uint32_t	chm_chanid;
42850517e57Snonaka } __packed;
42950517e57Snonaka 
43050517e57Snonaka /* VMBUS_CHANMSG_CHOFFER */
43150517e57Snonaka struct vmbus_chanmsg_choffer {
43250517e57Snonaka 	struct vmbus_chanmsg_hdr chm_hdr;
43350517e57Snonaka 	struct hyperv_guid chm_chtype;
43450517e57Snonaka 	struct hyperv_guid chm_chinst;
43550517e57Snonaka 	uint64_t	chm_chlat;	/* unit: 100ns */
43650517e57Snonaka 	uint32_t	chm_chrev;
43750517e57Snonaka 	uint32_t	chm_svrctx_sz;
43850517e57Snonaka 	uint16_t	chm_chflags;
43950517e57Snonaka 	uint16_t	chm_mmio_sz;	/* unit: MB */
44050517e57Snonaka 	uint8_t		chm_udata[120];
44150517e57Snonaka 	uint16_t	chm_subidx;
44250517e57Snonaka 	uint16_t	chm_rsvd;
44350517e57Snonaka 	uint32_t	chm_chanid;
44450517e57Snonaka 	uint8_t		chm_montrig;
44550517e57Snonaka 	uint8_t		chm_flags1;	/* VMBUS_CHOFFER_FLAG1_ */
44650517e57Snonaka 	uint16_t	chm_flags2;
44750517e57Snonaka 	uint32_t	chm_connid;
44850517e57Snonaka } __packed;
44950517e57Snonaka 
45050517e57Snonaka #define VMBUS_CHOFFER_FLAG1_HASMNF	0x01
45150517e57Snonaka 
45250517e57Snonaka #endif	/* _KERNEL */
45350517e57Snonaka 
45450517e57Snonaka #endif	/* _HYPERVREG_H_ */
455