Commit | Line | Data |
---|---|---|
3e7ee490 HJ |
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_PRIVATE_H_ | |
26 | #define _VMBUS_PRIVATE_H_ | |
27 | ||
7e8ad49f | 28 | #include "hv.h" |
447fc67e | 29 | #include "vmbus_api.h" |
4df90be5 | 30 | #include "channel.h" |
ff39524b | 31 | #include "channel_mgmt.h" |
8f078ca6 | 32 | #include "ring_buffer.h" |
53af545b | 33 | #include <linux/list.h> |
3e7ee490 | 34 | |
3e7ee490 | 35 | |
454f18a9 BP |
36 | /* |
37 | * Maximum channels is determined by the size of the interrupt page | |
38 | * which is PAGE_SIZE. 1/2 of PAGE_SIZE is for send endpoint interrupt | |
39 | * and the other is receive endpoint interrupt | |
40 | */ | |
f346fdc2 | 41 | #define MAX_NUM_CHANNELS ((PAGE_SIZE >> 1) << 3) /* 16348 channels */ |
454f18a9 BP |
42 | |
43 | /* The value here must be in multiple of 32 */ | |
44 | /* TODO: Need to make this configurable */ | |
f346fdc2 | 45 | #define MAX_NUM_CHANNELS_SUPPORTED 256 |
454f18a9 | 46 | |
3e7ee490 | 47 | |
5c3e375c | 48 | enum VMBUS_CONNECT_STATE { |
3e7ee490 HJ |
49 | Disconnected, |
50 | Connecting, | |
51 | Connected, | |
52 | Disconnecting | |
5c3e375c | 53 | }; |
3e7ee490 | 54 | |
f346fdc2 | 55 | #define MAX_SIZE_CHANNEL_MESSAGE HV_MESSAGE_PAYLOAD_BYTE_COUNT |
3e7ee490 | 56 | |
662e66b0 | 57 | struct VMBUS_CONNECTION { |
f346fdc2 | 58 | enum VMBUS_CONNECT_STATE ConnectState; |
3e7ee490 | 59 | |
f4888417 | 60 | atomic_t NextGpadlHandle; |
3e7ee490 | 61 | |
454f18a9 | 62 | /* |
f346fdc2 GKH |
63 | * Represents channel interrupts. Each bit position represents a |
64 | * channel. When a channel sends an interrupt via VMBUS, it finds its | |
65 | * bit in the sendInterruptPage, set it and calls Hv to generate a port | |
66 | * event. The other end receives the port event and parse the | |
67 | * recvInterruptPage to see which bit is set | |
454f18a9 | 68 | */ |
f346fdc2 GKH |
69 | void *InterruptPage; |
70 | void *SendInterruptPage; | |
71 | void *RecvInterruptPage; | |
3e7ee490 | 72 | |
454f18a9 BP |
73 | /* |
74 | * 2 pages - 1st page for parent->child notification and 2nd | |
75 | * is child->parent notification | |
76 | */ | |
f346fdc2 | 77 | void *MonitorPages; |
53af545b | 78 | struct list_head ChannelMsgList; |
dd0813b6 | 79 | spinlock_t channelmsg_lock; |
3e7ee490 | 80 | |
454f18a9 | 81 | /* List of channels */ |
53af545b | 82 | struct list_head ChannelList; |
0f5e44ca | 83 | spinlock_t channel_lock; |
3e7ee490 | 84 | |
df8d9b1f | 85 | struct workqueue_struct *WorkQueue; |
662e66b0 | 86 | }; |
3e7ee490 HJ |
87 | |
88 | ||
a9a71354 | 89 | struct VMBUS_MSGINFO { |
454f18a9 | 90 | /* Bookkeeping stuff */ |
53af545b | 91 | struct list_head MsgListEntry; |
3e7ee490 | 92 | |
454f18a9 | 93 | /* Synchronize the request/response if needed */ |
aedb444a | 94 | struct osd_waitevent *WaitEvent; |
3e7ee490 | 95 | |
454f18a9 | 96 | /* The message itself */ |
f346fdc2 | 97 | unsigned char Msg[0]; |
a9a71354 | 98 | }; |
3e7ee490 HJ |
99 | |
100 | ||
15b2f647 | 101 | extern struct VMBUS_CONNECTION vmbus_connection; |
3e7ee490 | 102 | |
454f18a9 BP |
103 | /* General vmbus interface */ |
104 | ||
89733aa9 | 105 | struct hv_device *vmbus_child_device_create(struct hv_guid *deviceType, |
daaa8cc3 | 106 | struct hv_guid *deviceInstance, |
cae5b843 | 107 | struct vmbus_channel *channel); |
3e7ee490 | 108 | |
f346fdc2 | 109 | int VmbusChildDeviceAdd(struct hv_device *Device); |
98293a27 GKH |
110 | int vmbus_child_device_register(struct hv_device *root_device_obj, |
111 | struct hv_device *child_device_obj); | |
9d8bd71a | 112 | void vmbus_child_device_unregister(struct hv_device *device_obj); |
3e7ee490 | 113 | |
454f18a9 BP |
114 | /* static void */ |
115 | /* VmbusChildDeviceDestroy( */ | |
3d3b5518 | 116 | /* struct hv_device *); */ |
3e7ee490 | 117 | |
aded7165 | 118 | struct vmbus_channel *GetChannelFromRelId(u32 relId); |
3e7ee490 | 119 | |
454f18a9 BP |
120 | |
121 | /* Connection interface */ | |
122 | ||
f346fdc2 GKH |
123 | int VmbusConnect(void); |
124 | ||
125 | int VmbusDisconnect(void); | |
126 | ||
127 | int VmbusPostMessage(void *buffer, size_t bufSize); | |
128 | ||
129 | int VmbusSetEvent(u32 childRelId); | |
130 | ||
131 | void VmbusOnEvents(void); | |
3e7ee490 HJ |
132 | |
133 | ||
454f18a9 | 134 | #endif /* _VMBUS_PRIVATE_H_ */ |