28 #include <linux/types.h>
58 #define HV_KVP_EXCHANGE_MAX_VALUE_SIZE (2048)
66 #define HV_KVP_EXCHANGE_MAX_KEY_SIZE (512)
154 #define KVP_OP_REGISTER 4
163 #define KVP_OP_REGISTER1 100
188 #define HV_S_OK 0x00000000
189 #define HV_E_FAIL 0x80004005
190 #define HV_S_CONT 0x80070103
191 #define HV_ERROR_NOT_SUPPORTED 0x80070032
192 #define HV_ERROR_MACHINE_LOCKED 0x800704F7
193 #define HV_ERROR_DEVICE_NOT_CONNECTED 0x8007048F
194 #define HV_INVALIDARG 0x80070057
195 #define HV_GUID_NOTFOUND 0x80041002
197 #define ADDR_FAMILY_NONE 0x00
198 #define ADDR_FAMILY_IPV4 0x01
199 #define ADDR_FAMILY_IPV6 0x02
201 #define MAX_ADAPTER_ID_SIZE 128
202 #define MAX_IP_ADDR_SIZE 1024
203 #define MAX_GATEWAY_SIZE 512
280 #include <linux/list.h>
281 #include <linux/uuid.h>
285 #include <linux/device.h>
289 #define MAX_PAGE_BUFFER_COUNT 19
290 #define MAX_MULTIPAGE_BUFFER_COUNT 32
292 #pragma pack(push, 1)
295 struct hv_page_buffer {
302 struct hv_multipage_buffer {
306 u64 pfn_array[MAX_MULTIPAGE_BUFFER_COUNT];
310 #define MAX_PAGE_BUFFER_PACKET (0x18 + \
311 (sizeof(struct hv_page_buffer) * \
312 MAX_PAGE_BUFFER_COUNT))
313 #define MAX_MULTIPAGE_BUFFER_PACKET (0x18 + \
314 sizeof(struct hv_multipage_buffer))
319 struct hv_ring_buffer {
344 struct hv_ring_buffer_info {
350 u32 ring_data_startoffset;
353 struct hv_ring_buffer_debug_info {
354 u32 current_interrupt_mask;
355 u32 current_read_index;
356 u32 current_write_index;
357 u32 bytes_avail_toread;
358 u32 bytes_avail_towrite;
370 hv_get_ringbuffer_availbytes(
struct hv_ring_buffer_info *rbi,
373 u32 read_loc, write_loc, dsize;
378 read_loc = rbi->ring_buffer->read_index;
379 write_loc = rbi->ring_buffer->write_index;
380 dsize = rbi->ring_datasize;
382 *write = write_loc >= read_loc ? dsize - (write_loc - read_loc) :
383 read_loc - write_loc;
384 *read = dsize - *
write;
406 #define HV_DRV_VERSION "3.1"
413 #define VMBUS_REVISION_NUMBER 13
416 #define MAX_PIPE_DATA_PAYLOAD (sizeof(u8) * 16384)
419 #define VMBUS_PIPE_TYPE_BYTE 0x00000000
420 #define VMBUS_PIPE_TYPE_MESSAGE 0x00000004
423 #define MAX_USER_DEFINED_BYTES 120
426 #define MAX_PIPE_USER_DEFINED_BYTES 116
432 struct vmbus_channel_offer {
444 unsigned char user_def[MAX_USER_DEFINED_BYTES];
456 unsigned char user_def[MAX_PIPE_USER_DEFINED_BYTES];
463 #define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 1
464 #define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 2
465 #define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 4
466 #define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x10
467 #define VMBUS_CHANNEL_LOOPBACK_OFFER 0x100
468 #define VMBUS_CHANNEL_PARENT_OFFER 0x200
469 #define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400
471 struct vmpacket_descriptor {
479 struct vmpacket_header {
480 u32 prev_pkt_start_offset;
484 struct vmtransfer_page_range {
489 struct vmtransfer_page_packet_header {
490 struct vmpacket_descriptor
d;
495 struct vmtransfer_page_range ranges[1];
498 struct vmgpadl_packet_header {
499 struct vmpacket_descriptor
d;
504 struct vmadd_remove_transfer_page_set {
505 struct vmpacket_descriptor
d;
528 struct vmestablish_gpadl {
529 struct vmpacket_descriptor
d;
532 struct gpa_range
range[1];
539 struct vmteardown_gpadl {
540 struct vmpacket_descriptor
d;
549 struct vmdata_gpa_direct {
550 struct vmpacket_descriptor
d;
553 struct gpa_range
range[1];
557 struct vmadditional_data {
558 struct vmpacket_descriptor
d;
562 unsigned char data[1];
565 union vmpacket_largest_possible_header {
566 struct vmpacket_descriptor simple_hdr;
567 struct vmtransfer_page_packet_header xfer_page_hdr;
568 struct vmgpadl_packet_header gpadl_hdr;
569 struct vmadd_remove_transfer_page_set add_rm_xfer_page_hdr;
570 struct vmestablish_gpadl establish_gpadl_hdr;
571 struct vmteardown_gpadl teardown_gpadl_hdr;
572 struct vmdata_gpa_direct data_gpa_direct_hdr;
575 #define VMPACKET_DATA_START_ADDRESS(__packet) \
576 (void *)(((unsigned char *)__packet) + \
577 ((struct vmpacket_descriptor)__packet)->offset8 * 8)
579 #define VMPACKET_DATA_LENGTH(__packet) \
580 ((((struct vmpacket_descriptor)__packet)->len8 - \
581 ((struct vmpacket_descriptor)__packet)->offset8) * 8)
583 #define VMPACKET_TRANSFER_MODE(__packet) \
584 (((struct IMPACT)__packet)->type)
586 enum vmbus_packet_type {
587 VM_PKT_INVALID = 0x0,
589 VM_PKT_ADD_XFER_PAGESET = 0x2,
590 VM_PKT_RM_XFER_PAGESET = 0x3,
591 VM_PKT_ESTABLISH_GPADL = 0x4,
592 VM_PKT_TEARDOWN_GPADL = 0x5,
593 VM_PKT_DATA_INBAND = 0x6,
594 VM_PKT_DATA_USING_XFER_PAGES = 0x7,
595 VM_PKT_DATA_USING_GPADL = 0x8,
596 VM_PKT_DATA_USING_GPA_DIRECT = 0x9,
597 VM_PKT_CANCEL_REQUEST = 0xa,
599 VM_PKT_DATA_USING_ADDITIONAL_PKT = 0xc,
600 VM_PKT_ADDITIONAL_DATA = 0xd
603 #define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED 1
607 enum vmbus_channel_message_type {
608 CHANNELMSG_INVALID = 0,
609 CHANNELMSG_OFFERCHANNEL = 1,
610 CHANNELMSG_RESCIND_CHANNELOFFER = 2,
611 CHANNELMSG_REQUESTOFFERS = 3,
612 CHANNELMSG_ALLOFFERS_DELIVERED = 4,
613 CHANNELMSG_OPENCHANNEL = 5,
614 CHANNELMSG_OPENCHANNEL_RESULT = 6,
615 CHANNELMSG_CLOSECHANNEL = 7,
616 CHANNELMSG_GPADL_HEADER = 8,
617 CHANNELMSG_GPADL_BODY = 9,
618 CHANNELMSG_GPADL_CREATED = 10,
619 CHANNELMSG_GPADL_TEARDOWN = 11,
620 CHANNELMSG_GPADL_TORNDOWN = 12,
621 CHANNELMSG_RELID_RELEASED = 13,
622 CHANNELMSG_INITIATE_CONTACT = 14,
623 CHANNELMSG_VERSION_RESPONSE = 15,
624 CHANNELMSG_UNLOAD = 16,
625 #ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
626 CHANNELMSG_VIEWRANGE_ADD = 17,
627 CHANNELMSG_VIEWRANGE_REMOVE = 18,
632 struct vmbus_channel_message_header {
633 enum vmbus_channel_message_type
msgtype;
638 struct vmbus_channel_query_vmbus_version {
639 struct vmbus_channel_message_header
header;
644 struct vmbus_channel_version_supported {
645 struct vmbus_channel_message_header
header;
646 u8 version_supported;
650 struct vmbus_channel_offer_channel {
651 struct vmbus_channel_message_header
header;
652 struct vmbus_channel_offer offer;
655 u8 monitor_allocated;
659 struct vmbus_channel_rescind_offer {
660 struct vmbus_channel_message_header
header;
674 struct vmbus_channel_open_channel {
675 struct vmbus_channel_message_header
header;
684 u32 ringbuffer_gpadlhandle;
687 u32 server_contextarea_gpadlhandle;
694 u32 downstream_ringbuffer_pageoffset;
697 unsigned char userdata[MAX_USER_DEFINED_BYTES];
701 struct vmbus_channel_open_result {
702 struct vmbus_channel_message_header
header;
709 struct vmbus_channel_close_channel {
710 struct vmbus_channel_message_header
header;
715 #define GPADL_TYPE_RING_BUFFER 1
716 #define GPADL_TYPE_SERVER_SAVE_AREA 2
717 #define GPADL_TYPE_TRANSACTION 8
725 struct vmbus_channel_gpadl_header {
726 struct vmbus_channel_message_header
header;
731 struct gpa_range
range[0];
735 struct vmbus_channel_gpadl_body {
736 struct vmbus_channel_message_header
header;
742 struct vmbus_channel_gpadl_created {
743 struct vmbus_channel_message_header
header;
749 struct vmbus_channel_gpadl_teardown {
750 struct vmbus_channel_message_header
header;
755 struct vmbus_channel_gpadl_torndown {
756 struct vmbus_channel_message_header
header;
760 #ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
761 struct vmbus_channel_view_range_add {
762 struct vmbus_channel_message_header
header;
763 PHYSICAL_ADDRESS viewrange_base;
764 u64 viewrange_length;
768 struct vmbus_channel_view_range_remove {
769 struct vmbus_channel_message_header
header;
770 PHYSICAL_ADDRESS viewrange_base;
775 struct vmbus_channel_relid_released {
776 struct vmbus_channel_message_header
header;
780 struct vmbus_channel_initiate_contact {
781 struct vmbus_channel_message_header
header;
782 u32 vmbus_version_requested;
789 struct vmbus_channel_version_response {
790 struct vmbus_channel_message_header
header;
791 u8 version_supported;
794 enum vmbus_channel_state {
796 CHANNEL_OPENING_STATE,
800 struct vmbus_channel_debug_info {
802 enum vmbus_channel_state
state;
806 u32 servermonitor_pending;
807 u32 servermonitor_latency;
808 u32 servermonitor_connectionid;
809 u32 clientmonitor_pending;
810 u32 clientmonitor_latency;
811 u32 clientmonitor_connectionid;
813 struct hv_ring_buffer_debug_info inbound;
814 struct hv_ring_buffer_debug_info outbound;
821 struct vmbus_channel_msginfo {
831 struct vmbus_channel_version_supported version_supported;
832 struct vmbus_channel_open_result open_result;
833 struct vmbus_channel_gpadl_torndown gpadl_torndown;
834 struct vmbus_channel_gpadl_created gpadl_created;
835 struct vmbus_channel_version_response version_response;
843 unsigned char msg[0];
846 struct vmbus_close_msg {
847 struct vmbus_channel_msginfo
info;
848 struct vmbus_channel_close_channel
msg;
851 struct vmbus_channel {
854 struct hv_device *device_obj;
858 enum vmbus_channel_state
state;
860 struct vmbus_channel_offer_channel offermsg;
868 u32 ringbuffer_gpadlhandle;
871 void *ringbuffer_pages;
872 u32 ringbuffer_pagecount;
873 struct hv_ring_buffer_info outbound;
874 struct hv_ring_buffer_info inbound;
884 void *channel_callback_context;
892 struct vmbus_channel_packet_page_buffer {
900 struct hv_page_buffer
range[MAX_PAGE_BUFFER_COUNT];
904 struct vmbus_channel_packet_multipage_buffer {
912 struct hv_multipage_buffer
range;
917 u32 send_ringbuffersize,
918 u32 recv_ringbuffersize,
921 void(*onchannel_callback)(
void *
context),
924 extern void vmbus_close(
struct vmbus_channel *channel);
930 enum vmbus_packet_type
type,
934 struct hv_page_buffer pagebuffers[],
941 struct hv_multipage_buffer *mpb,
957 u32 *buffer_actual_len,
963 u32 *buffer_actual_len,
968 struct vmbus_channel_debug_info *
debug);
970 extern void vmbus_ontimer(
unsigned long data);
972 struct hv_dev_port_info {
976 u32 bytes_avail_toread;
977 u32 bytes_avail_towrite;
991 int (*
remove)(
struct hv_device *);
992 void (*shutdown)(
struct hv_device *);
1006 struct vmbus_channel *
channel;
1010 static inline struct hv_device *device_to_hv_device(
struct device *
d)
1015 static inline struct hv_driver *drv_to_hv_drv(
struct device_driver *
d)
1020 static inline void hv_set_drvdata(
struct hv_device *
dev,
void *
data)
1025 static inline void *hv_get_drvdata(
struct hv_device *
dev)
1031 #define vmbus_driver_register(driver) \
1032 __vmbus_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
1035 const char *mod_name);
1044 #define VMBUS_DEVICE(g0, g1, g2, g3, g4, g5, g6, g7, \
1045 g8, g9, ga, gb, gc, gd, ge, gf) \
1046 .guid = { g0, g1, g2, g3, g4, g5, g6, g7, \
1047 g8, g9, ga, gb, gc, gd, ge, gf },
1053 #define ICMSGTYPE_NEGOTIATE 0
1054 #define ICMSGTYPE_HEARTBEAT 1
1055 #define ICMSGTYPE_KVPEXCHANGE 2
1056 #define ICMSGTYPE_SHUTDOWN 3
1057 #define ICMSGTYPE_TIMESYNC 4
1058 #define ICMSGTYPE_VSS 5
1060 #define ICMSGHDRFLAG_TRANSACTION 1
1061 #define ICMSGHDRFLAG_REQUEST 2
1062 #define ICMSGHDRFLAG_RESPONSE 4
1071 struct hv_util_service {
1073 void (*util_cb)(
void *);
1074 int (*util_init)(
struct hv_util_service *);
1078 struct vmbuspipe_hdr {
1089 struct ic_version icverframe;
1091 struct ic_version icvermsg;
1094 u8 ictransaction_id;
1099 struct icmsg_negotiate {
1103 struct ic_version icversion_data[1];
1106 struct shutdown_msg_data {
1108 u32 timeout_seconds;
1110 u8 display_message[2048];
1113 struct heartbeat_msg_data {
1119 #define ICTIMESYNCFLAG_PROBE 0
1120 #define ICTIMESYNCFLAG_SYNC 1
1121 #define ICTIMESYNCFLAG_SAMPLE 2
1124 #define WLTIMEDELTA 116444736000000000L
1126 #define WLTIMEDELTA 116444736000000000LL
1129 struct ictimesync_data {
1136 struct hyperv_service_callback {
1140 struct vmbus_channel *
channel;
1144 #define MAX_SRV_VER 0x7ffffff
1146 struct icmsg_negotiate *,
u8 *,
int,