]>
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 __HV_H__ | |
26 | #define __HV_H__ | |
27 | ||
6658be6a | 28 | #include "hv_api.h" |
3e7ee490 | 29 | |
98d9fac4 GKH |
30 | enum { |
31 | VMBUS_MESSAGE_CONNECTION_ID = 1, | |
32 | VMBUS_MESSAGE_PORT_ID = 1, | |
33 | VMBUS_EVENT_CONNECTION_ID = 2, | |
34 | VMBUS_EVENT_PORT_ID = 2, | |
35 | VMBUS_MONITOR_CONNECTION_ID = 3, | |
36 | VMBUS_MONITOR_PORT_ID = 3, | |
37 | VMBUS_MESSAGE_SINT = 2, | |
3e7ee490 | 38 | }; |
454f18a9 BP |
39 | |
40 | /* #defines */ | |
41 | ||
98d9fac4 | 42 | #define HV_PRESENT_BIT 0x80000000 |
3e7ee490 | 43 | |
3e7ee490 HJ |
44 | #define HV_LINUX_GUEST_ID_LO 0x00000000 |
45 | #define HV_LINUX_GUEST_ID_HI 0xB16B00B5 | |
98d9fac4 GKH |
46 | #define HV_LINUX_GUEST_ID (((u64)HV_LINUX_GUEST_ID_HI << 32) | \ |
47 | HV_LINUX_GUEST_ID_LO) | |
3e7ee490 | 48 | |
98d9fac4 GKH |
49 | #define HV_CPU_POWER_MANAGEMENT (1 << 0) |
50 | #define HV_RECOMMENDATIONS_MAX 4 | |
3e7ee490 | 51 | |
98d9fac4 GKH |
52 | #define HV_X64_MAX 5 |
53 | #define HV_CAPS_MAX 8 | |
3e7ee490 HJ |
54 | |
55 | ||
59471438 | 56 | #define HV_HYPERCALL_PARAM_ALIGN sizeof(u64) |
3e7ee490 | 57 | |
454f18a9 BP |
58 | |
59 | /* Service definitions */ | |
60 | ||
98d9fac4 GKH |
61 | #define HV_SERVICE_PARENT_PORT (0) |
62 | #define HV_SERVICE_PARENT_CONNECTION (0) | |
3e7ee490 | 63 | |
98d9fac4 GKH |
64 | #define HV_SERVICE_CONNECT_RESPONSE_SUCCESS (0) |
65 | #define HV_SERVICE_CONNECT_RESPONSE_INVALID_PARAMETER (1) | |
66 | #define HV_SERVICE_CONNECT_RESPONSE_UNKNOWN_SERVICE (2) | |
67 | #define HV_SERVICE_CONNECT_RESPONSE_CONNECTION_REJECTED (3) | |
3e7ee490 HJ |
68 | |
69 | #define HV_SERVICE_CONNECT_REQUEST_MESSAGE_ID (1) | |
70 | #define HV_SERVICE_CONNECT_RESPONSE_MESSAGE_ID (2) | |
71 | #define HV_SERVICE_DISCONNECT_REQUEST_MESSAGE_ID (3) | |
72 | #define HV_SERVICE_DISCONNECT_RESPONSE_MESSAGE_ID (4) | |
98d9fac4 | 73 | #define HV_SERVICE_MAX_MESSAGE_ID (4) |
3e7ee490 HJ |
74 | |
75 | #define HV_SERVICE_PROTOCOL_VERSION (0x0010) | |
76 | #define HV_CONNECT_PAYLOAD_BYTE_COUNT 64 | |
77 | ||
454f18a9 | 78 | /* #define VMBUS_REVISION_NUMBER 6 */ |
98d9fac4 GKH |
79 | |
80 | /* Our local vmbus's port and connection id. Anything >0 is fine */ | |
81 | /* #define VMBUS_PORT_ID 11 */ | |
3e7ee490 | 82 | |
454f18a9 | 83 | /* 628180B8-308D-4c5e-B7DB-1BEB62E62EF4 */ |
caf26a31 GKH |
84 | static const struct hv_guid VMBUS_SERVICE_ID = { |
85 | .data = { | |
98d9fac4 GKH |
86 | 0xb8, 0x80, 0x81, 0x62, 0x8d, 0x30, 0x5e, 0x4c, |
87 | 0xb7, 0xdb, 0x1b, 0xeb, 0x62, 0xe6, 0x2e, 0xf4 | |
88 | }, | |
89 | }; | |
3e7ee490 | 90 | |
7692fd4d | 91 | #define MAX_NUM_CPUS 32 |
3e7ee490 HJ |
92 | |
93 | ||
af248e1f | 94 | struct hv_input_signal_event_buffer { |
6a0aaa18 HZ |
95 | u64 align8; |
96 | struct hv_input_signal_event event; | |
af248e1f | 97 | }; |
3e7ee490 | 98 | |
af248e1f | 99 | struct hv_context { |
a73e6b7c HJ |
100 | /* We only support running on top of Hyper-V |
101 | * So at this point this really can only contain the Hyper-V ID | |
102 | */ | |
6a0aaa18 | 103 | u64 guestid; |
98d9fac4 | 104 | |
6a0aaa18 | 105 | void *hypercall_page; |
3e7ee490 | 106 | |
6a0aaa18 | 107 | bool synic_initialized; |
98d9fac4 GKH |
108 | |
109 | /* | |
110 | * This is used as an input param to HvCallSignalEvent hypercall. The | |
111 | * input param is immutable in our usage and must be dynamic mem (vs | |
112 | * stack or global). */ | |
6a0aaa18 | 113 | struct hv_input_signal_event_buffer *signal_event_buffer; |
98d9fac4 | 114 | /* 8-bytes aligned of the buffer above */ |
6a0aaa18 | 115 | struct hv_input_signal_event *signal_event_param; |
3e7ee490 | 116 | |
6a0aaa18 HZ |
117 | void *synic_message_page[MAX_NUM_CPUS]; |
118 | void *synic_event_page[MAX_NUM_CPUS]; | |
af248e1f | 119 | }; |
3e7ee490 | 120 | |
6a0aaa18 | 121 | extern struct hv_context hv_context; |
3e7ee490 HJ |
122 | |
123 | ||
454f18a9 BP |
124 | /* Hv Interface */ |
125 | ||
d44890c8 | 126 | extern int hv_init(void); |
98d9fac4 | 127 | |
d44890c8 | 128 | extern void hv_cleanup(void); |
98d9fac4 | 129 | |
d44890c8 HZ |
130 | extern u16 hv_post_message(union hv_connection_id connection_id, |
131 | enum hv_message_type message_type, | |
132 | void *payload, size_t payload_size); | |
98d9fac4 | 133 | |
d44890c8 | 134 | extern u16 hv_signal_event(void); |
98d9fac4 | 135 | |
d44890c8 | 136 | extern void hv_synic_init(void *irqarg); |
98d9fac4 | 137 | |
d44890c8 | 138 | extern void hv_synic_cleanup(void *arg); |
3e7ee490 | 139 | |
454f18a9 | 140 | #endif /* __HV_H__ */ |