Blame view

include/linux/hyperv.h 31 KB
5c4734006   K. Y. Srinivasan   Staging: hv: Crea...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  /*
   *
   * Copyright (c) 2011, Microsoft Corporation.
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms and conditions of the GNU General Public License,
   * version 2, as published by the Free Software Foundation.
   *
   * This program is distributed in the hope it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   * more details.
   *
   * You should have received a copy of the GNU General Public License along with
   * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
   * Place - Suite 330, Boston, MA 02111-1307 USA.
   *
   * Authors:
   *   Haiyang Zhang <haiyangz@microsoft.com>
   *   Hank Janssen  <hjanssen@microsoft.com>
   *   K. Y. Srinivasan <kys@microsoft.com>
   *
   */
3f335ea21   K. Y. Srinivasan   Staging: hv: Incl...
24
25
26
  
  #ifndef _HYPERV_H
  #define _HYPERV_H
5267cf02c   Bjarke Istrup Pedersen   hv: Add hyperv.h ...
27
  #include <uapi/linux/hyperv.h>
c75efa974   Andrey Smetanin   drivers/hv: share...
28
  #include <uapi/asm/hyperv.h>
2939437ce   K. Y. Srinivasan   drivers: hv: kvp:...
29

5267cf02c   Bjarke Istrup Pedersen   hv: Add hyperv.h ...
30
  #include <linux/types.h>
8ff3e6fc5   K. Y. Srinivasan   Staging: hv: Incl...
31
32
33
34
35
36
  #include <linux/scatterlist.h>
  #include <linux/list.h>
  #include <linux/timer.h>
  #include <linux/workqueue.h>
  #include <linux/completion.h>
  #include <linux/device.h>
2e2c1d17a   K. Y. Srinivasan   Staging: hv: vmbu...
37
  #include <linux/mod_devicetable.h>
8ff3e6fc5   K. Y. Srinivasan   Staging: hv: Incl...
38

7e5ec3683   K. Y. Srinivasan   Drivers: hv: vmbu...
39
  #define MAX_PAGE_BUFFER_COUNT				32
a363bf7bd   K. Y. Srinivasan   Staging: hv: Add ...
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  #define MAX_MULTIPAGE_BUFFER_COUNT			32 /* 128K */
  
  #pragma pack(push, 1)
  
  /* Single-page buffer */
  struct hv_page_buffer {
  	u32 len;
  	u32 offset;
  	u64 pfn;
  };
  
  /* Multiple-page buffer */
  struct hv_multipage_buffer {
  	/* Length and Offset determines the # of pfns in the array */
  	u32 len;
  	u32 offset;
  	u64 pfn_array[MAX_MULTIPAGE_BUFFER_COUNT];
  };
d61031ee8   K. Y. Srinivasan   Drivers: hv: vmbu...
58
59
60
61
62
63
64
65
66
67
68
  /*
   * Multiple-page buffer array; the pfn array is variable size:
   * The number of entries in the PFN array is determined by
   * "len" and "offset".
   */
  struct hv_mpb_array {
  	/* Length and Offset determines the # of pfns in the array */
  	u32 len;
  	u32 offset;
  	u64 pfn_array[];
  };
a363bf7bd   K. Y. Srinivasan   Staging: hv: Add ...
69
70
71
72
73
74
75
76
77
  /* 0x18 includes the proprietary packet header */
  #define MAX_PAGE_BUFFER_PACKET		(0x18 +			\
  					(sizeof(struct hv_page_buffer) * \
  					 MAX_PAGE_BUFFER_COUNT))
  #define MAX_MULTIPAGE_BUFFER_PACKET	(0x18 +			\
  					 sizeof(struct hv_multipage_buffer))
  
  
  #pragma pack(pop)
7effffb7a   K. Y. Srinivasan   Staging: hv: Move...
78
79
80
81
82
83
84
85
  struct hv_ring_buffer {
  	/* Offset in bytes from the start of ring data below */
  	u32 write_index;
  
  	/* Offset in bytes from the start of ring data below */
  	u32 read_index;
  
  	u32 interrupt_mask;
2416603ef   K. Y. Srinivasan   Drivers: hv: Upda...
86
87
88
89
90
91
92
93
  	/*
  	 * Win8 uses some of the reserved bits to implement
  	 * interrupt driven flow management. On the send side
  	 * we can request that the receiver interrupt the sender
  	 * when the ring transitions from being full to being able
  	 * to handle a message of size "pending_send_sz".
  	 *
  	 * Add necessary state for this enhancement.
7effffb7a   K. Y. Srinivasan   Staging: hv: Move...
94
  	 */
2416603ef   K. Y. Srinivasan   Drivers: hv: Upda...
95
96
97
98
99
100
101
102
103
104
105
106
107
  	u32 pending_send_sz;
  
  	u32 reserved1[12];
  
  	union {
  		struct {
  			u32 feat_pending_send_sz:1;
  		};
  		u32 value;
  	} feature_bits;
  
  	/* Pad it to PAGE_SIZE so that data starts on page boundary */
  	u8	reserved2[4028];
7effffb7a   K. Y. Srinivasan   Staging: hv: Move...
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  
  	/*
  	 * Ring data starts here + RingDataStartOffset
  	 * !!! DO NOT place any fields below this !!!
  	 */
  	u8 buffer[0];
  } __packed;
  
  struct hv_ring_buffer_info {
  	struct hv_ring_buffer *ring_buffer;
  	u32 ring_size;			/* Include the shared header */
  	spinlock_t ring_lock;
  
  	u32 ring_datasize;		/* < ring_size */
  	u32 ring_data_startoffset;
  };
33be96e47   Haiyang Zhang   net/hyperv: Add f...
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  /*
   *
   * hv_get_ringbuffer_availbytes()
   *
   * Get number of bytes available to read and to write to
   * for the specified ring buffer
   */
  static inline void
  hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi,
  			  u32 *read, u32 *write)
  {
  	u32 read_loc, write_loc, dsize;
  
  	smp_read_barrier_depends();
  
  	/* Capture the read/write indices before they changed */
  	read_loc = rbi->ring_buffer->read_index;
  	write_loc = rbi->ring_buffer->write_index;
  	dsize = rbi->ring_datasize;
  
  	*write = write_loc >= read_loc ? dsize - (write_loc - read_loc) :
  		read_loc - write_loc;
  	*read = dsize - *write;
  }
eafa7072e   K. Y. Srinivasan   Drivers: hv: Move...
148
149
150
151
152
153
154
  /*
   * VMBUS version is 32 bit entity broken up into
   * two 16 bit quantities: major_number. minor_number.
   *
   * 0 . 13 (Windows Server 2008)
   * 1 . 1  (Windows 7)
   * 2 . 4  (Windows 8)
03367ef5e   K. Y. Srinivasan   Drivers: hv: vmbu...
155
   * 3 . 0  (Windows 8 R2)
6c4e5f9c9   Keith Mange   Drivers: hv: vmbu...
156
   * 4 . 0  (Windows 10)
eafa7072e   K. Y. Srinivasan   Drivers: hv: Move...
157
158
159
160
161
   */
  
  #define VERSION_WS2008  ((0 << 16) | (13))
  #define VERSION_WIN7    ((1 << 16) | (1))
  #define VERSION_WIN8    ((2 << 16) | (4))
03367ef5e   K. Y. Srinivasan   Drivers: hv: vmbu...
162
  #define VERSION_WIN8_1    ((3 << 16) | (0))
6c4e5f9c9   Keith Mange   Drivers: hv: vmbu...
163
  #define VERSION_WIN10	((4 << 16) | (0))
eafa7072e   K. Y. Srinivasan   Drivers: hv: Move...
164
165
  
  #define VERSION_INVAL -1
6c4e5f9c9   Keith Mange   Drivers: hv: vmbu...
166
  #define VERSION_CURRENT VERSION_WIN10
f7c6dfda0   K. Y. Srinivasan   Staging: hv: Move...
167

517d8dc68   K. Y. Srinivasan   Staging: hv: Move...
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
  /* Make maximum size of pipe payload of 16K */
  #define MAX_PIPE_DATA_PAYLOAD		(sizeof(u8) * 16384)
  
  /* Define PipeMode values. */
  #define VMBUS_PIPE_TYPE_BYTE		0x00000000
  #define VMBUS_PIPE_TYPE_MESSAGE		0x00000004
  
  /* The size of the user defined data buffer for non-pipe offers. */
  #define MAX_USER_DEFINED_BYTES		120
  
  /* The size of the user defined data buffer for pipe offers. */
  #define MAX_PIPE_USER_DEFINED_BYTES	116
  
  /*
   * At the center of the Channel Management library is the Channel Offer. This
   * struct contains the fundamental information about an offer.
   */
  struct vmbus_channel_offer {
358d2ee2e   K. Y. Srinivasan   Staging: hv: Repl...
186
187
  	uuid_le if_type;
  	uuid_le if_instance;
29423b7e5   K. Y. Srinivasan   Drivers: hv: Exte...
188
189
190
191
192
193
  
  	/*
  	 * These two fields are not currently used.
  	 */
  	u64 reserved1;
  	u64 reserved2;
517d8dc68   K. Y. Srinivasan   Staging: hv: Move...
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
  	u16 chn_flags;
  	u16 mmio_megabytes;		/* in bytes * 1024 * 1024 */
  
  	union {
  		/* Non-pipes: The user has MAX_USER_DEFINED_BYTES bytes. */
  		struct {
  			unsigned char user_def[MAX_USER_DEFINED_BYTES];
  		} std;
  
  		/*
  		 * Pipes:
  		 * The following sructure is an integrated pipe protocol, which
  		 * is implemented on top of standard user-defined data. Pipe
  		 * clients have MAX_PIPE_USER_DEFINED_BYTES left for their own
  		 * use.
  		 */
  		struct {
  			u32  pipe_mode;
  			unsigned char user_def[MAX_PIPE_USER_DEFINED_BYTES];
  		} pipe;
  	} u;
29423b7e5   K. Y. Srinivasan   Drivers: hv: Exte...
215
216
217
218
219
  	/*
  	 * The sub_channel_index is defined in win8.
  	 */
  	u16 sub_channel_index;
  	u16 reserved3;
517d8dc68   K. Y. Srinivasan   Staging: hv: Move...
220
221
222
223
224
225
226
227
228
229
  } __packed;
  
  /* Server Flags */
  #define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE	1
  #define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES	2
  #define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS		4
  #define VMBUS_CHANNEL_NAMED_PIPE_MODE			0x10
  #define VMBUS_CHANNEL_LOOPBACK_OFFER			0x100
  #define VMBUS_CHANNEL_PARENT_OFFER			0x200
  #define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION	0x400
50ed40e0d   K. Y. Srinivasan   Staging: hv: Move...
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
  struct vmpacket_descriptor {
  	u16 type;
  	u16 offset8;
  	u16 len8;
  	u16 flags;
  	u64 trans_id;
  } __packed;
  
  struct vmpacket_header {
  	u32 prev_pkt_start_offset;
  	struct vmpacket_descriptor descriptor;
  } __packed;
  
  struct vmtransfer_page_range {
  	u32 byte_count;
  	u32 byte_offset;
  } __packed;
  
  struct vmtransfer_page_packet_header {
  	struct vmpacket_descriptor d;
  	u16 xfer_pageset_id;
1508d8111   K. Y. Srinivasan   Drivers: hv: Expl...
251
  	u8  sender_owns_set;
50ed40e0d   K. Y. Srinivasan   Staging: hv: Move...
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
  	u8 reserved;
  	u32 range_cnt;
  	struct vmtransfer_page_range ranges[1];
  } __packed;
  
  struct vmgpadl_packet_header {
  	struct vmpacket_descriptor d;
  	u32 gpadl;
  	u32 reserved;
  } __packed;
  
  struct vmadd_remove_transfer_page_set {
  	struct vmpacket_descriptor d;
  	u32 gpadl;
  	u16 xfer_pageset_id;
  	u16 reserved;
  } __packed;
  
  /*
   * This structure defines a range in guest physical space that can be made to
   * look virtually contiguous.
   */
  struct gpa_range {
  	u32 byte_count;
  	u32 byte_offset;
  	u64 pfn_array[0];
  };
  
  /*
   * This is the format for an Establish Gpadl packet, which contains a handle by
   * which this GPADL will be known and a set of GPA ranges associated with it.
   * This can be converted to a MDL by the guest OS.  If there are multiple GPA
   * ranges, then the resulting MDL will be "chained," representing multiple VA
   * ranges.
   */
  struct vmestablish_gpadl {
  	struct vmpacket_descriptor d;
  	u32 gpadl;
  	u32 range_cnt;
  	struct gpa_range range[1];
  } __packed;
  
  /*
   * This is the format for a Teardown Gpadl packet, which indicates that the
   * GPADL handle in the Establish Gpadl packet will never be referenced again.
   */
  struct vmteardown_gpadl {
  	struct vmpacket_descriptor d;
  	u32 gpadl;
  	u32 reserved;	/* for alignment to a 8-byte boundary */
  } __packed;
  
  /*
   * This is the format for a GPA-Direct packet, which contains a set of GPA
   * ranges, in addition to commands and/or data.
   */
  struct vmdata_gpa_direct {
  	struct vmpacket_descriptor d;
  	u32 reserved;
  	u32 range_cnt;
  	struct gpa_range range[1];
  } __packed;
  
  /* This is the format for a Additional Data Packet. */
  struct vmadditional_data {
  	struct vmpacket_descriptor d;
  	u64 total_bytes;
  	u32 offset;
  	u32 byte_cnt;
  	unsigned char data[1];
  } __packed;
  
  union vmpacket_largest_possible_header {
  	struct vmpacket_descriptor simple_hdr;
  	struct vmtransfer_page_packet_header xfer_page_hdr;
  	struct vmgpadl_packet_header gpadl_hdr;
  	struct vmadd_remove_transfer_page_set add_rm_xfer_page_hdr;
  	struct vmestablish_gpadl establish_gpadl_hdr;
  	struct vmteardown_gpadl teardown_gpadl_hdr;
  	struct vmdata_gpa_direct data_gpa_direct_hdr;
  };
  
  #define VMPACKET_DATA_START_ADDRESS(__packet)	\
  	(void *)(((unsigned char *)__packet) +	\
  	 ((struct vmpacket_descriptor)__packet)->offset8 * 8)
  
  #define VMPACKET_DATA_LENGTH(__packet)		\
  	((((struct vmpacket_descriptor)__packet)->len8 -	\
  	  ((struct vmpacket_descriptor)__packet)->offset8) * 8)
  
  #define VMPACKET_TRANSFER_MODE(__packet)	\
  	(((struct IMPACT)__packet)->type)
  
  enum vmbus_packet_type {
  	VM_PKT_INVALID				= 0x0,
  	VM_PKT_SYNCH				= 0x1,
  	VM_PKT_ADD_XFER_PAGESET			= 0x2,
  	VM_PKT_RM_XFER_PAGESET			= 0x3,
  	VM_PKT_ESTABLISH_GPADL			= 0x4,
  	VM_PKT_TEARDOWN_GPADL			= 0x5,
  	VM_PKT_DATA_INBAND			= 0x6,
  	VM_PKT_DATA_USING_XFER_PAGES		= 0x7,
  	VM_PKT_DATA_USING_GPADL			= 0x8,
  	VM_PKT_DATA_USING_GPA_DIRECT		= 0x9,
  	VM_PKT_CANCEL_REQUEST			= 0xa,
  	VM_PKT_COMP				= 0xb,
  	VM_PKT_DATA_USING_ADDITIONAL_PKT	= 0xc,
  	VM_PKT_ADDITIONAL_DATA			= 0xd
  };
  
  #define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED	1
517d8dc68   K. Y. Srinivasan   Staging: hv: Move...
363

b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
364

b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
  /* Version 1 messages */
  enum vmbus_channel_message_type {
  	CHANNELMSG_INVALID			=  0,
  	CHANNELMSG_OFFERCHANNEL		=  1,
  	CHANNELMSG_RESCIND_CHANNELOFFER	=  2,
  	CHANNELMSG_REQUESTOFFERS		=  3,
  	CHANNELMSG_ALLOFFERS_DELIVERED	=  4,
  	CHANNELMSG_OPENCHANNEL		=  5,
  	CHANNELMSG_OPENCHANNEL_RESULT		=  6,
  	CHANNELMSG_CLOSECHANNEL		=  7,
  	CHANNELMSG_GPADL_HEADER		=  8,
  	CHANNELMSG_GPADL_BODY			=  9,
  	CHANNELMSG_GPADL_CREATED		= 10,
  	CHANNELMSG_GPADL_TEARDOWN		= 11,
  	CHANNELMSG_GPADL_TORNDOWN		= 12,
  	CHANNELMSG_RELID_RELEASED		= 13,
  	CHANNELMSG_INITIATE_CONTACT		= 14,
  	CHANNELMSG_VERSION_RESPONSE		= 15,
  	CHANNELMSG_UNLOAD			= 16,
2db84eff1   K. Y. Srinivasan   Drivers: hv: vmbu...
384
  	CHANNELMSG_UNLOAD_RESPONSE		= 17,
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
  	CHANNELMSG_COUNT
  };
  
  struct vmbus_channel_message_header {
  	enum vmbus_channel_message_type msgtype;
  	u32 padding;
  } __packed;
  
  /* Query VMBus Version parameters */
  struct vmbus_channel_query_vmbus_version {
  	struct vmbus_channel_message_header header;
  	u32 version;
  } __packed;
  
  /* VMBus Version Supported parameters */
  struct vmbus_channel_version_supported {
  	struct vmbus_channel_message_header header;
1508d8111   K. Y. Srinivasan   Drivers: hv: Expl...
402
  	u8 version_supported;
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
403
404
405
406
407
408
409
410
  } __packed;
  
  /* Offer Channel parameters */
  struct vmbus_channel_offer_channel {
  	struct vmbus_channel_message_header header;
  	struct vmbus_channel_offer offer;
  	u32 child_relid;
  	u8 monitorid;
29423b7e5   K. Y. Srinivasan   Drivers: hv: Exte...
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
  	/*
  	 * win7 and beyond splits this field into a bit field.
  	 */
  	u8 monitor_allocated:1;
  	u8 reserved:7;
  	/*
  	 * These are new fields added in win7 and later.
  	 * Do not access these fields without checking the
  	 * negotiated protocol.
  	 *
  	 * If "is_dedicated_interrupt" is set, we must not set the
  	 * associated bit in the channel bitmap while sending the
  	 * interrupt to the host.
  	 *
  	 * connection_id is to be used in signaling the host.
  	 */
  	u16 is_dedicated_interrupt:1;
  	u16 reserved1:15;
  	u32 connection_id;
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
  } __packed;
  
  /* Rescind Offer parameters */
  struct vmbus_channel_rescind_offer {
  	struct vmbus_channel_message_header header;
  	u32 child_relid;
  } __packed;
  
  /*
   * Request Offer -- no parameters, SynIC message contains the partition ID
   * Set Snoop -- no parameters, SynIC message contains the partition ID
   * Clear Snoop -- no parameters, SynIC message contains the partition ID
   * All Offers Delivered -- no parameters, SynIC message contains the partition
   *		           ID
   * Flush Client -- no parameters, SynIC message contains the partition ID
   */
  
  /* Open Channel parameters */
  struct vmbus_channel_open_channel {
  	struct vmbus_channel_message_header header;
  
  	/* Identifies the specific VMBus channel that is being opened. */
  	u32 child_relid;
  
  	/* ID making a particular open request at a channel offer unique. */
  	u32 openid;
  
  	/* GPADL for the channel's ring buffer. */
  	u32 ringbuffer_gpadlhandle;
abbf3b2aa   K. Y. Srinivasan   Drivers: hv: Add ...
459
460
461
462
463
464
465
466
467
  	/*
  	 * Starting with win8, this field will be used to specify
  	 * the target virtual processor on which to deliver the interrupt for
  	 * the host to guest communication.
  	 * Prior to win8, incoming channel interrupts would only
  	 * be delivered on cpu 0. Setting this value to 0 would
  	 * preserve the earlier behavior.
  	 */
  	u32 target_vp;
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
  
  	/*
  	* The upstream ring buffer begins at offset zero in the memory
  	* described by RingBufferGpadlHandle. The downstream ring buffer
  	* follows it at this offset (in pages).
  	*/
  	u32 downstream_ringbuffer_pageoffset;
  
  	/* User-specific data to be passed along to the server endpoint. */
  	unsigned char userdata[MAX_USER_DEFINED_BYTES];
  } __packed;
  
  /* Open Channel Result parameters */
  struct vmbus_channel_open_result {
  	struct vmbus_channel_message_header header;
  	u32 child_relid;
  	u32 openid;
  	u32 status;
  } __packed;
  
  /* Close channel parameters; */
  struct vmbus_channel_close_channel {
  	struct vmbus_channel_message_header header;
  	u32 child_relid;
  } __packed;
  
  /* Channel Message GPADL */
  #define GPADL_TYPE_RING_BUFFER		1
  #define GPADL_TYPE_SERVER_SAVE_AREA	2
  #define GPADL_TYPE_TRANSACTION		8
  
  /*
   * The number of PFNs in a GPADL message is defined by the number of
   * pages that would be spanned by ByteCount and ByteOffset.  If the
   * implied number of PFNs won't fit in this packet, there will be a
   * follow-up packet that contains more.
   */
  struct vmbus_channel_gpadl_header {
  	struct vmbus_channel_message_header header;
  	u32 child_relid;
  	u32 gpadl;
  	u16 range_buflen;
  	u16 rangecount;
  	struct gpa_range range[0];
  } __packed;
  
  /* This is the followup packet that contains more PFNs. */
  struct vmbus_channel_gpadl_body {
  	struct vmbus_channel_message_header header;
  	u32 msgnumber;
  	u32 gpadl;
  	u64 pfn[0];
  } __packed;
  
  struct vmbus_channel_gpadl_created {
  	struct vmbus_channel_message_header header;
  	u32 child_relid;
  	u32 gpadl;
  	u32 creation_status;
  } __packed;
  
  struct vmbus_channel_gpadl_teardown {
  	struct vmbus_channel_message_header header;
  	u32 child_relid;
  	u32 gpadl;
  } __packed;
  
  struct vmbus_channel_gpadl_torndown {
  	struct vmbus_channel_message_header header;
  	u32 gpadl;
  } __packed;
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
539
540
541
542
543
544
545
546
  struct vmbus_channel_relid_released {
  	struct vmbus_channel_message_header header;
  	u32 child_relid;
  } __packed;
  
  struct vmbus_channel_initiate_contact {
  	struct vmbus_channel_message_header header;
  	u32 vmbus_version_requested;
e28bab482   K. Y. Srinivasan   Drivers: hv: vmbu...
547
  	u32 target_vcpu; /* The VCPU the host should respond to */
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
548
549
550
551
552
553
554
  	u64 interrupt_page;
  	u64 monitor_page1;
  	u64 monitor_page2;
  } __packed;
  
  struct vmbus_channel_version_response {
  	struct vmbus_channel_message_header header;
1508d8111   K. Y. Srinivasan   Drivers: hv: Expl...
555
  	u8 version_supported;
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
556
557
558
559
560
561
  } __packed;
  
  enum vmbus_channel_state {
  	CHANNEL_OFFER_STATE,
  	CHANNEL_OPENING_STATE,
  	CHANNEL_OPEN_STATE,
e68d2971d   K. Y. Srinivasan   Drivers: hv: vmbu...
562
  	CHANNEL_OPENED_STATE,
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
563
  };
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
  /*
   * Represents each channel msg on the vmbus connection This is a
   * variable-size data structure depending on the msg type itself
   */
  struct vmbus_channel_msginfo {
  	/* Bookkeeping stuff */
  	struct list_head msglistentry;
  
  	/* So far, this is only used to handle gpadl body message */
  	struct list_head submsglist;
  
  	/* Synchronize the request/response if needed */
  	struct completion  waitevent;
  	union {
  		struct vmbus_channel_version_supported version_supported;
  		struct vmbus_channel_open_result open_result;
  		struct vmbus_channel_gpadl_torndown gpadl_torndown;
  		struct vmbus_channel_gpadl_created gpadl_created;
  		struct vmbus_channel_version_response version_response;
  	} response;
  
  	u32 msgsize;
  	/*
  	 * The channel message that goes out on the "wire".
  	 * It will contain at minimum the VMBUS_CHANNEL_MESSAGE_HEADER header
  	 */
  	unsigned char msg[0];
  };
f9f1db832   K. Y. Srinivasan   Staging: hv: vmbu...
592
593
594
595
  struct vmbus_close_msg {
  	struct vmbus_channel_msginfo info;
  	struct vmbus_channel_close_channel msg;
  };
b3bf60c7b   K. Y. Srinivasan   Drivers: hv: Mana...
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
  /* Define connection identifier type. */
  union hv_connection_id {
  	u32 asu32;
  	struct {
  		u32 id:24;
  		u32 reserved:8;
  	} u;
  };
  
  /* Definition of the hv_signal_event hypercall input structure. */
  struct hv_input_signal_event {
  	union hv_connection_id connectionid;
  	u16 flag_number;
  	u16 rsvdz;
  };
  
  struct hv_input_signal_event_buffer {
  	u64 align8;
  	struct hv_input_signal_event event;
  };
7d7c75cd4   K. Y. Srinivasan   Staging: hv: vmbu...
616
  struct vmbus_channel {
bc63b6f63   Vitaly Kuznetsov   Drivers: hv: vmbu...
617
618
  	/* Unique channel id */
  	int id;
7d7c75cd4   K. Y. Srinivasan   Staging: hv: vmbu...
619
620
621
  	struct list_head listentry;
  
  	struct hv_device *device_obj;
7d7c75cd4   K. Y. Srinivasan   Staging: hv: vmbu...
622
  	enum vmbus_channel_state state;
7d7c75cd4   K. Y. Srinivasan   Staging: hv: vmbu...
623
624
625
626
627
628
629
630
  
  	struct vmbus_channel_offer_channel offermsg;
  	/*
  	 * These are based on the OfferMsg.MonitorId.
  	 * Save it here for easy access.
  	 */
  	u8 monitor_grp;
  	u8 monitor_bit;
c3582a2c4   Haiyang Zhang   hyperv: Add suppo...
631
  	bool rescind; /* got rescind msg */
7d7c75cd4   K. Y. Srinivasan   Staging: hv: vmbu...
632
633
634
635
636
637
638
639
  	u32 ringbuffer_gpadlhandle;
  
  	/* Allocated memory for ring buffer */
  	void *ringbuffer_pages;
  	u32 ringbuffer_pagecount;
  	struct hv_ring_buffer_info outbound;	/* send to parent */
  	struct hv_ring_buffer_info inbound;	/* receive from parent */
  	spinlock_t inbound_lock;
7d7c75cd4   K. Y. Srinivasan   Staging: hv: vmbu...
640

f9f1db832   K. Y. Srinivasan   Staging: hv: vmbu...
641
  	struct vmbus_close_msg close_msg;
7d7c75cd4   K. Y. Srinivasan   Staging: hv: vmbu...
642
643
644
645
646
  	/* Channel callback are invoked in this workqueue context */
  	/* HANDLE dataWorkQueue; */
  
  	void (*onchannel_callback)(void *context);
  	void *channel_callback_context;
132368bd0   K. Y. Srinivasan   Drivers: hv: Add ...
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
  
  	/*
  	 * A channel can be marked for efficient (batched)
  	 * reading:
  	 * If batched_reading is set to "true", we read until the
  	 * channel is empty and hold off interrupts from the host
  	 * during the entire read process.
  	 * If batched_reading is set to "false", the client is not
  	 * going to perform batched reading.
  	 *
  	 * By default we will enable batched reading; specific
  	 * drivers that don't want this behavior can turn it off.
  	 */
  
  	bool batched_reading;
b3bf60c7b   K. Y. Srinivasan   Drivers: hv: Mana...
662
663
664
665
  
  	bool is_dedicated_interrupt;
  	struct hv_input_signal_event_buffer sig_buf;
  	struct hv_input_signal_event *sig_event;
abbf3b2aa   K. Y. Srinivasan   Drivers: hv: Add ...
666
667
668
669
670
671
672
673
674
675
  
  	/*
  	 * Starting with win8, this field will be used to specify
  	 * the target virtual processor on which to deliver the interrupt for
  	 * the host to guest communication.
  	 * Prior to win8, incoming channel interrupts would only
  	 * be delivered on cpu 0. Setting this value to 0 would
  	 * preserve the earlier behavior.
  	 */
  	u32 target_vp;
d3ba720dd   K. Y. Srinivasan   Drivers: hv: Elim...
676
677
  	/* The corresponding CPUID in the guest */
  	u32 target_cpu;
e68d2971d   K. Y. Srinivasan   Drivers: hv: vmbu...
678
  	/*
1f656ff3f   K. Y. Srinivasan   Drivers: hv: vmbu...
679
680
  	 * State to manage the CPU affiliation of channels.
  	 */
3b71107d7   Dexuan Cui   Drivers: hv: vmbu...
681
  	struct cpumask alloced_cpus_in_node;
1f656ff3f   K. Y. Srinivasan   Drivers: hv: vmbu...
682
683
  	int numa_node;
  	/*
e68d2971d   K. Y. Srinivasan   Drivers: hv: vmbu...
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
  	 * Support for sub-channels. For high performance devices,
  	 * it will be useful to have multiple sub-channels to support
  	 * a scalable communication infrastructure with the host.
  	 * The support for sub-channels is implemented as an extention
  	 * to the current infrastructure.
  	 * The initial offer is considered the primary channel and this
  	 * offer message will indicate if the host supports sub-channels.
  	 * The guest is free to ask for sub-channels to be offerred and can
  	 * open these sub-channels as a normal "primary" channel. However,
  	 * all sub-channels will have the same type and instance guids as the
  	 * primary channel. Requests sent on a given channel will result in a
  	 * response on the same channel.
  	 */
  
  	/*
  	 * Sub-channel creation callback. This callback will be called in
  	 * process context when a sub-channel offer is received from the host.
  	 * The guest can open the sub-channel in the context of this callback.
  	 */
  	void (*sc_creation_callback)(struct vmbus_channel *new_sc);
67fae053b   Vitaly Kuznetsov   Drivers: hv: rena...
704
705
706
707
708
709
  	/*
  	 * The spinlock to protect the structure. It is being used to protect
  	 * test-and-set access to various attributes of the structure as well
  	 * as all sc_list operations.
  	 */
  	spinlock_t lock;
e68d2971d   K. Y. Srinivasan   Drivers: hv: vmbu...
710
711
712
713
714
  	/*
  	 * All Sub-channels of a primary channel are linked here.
  	 */
  	struct list_head sc_list;
  	/*
fea844a2b   Vitaly Kuznetsov   Drivers: hv: vmbu...
715
716
717
718
719
720
721
722
723
  	 * Current number of sub-channels.
  	 */
  	int num_sc;
  	/*
  	 * Number of a sub-channel (position within sc_list) which is supposed
  	 * to be used as the next outgoing channel.
  	 */
  	int next_oc;
  	/*
e68d2971d   K. Y. Srinivasan   Drivers: hv: vmbu...
724
725
726
727
  	 * The primary channel this sub-channel belongs to.
  	 * This will be NULL for the primary channel.
  	 */
  	struct vmbus_channel *primary_channel;
8a7206a89   K. Y. Srinivasan   Drivers: hv: vmbu...
728
729
730
731
  	/*
  	 * Support per-channel state for use by vmbus drivers.
  	 */
  	void *per_channel_state;
3a28fa35d   K. Y. Srinivasan   Drivers: hv: vmbu...
732
733
734
735
736
  	/*
  	 * To support per-cpu lookup mapping of relid to channel,
  	 * link up channels based on their CPU affinity.
  	 */
  	struct list_head percpu_list;
7d7c75cd4   K. Y. Srinivasan   Staging: hv: vmbu...
737
  };
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
738

132368bd0   K. Y. Srinivasan   Drivers: hv: Add ...
739
740
741
742
  static inline void set_channel_read_state(struct vmbus_channel *c, bool state)
  {
  	c->batched_reading = state;
  }
8a7206a89   K. Y. Srinivasan   Drivers: hv: vmbu...
743
744
745
746
747
748
749
750
751
  static inline void set_per_channel_state(struct vmbus_channel *c, void *s)
  {
  	c->per_channel_state = s;
  }
  
  static inline void *get_per_channel_state(struct vmbus_channel *c)
  {
  	return c->per_channel_state;
  }
b56dda06b   K. Y. Srinivasan   Staging: hv: Move...
752
753
754
  void vmbus_onmessage(void *context);
  
  int vmbus_request_offers(void);
e68d2971d   K. Y. Srinivasan   Drivers: hv: vmbu...
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
  /*
   * APIs for managing sub-channels.
   */
  
  void vmbus_set_sc_create_callback(struct vmbus_channel *primary_channel,
  			void (*sc_cr_cb)(struct vmbus_channel *new_sc));
  
  /*
   * Retrieve the (sub) channel on which to send an outgoing request.
   * When a primary channel has multiple sub-channels, we choose a
   * channel whose VCPU binding is closest to the VCPU on which
   * this call is being made.
   */
  struct vmbus_channel *vmbus_get_outgoing_channel(struct vmbus_channel *primary);
  
  /*
   * Check if sub-channels have already been offerred. This API will be useful
   * when the driver is unloaded after establishing sub-channels. In this case,
   * when the driver is re-loaded, the driver would have to check if the
   * subchannels have already been established before attempting to request
   * the creation of sub-channels.
   * This function returns TRUE to indicate that subchannels have already been
   * created.
   * This function should be invoked after setting the callback function for
   * sub-channel creation.
   */
  bool vmbus_are_subchannels_present(struct vmbus_channel *primary);
c35470b22   K. Y. Srinivasan   Staging: hv: Move...
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
  /* The format must be the same as struct vmdata_gpa_direct */
  struct vmbus_channel_packet_page_buffer {
  	u16 type;
  	u16 dataoffset8;
  	u16 length8;
  	u16 flags;
  	u64 transactionid;
  	u32 reserved;
  	u32 rangecount;
  	struct hv_page_buffer range[MAX_PAGE_BUFFER_COUNT];
  } __packed;
  
  /* The format must be the same as struct vmdata_gpa_direct */
  struct vmbus_channel_packet_multipage_buffer {
  	u16 type;
  	u16 dataoffset8;
  	u16 length8;
  	u16 flags;
  	u64 transactionid;
  	u32 reserved;
  	u32 rangecount;		/* Always 1 in this case */
  	struct hv_multipage_buffer range;
  } __packed;
d61031ee8   K. Y. Srinivasan   Drivers: hv: vmbu...
805
806
807
808
809
810
811
812
813
814
815
  /* The format must be the same as struct vmdata_gpa_direct */
  struct vmbus_packet_mpb_array {
  	u16 type;
  	u16 dataoffset8;
  	u16 length8;
  	u16 flags;
  	u64 transactionid;
  	u32 reserved;
  	u32 rangecount;         /* Always 1 in this case */
  	struct hv_mpb_array range;
  } __packed;
c35470b22   K. Y. Srinivasan   Staging: hv: Move...
816
817
818
819
820
821
822
823
824
825
826
827
  
  extern int vmbus_open(struct vmbus_channel *channel,
  			    u32 send_ringbuffersize,
  			    u32 recv_ringbuffersize,
  			    void *userdata,
  			    u32 userdatalen,
  			    void(*onchannel_callback)(void *context),
  			    void *context);
  
  extern void vmbus_close(struct vmbus_channel *channel);
  
  extern int vmbus_sendpacket(struct vmbus_channel *channel,
011a7c3cc   K. Y. Srinivasan   Drivers: hv: vmbu...
828
  				  void *buffer,
c35470b22   K. Y. Srinivasan   Staging: hv: Move...
829
830
831
832
  				  u32 bufferLen,
  				  u64 requestid,
  				  enum vmbus_packet_type type,
  				  u32 flags);
e9395e3f8   K. Y. Srinivasan   Drivers: hv: vmbu...
833
834
835
836
837
838
839
  extern int vmbus_sendpacket_ctl(struct vmbus_channel *channel,
  				  void *buffer,
  				  u32 bufferLen,
  				  u64 requestid,
  				  enum vmbus_packet_type type,
  				  u32 flags,
  				  bool kick_q);
c35470b22   K. Y. Srinivasan   Staging: hv: Move...
840
841
842
843
844
845
  extern int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
  					    struct hv_page_buffer pagebuffers[],
  					    u32 pagecount,
  					    void *buffer,
  					    u32 bufferlen,
  					    u64 requestid);
87e93d617   K. Y. Srinivasan   Drivers: hv: vmbu...
846
847
848
849
850
851
852
853
  extern int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
  					   struct hv_page_buffer pagebuffers[],
  					   u32 pagecount,
  					   void *buffer,
  					   u32 bufferlen,
  					   u64 requestid,
  					   u32 flags,
  					   bool kick_q);
c35470b22   K. Y. Srinivasan   Staging: hv: Move...
854
855
856
857
858
  extern int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel,
  					struct hv_multipage_buffer *mpb,
  					void *buffer,
  					u32 bufferlen,
  					u64 requestid);
d61031ee8   K. Y. Srinivasan   Drivers: hv: vmbu...
859
860
861
862
863
864
  extern int vmbus_sendpacket_mpb_desc(struct vmbus_channel *channel,
  				     struct vmbus_packet_mpb_array *mpb,
  				     u32 desc_size,
  				     void *buffer,
  				     u32 bufferlen,
  				     u64 requestid);
c35470b22   K. Y. Srinivasan   Staging: hv: Move...
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
  extern int vmbus_establish_gpadl(struct vmbus_channel *channel,
  				      void *kbuffer,
  				      u32 size,
  				      u32 *gpadl_handle);
  
  extern int vmbus_teardown_gpadl(struct vmbus_channel *channel,
  				     u32 gpadl_handle);
  
  extern int vmbus_recvpacket(struct vmbus_channel *channel,
  				  void *buffer,
  				  u32 bufferlen,
  				  u32 *buffer_actual_len,
  				  u64 *requestid);
  
  extern int vmbus_recvpacket_raw(struct vmbus_channel *channel,
  				     void *buffer,
  				     u32 bufferlen,
  				     u32 *buffer_actual_len,
  				     u64 *requestid);
c35470b22   K. Y. Srinivasan   Staging: hv: Move...
884

c35470b22   K. Y. Srinivasan   Staging: hv: Move...
885
  extern void vmbus_ontimer(unsigned long data);
35ea09c39   K. Y. Srinivasan   Staging: hv: Move...
886
887
888
889
890
  /* Base driver object */
  struct hv_driver {
  	const char *name;
  
  	/* the device type supported by this driver */
358d2ee2e   K. Y. Srinivasan   Staging: hv: Repl...
891
  	uuid_le dev_type;
2e2c1d17a   K. Y. Srinivasan   Staging: hv: vmbu...
892
  	const struct hv_vmbus_device_id *id_table;
35ea09c39   K. Y. Srinivasan   Staging: hv: Move...
893
894
  
  	struct device_driver driver;
84946899b   K. Y. Srinivasan   Staging: hv: vmbu...
895
  	int (*probe)(struct hv_device *, const struct hv_vmbus_device_id *);
35ea09c39   K. Y. Srinivasan   Staging: hv: Move...
896
897
898
899
900
901
902
903
  	int (*remove)(struct hv_device *);
  	void (*shutdown)(struct hv_device *);
  
  };
  
  /* Base device object */
  struct hv_device {
  	/* the device type id of this device */
358d2ee2e   K. Y. Srinivasan   Staging: hv: Repl...
904
  	uuid_le dev_type;
35ea09c39   K. Y. Srinivasan   Staging: hv: Move...
905
906
  
  	/* the device instance id of this device */
358d2ee2e   K. Y. Srinivasan   Staging: hv: Repl...
907
  	uuid_le dev_instance;
35ea09c39   K. Y. Srinivasan   Staging: hv: Move...
908
909
910
911
  
  	struct device device;
  
  	struct vmbus_channel *channel;
35ea09c39   K. Y. Srinivasan   Staging: hv: Move...
912
  };
27b5b3ca6   K. Y. Srinivasan   Staging: hv: Move...
913
914
915
916
917
918
919
920
921
922
  
  static inline struct hv_device *device_to_hv_device(struct device *d)
  {
  	return container_of(d, struct hv_device, device);
  }
  
  static inline struct hv_driver *drv_to_hv_drv(struct device_driver *d)
  {
  	return container_of(d, struct hv_driver, driver);
  }
ab101e86d   K. Y. Srinivasan   Staging: hv: vmbu...
923
924
925
926
927
928
929
930
931
  static inline void hv_set_drvdata(struct hv_device *dev, void *data)
  {
  	dev_set_drvdata(&dev->device, data);
  }
  
  static inline void *hv_get_drvdata(struct hv_device *dev)
  {
  	return dev_get_drvdata(&dev->device);
  }
27b5b3ca6   K. Y. Srinivasan   Staging: hv: Move...
932
933
  
  /* Vmbus interface */
768fa2191   Greg Kroah-Hartman   Staging: hv: fix ...
934
935
936
937
938
939
  #define vmbus_driver_register(driver)	\
  	__vmbus_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
  int __must_check __vmbus_driver_register(struct hv_driver *hv_driver,
  					 struct module *owner,
  					 const char *mod_name);
  void vmbus_driver_unregister(struct hv_driver *hv_driver);
27b5b3ca6   K. Y. Srinivasan   Staging: hv: Move...
940

354644833   Jake Oshins   drivers:hv: Move ...
941
942
943
944
  int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj,
  			resource_size_t min, resource_size_t max,
  			resource_size_t size, resource_size_t align,
  			bool fb_overlap_ok);
c45cf2d49   Greg Kroah-Hartman   Staging: hv: crea...
945
946
947
948
949
950
951
952
953
954
  /**
   * VMBUS_DEVICE - macro used to describe a specific hyperv vmbus device
   *
   * This macro is used to create a struct hv_vmbus_device_id that matches a
   * specific device.
   */
  #define VMBUS_DEVICE(g0, g1, g2, g3, g4, g5, g6, g7,	\
  		     g8, g9, ga, gb, gc, gd, ge, gf)	\
  	.guid = { g0, g1, g2, g3, g4, g5, g6, g7,	\
  		  g8, g9, ga, gb, gc, gd, ge, gf },
b189702dd   K. Y. Srinivasan   Staging: hv: Move...
955
  /*
7fb96565e   K. Y. Srinivasan   Drivers: hv: vmbu...
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
   * GUID definitions of various offer types - services offered to the guest.
   */
  
  /*
   * Network GUID
   * {f8615163-df3e-46c5-913f-f2d2f965ed0e}
   */
  #define HV_NIC_GUID \
  	.guid = { \
  			0x63, 0x51, 0x61, 0xf8, 0x3e, 0xdf, 0xc5, 0x46, \
  			0x91, 0x3f, 0xf2, 0xd2, 0xf9, 0x65, 0xed, 0x0e \
  		}
  
  /*
   * IDE GUID
   * {32412632-86cb-44a2-9b5c-50d1417354f5}
   */
  #define HV_IDE_GUID \
  	.guid = { \
  			0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, \
  			0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 \
  		}
  
  /*
   * SCSI GUID
   * {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f}
   */
  #define HV_SCSI_GUID \
  	.guid = { \
  			0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, \
  			0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f \
  		}
  
  /*
   * Shutdown GUID
   * {0e0b6031-5213-4934-818b-38d90ced39db}
   */
  #define HV_SHUTDOWN_GUID \
  	.guid = { \
  			0x31, 0x60, 0x0b, 0x0e, 0x13, 0x52, 0x34, 0x49, \
  			0x81, 0x8b, 0x38, 0xd9, 0x0c, 0xed, 0x39, 0xdb \
  		}
  
  /*
   * Time Synch GUID
   * {9527E630-D0AE-497b-ADCE-E80AB0175CAF}
   */
  #define HV_TS_GUID \
  	.guid = { \
  			0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49, \
  			0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf \
  		}
  
  /*
   * Heartbeat GUID
   * {57164f39-9115-4e78-ab55-382f3bd5422d}
   */
  #define HV_HEART_BEAT_GUID \
  	.guid = { \
  			0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e, \
  			0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d \
  		}
  
  /*
   * KVP GUID
   * {a9a0f4e7-5a45-4d96-b827-8a841e8c03e6}
   */
  #define HV_KVP_GUID \
  	.guid = { \
  			0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d, \
  			0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3,  0xe6 \
  		}
  
  /*
   * Dynamic memory GUID
   * {525074dc-8985-46e2-8057-a307dc18a502}
   */
  #define HV_DM_GUID \
  	.guid = { \
  			0xdc, 0x74, 0x50, 0X52, 0x85, 0x89, 0xe2, 0x46, \
  			0x80, 0x57, 0xa3, 0x07, 0xdc, 0x18, 0xa5, 0x02 \
  		}
  
  /*
   * Mouse GUID
   * {cfa8b69e-5b4a-4cc0-b98b-8ba1a1f3f95a}
   */
  #define HV_MOUSE_GUID \
  	.guid = { \
  			0x9e, 0xb6, 0xa8, 0xcf, 0x4a, 0x5b, 0xc0, 0x4c, \
  			0xb9, 0x8b, 0x8b, 0xa1, 0xa1, 0xf3, 0xf9, 0x5a \
  		}
  
  /*
96dd86fa5   K. Y. Srinivasan   Drivers: hv: Add ...
1050
1051
1052
1053
1054
1055
1056
1057
   * VSS (Backup/Restore) GUID
   */
  #define HV_VSS_GUID \
  	.guid = { \
  			0x29, 0x2e, 0xfa, 0x35, 0x23, 0xea, 0x36, 0x42, \
  			0x96, 0xae, 0x3a, 0x6e, 0xba, 0xcb, 0xa4,  0x40 \
  		}
  /*
68a2d20b7   Haiyang Zhang   drivers/video: ad...
1058
1059
1060
1061
1062
1063
1064
1065
   * Synthetic Video GUID
   * {DA0A7802-E377-4aac-8E77-0558EB1073F8}
   */
  #define HV_SYNTHVID_GUID \
  	.guid = { \
  			0x02, 0x78, 0x0a, 0xda, 0x77, 0xe3, 0xac, 0x4a, \
  			0x8e, 0x77, 0x05, 0x58, 0xeb, 0x10, 0x73, 0xf8 \
  		}
68a2d20b7   Haiyang Zhang   drivers/video: ad...
1066
  /*
98b80d893   K. Y. Srinivasan   Drivers: hv: Add ...
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
   * Synthetic FC GUID
   * {2f9bcc4a-0069-4af3-b76b-6fd0be528cda}
   */
  #define HV_SYNTHFC_GUID \
  	.guid = { \
  			0x4A, 0xCC, 0x9B, 0x2F, 0x69, 0x00, 0xF3, 0x4A, \
  			0xB7, 0x6B, 0x6F, 0xD0, 0xBE, 0x52, 0x8C, 0xDA \
  		}
  
  /*
01325476d   K. Y. Srinivasan   Drivers: hv: Impl...
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
   * Guest File Copy Service
   * {34D14BE3-DEE4-41c8-9AE7-6B174977C192}
   */
  
  #define HV_FCOPY_GUID \
  	.guid = { \
  			0xE3, 0x4B, 0xD1, 0x34, 0xE4, 0xDE, 0xC8, 0x41, \
  			0x9A, 0xE7, 0x6B, 0x17, 0x49, 0x77, 0xC1, 0x92 \
  		}
  
  /*
04653a009   K. Y. Srinivasan   Drivers: hv: vmbu...
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
   * NetworkDirect. This is the guest RDMA service.
   * {8c2eaf3d-32a7-4b09-ab99-bd1f1c86b501}
   */
  #define HV_ND_GUID \
  	.guid = { \
  			0x3d, 0xaf, 0x2e, 0x8c, 0xa7, 0x32, 0x09, 0x4b, \
  			0xab, 0x99, 0xbd, 0x1f, 0x1c, 0x86, 0xb5, 0x01 \
  		}
  
  /*
b189702dd   K. Y. Srinivasan   Staging: hv: Move...
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
   * Common header for Hyper-V ICs
   */
  
  #define ICMSGTYPE_NEGOTIATE		0
  #define ICMSGTYPE_HEARTBEAT		1
  #define ICMSGTYPE_KVPEXCHANGE		2
  #define ICMSGTYPE_SHUTDOWN		3
  #define ICMSGTYPE_TIMESYNC		4
  #define ICMSGTYPE_VSS			5
  
  #define ICMSGHDRFLAG_TRANSACTION	1
  #define ICMSGHDRFLAG_REQUEST		2
  #define ICMSGHDRFLAG_RESPONSE		4
b189702dd   K. Y. Srinivasan   Staging: hv: Move...
1111

a29b643c5   K. Y. Srinivasan   Staging: hv: util...
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
  /*
   * While we want to handle util services as regular devices,
   * there is only one instance of each of these services; so
   * we statically allocate the service specific state.
   */
  
  struct hv_util_service {
  	u8 *recv_buffer;
  	void (*util_cb)(void *);
  	int (*util_init)(struct hv_util_service *);
  	void (*util_deinit)(void);
  };
b189702dd   K. Y. Srinivasan   Staging: hv: Move...
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
  struct vmbuspipe_hdr {
  	u32 flags;
  	u32 msgsize;
  } __packed;
  
  struct ic_version {
  	u16 major;
  	u16 minor;
  } __packed;
  
  struct icmsg_hdr {
  	struct ic_version icverframe;
  	u16 icmsgtype;
  	struct ic_version icvermsg;
  	u16 icmsgsize;
  	u32 status;
  	u8 ictransaction_id;
  	u8 icflags;
  	u8 reserved[2];
  } __packed;
  
  struct icmsg_negotiate {
  	u16 icframe_vercnt;
  	u16 icmsg_vercnt;
  	u32 reserved;
  	struct ic_version icversion_data[1]; /* any size array */
  } __packed;
  
  struct shutdown_msg_data {
  	u32 reason_code;
  	u32 timeout_seconds;
  	u32 flags;
  	u8  display_message[2048];
  } __packed;
  
  struct heartbeat_msg_data {
  	u64 seq_num;
  	u32 reserved[8];
  } __packed;
  
  /* Time Sync IC defs */
  #define ICTIMESYNCFLAG_PROBE	0
  #define ICTIMESYNCFLAG_SYNC	1
  #define ICTIMESYNCFLAG_SAMPLE	2
  
  #ifdef __x86_64__
  #define WLTIMEDELTA	116444736000000000L	/* in 100ns unit */
  #else
  #define WLTIMEDELTA	116444736000000000LL
  #endif
  
  struct ictimesync_data {
  	u64 parenttime;
  	u64 childtime;
  	u64 roundtriptime;
  	u8 flags;
  } __packed;
b189702dd   K. Y. Srinivasan   Staging: hv: Move...
1181
1182
1183
  struct hyperv_service_callback {
  	u8 msg_type;
  	char *log_msg;
358d2ee2e   K. Y. Srinivasan   Staging: hv: Repl...
1184
  	uuid_le data;
b189702dd   K. Y. Srinivasan   Staging: hv: Move...
1185
1186
1187
  	struct vmbus_channel *channel;
  	void (*callback) (void *context);
  };
c836d0ab7   K. Y. Srinivasan   Drivers: hv: util...
1188
  #define MAX_SRV_VER	0x7ffffff
6741335bc   K. Y. Srinivasan   Drivers: hv: util...
1189
  extern bool vmbus_prep_negotiate_resp(struct icmsg_hdr *,
c836d0ab7   K. Y. Srinivasan   Drivers: hv: util...
1190
1191
  					struct icmsg_negotiate *, u8 *, int,
  					int);
b189702dd   K. Y. Srinivasan   Staging: hv: Move...
1192

ed6cfcc5f   K. Y. Srinivasan   Drivers: hv: vmbu...
1193
  void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid);
96dd86fa5   K. Y. Srinivasan   Drivers: hv: Add ...
1194

37f7278b8   K. Y. Srinivasan   Drivers: hv: Save...
1195
1196
1197
1198
1199
  /*
   * Negotiated version with the Host.
   */
  
  extern __u32 vmbus_proto_version;
3f335ea21   K. Y. Srinivasan   Staging: hv: Incl...
1200
  #endif /* _HYPERV_H */