2 * QEMU Hyper-V VMBus support
4 * Copyright (c) 2017-2018 Virtuozzo International GmbH.
6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
7 * See the COPYING file in the top-level directory.
10 #ifndef HW_HYPERV_VMBUS_PROTO_H
11 #define HW_HYPERV_VMBUS_PROTO_H
13 #define VMBUS_VERSION_WS2008 ((0 << 16) | (13))
14 #define VMBUS_VERSION_WIN7 ((1 << 16) | (1))
15 #define VMBUS_VERSION_WIN8 ((2 << 16) | (4))
16 #define VMBUS_VERSION_WIN8_1 ((3 << 16) | (0))
17 #define VMBUS_VERSION_WIN10 ((4 << 16) | (0))
18 #define VMBUS_VERSION_INVAL -1
19 #define VMBUS_VERSION_CURRENT VMBUS_VERSION_WIN10
21 #define VMBUS_MESSAGE_CONNECTION_ID 1
22 #define VMBUS_EVENT_CONNECTION_ID 2
23 #define VMBUS_MONITOR_CONNECTION_ID 3
26 #define VMBUS_MSG_INVALID 0
27 #define VMBUS_MSG_OFFERCHANNEL 1
28 #define VMBUS_MSG_RESCIND_CHANNELOFFER 2
29 #define VMBUS_MSG_REQUESTOFFERS 3
30 #define VMBUS_MSG_ALLOFFERS_DELIVERED 4
31 #define VMBUS_MSG_OPENCHANNEL 5
32 #define VMBUS_MSG_OPENCHANNEL_RESULT 6
33 #define VMBUS_MSG_CLOSECHANNEL 7
34 #define VMBUS_MSG_GPADL_HEADER 8
35 #define VMBUS_MSG_GPADL_BODY 9
36 #define VMBUS_MSG_GPADL_CREATED 10
37 #define VMBUS_MSG_GPADL_TEARDOWN 11
38 #define VMBUS_MSG_GPADL_TORNDOWN 12
39 #define VMBUS_MSG_RELID_RELEASED 13
40 #define VMBUS_MSG_INITIATE_CONTACT 14
41 #define VMBUS_MSG_VERSION_RESPONSE 15
42 #define VMBUS_MSG_UNLOAD 16
43 #define VMBUS_MSG_UNLOAD_RESPONSE 17
44 #define VMBUS_MSG_COUNT 18
46 #define VMBUS_MESSAGE_SIZE_ALIGN sizeof(uint64_t)
48 #define VMBUS_PACKET_INVALID 0x0
49 #define VMBUS_PACKET_SYNCH 0x1
50 #define VMBUS_PACKET_ADD_XFER_PAGESET 0x2
51 #define VMBUS_PACKET_RM_XFER_PAGESET 0x3
52 #define VMBUS_PACKET_ESTABLISH_GPADL 0x4
53 #define VMBUS_PACKET_TEARDOWN_GPADL 0x5
54 #define VMBUS_PACKET_DATA_INBAND 0x6
55 #define VMBUS_PACKET_DATA_USING_XFER_PAGES 0x7
56 #define VMBUS_PACKET_DATA_USING_GPADL 0x8
57 #define VMBUS_PACKET_DATA_USING_GPA_DIRECT 0x9
58 #define VMBUS_PACKET_CANCEL_REQUEST 0xa
59 #define VMBUS_PACKET_COMP 0xb
60 #define VMBUS_PACKET_DATA_USING_ADDITIONAL_PKT 0xc
61 #define VMBUS_PACKET_ADDITIONAL_DATA 0xd
63 #define VMBUS_CHANNEL_USER_DATA_SIZE 120
65 #define VMBUS_OFFER_MONITOR_ALLOCATED 0x1
66 #define VMBUS_OFFER_INTERRUPT_DEDICATED 0x1
68 #define VMBUS_RING_BUFFER_FEAT_PENDING_SZ (1ul << 0)
70 #define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 0x1
71 #define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 0x2
72 #define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 0x4
73 #define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x10
74 #define VMBUS_CHANNEL_LOOPBACK_OFFER 0x100
75 #define VMBUS_CHANNEL_PARENT_OFFER 0x200
76 #define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400
77 #define VMBUS_CHANNEL_TLNPI_PROVIDER_OFFER 0x2000
79 #define VMBUS_PACKET_FLAG_REQUEST_COMPLETION 1
81 typedef struct vmbus_message_header
{
82 uint32_t message_type
;
84 } vmbus_message_header
;
86 typedef struct vmbus_message_initiate_contact
{
87 vmbus_message_header header
;
88 uint32_t version_requested
;
90 uint64_t interrupt_page
;
91 uint64_t monitor_page1
;
92 uint64_t monitor_page2
;
93 } vmbus_message_initiate_contact
;
95 typedef struct vmbus_message_version_response
{
96 vmbus_message_header header
;
97 uint8_t version_supported
;
99 } vmbus_message_version_response
;
101 typedef struct vmbus_message_offer_channel
{
102 vmbus_message_header header
;
103 uint8_t type_uuid
[16];
104 uint8_t instance_uuid
[16];
107 uint16_t channel_flags
;
108 uint16_t mmio_size_mb
;
109 uint8_t user_data
[VMBUS_CHANNEL_USER_DATA_SIZE
];
110 uint16_t sub_channel_index
;
112 uint32_t child_relid
;
114 uint8_t monitor_flags
;
115 uint16_t interrupt_flags
;
116 uint32_t connection_id
;
117 } vmbus_message_offer_channel
;
119 typedef struct vmbus_message_rescind_channel_offer
{
120 vmbus_message_header header
;
121 uint32_t child_relid
;
122 } vmbus_message_rescind_channel_offer
;
124 typedef struct vmbus_gpa_range
{
126 uint32_t byte_offset
;
127 uint64_t pfn_array
[];
130 typedef struct vmbus_message_gpadl_header
{
131 vmbus_message_header header
;
132 uint32_t child_relid
;
134 uint16_t range_buflen
;
136 vmbus_gpa_range range
[];
137 } QEMU_PACKED vmbus_message_gpadl_header
;
139 typedef struct vmbus_message_gpadl_body
{
140 vmbus_message_header header
;
141 uint32_t message_number
;
143 uint64_t pfn_array
[];
144 } vmbus_message_gpadl_body
;
146 typedef struct vmbus_message_gpadl_created
{
147 vmbus_message_header header
;
148 uint32_t child_relid
;
151 } vmbus_message_gpadl_created
;
153 typedef struct vmbus_message_gpadl_teardown
{
154 vmbus_message_header header
;
155 uint32_t child_relid
;
157 } vmbus_message_gpadl_teardown
;
159 typedef struct vmbus_message_gpadl_torndown
{
160 vmbus_message_header header
;
162 } vmbus_message_gpadl_torndown
;
164 typedef struct vmbus_message_open_channel
{
165 vmbus_message_header header
;
166 uint32_t child_relid
;
168 uint32_t ring_buffer_gpadl_id
;
170 uint32_t ring_buffer_offset
;
171 uint8_t user_data
[VMBUS_CHANNEL_USER_DATA_SIZE
];
172 } vmbus_message_open_channel
;
174 typedef struct vmbus_message_open_result
{
175 vmbus_message_header header
;
176 uint32_t child_relid
;
179 } vmbus_message_open_result
;
181 typedef struct vmbus_message_close_channel
{
182 vmbus_message_header header
;
183 uint32_t child_relid
;
184 } vmbus_message_close_channel
;
186 typedef struct vmbus_ring_buffer
{
187 uint32_t write_index
;
189 uint32_t interrupt_mask
;
190 uint32_t pending_send_sz
;
191 uint32_t _reserved1
[12];
192 uint32_t feature_bits
;
195 typedef struct vmbus_packet_hdr
{
197 uint16_t offset_qwords
;
200 uint64_t transaction_id
;
203 typedef struct vmbus_pkt_gpa_direct
{
206 vmbus_gpa_range range
[];
207 } vmbus_pkt_gpa_direct
;
209 typedef struct vmbus_xferpg_range
{
211 uint32_t byte_offset
;
212 } vmbus_xferpg_range
;
214 typedef struct vmbus_pkt_xferpg
{
216 uint8_t sender_owns_set
;
219 vmbus_xferpg_range range
[];