aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/hv/vmbus_packet_format.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/hv/vmbus_packet_format.h')
-rw-r--r--drivers/staging/hv/vmbus_packet_format.h161
1 files changed, 161 insertions, 0 deletions
diff --git a/drivers/staging/hv/vmbus_packet_format.h b/drivers/staging/hv/vmbus_packet_format.h
new file mode 100644
index 000000000000..f9f6b4bf6fb1
--- /dev/null
+++ b/drivers/staging/hv/vmbus_packet_format.h
@@ -0,0 +1,161 @@
+/*
+ *
+ * Copyright (c) 2009, 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>
+ *
+ */
+
+#ifndef _VMBUSPACKETFORMAT_H_
+#define _VMBUSPACKETFORMAT_H_
+
+struct vmpacket_descriptor {
+ u16 Type;
+ u16 DataOffset8;
+ u16 Length8;
+ u16 Flags;
+ u64 TransactionId;
+} __attribute__((packed));
+
+struct vmpacket_header {
+ u32 PreviousPacketStartOffset;
+ struct vmpacket_descriptor Descriptor;
+} __attribute__((packed));
+
+struct vmtransfer_page_range {
+ u32 ByteCount;
+ u32 ByteOffset;
+} __attribute__((packed));
+
+struct vmtransfer_page_packet_header {
+ struct vmpacket_descriptor d;
+ u16 TransferPageSetId;
+ bool SenderOwnsSet;
+ u8 Reserved;
+ u32 RangeCount;
+ struct vmtransfer_page_range Ranges[1];
+} __attribute__((packed));
+
+struct vmgpadl_packet_header {
+ struct vmpacket_descriptor d;
+ u32 Gpadl;
+ u32 Reserved;
+} __attribute__((packed));
+
+struct vmadd_remove_transfer_page_set {
+ struct vmpacket_descriptor d;
+ u32 Gpadl;
+ u16 TransferPageSetId;
+ u16 Reserved;
+} __attribute__((packed));
+
+/*
+ * This structure defines a range in guest physical space that can be made to
+ * look virtually contiguous.
+ */
+struct gpa_range {
+ u32 ByteCount;
+ u32 ByteOffset;
+ u64 PfnArray[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 RangeCount;
+ struct gpa_range Range[1];
+} __attribute__((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 */
+} __attribute__((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 RangeCount;
+ struct gpa_range Range[1];
+} __attribute__((packed));
+
+/* This is the format for a Additional Data Packet. */
+struct vmadditional_data {
+ struct vmpacket_descriptor d;
+ u64 TotalBytes;
+ u32 ByteOffset;
+ u32 ByteCount;
+ unsigned char Data[1];
+} __attribute__((packed));
+
+union vmpacket_largest_possible_header {
+ struct vmpacket_descriptor SimpleHeader;
+ struct vmtransfer_page_packet_header TransferPageHeader;
+ struct vmgpadl_packet_header GpadlHeader;
+ struct vmadd_remove_transfer_page_set AddRemoveTransferPageHeader;
+ struct vmestablish_gpadl EstablishGpadlHeader;
+ struct vmteardown_gpadl TeardownGpadlHeader;
+ struct vmdata_gpa_direct DataGpaDirectHeader;
+};
+
+#define VMPACKET_DATA_START_ADDRESS(__packet) \
+ (void *)(((unsigned char *)__packet) + \
+ ((struct vmpacket_descriptor)__packet)->DataOffset8 * 8)
+
+#define VMPACKET_DATA_LENGTH(__packet) \
+ ((((struct vmpacket_descriptor)__packet)->Length8 - \
+ ((struct vmpacket_descriptor)__packet)->DataOffset8) * 8)
+
+#define VMPACKET_TRANSFER_MODE(__packet) \
+ (((struct IMPACT)__packet)->Type)
+
+enum vmbus_packet_type {
+ VmbusPacketTypeInvalid = 0x0,
+ VmbusPacketTypeSynch = 0x1,
+ VmbusPacketTypeAddTransferPageSet = 0x2,
+ VmbusPacketTypeRemoveTransferPageSet = 0x3,
+ VmbusPacketTypeEstablishGpadl = 0x4,
+ VmbusPacketTypeTearDownGpadl = 0x5,
+ VmbusPacketTypeDataInBand = 0x6,
+ VmbusPacketTypeDataUsingTransferPages = 0x7,
+ VmbusPacketTypeDataUsingGpadl = 0x8,
+ VmbusPacketTypeDataUsingGpaDirect = 0x9,
+ VmbusPacketTypeCancelRequest = 0xa,
+ VmbusPacketTypeCompletion = 0xb,
+ VmbusPacketTypeDataUsingAdditionalPackets = 0xc,
+ VmbusPacketTypeAdditionalData = 0xd
+};
+
+#define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED 1
+
+#endif