3 * Copyright (c) 2009, Microsoft Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16 * Place - Suite 330, Boston, MA 02111-1307 USA.
19 * Haiyang Zhang <haiyangz@microsoft.com>
20 * Hank Janssen <hjanssen@microsoft.com>
24 #ifndef _VMBUSPACKETFORMAT_H_
25 #define _VMBUSPACKETFORMAT_H_
27 struct vmpacket_descriptor
{
35 struct vmpacket_header
{
36 u32 prev_pkt_start_offset
;
37 struct vmpacket_descriptor descriptor
;
40 struct vmtransfer_page_range
{
45 struct vmtransfer_page_packet_header
{
46 struct vmpacket_descriptor d
;
51 struct vmtransfer_page_range ranges
[1];
54 struct vmgpadl_packet_header
{
55 struct vmpacket_descriptor d
;
60 struct vmadd_remove_transfer_page_set
{
61 struct vmpacket_descriptor d
;
68 * This structure defines a range in guest physical space that can be made to
69 * look virtually contiguous.
78 * This is the format for an Establish Gpadl packet, which contains a handle by
79 * which this GPADL will be known and a set of GPA ranges associated with it.
80 * This can be converted to a MDL by the guest OS. If there are multiple GPA
81 * ranges, then the resulting MDL will be "chained," representing multiple VA
84 struct vmestablish_gpadl
{
85 struct vmpacket_descriptor d
;
88 struct gpa_range range
[1];
92 * This is the format for a Teardown Gpadl packet, which indicates that the
93 * GPADL handle in the Establish Gpadl packet will never be referenced again.
95 struct vmteardown_gpadl
{
96 struct vmpacket_descriptor d
;
98 u32 reserved
; /* for alignment to a 8-byte boundary */
102 * This is the format for a GPA-Direct packet, which contains a set of GPA
103 * ranges, in addition to commands and/or data.
105 struct vmdata_gpa_direct
{
106 struct vmpacket_descriptor d
;
109 struct gpa_range range
[1];
112 /* This is the format for a Additional Data Packet. */
113 struct vmadditional_data
{
114 struct vmpacket_descriptor d
;
118 unsigned char data
[1];
121 union vmpacket_largest_possible_header
{
122 struct vmpacket_descriptor simple_hdr
;
123 struct vmtransfer_page_packet_header xfer_page_hdr
;
124 struct vmgpadl_packet_header gpadl_hdr
;
125 struct vmadd_remove_transfer_page_set add_rm_xfer_page_hdr
;
126 struct vmestablish_gpadl establish_gpadl_hdr
;
127 struct vmteardown_gpadl teardown_gpadl_hdr
;
128 struct vmdata_gpa_direct data_gpa_direct_hdr
;
131 #define VMPACKET_DATA_START_ADDRESS(__packet) \
132 (void *)(((unsigned char *)__packet) + \
133 ((struct vmpacket_descriptor)__packet)->offset8 * 8)
135 #define VMPACKET_DATA_LENGTH(__packet) \
136 ((((struct vmpacket_descriptor)__packet)->len8 - \
137 ((struct vmpacket_descriptor)__packet)->offset8) * 8)
139 #define VMPACKET_TRANSFER_MODE(__packet) \
140 (((struct IMPACT)__packet)->type)
142 enum vmbus_packet_type
{
143 VM_PKT_INVALID
= 0x0,
145 VM_PKT_ADD_XFER_PAGESET
= 0x2,
146 VM_PKT_RM_XFER_PAGESET
= 0x3,
147 VM_PKT_ESTABLISH_GPADL
= 0x4,
148 VM_PKT_TEARDOWN_GPADL
= 0x5,
149 VM_PKT_DATA_INBAND
= 0x6,
150 VM_PKT_DATA_USING_XFER_PAGES
= 0x7,
151 VM_PKT_DATA_USING_GPADL
= 0x8,
152 VM_PKT_DATA_USING_GPA_DIRECT
= 0x9,
153 VM_PKT_CANCEL_REQUEST
= 0xa,
155 VM_PKT_DATA_USING_ADDITIONAL_PKT
= 0xc,
156 VM_PKT_ADDITIONAL_DATA
= 0xd
159 #define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED 1