Drivers: hv: vmbus: Consolidate all offer GUID definitions in hyperv.h
[profile/ivi/kernel-x86-ivi.git] / include / linux / hyperv.h
index e73b852..df77ba9 100644 (file)
@@ -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 */