blob: 8b0b23350a229557ba7c8d049d470e0a063a8dc1 [file] [log] [blame]
Hank Janssenab057782009-07-13 15:19:28 -07001/*
2 *
3 * Copyright (c) 2009, Microsoft Corporation.
4 *
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.
8 *
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
12 * more details.
13 *
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.
17 *
18 * Authors:
19 * Haiyang Zhang <haiyangz@microsoft.com>
20 * Hank Janssen <hjanssen@microsoft.com>
21 *
22 */
23
24
25#ifndef _VMBUS_API_H_
26#define _VMBUS_API_H_
27
Hank Janssenab057782009-07-13 15:19:28 -070028#define MAX_PAGE_BUFFER_COUNT 16
Bill Pemberton454f18a2009-07-27 16:47:24 -040029#define MAX_MULTIPAGE_BUFFER_COUNT 32 /* 128K */
Hank Janssenab057782009-07-13 15:19:28 -070030
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -070031#pragma pack(push, 1)
Hank Janssenab057782009-07-13 15:19:28 -070032
Bill Pemberton454f18a2009-07-27 16:47:24 -040033/* Single-page buffer */
Hank Janssenab057782009-07-13 15:19:28 -070034typedef struct _PAGE_BUFFER {
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -070035 u32 Length;
36 u32 Offset;
37 u64 Pfn;
Hank Janssenab057782009-07-13 15:19:28 -070038} PAGE_BUFFER;
39
Bill Pemberton454f18a2009-07-27 16:47:24 -040040/* Multiple-page buffer */
Hank Janssenab057782009-07-13 15:19:28 -070041typedef struct _MULTIPAGE_BUFFER {
Bill Pemberton454f18a2009-07-27 16:47:24 -040042 /* Length and Offset determines the # of pfns in the array */
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -070043 u32 Length;
44 u32 Offset;
45 u64 PfnArray[MAX_MULTIPAGE_BUFFER_COUNT];
46} MULTIPAGE_BUFFER;
Hank Janssenab057782009-07-13 15:19:28 -070047
Bill Pemberton454f18a2009-07-27 16:47:24 -040048/* 0x18 includes the proprietary packet header */
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -070049#define MAX_PAGE_BUFFER_PACKET (0x18 + \
50 (sizeof(PAGE_BUFFER) * \
51 MAX_PAGE_BUFFER_COUNT))
52#define MAX_MULTIPAGE_BUFFER_PACKET (0x18 + sizeof(MULTIPAGE_BUFFER))
Hank Janssenab057782009-07-13 15:19:28 -070053
54
55#pragma pack(pop)
56
Nicolas Palix775ef252009-07-29 14:09:45 +020057struct hv_driver;
Nicolas Palix3d3b5512009-07-28 17:32:53 +020058struct hv_device;
59
Bill Pemberton454f18a2009-07-27 16:47:24 -040060/* All drivers */
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -070061typedef int (*PFN_ON_DEVICEADD)(struct hv_device *Device,
62 void *AdditionalInfo);
Nicolas Palix3d3b5512009-07-28 17:32:53 +020063typedef int (*PFN_ON_DEVICEREMOVE)(struct hv_device *Device);
Hank Janssenab057782009-07-13 15:19:28 -070064typedef char** (*PFN_ON_GETDEVICEIDS)(void);
Nicolas Palix775ef252009-07-29 14:09:45 +020065typedef void (*PFN_ON_CLEANUP)(struct hv_driver *Driver);
Hank Janssenab057782009-07-13 15:19:28 -070066
Bill Pemberton454f18a2009-07-27 16:47:24 -040067/* Vmbus extensions */
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -070068typedef int (*PFN_ON_ISR)(struct hv_driver *drv);
Nicolas Palix775ef252009-07-29 14:09:45 +020069typedef void (*PFN_ON_DPC)(struct hv_driver *drv);
Hank Janssenab057782009-07-13 15:19:28 -070070typedef void (*PFN_GET_CHANNEL_OFFERS)(void);
71
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -070072typedef struct hv_device *(*PFN_ON_CHILDDEVICE_CREATE)
73 (struct hv_guid *DeviceType,
74 struct hv_guid *DeviceInstance,
75 void *Context);
Nicolas Palix3d3b5512009-07-28 17:32:53 +020076typedef void (*PFN_ON_CHILDDEVICE_DESTROY)(struct hv_device *Device);
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -070077typedef int (*PFN_ON_CHILDDEVICE_ADD)(struct hv_device *RootDevice,
78 struct hv_device *ChildDevice);
Nicolas Palix3d3b5512009-07-28 17:32:53 +020079typedef void (*PFN_ON_CHILDDEVICE_REMOVE)(struct hv_device *Device);
Hank Janssenab057782009-07-13 15:19:28 -070080
Bill Pemberton454f18a2009-07-27 16:47:24 -040081/* Vmbus channel interface */
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -070082typedef void (*VMBUS_CHANNEL_CALLBACK)(void *context);
83typedef int (*VMBUS_CHANNEL_OPEN)(struct hv_device *Device, u32 SendBufferSize,
84 u32 RecvRingBufferSize,
85 void *UserData,
86 u32 UserDataLen,
87 VMBUS_CHANNEL_CALLBACK ChannelCallback,
88 void *Context);
89typedef void (*VMBUS_CHANNEL_CLOSE)(struct hv_device *Device);
90typedef int (*VMBUS_CHANNEL_SEND_PACKET)(struct hv_device *Device,
91 const void *Buffer,
92 u32 BufferLen,
93 u64 RequestId,
94 u32 Type,
95 u32 Flags);
96typedef int (*VMBUS_CHANNEL_SEND_PACKET_PAGEBUFFER)(struct hv_device *Device,
97 PAGE_BUFFER PageBuffers[],
98 u32 PageCount,
99 void *Buffer,
100 u32 BufferLen,
101 u64 RequestId);
102typedef int(*VMBUS_CHANNEL_SEND_PACKET_MULTIPAGEBUFFER)
103 (struct hv_device *Device,
104 MULTIPAGE_BUFFER *MultiPageBuffer,
105 void *Buffer,
106 u32 BufferLen,
107 u64 RequestId);
108typedef int (*VMBUS_CHANNEL_RECV_PACKET)(struct hv_device *Device,
109 void *Buffer,
110 u32 BufferLen,
111 u32 *BufferActualLen,
112 u64 *RequestId);
113typedef int(*VMBUS_CHANNEL_RECV_PACKET_PAW)(struct hv_device *Device,
114 void *Buffer,
115 u32 BufferLen,
116 u32 *BufferActualLen,
117 u64 *RequestId);
118typedef int (*VMBUS_CHANNEL_ESTABLISH_GPADL)(struct hv_device *Device,
119 void *Buffer,
120 u32 BufferLen,
121 u32 *GpadlHandle);
122typedef int (*VMBUS_CHANNEL_TEARDOWN_GPADL)(struct hv_device *Device,
123 u32 GpadlHandle);
Hank Janssenab057782009-07-13 15:19:28 -0700124
125
126typedef struct _PORT_INFO {
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700127 u32 InterruptMask;
128 u32 ReadIndex;
129 u32 WriteIndex;
130 u32 BytesAvailToRead;
131 u32 BytesAvailToWrite;
Hank Janssenab057782009-07-13 15:19:28 -0700132} PORT_INFO;
133
Hank Janssenab057782009-07-13 15:19:28 -0700134typedef struct _DEVICE_INFO {
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700135 u32 ChannelId;
136 u32 ChannelState;
Greg Kroah-Hartmancaf26a32009-08-19 16:17:03 -0700137 struct hv_guid ChannelType;
138 struct hv_guid ChannelInstance;
Hank Janssenab057782009-07-13 15:19:28 -0700139
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700140 u32 MonitorId;
141 u32 ServerMonitorPending;
142 u32 ServerMonitorLatency;
143 u32 ServerMonitorConnectionId;
144 u32 ClientMonitorPending;
145 u32 ClientMonitorLatency;
146 u32 ClientMonitorConnectionId;
Hank Janssenab057782009-07-13 15:19:28 -0700147
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700148 PORT_INFO Inbound;
149 PORT_INFO Outbound;
Hank Janssenab057782009-07-13 15:19:28 -0700150} DEVICE_INFO;
151
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700152typedef void (*VMBUS_GET_CHANNEL_INFO)(struct hv_device *Device,
153 DEVICE_INFO *DeviceInfo);
Hank Janssenab057782009-07-13 15:19:28 -0700154
155typedef struct _VMBUS_CHANNEL_INTERFACE {
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700156 VMBUS_CHANNEL_OPEN Open;
157 VMBUS_CHANNEL_CLOSE Close;
158 VMBUS_CHANNEL_SEND_PACKET SendPacket;
159 VMBUS_CHANNEL_SEND_PACKET_PAGEBUFFER SendPacketPageBuffer;
160 VMBUS_CHANNEL_SEND_PACKET_MULTIPAGEBUFFER SendPacketMultiPageBuffer;
161 VMBUS_CHANNEL_RECV_PACKET RecvPacket;
162 VMBUS_CHANNEL_RECV_PACKET_PAW RecvPacketRaw;
163 VMBUS_CHANNEL_ESTABLISH_GPADL EstablishGpadl;
164 VMBUS_CHANNEL_TEARDOWN_GPADL TeardownGpadl;
165 VMBUS_GET_CHANNEL_INFO GetInfo;
Hank Janssenab057782009-07-13 15:19:28 -0700166} VMBUS_CHANNEL_INTERFACE;
167
168typedef void (*VMBUS_GET_CHANNEL_INTERFACE)(VMBUS_CHANNEL_INTERFACE *Interface);
169
Bill Pemberton454f18a2009-07-27 16:47:24 -0400170/* Base driver object */
Nicolas Palix775ef252009-07-29 14:09:45 +0200171struct hv_driver {
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700172 const char *name;
Hank Janssenab057782009-07-13 15:19:28 -0700173
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700174 /* the device type supported by this driver */
175 struct hv_guid deviceType;
176
177 PFN_ON_DEVICEADD OnDeviceAdd;
178 PFN_ON_DEVICEREMOVE OnDeviceRemove;
179
180 /* device ids supported by this driver */
181 PFN_ON_GETDEVICEIDS OnGetDeviceIds;
182 PFN_ON_CLEANUP OnCleanup;
Hank Janssenab057782009-07-13 15:19:28 -0700183
184 VMBUS_CHANNEL_INTERFACE VmbusChannelInterface;
Nicolas Palix775ef252009-07-29 14:09:45 +0200185};
Hank Janssenab057782009-07-13 15:19:28 -0700186
Bill Pemberton454f18a2009-07-27 16:47:24 -0400187/* Base device object */
Nicolas Palix3d3b5512009-07-28 17:32:53 +0200188struct hv_device {
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700189 /* the driver for this device */
190 struct hv_driver *Driver;
Hank Janssenab057782009-07-13 15:19:28 -0700191
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700192 char name[64];
193
194 /* the device type id of this device */
195 struct hv_guid deviceType;
196
197 /* the device instance id of this device */
198 struct hv_guid deviceInstance;
199
200 void *context;
201
202 /* Device extension; */
203 void *Extension;
204};
Hank Janssenab057782009-07-13 15:19:28 -0700205
Bill Pemberton454f18a2009-07-27 16:47:24 -0400206/* Vmbus driver object */
Hank Janssenab057782009-07-13 15:19:28 -0700207typedef struct _VMBUS_DRIVER_OBJECT {
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700208 /* !! Must be the 1st field !! */
209 /* FIXME if ^, then someone is doing somthing stupid */
210 struct hv_driver Base;
Hank Janssenab057782009-07-13 15:19:28 -0700211
Bill Pemberton454f18a2009-07-27 16:47:24 -0400212 /* Set by the caller */
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700213 PFN_ON_CHILDDEVICE_CREATE OnChildDeviceCreate;
214 PFN_ON_CHILDDEVICE_DESTROY OnChildDeviceDestroy;
215 PFN_ON_CHILDDEVICE_ADD OnChildDeviceAdd;
216 PFN_ON_CHILDDEVICE_REMOVE OnChildDeviceRemove;
Hank Janssenab057782009-07-13 15:19:28 -0700217
Bill Pemberton454f18a2009-07-27 16:47:24 -0400218 /* Set by the callee */
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700219 PFN_ON_ISR OnIsr;
220 PFN_ON_DPC OnMsgDpc;
221 PFN_ON_DPC OnEventDpc;
222 PFN_GET_CHANNEL_OFFERS GetChannelOffers;
Hank Janssenab057782009-07-13 15:19:28 -0700223
224 VMBUS_GET_CHANNEL_INTERFACE GetChannelInterface;
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700225 VMBUS_GET_CHANNEL_INFO GetChannelInfo;
Hank Janssenab057782009-07-13 15:19:28 -0700226} VMBUS_DRIVER_OBJECT;
227
Greg Kroah-Hartman54b2b842009-08-20 12:16:33 -0700228int VmbusInitialize(struct hv_driver *drv);
Hank Janssenab057782009-07-13 15:19:28 -0700229
Bill Pemberton454f18a2009-07-27 16:47:24 -0400230#endif /* _VMBUS_API_H_ */