1/* 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 28#define MAX_PAGE_BUFFER_COUNT 16 29#define MAX_MULTIPAGE_BUFFER_COUNT 32 /* 128K */ 30 31#pragma pack(push, 1) 32 33/* Single-page buffer */ 34struct hv_page_buffer { 35 u32 Length; 36 u32 Offset; 37 u64 Pfn; 38}; 39 40/* Multiple-page buffer */ 41struct hv_multipage_buffer { 42 /* Length and Offset determines the # of pfns in the array */ 43 u32 Length; 44 u32 Offset; 45 u64 PfnArray[MAX_MULTIPAGE_BUFFER_COUNT]; 46}; 47 48/* 0x18 includes the proprietary packet header */ 49#define MAX_PAGE_BUFFER_PACKET (0x18 + \ 50 (sizeof(struct hv_page_buffer) * \ 51 MAX_PAGE_BUFFER_COUNT)) 52#define MAX_MULTIPAGE_BUFFER_PACKET (0x18 + \ 53 sizeof(struct hv_multipage_buffer)) 54 55 56#pragma pack(pop) 57 58struct hv_driver; 59struct hv_device; 60 61struct hv_dev_port_info { 62 u32 InterruptMask; 63 u32 ReadIndex; 64 u32 WriteIndex; 65 u32 BytesAvailToRead; 66 u32 BytesAvailToWrite; 67}; 68 69struct hv_device_info { 70 u32 ChannelId; 71 u32 ChannelState; 72 struct hv_guid ChannelType; 73 struct hv_guid ChannelInstance; 74 75 u32 MonitorId; 76 u32 ServerMonitorPending; 77 u32 ServerMonitorLatency; 78 u32 ServerMonitorConnectionId; 79 u32 ClientMonitorPending; 80 u32 ClientMonitorLatency; 81 u32 ClientMonitorConnectionId; 82 83 struct hv_dev_port_info Inbound; 84 struct hv_dev_port_info Outbound; 85}; 86 87/** 88 * struct vmbus_channel_interface - Contains member functions for vmbus channel 89 * @Open: Open the channel 90 * @Close: Close the channel 91 * @SendPacket: Send a packet over the channel 92 * @SendPacketPageBuffer: Send a single page buffer over the channel 93 * @SendPacketMultiPageBuffer: Send a multiple page buffers 94 * @RecvPacket: Receive packet 95 * @RecvPacketRaw: Receive Raw packet 96 * @EstablishGpadl: Set up GPADL for ringbuffer 97 * @TeardownGpadl: Teardown GPADL for ringbuffer 98 * @GetInfo: Get info about the channel 99 * 100 * This structure contains function pointer to control vmbus channel 101 * behavior. None of these functions is externally callable, but they 102 * are used for normal vmbus channel internal behavior. 103 * Only used by Hyper-V drivers. 104 */ 105struct vmbus_channel_interface { 106 int (*Open)(struct hv_device *Device, u32 SendBufferSize, 107 u32 RecvRingBufferSize, void *UserData, u32 UserDataLen, 108 void (*ChannelCallback)(void *context), 109 void *Context); 110 void (*Close)(struct hv_device *device); 111 int (*SendPacket)(struct hv_device *Device, const void *Buffer, 112 u32 BufferLen, u64 RequestId, u32 Type, u32 Flags); 113 int (*SendPacketPageBuffer)(struct hv_device *dev, 114 struct hv_page_buffer PageBuffers[], 115 u32 PageCount, void *Buffer, u32 BufferLen, 116 u64 RequestId); 117 int (*SendPacketMultiPageBuffer)(struct hv_device *device, 118 struct hv_multipage_buffer *mpb, 119 void *Buffer, 120 u32 BufferLen, 121 u64 RequestId); 122 int (*RecvPacket)(struct hv_device *dev, void *buf, u32 buflen, 123 u32 *BufferActualLen, u64 *RequestId); 124 int (*RecvPacketRaw)(struct hv_device *dev, void *buf, u32 buflen, 125 u32 *BufferActualLen, u64 *RequestId); 126 int (*EstablishGpadl)(struct hv_device *dev, void *buf, u32 buflen, 127 u32 *GpadlHandle); 128 int (*TeardownGpadl)(struct hv_device *device, u32 GpadlHandle); 129 void (*GetInfo)(struct hv_device *dev, struct hv_device_info *devinfo); 130}; 131 132/* Base driver object */ 133struct hv_driver { 134 const char *name; 135 136 /* the device type supported by this driver */ 137 struct hv_guid deviceType; 138 139 int (*OnDeviceAdd)(struct hv_device *device, void *data); 140 int (*OnDeviceRemove)(struct hv_device *device); 141 void (*OnCleanup)(struct hv_driver *driver); 142 143 struct vmbus_channel_interface VmbusChannelInterface; 144}; 145 146/* Base device object */ 147struct hv_device { 148 /* the driver for this device */ 149 struct hv_driver *Driver; 150 151 char name[64]; 152 153 /* the device type id of this device */ 154 struct hv_guid deviceType; 155 156 /* the device instance id of this device */ 157 struct hv_guid deviceInstance; 158 159 void *context; 160 161 /* Device extension; */ 162 void *Extension; 163}; 164 165/* Vmbus driver object */ 166struct vmbus_driver { 167 /* !! Must be the 1st field !! */ 168 struct hv_driver Base; 169 170 /* Set by the caller */ 171 struct hv_device * (*OnChildDeviceCreate)(struct hv_guid *DeviceType, 172 struct hv_guid *DeviceInstance, 173 void *Context); 174 void (*OnChildDeviceDestroy)(struct hv_device *device); 175 int (*OnChildDeviceAdd)(struct hv_device *RootDevice, 176 struct hv_device *ChildDevice); 177 void (*OnChildDeviceRemove)(struct hv_device *device); 178 179 /* Set by the callee */ 180 int (*OnIsr)(struct hv_driver *driver); 181 void (*OnMsgDpc)(struct hv_driver *driver); 182 void (*OnEventDpc)(struct hv_driver *driver); 183 void (*GetChannelOffers)(void); 184 185 void (*GetChannelInterface)(struct vmbus_channel_interface *i); 186 void (*GetChannelInfo)(struct hv_device *dev, 187 struct hv_device_info *devinfo); 188}; 189 190int VmbusInitialize(struct hv_driver *drv); 191 192#endif /* _VMBUS_API_H_ */ 193