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