xref: /qemu/include/hw/hyperv/vmbus-proto.h (revision 12b35405)
1 /*
2  * QEMU Hyper-V VMBus support
3  *
4  * Copyright (c) 2017-2018 Virtuozzo International GmbH.
5  *
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.
8  */
9 
10 #ifndef HW_HYPERV_VMBUS_PROTO_H
11 #define HW_HYPERV_VMBUS_PROTO_H
12 
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
20 
21 #define VMBUS_MESSAGE_CONNECTION_ID             1
22 #define VMBUS_EVENT_CONNECTION_ID               2
23 #define VMBUS_MONITOR_CONNECTION_ID             3
24 #define VMBUS_SINT                              2
25 
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
45 
46 #define VMBUS_MESSAGE_SIZE_ALIGN        sizeof(uint64_t)
47 
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
62 
63 #define VMBUS_CHANNEL_USER_DATA_SIZE            120
64 
65 #define VMBUS_OFFER_MONITOR_ALLOCATED           0x1
66 #define VMBUS_OFFER_INTERRUPT_DEDICATED         0x1
67 
68 #define VMBUS_RING_BUFFER_FEAT_PENDING_SZ       (1ul << 0)
69 
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
78 
79 #define VMBUS_PACKET_FLAG_REQUEST_COMPLETION    1
80 
81 typedef struct vmbus_message_header {
82     uint32_t message_type;
83     uint32_t _padding;
84 } vmbus_message_header;
85 
86 typedef struct vmbus_message_initiate_contact {
87     vmbus_message_header header;
88     uint32_t version_requested;
89     uint32_t target_vcpu;
90     uint64_t interrupt_page;
91     uint64_t monitor_page1;
92     uint64_t monitor_page2;
93 } vmbus_message_initiate_contact;
94 
95 typedef struct vmbus_message_version_response {
96     vmbus_message_header header;
97     uint8_t version_supported;
98     uint8_t status;
99 } vmbus_message_version_response;
100 
101 typedef struct vmbus_message_offer_channel {
102     vmbus_message_header header;
103     uint8_t  type_uuid[16];
104     uint8_t  instance_uuid[16];
105     uint64_t _reserved1;
106     uint64_t _reserved2;
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;
111     uint16_t _reserved3;
112     uint32_t child_relid;
113     uint8_t  monitor_id;
114     uint8_t  monitor_flags;
115     uint16_t interrupt_flags;
116     uint32_t connection_id;
117 } vmbus_message_offer_channel;
118 
119 typedef struct vmbus_message_rescind_channel_offer {
120     vmbus_message_header header;
121     uint32_t child_relid;
122 } vmbus_message_rescind_channel_offer;
123 
124 typedef struct vmbus_gpa_range {
125     uint32_t byte_count;
126     uint32_t byte_offset;
127     uint64_t pfn_array[];
128 } vmbus_gpa_range;
129 
130 typedef struct vmbus_message_gpadl_header {
131     vmbus_message_header header;
132     uint32_t child_relid;
133     uint32_t gpadl_id;
134     uint16_t range_buflen;
135     uint16_t rangecount;
136     vmbus_gpa_range range[];
137 } QEMU_PACKED vmbus_message_gpadl_header;
138 
139 typedef struct vmbus_message_gpadl_body {
140     vmbus_message_header header;
141     uint32_t message_number;
142     uint32_t gpadl_id;
143     uint64_t pfn_array[];
144 } vmbus_message_gpadl_body;
145 
146 typedef struct vmbus_message_gpadl_created {
147     vmbus_message_header header;
148     uint32_t child_relid;
149     uint32_t gpadl_id;
150     uint32_t status;
151 } vmbus_message_gpadl_created;
152 
153 typedef struct vmbus_message_gpadl_teardown {
154     vmbus_message_header header;
155     uint32_t child_relid;
156     uint32_t gpadl_id;
157 } vmbus_message_gpadl_teardown;
158 
159 typedef struct vmbus_message_gpadl_torndown {
160     vmbus_message_header header;
161     uint32_t gpadl_id;
162 } vmbus_message_gpadl_torndown;
163 
164 typedef struct vmbus_message_open_channel {
165     vmbus_message_header header;
166     uint32_t child_relid;
167     uint32_t open_id;
168     uint32_t ring_buffer_gpadl_id;
169     uint32_t target_vp;
170     uint32_t ring_buffer_offset;
171     uint8_t  user_data[VMBUS_CHANNEL_USER_DATA_SIZE];
172 } vmbus_message_open_channel;
173 
174 typedef struct vmbus_message_open_result {
175     vmbus_message_header header;
176     uint32_t child_relid;
177     uint32_t open_id;
178     uint32_t status;
179 } vmbus_message_open_result;
180 
181 typedef struct vmbus_message_close_channel {
182     vmbus_message_header header;
183     uint32_t child_relid;
184 } vmbus_message_close_channel;
185 
186 typedef struct vmbus_ring_buffer {
187     uint32_t write_index;
188     uint32_t read_index;
189     uint32_t interrupt_mask;
190     uint32_t pending_send_sz;
191     uint32_t _reserved1[12];
192     uint32_t feature_bits;
193 } vmbus_ring_buffer;
194 
195 typedef struct vmbus_packet_hdr {
196     uint16_t type;
197     uint16_t offset_qwords;
198     uint16_t len_qwords;
199     uint16_t flags;
200     uint64_t transaction_id;
201 } vmbus_packet_hdr;
202 
203 typedef struct vmbus_pkt_gpa_direct {
204     uint32_t _reserved;
205     uint32_t rangecount;
206     vmbus_gpa_range range[];
207 } vmbus_pkt_gpa_direct;
208 
209 typedef struct vmbus_xferpg_range {
210     uint32_t byte_count;
211     uint32_t byte_offset;
212 } vmbus_xferpg_range;
213 
214 typedef struct vmbus_pkt_xferpg {
215     uint16_t buffer_id;
216     uint8_t sender_owns_set;
217     uint8_t _reserved;
218     uint32_t rangecount;
219     vmbus_xferpg_range range[];
220 } vmbus_pkt_xferpg;
221 
222 #endif
223