diff options
Diffstat (limited to 'include/linux/hyperv.h')
-rw-r--r-- | include/linux/hyperv.h | 248 |
1 files changed, 230 insertions, 18 deletions
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index e73b852156b1..df77ba9a8166 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h | |||
@@ -325,14 +325,28 @@ struct hv_ring_buffer { | |||
325 | 325 | ||
326 | u32 interrupt_mask; | 326 | u32 interrupt_mask; |
327 | 327 | ||
328 | /* Pad it to PAGE_SIZE so that data starts on page boundary */ | 328 | /* |
329 | u8 reserved[4084]; | 329 | * Win8 uses some of the reserved bits to implement |
330 | 330 | * interrupt driven flow management. On the send side | |
331 | /* NOTE: | 331 | * we can request that the receiver interrupt the sender |
332 | * The interrupt_mask field is used only for channels but since our | 332 | * when the ring transitions from being full to being able |
333 | * vmbus connection also uses this data structure and its data starts | 333 | * to handle a message of size "pending_send_sz". |
334 | * here, we commented out this field. | 334 | * |
335 | * Add necessary state for this enhancement. | ||
335 | */ | 336 | */ |
337 | u32 pending_send_sz; | ||
338 | |||
339 | u32 reserved1[12]; | ||
340 | |||
341 | union { | ||
342 | struct { | ||
343 | u32 feat_pending_send_sz:1; | ||
344 | }; | ||
345 | u32 value; | ||
346 | } feature_bits; | ||
347 | |||
348 | /* Pad it to PAGE_SIZE so that data starts on page boundary */ | ||
349 | u8 reserved2[4028]; | ||
336 | 350 | ||
337 | /* | 351 | /* |
338 | * Ring data starts here + RingDataStartOffset | 352 | * Ring data starts here + RingDataStartOffset |
@@ -405,12 +419,22 @@ hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi, | |||
405 | */ | 419 | */ |
406 | #define HV_DRV_VERSION "3.1" | 420 | #define HV_DRV_VERSION "3.1" |
407 | 421 | ||
408 | |||
409 | /* | 422 | /* |
410 | * A revision number of vmbus that is used for ensuring both ends on a | 423 | * VMBUS version is 32 bit entity broken up into |
411 | * partition are using compatible versions. | 424 | * two 16 bit quantities: major_number. minor_number. |
425 | * | ||
426 | * 0 . 13 (Windows Server 2008) | ||
427 | * 1 . 1 (Windows 7) | ||
428 | * 2 . 4 (Windows 8) | ||
412 | */ | 429 | */ |
413 | #define VMBUS_REVISION_NUMBER 13 | 430 | |
431 | #define VERSION_WS2008 ((0 << 16) | (13)) | ||
432 | #define VERSION_WIN7 ((1 << 16) | (1)) | ||
433 | #define VERSION_WIN8 ((2 << 16) | (4)) | ||
434 | |||
435 | #define VERSION_INVAL -1 | ||
436 | |||
437 | #define VERSION_CURRENT VERSION_WIN8 | ||
414 | 438 | ||
415 | /* Make maximum size of pipe payload of 16K */ | 439 | /* Make maximum size of pipe payload of 16K */ |
416 | #define MAX_PIPE_DATA_PAYLOAD (sizeof(u8) * 16384) | 440 | #define MAX_PIPE_DATA_PAYLOAD (sizeof(u8) * 16384) |
@@ -432,9 +456,13 @@ hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi, | |||
432 | struct vmbus_channel_offer { | 456 | struct vmbus_channel_offer { |
433 | uuid_le if_type; | 457 | uuid_le if_type; |
434 | uuid_le if_instance; | 458 | uuid_le if_instance; |
435 | u64 int_latency; /* in 100ns units */ | 459 | |
436 | u32 if_revision; | 460 | /* |
437 | u32 server_ctx_size; /* in bytes */ | 461 | * These two fields are not currently used. |
462 | */ | ||
463 | u64 reserved1; | ||
464 | u64 reserved2; | ||
465 | |||
438 | u16 chn_flags; | 466 | u16 chn_flags; |
439 | u16 mmio_megabytes; /* in bytes * 1024 * 1024 */ | 467 | u16 mmio_megabytes; /* in bytes * 1024 * 1024 */ |
440 | 468 | ||
@@ -456,7 +484,11 @@ struct vmbus_channel_offer { | |||
456 | unsigned char user_def[MAX_PIPE_USER_DEFINED_BYTES]; | 484 | unsigned char user_def[MAX_PIPE_USER_DEFINED_BYTES]; |
457 | } pipe; | 485 | } pipe; |
458 | } u; | 486 | } u; |
459 | u32 padding; | 487 | /* |
488 | * The sub_channel_index is defined in win8. | ||
489 | */ | ||
490 | u16 sub_channel_index; | ||
491 | u16 reserved3; | ||
460 | } __packed; | 492 | } __packed; |
461 | 493 | ||
462 | /* Server Flags */ | 494 | /* Server Flags */ |
@@ -652,7 +684,25 @@ struct vmbus_channel_offer_channel { | |||
652 | struct vmbus_channel_offer offer; | 684 | struct vmbus_channel_offer offer; |
653 | u32 child_relid; | 685 | u32 child_relid; |
654 | u8 monitorid; | 686 | u8 monitorid; |
655 | u8 monitor_allocated; | 687 | /* |
688 | * win7 and beyond splits this field into a bit field. | ||
689 | */ | ||
690 | u8 monitor_allocated:1; | ||
691 | u8 reserved:7; | ||
692 | /* | ||
693 | * These are new fields added in win7 and later. | ||
694 | * Do not access these fields without checking the | ||
695 | * negotiated protocol. | ||
696 | * | ||
697 | * If "is_dedicated_interrupt" is set, we must not set the | ||
698 | * associated bit in the channel bitmap while sending the | ||
699 | * interrupt to the host. | ||
700 | * | ||
701 | * connection_id is to be used in signaling the host. | ||
702 | */ | ||
703 | u16 is_dedicated_interrupt:1; | ||
704 | u16 reserved1:15; | ||
705 | u32 connection_id; | ||
656 | } __packed; | 706 | } __packed; |
657 | 707 | ||
658 | /* Rescind Offer parameters */ | 708 | /* Rescind Offer parameters */ |
@@ -683,8 +733,15 @@ struct vmbus_channel_open_channel { | |||
683 | /* GPADL for the channel's ring buffer. */ | 733 | /* GPADL for the channel's ring buffer. */ |
684 | u32 ringbuffer_gpadlhandle; | 734 | u32 ringbuffer_gpadlhandle; |
685 | 735 | ||
686 | /* GPADL for the channel's server context save area. */ | 736 | /* |
687 | u32 server_contextarea_gpadlhandle; | 737 | * Starting with win8, this field will be used to specify |
738 | * the target virtual processor on which to deliver the interrupt for | ||
739 | * the host to guest communication. | ||
740 | * Prior to win8, incoming channel interrupts would only | ||
741 | * be delivered on cpu 0. Setting this value to 0 would | ||
742 | * preserve the earlier behavior. | ||
743 | */ | ||
744 | u32 target_vp; | ||
688 | 745 | ||
689 | /* | 746 | /* |
690 | * The upstream ring buffer begins at offset zero in the memory | 747 | * The upstream ring buffer begins at offset zero in the memory |
@@ -848,6 +905,27 @@ struct vmbus_close_msg { | |||
848 | struct vmbus_channel_close_channel msg; | 905 | struct vmbus_channel_close_channel msg; |
849 | }; | 906 | }; |
850 | 907 | ||
908 | /* Define connection identifier type. */ | ||
909 | union hv_connection_id { | ||
910 | u32 asu32; | ||
911 | struct { | ||
912 | u32 id:24; | ||
913 | u32 reserved:8; | ||
914 | } u; | ||
915 | }; | ||
916 | |||
917 | /* Definition of the hv_signal_event hypercall input structure. */ | ||
918 | struct hv_input_signal_event { | ||
919 | union hv_connection_id connectionid; | ||
920 | u16 flag_number; | ||
921 | u16 rsvdz; | ||
922 | }; | ||
923 | |||
924 | struct hv_input_signal_event_buffer { | ||
925 | u64 align8; | ||
926 | struct hv_input_signal_event event; | ||
927 | }; | ||
928 | |||
851 | struct vmbus_channel { | 929 | struct vmbus_channel { |
852 | struct list_head listentry; | 930 | struct list_head listentry; |
853 | 931 | ||
@@ -882,8 +960,42 @@ struct vmbus_channel { | |||
882 | 960 | ||
883 | void (*onchannel_callback)(void *context); | 961 | void (*onchannel_callback)(void *context); |
884 | void *channel_callback_context; | 962 | void *channel_callback_context; |
963 | |||
964 | /* | ||
965 | * A channel can be marked for efficient (batched) | ||
966 | * reading: | ||
967 | * If batched_reading is set to "true", we read until the | ||
968 | * channel is empty and hold off interrupts from the host | ||
969 | * during the entire read process. | ||
970 | * If batched_reading is set to "false", the client is not | ||
971 | * going to perform batched reading. | ||
972 | * | ||
973 | * By default we will enable batched reading; specific | ||
974 | * drivers that don't want this behavior can turn it off. | ||
975 | */ | ||
976 | |||
977 | bool batched_reading; | ||
978 | |||
979 | bool is_dedicated_interrupt; | ||
980 | struct hv_input_signal_event_buffer sig_buf; | ||
981 | struct hv_input_signal_event *sig_event; | ||
982 | |||
983 | /* | ||
984 | * Starting with win8, this field will be used to specify | ||
985 | * the target virtual processor on which to deliver the interrupt for | ||
986 | * the host to guest communication. | ||
987 | * Prior to win8, incoming channel interrupts would only | ||
988 | * be delivered on cpu 0. Setting this value to 0 would | ||
989 | * preserve the earlier behavior. | ||
990 | */ | ||
991 | u32 target_vp; | ||
885 | }; | 992 | }; |
886 | 993 | ||
994 | static inline void set_channel_read_state(struct vmbus_channel *c, bool state) | ||
995 | { | ||
996 | c->batched_reading = state; | ||
997 | } | ||
998 | |||
887 | void vmbus_onmessage(void *context); | 999 | void vmbus_onmessage(void *context); |
888 | 1000 | ||
889 | int vmbus_request_offers(void); | 1001 | int vmbus_request_offers(void); |
@@ -1047,6 +1159,100 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver); | |||
1047 | g8, g9, ga, gb, gc, gd, ge, gf }, | 1159 | g8, g9, ga, gb, gc, gd, ge, gf }, |
1048 | 1160 | ||
1049 | /* | 1161 | /* |
1162 | * GUID definitions of various offer types - services offered to the guest. | ||
1163 | */ | ||
1164 | |||
1165 | /* | ||
1166 | * Network GUID | ||
1167 | * {f8615163-df3e-46c5-913f-f2d2f965ed0e} | ||
1168 | */ | ||
1169 | #define HV_NIC_GUID \ | ||
1170 | .guid = { \ | ||
1171 | 0x63, 0x51, 0x61, 0xf8, 0x3e, 0xdf, 0xc5, 0x46, \ | ||
1172 | 0x91, 0x3f, 0xf2, 0xd2, 0xf9, 0x65, 0xed, 0x0e \ | ||
1173 | } | ||
1174 | |||
1175 | /* | ||
1176 | * IDE GUID | ||
1177 | * {32412632-86cb-44a2-9b5c-50d1417354f5} | ||
1178 | */ | ||
1179 | #define HV_IDE_GUID \ | ||
1180 | .guid = { \ | ||
1181 | 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, \ | ||
1182 | 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 \ | ||
1183 | } | ||
1184 | |||
1185 | /* | ||
1186 | * SCSI GUID | ||
1187 | * {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} | ||
1188 | */ | ||
1189 | #define HV_SCSI_GUID \ | ||
1190 | .guid = { \ | ||
1191 | 0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, \ | ||
1192 | 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f \ | ||
1193 | } | ||
1194 | |||
1195 | /* | ||
1196 | * Shutdown GUID | ||
1197 | * {0e0b6031-5213-4934-818b-38d90ced39db} | ||
1198 | */ | ||
1199 | #define HV_SHUTDOWN_GUID \ | ||
1200 | .guid = { \ | ||
1201 | 0x31, 0x60, 0x0b, 0x0e, 0x13, 0x52, 0x34, 0x49, \ | ||
1202 | 0x81, 0x8b, 0x38, 0xd9, 0x0c, 0xed, 0x39, 0xdb \ | ||
1203 | } | ||
1204 | |||
1205 | /* | ||
1206 | * Time Synch GUID | ||
1207 | * {9527E630-D0AE-497b-ADCE-E80AB0175CAF} | ||
1208 | */ | ||
1209 | #define HV_TS_GUID \ | ||
1210 | .guid = { \ | ||
1211 | 0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49, \ | ||
1212 | 0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf \ | ||
1213 | } | ||
1214 | |||
1215 | /* | ||
1216 | * Heartbeat GUID | ||
1217 | * {57164f39-9115-4e78-ab55-382f3bd5422d} | ||
1218 | */ | ||
1219 | #define HV_HEART_BEAT_GUID \ | ||
1220 | .guid = { \ | ||
1221 | 0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e, \ | ||
1222 | 0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d \ | ||
1223 | } | ||
1224 | |||
1225 | /* | ||
1226 | * KVP GUID | ||
1227 | * {a9a0f4e7-5a45-4d96-b827-8a841e8c03e6} | ||
1228 | */ | ||
1229 | #define HV_KVP_GUID \ | ||
1230 | .guid = { \ | ||
1231 | 0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d, \ | ||
1232 | 0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3, 0xe6 \ | ||
1233 | } | ||
1234 | |||
1235 | /* | ||
1236 | * Dynamic memory GUID | ||
1237 | * {525074dc-8985-46e2-8057-a307dc18a502} | ||
1238 | */ | ||
1239 | #define HV_DM_GUID \ | ||
1240 | .guid = { \ | ||
1241 | 0xdc, 0x74, 0x50, 0X52, 0x85, 0x89, 0xe2, 0x46, \ | ||
1242 | 0x80, 0x57, 0xa3, 0x07, 0xdc, 0x18, 0xa5, 0x02 \ | ||
1243 | } | ||
1244 | |||
1245 | /* | ||
1246 | * Mouse GUID | ||
1247 | * {cfa8b69e-5b4a-4cc0-b98b-8ba1a1f3f95a} | ||
1248 | */ | ||
1249 | #define HV_MOUSE_GUID \ | ||
1250 | .guid = { \ | ||
1251 | 0x9e, 0xb6, 0xa8, 0xcf, 0x4a, 0x5b, 0xc0, 0x4c, \ | ||
1252 | 0xb9, 0x8b, 0x8b, 0xa1, 0xa1, 0xf3, 0xf9, 0x5a \ | ||
1253 | } | ||
1254 | |||
1255 | /* | ||
1050 | * Common header for Hyper-V ICs | 1256 | * Common header for Hyper-V ICs |
1051 | */ | 1257 | */ |
1052 | 1258 | ||
@@ -1150,5 +1356,11 @@ int hv_kvp_init(struct hv_util_service *); | |||
1150 | void hv_kvp_deinit(void); | 1356 | void hv_kvp_deinit(void); |
1151 | void hv_kvp_onchannelcallback(void *); | 1357 | void hv_kvp_onchannelcallback(void *); |
1152 | 1358 | ||
1359 | /* | ||
1360 | * Negotiated version with the Host. | ||
1361 | */ | ||
1362 | |||
1363 | extern __u32 vmbus_proto_version; | ||
1364 | |||
1153 | #endif /* __KERNEL__ */ | 1365 | #endif /* __KERNEL__ */ |
1154 | #endif /* _HYPERV_H */ | 1366 | #endif /* _HYPERV_H */ |