Linux-2.6.33.2/drivers/staging/hv/VmbusPacketFormat.h

/*
 *
 * 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_

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