diff options
author | Yu Ke <ke.yu@intel.com> | 2010-03-24 14:01:13 -0400 |
---|---|---|
committer | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2011-09-26 14:04:39 -0400 |
commit | 3e0996798a6a113efae9e0187c5581491bdb07a7 (patch) | |
tree | 3bf147942d3f0d2c875dc7d19f89b3537b673bca | |
parent | 02f8c6aee8df3cdc935e9bdd4f2d020306035dbe (diff) |
xen/acpi: Domain0 acpi parser related platform hypercall
This patches implements the xen_platform_op hypercall, to pass the parsed
ACPI info to hypervisor.
Signed-off-by: Yu Ke <ke.yu@intel.com>
Signed-off-by: Tian Kevin <kevin.tian@intel.com>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
[v1: Added DEFINE_GUEST.. in appropiate headers]
[v2: Ripped out typedefs]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
-rw-r--r-- | arch/ia64/include/asm/xen/interface.h | 1 | ||||
-rw-r--r-- | arch/x86/include/asm/xen/interface.h | 1 | ||||
-rw-r--r-- | include/xen/interface/platform.h | 320 | ||||
-rw-r--r-- | include/xen/interface/xen.h | 1 |
4 files changed, 323 insertions, 0 deletions
diff --git a/arch/ia64/include/asm/xen/interface.h b/arch/ia64/include/asm/xen/interface.h index e951e740bdf..1d2427d116e 100644 --- a/arch/ia64/include/asm/xen/interface.h +++ b/arch/ia64/include/asm/xen/interface.h | |||
@@ -76,6 +76,7 @@ DEFINE_GUEST_HANDLE(char); | |||
76 | DEFINE_GUEST_HANDLE(int); | 76 | DEFINE_GUEST_HANDLE(int); |
77 | DEFINE_GUEST_HANDLE(long); | 77 | DEFINE_GUEST_HANDLE(long); |
78 | DEFINE_GUEST_HANDLE(void); | 78 | DEFINE_GUEST_HANDLE(void); |
79 | DEFINE_GUEST_HANDLE(uint64_t); | ||
79 | 80 | ||
80 | typedef unsigned long xen_pfn_t; | 81 | typedef unsigned long xen_pfn_t; |
81 | DEFINE_GUEST_HANDLE(xen_pfn_t); | 82 | DEFINE_GUEST_HANDLE(xen_pfn_t); |
diff --git a/arch/x86/include/asm/xen/interface.h b/arch/x86/include/asm/xen/interface.h index 5d4922ad4b9..a1f2db5f117 100644 --- a/arch/x86/include/asm/xen/interface.h +++ b/arch/x86/include/asm/xen/interface.h | |||
@@ -55,6 +55,7 @@ DEFINE_GUEST_HANDLE(char); | |||
55 | DEFINE_GUEST_HANDLE(int); | 55 | DEFINE_GUEST_HANDLE(int); |
56 | DEFINE_GUEST_HANDLE(long); | 56 | DEFINE_GUEST_HANDLE(long); |
57 | DEFINE_GUEST_HANDLE(void); | 57 | DEFINE_GUEST_HANDLE(void); |
58 | DEFINE_GUEST_HANDLE(uint64_t); | ||
58 | #endif | 59 | #endif |
59 | 60 | ||
60 | #ifndef HYPERVISOR_VIRT_START | 61 | #ifndef HYPERVISOR_VIRT_START |
diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h new file mode 100644 index 00000000000..c1684680431 --- /dev/null +++ b/include/xen/interface/platform.h | |||
@@ -0,0 +1,320 @@ | |||
1 | /****************************************************************************** | ||
2 | * platform.h | ||
3 | * | ||
4 | * Hardware platform operations. Intended for use by domain-0 kernel. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
7 | * of this software and associated documentation files (the "Software"), to | ||
8 | * deal in the Software without restriction, including without limitation the | ||
9 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
10 | * sell copies of the Software, and to permit persons to whom the Software is | ||
11 | * furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
22 | * DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Copyright (c) 2002-2006, K Fraser | ||
25 | */ | ||
26 | |||
27 | #ifndef __XEN_PUBLIC_PLATFORM_H__ | ||
28 | #define __XEN_PUBLIC_PLATFORM_H__ | ||
29 | |||
30 | #include "xen.h" | ||
31 | |||
32 | #define XENPF_INTERFACE_VERSION 0x03000001 | ||
33 | |||
34 | /* | ||
35 | * Set clock such that it would read <secs,nsecs> after 00:00:00 UTC, | ||
36 | * 1 January, 1970 if the current system time was <system_time>. | ||
37 | */ | ||
38 | #define XENPF_settime 17 | ||
39 | struct xenpf_settime { | ||
40 | /* IN variables. */ | ||
41 | uint32_t secs; | ||
42 | uint32_t nsecs; | ||
43 | uint64_t system_time; | ||
44 | }; | ||
45 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_settime_t); | ||
46 | |||
47 | /* | ||
48 | * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type. | ||
49 | * On x86, @type is an architecture-defined MTRR memory type. | ||
50 | * On success, returns the MTRR that was used (@reg) and a handle that can | ||
51 | * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting. | ||
52 | * (x86-specific). | ||
53 | */ | ||
54 | #define XENPF_add_memtype 31 | ||
55 | struct xenpf_add_memtype { | ||
56 | /* IN variables. */ | ||
57 | unsigned long mfn; | ||
58 | uint64_t nr_mfns; | ||
59 | uint32_t type; | ||
60 | /* OUT variables. */ | ||
61 | uint32_t handle; | ||
62 | uint32_t reg; | ||
63 | }; | ||
64 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_add_memtype_t); | ||
65 | |||
66 | /* | ||
67 | * Tear down an existing memory-range type. If @handle is remembered then it | ||
68 | * should be passed in to accurately tear down the correct setting (in case | ||
69 | * of overlapping memory regions with differing types). If it is not known | ||
70 | * then @handle should be set to zero. In all cases @reg must be set. | ||
71 | * (x86-specific). | ||
72 | */ | ||
73 | #define XENPF_del_memtype 32 | ||
74 | struct xenpf_del_memtype { | ||
75 | /* IN variables. */ | ||
76 | uint32_t handle; | ||
77 | uint32_t reg; | ||
78 | }; | ||
79 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_del_memtype_t); | ||
80 | |||
81 | /* Read current type of an MTRR (x86-specific). */ | ||
82 | #define XENPF_read_memtype 33 | ||
83 | struct xenpf_read_memtype { | ||
84 | /* IN variables. */ | ||
85 | uint32_t reg; | ||
86 | /* OUT variables. */ | ||
87 | unsigned long mfn; | ||
88 | uint64_t nr_mfns; | ||
89 | uint32_t type; | ||
90 | }; | ||
91 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_read_memtype_t); | ||
92 | |||
93 | #define XENPF_microcode_update 35 | ||
94 | struct xenpf_microcode_update { | ||
95 | /* IN variables. */ | ||
96 | GUEST_HANDLE(void) data; /* Pointer to microcode data */ | ||
97 | uint32_t length; /* Length of microcode data. */ | ||
98 | }; | ||
99 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_microcode_update_t); | ||
100 | |||
101 | #define XENPF_platform_quirk 39 | ||
102 | #define QUIRK_NOIRQBALANCING 1 /* Do not restrict IO-APIC RTE targets */ | ||
103 | #define QUIRK_IOAPIC_BAD_REGSEL 2 /* IO-APIC REGSEL forgets its value */ | ||
104 | #define QUIRK_IOAPIC_GOOD_REGSEL 3 /* IO-APIC REGSEL behaves properly */ | ||
105 | struct xenpf_platform_quirk { | ||
106 | /* IN variables. */ | ||
107 | uint32_t quirk_id; | ||
108 | }; | ||
109 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_platform_quirk_t); | ||
110 | |||
111 | #define XENPF_firmware_info 50 | ||
112 | #define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ | ||
113 | #define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ | ||
114 | #define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ | ||
115 | struct xenpf_firmware_info { | ||
116 | /* IN variables. */ | ||
117 | uint32_t type; | ||
118 | uint32_t index; | ||
119 | /* OUT variables. */ | ||
120 | union { | ||
121 | struct { | ||
122 | /* Int13, Fn48: Check Extensions Present. */ | ||
123 | uint8_t device; /* %dl: bios device number */ | ||
124 | uint8_t version; /* %ah: major version */ | ||
125 | uint16_t interface_support; /* %cx: support bitmap */ | ||
126 | /* Int13, Fn08: Legacy Get Device Parameters. */ | ||
127 | uint16_t legacy_max_cylinder; /* %cl[7:6]:%ch: max cyl # */ | ||
128 | uint8_t legacy_max_head; /* %dh: max head # */ | ||
129 | uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector # */ | ||
130 | /* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */ | ||
131 | /* NB. First uint16_t of buffer must be set to buffer size. */ | ||
132 | GUEST_HANDLE(void) edd_params; | ||
133 | } disk_info; /* XEN_FW_DISK_INFO */ | ||
134 | struct { | ||
135 | uint8_t device; /* bios device number */ | ||
136 | uint32_t mbr_signature; /* offset 0x1b8 in mbr */ | ||
137 | } disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */ | ||
138 | struct { | ||
139 | /* Int10, AX=4F15: Get EDID info. */ | ||
140 | uint8_t capabilities; | ||
141 | uint8_t edid_transfer_time; | ||
142 | /* must refer to 128-byte buffer */ | ||
143 | GUEST_HANDLE(uchar) edid; | ||
144 | } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ | ||
145 | } u; | ||
146 | }; | ||
147 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t); | ||
148 | |||
149 | #define XENPF_enter_acpi_sleep 51 | ||
150 | struct xenpf_enter_acpi_sleep { | ||
151 | /* IN variables */ | ||
152 | uint16_t pm1a_cnt_val; /* PM1a control value. */ | ||
153 | uint16_t pm1b_cnt_val; /* PM1b control value. */ | ||
154 | uint32_t sleep_state; /* Which state to enter (Sn). */ | ||
155 | uint32_t flags; /* Must be zero. */ | ||
156 | }; | ||
157 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_enter_acpi_sleep_t); | ||
158 | |||
159 | #define XENPF_change_freq 52 | ||
160 | struct xenpf_change_freq { | ||
161 | /* IN variables */ | ||
162 | uint32_t flags; /* Must be zero. */ | ||
163 | uint32_t cpu; /* Physical cpu. */ | ||
164 | uint64_t freq; /* New frequency (Hz). */ | ||
165 | }; | ||
166 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_change_freq_t); | ||
167 | |||
168 | /* | ||
169 | * Get idle times (nanoseconds since boot) for physical CPUs specified in the | ||
170 | * @cpumap_bitmap with range [0..@cpumap_nr_cpus-1]. The @idletime array is | ||
171 | * indexed by CPU number; only entries with the corresponding @cpumap_bitmap | ||
172 | * bit set are written to. On return, @cpumap_bitmap is modified so that any | ||
173 | * non-existent CPUs are cleared. Such CPUs have their @idletime array entry | ||
174 | * cleared. | ||
175 | */ | ||
176 | #define XENPF_getidletime 53 | ||
177 | struct xenpf_getidletime { | ||
178 | /* IN/OUT variables */ | ||
179 | /* IN: CPUs to interrogate; OUT: subset of IN which are present */ | ||
180 | GUEST_HANDLE(uchar) cpumap_bitmap; | ||
181 | /* IN variables */ | ||
182 | /* Size of cpumap bitmap. */ | ||
183 | uint32_t cpumap_nr_cpus; | ||
184 | /* Must be indexable for every cpu in cpumap_bitmap. */ | ||
185 | GUEST_HANDLE(uint64_t) idletime; | ||
186 | /* OUT variables */ | ||
187 | /* System time when the idletime snapshots were taken. */ | ||
188 | uint64_t now; | ||
189 | }; | ||
190 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_getidletime_t); | ||
191 | |||
192 | #define XENPF_set_processor_pminfo 54 | ||
193 | |||
194 | /* ability bits */ | ||
195 | #define XEN_PROCESSOR_PM_CX 1 | ||
196 | #define XEN_PROCESSOR_PM_PX 2 | ||
197 | #define XEN_PROCESSOR_PM_TX 4 | ||
198 | |||
199 | /* cmd type */ | ||
200 | #define XEN_PM_CX 0 | ||
201 | #define XEN_PM_PX 1 | ||
202 | #define XEN_PM_TX 2 | ||
203 | |||
204 | /* Px sub info type */ | ||
205 | #define XEN_PX_PCT 1 | ||
206 | #define XEN_PX_PSS 2 | ||
207 | #define XEN_PX_PPC 4 | ||
208 | #define XEN_PX_PSD 8 | ||
209 | |||
210 | struct xen_power_register { | ||
211 | uint32_t space_id; | ||
212 | uint32_t bit_width; | ||
213 | uint32_t bit_offset; | ||
214 | uint32_t access_size; | ||
215 | uint64_t address; | ||
216 | }; | ||
217 | |||
218 | struct xen_processor_csd { | ||
219 | uint32_t domain; /* domain number of one dependent group */ | ||
220 | uint32_t coord_type; /* coordination type */ | ||
221 | uint32_t num; /* number of processors in same domain */ | ||
222 | }; | ||
223 | DEFINE_GUEST_HANDLE_STRUCT(xen_processor_csd); | ||
224 | |||
225 | struct xen_processor_cx { | ||
226 | struct xen_power_register reg; /* GAS for Cx trigger register */ | ||
227 | uint8_t type; /* cstate value, c0: 0, c1: 1, ... */ | ||
228 | uint32_t latency; /* worst latency (ms) to enter/exit this cstate */ | ||
229 | uint32_t power; /* average power consumption(mW) */ | ||
230 | uint32_t dpcnt; /* number of dependency entries */ | ||
231 | GUEST_HANDLE(xen_processor_csd) dp; /* NULL if no dependency */ | ||
232 | }; | ||
233 | DEFINE_GUEST_HANDLE_STRUCT(xen_processor_cx); | ||
234 | |||
235 | struct xen_processor_flags { | ||
236 | uint32_t bm_control:1; | ||
237 | uint32_t bm_check:1; | ||
238 | uint32_t has_cst:1; | ||
239 | uint32_t power_setup_done:1; | ||
240 | uint32_t bm_rld_set:1; | ||
241 | }; | ||
242 | |||
243 | struct xen_processor_power { | ||
244 | uint32_t count; /* number of C state entries in array below */ | ||
245 | struct xen_processor_flags flags; /* global flags of this processor */ | ||
246 | GUEST_HANDLE(xen_processor_cx) states; /* supported c states */ | ||
247 | }; | ||
248 | |||
249 | struct xen_pct_register { | ||
250 | uint8_t descriptor; | ||
251 | uint16_t length; | ||
252 | uint8_t space_id; | ||
253 | uint8_t bit_width; | ||
254 | uint8_t bit_offset; | ||
255 | uint8_t reserved; | ||
256 | uint64_t address; | ||
257 | }; | ||
258 | |||
259 | struct xen_processor_px { | ||
260 | uint64_t core_frequency; /* megahertz */ | ||
261 | uint64_t power; /* milliWatts */ | ||
262 | uint64_t transition_latency; /* microseconds */ | ||
263 | uint64_t bus_master_latency; /* microseconds */ | ||
264 | uint64_t control; /* control value */ | ||
265 | uint64_t status; /* success indicator */ | ||
266 | }; | ||
267 | DEFINE_GUEST_HANDLE_STRUCT(xen_processor_px); | ||
268 | |||
269 | struct xen_psd_package { | ||
270 | uint64_t num_entries; | ||
271 | uint64_t revision; | ||
272 | uint64_t domain; | ||
273 | uint64_t coord_type; | ||
274 | uint64_t num_processors; | ||
275 | }; | ||
276 | |||
277 | struct xen_processor_performance { | ||
278 | uint32_t flags; /* flag for Px sub info type */ | ||
279 | uint32_t platform_limit; /* Platform limitation on freq usage */ | ||
280 | struct xen_pct_register control_register; | ||
281 | struct xen_pct_register status_register; | ||
282 | uint32_t state_count; /* total available performance states */ | ||
283 | GUEST_HANDLE(xen_processor_px) states; | ||
284 | struct xen_psd_package domain_info; | ||
285 | uint32_t shared_type; /* coordination type of this processor */ | ||
286 | }; | ||
287 | DEFINE_GUEST_HANDLE_STRUCT(xen_processor_performance); | ||
288 | |||
289 | struct xenpf_set_processor_pminfo { | ||
290 | /* IN variables */ | ||
291 | uint32_t id; /* ACPI CPU ID */ | ||
292 | uint32_t type; /* {XEN_PM_CX, XEN_PM_PX} */ | ||
293 | union { | ||
294 | struct xen_processor_power power;/* Cx: _CST/_CSD */ | ||
295 | struct xen_processor_performance perf; /* Px: _PPC/_PCT/_PSS/_PSD */ | ||
296 | }; | ||
297 | }; | ||
298 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_set_processor_pminfo); | ||
299 | |||
300 | struct xen_platform_op { | ||
301 | uint32_t cmd; | ||
302 | uint32_t interface_version; /* XENPF_INTERFACE_VERSION */ | ||
303 | union { | ||
304 | struct xenpf_settime settime; | ||
305 | struct xenpf_add_memtype add_memtype; | ||
306 | struct xenpf_del_memtype del_memtype; | ||
307 | struct xenpf_read_memtype read_memtype; | ||
308 | struct xenpf_microcode_update microcode; | ||
309 | struct xenpf_platform_quirk platform_quirk; | ||
310 | struct xenpf_firmware_info firmware_info; | ||
311 | struct xenpf_enter_acpi_sleep enter_acpi_sleep; | ||
312 | struct xenpf_change_freq change_freq; | ||
313 | struct xenpf_getidletime getidletime; | ||
314 | struct xenpf_set_processor_pminfo set_pminfo; | ||
315 | uint8_t pad[128]; | ||
316 | } u; | ||
317 | }; | ||
318 | DEFINE_GUEST_HANDLE_STRUCT(xen_platform_op_t); | ||
319 | |||
320 | #endif /* __XEN_PUBLIC_PLATFORM_H__ */ | ||
diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h index 70213b4515e..d83cc08921a 100644 --- a/include/xen/interface/xen.h +++ b/include/xen/interface/xen.h | |||
@@ -453,6 +453,7 @@ struct start_info { | |||
453 | /* These flags are passed in the 'flags' field of start_info_t. */ | 453 | /* These flags are passed in the 'flags' field of start_info_t. */ |
454 | #define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */ | 454 | #define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */ |
455 | #define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */ | 455 | #define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */ |
456 | #define SIF_PM_MASK (0xFF<<8) /* reserve 1 byte for xen-pm options */ | ||
456 | 457 | ||
457 | typedef uint64_t cpumap_t; | 458 | typedef uint64_t cpumap_t; |
458 | 459 | ||