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 e73b852156b..df77ba9a816 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -325,14 +325,28 @@ struct hv_ring_buffer {  	u32 interrupt_mask; -	/* Pad it to PAGE_SIZE so that data starts on page boundary */ -	u8	reserved[4084]; - -	/* NOTE: -	 * The interrupt_mask field is used only for channels but since our -	 * vmbus connection also uses this data structure and its data starts -	 * here, we commented out this field. +	/* +	 * 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.  	 */ +	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];  	/*  	 * Ring data starts here + RingDataStartOffset @@ -405,12 +419,22 @@ hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi,   */  #define HV_DRV_VERSION           "3.1" -  /* - * A revision number of vmbus that is used for ensuring both ends on a - * partition are using compatible versions. + * 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)   */ -#define VMBUS_REVISION_NUMBER		13 + +#define VERSION_WS2008  ((0 << 16) | (13)) +#define VERSION_WIN7    ((1 << 16) | (1)) +#define VERSION_WIN8    ((2 << 16) | (4)) + +#define VERSION_INVAL -1 + +#define VERSION_CURRENT VERSION_WIN8  /* Make maximum size of pipe payload of 16K */  #define MAX_PIPE_DATA_PAYLOAD		(sizeof(u8) * 16384) @@ -432,9 +456,13 @@ hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi,  struct vmbus_channel_offer {  	uuid_le if_type;  	uuid_le if_instance; -	u64 int_latency; /* in 100ns units */ -	u32 if_revision; -	u32 server_ctx_size;	/* in bytes */ + +	/* +	 * These two fields are not currently used. +	 */ +	u64 reserved1; +	u64 reserved2; +  	u16 chn_flags;  	u16 mmio_megabytes;		/* in bytes * 1024 * 1024 */ @@ -456,7 +484,11 @@ struct vmbus_channel_offer {  			unsigned char user_def[MAX_PIPE_USER_DEFINED_BYTES];  		} pipe;  	} u; -	u32 padding; +	/* +	 * The sub_channel_index is defined in win8. +	 */ +	u16 sub_channel_index; +	u16 reserved3;  } __packed;  /* Server Flags */ @@ -652,7 +684,25 @@ struct vmbus_channel_offer_channel {  	struct vmbus_channel_offer offer;  	u32 child_relid;  	u8 monitorid; -	u8 monitor_allocated; +	/* +	 * 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;  } __packed;  /* Rescind Offer parameters */ @@ -683,8 +733,15 @@ struct vmbus_channel_open_channel {  	/* GPADL for the channel's ring buffer. */  	u32 ringbuffer_gpadlhandle; -	/* GPADL for the channel's server context save area. */ -	u32 server_contextarea_gpadlhandle; +	/* +	 * 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;  	/*  	* The upstream ring buffer begins at offset zero in the memory @@ -848,6 +905,27 @@ struct vmbus_close_msg {  	struct vmbus_channel_close_channel msg;  }; +/* 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; +}; +  struct vmbus_channel {  	struct list_head listentry; @@ -882,8 +960,42 @@ struct vmbus_channel {  	void (*onchannel_callback)(void *context);  	void *channel_callback_context; + +	/* +	 * 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; + +	bool is_dedicated_interrupt; +	struct hv_input_signal_event_buffer sig_buf; +	struct hv_input_signal_event *sig_event; + +	/* +	 * 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;  }; +static inline void set_channel_read_state(struct vmbus_channel *c, bool state) +{ +	c->batched_reading = state; +} +  void vmbus_onmessage(void *context);  int vmbus_request_offers(void); @@ -1047,6 +1159,100 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver);  		  g8, g9, ga, gb, gc, gd, ge, gf },  /* + * 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 \ +		} + +/*   * Common header for Hyper-V ICs   */ @@ -1150,5 +1356,11 @@ int hv_kvp_init(struct hv_util_service *);  void hv_kvp_deinit(void);  void hv_kvp_onchannelcallback(void *); +/* + * Negotiated version with the Host. + */ + +extern __u32 vmbus_proto_version; +  #endif /* __KERNEL__ */  #endif /* _HYPERV_H */  |