xref: /illumos-gate/usr/src/uts/common/xen/public/sysctl.h (revision 55fea89d)
1843e1988Sjohnlev /******************************************************************************
2843e1988Sjohnlev  * sysctl.h
3843e1988Sjohnlev  *
4843e1988Sjohnlev  * System management operations. For use by node control stack.
5843e1988Sjohnlev  *
6843e1988Sjohnlev  * Permission is hereby granted, free of charge, to any person obtaining a copy
7843e1988Sjohnlev  * of this software and associated documentation files (the "Software"), to
8843e1988Sjohnlev  * deal in the Software without restriction, including without limitation the
9843e1988Sjohnlev  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10843e1988Sjohnlev  * sell copies of the Software, and to permit persons to whom the Software is
11843e1988Sjohnlev  * furnished to do so, subject to the following conditions:
12843e1988Sjohnlev  *
13843e1988Sjohnlev  * The above copyright notice and this permission notice shall be included in
14843e1988Sjohnlev  * all copies or substantial portions of the Software.
15843e1988Sjohnlev  *
16843e1988Sjohnlev  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17843e1988Sjohnlev  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18843e1988Sjohnlev  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19843e1988Sjohnlev  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20843e1988Sjohnlev  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21843e1988Sjohnlev  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22843e1988Sjohnlev  * DEALINGS IN THE SOFTWARE.
23843e1988Sjohnlev  *
24843e1988Sjohnlev  * Copyright (c) 2002-2006, K Fraser
25843e1988Sjohnlev  */
26843e1988Sjohnlev 
27843e1988Sjohnlev #ifndef __XEN_PUBLIC_SYSCTL_H__
28843e1988Sjohnlev #define __XEN_PUBLIC_SYSCTL_H__
29843e1988Sjohnlev 
30843e1988Sjohnlev #if !defined(__XEN__) && !defined(__XEN_TOOLS__)
31843e1988Sjohnlev #error "sysctl operations are intended for use by node control tools only"
32843e1988Sjohnlev #endif
33843e1988Sjohnlev 
34843e1988Sjohnlev #include "xen.h"
35843e1988Sjohnlev #include "domctl.h"
36843e1988Sjohnlev 
37349b53ddSStuart Maybee #define XEN_SYSCTL_INTERFACE_VERSION 0x00000006
38843e1988Sjohnlev 
39843e1988Sjohnlev /*
40843e1988Sjohnlev  * Read console content from Xen buffer ring.
41843e1988Sjohnlev  */
42843e1988Sjohnlev #define XEN_SYSCTL_readconsole       1
43843e1988Sjohnlev struct xen_sysctl_readconsole {
44349b53ddSStuart Maybee     /* IN: Non-zero -> clear after reading. */
45349b53ddSStuart Maybee     uint8_t clear;
46349b53ddSStuart Maybee     /* IN: Non-zero -> start index specified by @index field. */
47349b53ddSStuart Maybee     uint8_t incremental;
48349b53ddSStuart Maybee     uint8_t pad0, pad1;
49349b53ddSStuart Maybee     /*
50349b53ddSStuart Maybee      * IN:  Start index for consuming from ring buffer (if @incremental);
51349b53ddSStuart Maybee      * OUT: End index after consuming from ring buffer.
52349b53ddSStuart Maybee      */
53349b53ddSStuart Maybee     uint32_t index;
54349b53ddSStuart Maybee     /* IN: Virtual address to write console data. */
55349b53ddSStuart Maybee     XEN_GUEST_HANDLE_64(char) buffer;
56349b53ddSStuart Maybee     /* IN: Size of buffer; OUT: Bytes written to buffer. */
57349b53ddSStuart Maybee     uint32_t count;
58843e1988Sjohnlev };
59843e1988Sjohnlev typedef struct xen_sysctl_readconsole xen_sysctl_readconsole_t;
60843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_readconsole_t);
61843e1988Sjohnlev 
62843e1988Sjohnlev /* Get trace buffers machine base address */
63843e1988Sjohnlev #define XEN_SYSCTL_tbuf_op           2
64843e1988Sjohnlev struct xen_sysctl_tbuf_op {
65843e1988Sjohnlev     /* IN variables */
66843e1988Sjohnlev #define XEN_SYSCTL_TBUFOP_get_info     0
67843e1988Sjohnlev #define XEN_SYSCTL_TBUFOP_set_cpu_mask 1
68843e1988Sjohnlev #define XEN_SYSCTL_TBUFOP_set_evt_mask 2
69843e1988Sjohnlev #define XEN_SYSCTL_TBUFOP_set_size     3
70843e1988Sjohnlev #define XEN_SYSCTL_TBUFOP_enable       4
71843e1988Sjohnlev #define XEN_SYSCTL_TBUFOP_disable      5
72843e1988Sjohnlev     uint32_t cmd;
73843e1988Sjohnlev     /* IN/OUT variables */
74843e1988Sjohnlev     struct xenctl_cpumap cpu_mask;
75843e1988Sjohnlev     uint32_t             evt_mask;
76843e1988Sjohnlev     /* OUT variables */
77a576ab5bSrab     uint64_aligned_t buffer_mfn;
78843e1988Sjohnlev     uint32_t size;
79843e1988Sjohnlev };
80843e1988Sjohnlev typedef struct xen_sysctl_tbuf_op xen_sysctl_tbuf_op_t;
81843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_tbuf_op_t);
82843e1988Sjohnlev 
83843e1988Sjohnlev /*
84843e1988Sjohnlev  * Get physical information about the host machine
85843e1988Sjohnlev  */
86843e1988Sjohnlev #define XEN_SYSCTL_physinfo          3
87349b53ddSStuart Maybee  /* (x86) The platform supports HVM guests. */
88349b53ddSStuart Maybee #define _XEN_SYSCTL_PHYSCAP_hvm          0
89349b53ddSStuart Maybee #define XEN_SYSCTL_PHYSCAP_hvm           (1u<<_XEN_SYSCTL_PHYSCAP_hvm)
90349b53ddSStuart Maybee  /* (x86) The platform supports HVM-guest direct access to I/O devices. */
91349b53ddSStuart Maybee #define _XEN_SYSCTL_PHYSCAP_hvm_directio 1
92349b53ddSStuart Maybee #define XEN_SYSCTL_PHYSCAP_hvm_directio  (1u<<_XEN_SYSCTL_PHYSCAP_hvm_directio)
93843e1988Sjohnlev struct xen_sysctl_physinfo {
94843e1988Sjohnlev     uint32_t threads_per_core;
95843e1988Sjohnlev     uint32_t cores_per_socket;
96349b53ddSStuart Maybee     uint32_t nr_cpus;
97843e1988Sjohnlev     uint32_t nr_nodes;
98843e1988Sjohnlev     uint32_t cpu_khz;
99a576ab5bSrab     uint64_aligned_t total_pages;
100a576ab5bSrab     uint64_aligned_t free_pages;
101a576ab5bSrab     uint64_aligned_t scrub_pages;
102843e1988Sjohnlev     uint32_t hw_cap[8];
103349b53ddSStuart Maybee 
104349b53ddSStuart Maybee     /*
105349b53ddSStuart Maybee      * IN: maximum addressable entry in the caller-provided cpu_to_node array.
106349b53ddSStuart Maybee      * OUT: largest cpu identifier in the system.
107349b53ddSStuart Maybee      * If OUT is greater than IN then the cpu_to_node array is truncated!
108349b53ddSStuart Maybee      */
109349b53ddSStuart Maybee     uint32_t max_cpu_id;
110349b53ddSStuart Maybee     /*
111349b53ddSStuart Maybee      * If not NULL, this array is filled with node identifier for each cpu.
112349b53ddSStuart Maybee      * If a cpu has no node information (e.g., cpu not present) then the
113349b53ddSStuart Maybee      * sentinel value ~0u is written.
114349b53ddSStuart Maybee      * The size of this array is specified by the caller in @max_cpu_id.
115349b53ddSStuart Maybee      * If the actual @max_cpu_id is smaller than the array then the trailing
116349b53ddSStuart Maybee      * elements of the array will not be written by the sysctl.
117349b53ddSStuart Maybee      */
118349b53ddSStuart Maybee     XEN_GUEST_HANDLE_64(uint32) cpu_to_node;
119349b53ddSStuart Maybee 
120349b53ddSStuart Maybee     /* XEN_SYSCTL_PHYSCAP_??? */
121349b53ddSStuart Maybee     uint32_t capabilities;
122843e1988Sjohnlev };
123843e1988Sjohnlev typedef struct xen_sysctl_physinfo xen_sysctl_physinfo_t;
124843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_physinfo_t);
125843e1988Sjohnlev 
126843e1988Sjohnlev /*
127843e1988Sjohnlev  * Get the ID of the current scheduler.
128843e1988Sjohnlev  */
129843e1988Sjohnlev #define XEN_SYSCTL_sched_id          4
130843e1988Sjohnlev struct xen_sysctl_sched_id {
131843e1988Sjohnlev     /* OUT variable */
132843e1988Sjohnlev     uint32_t sched_id;
133843e1988Sjohnlev };
134843e1988Sjohnlev typedef struct xen_sysctl_sched_id xen_sysctl_sched_id_t;
135843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_sched_id_t);
136843e1988Sjohnlev 
137843e1988Sjohnlev /* Interface for controlling Xen software performance counters. */
138843e1988Sjohnlev #define XEN_SYSCTL_perfc_op          5
139843e1988Sjohnlev /* Sub-operations: */
140843e1988Sjohnlev #define XEN_SYSCTL_PERFCOP_reset 1   /* Reset all counters to zero. */
141843e1988Sjohnlev #define XEN_SYSCTL_PERFCOP_query 2   /* Get perfctr information. */
142843e1988Sjohnlev struct xen_sysctl_perfc_desc {
143843e1988Sjohnlev     char         name[80];             /* name of perf counter */
144843e1988Sjohnlev     uint32_t     nr_vals;              /* number of values for this counter */
145843e1988Sjohnlev };
146843e1988Sjohnlev typedef struct xen_sysctl_perfc_desc xen_sysctl_perfc_desc_t;
147843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_desc_t);
148843e1988Sjohnlev typedef uint32_t xen_sysctl_perfc_val_t;
149843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_val_t);
150843e1988Sjohnlev 
151843e1988Sjohnlev struct xen_sysctl_perfc_op {
152843e1988Sjohnlev     /* IN variables. */
153843e1988Sjohnlev     uint32_t       cmd;                /*  XEN_SYSCTL_PERFCOP_??? */
154843e1988Sjohnlev     /* OUT variables. */
155843e1988Sjohnlev     uint32_t       nr_counters;       /*  number of counters description  */
156843e1988Sjohnlev     uint32_t       nr_vals;           /*  number of values  */
157843e1988Sjohnlev     /* counter information (or NULL) */
158a576ab5bSrab     XEN_GUEST_HANDLE_64(xen_sysctl_perfc_desc_t) desc;
159843e1988Sjohnlev     /* counter values (or NULL) */
160a576ab5bSrab     XEN_GUEST_HANDLE_64(xen_sysctl_perfc_val_t) val;
161843e1988Sjohnlev };
162843e1988Sjohnlev typedef struct xen_sysctl_perfc_op xen_sysctl_perfc_op_t;
163843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_op_t);
164843e1988Sjohnlev 
165843e1988Sjohnlev #define XEN_SYSCTL_getdomaininfolist 6
166843e1988Sjohnlev struct xen_sysctl_getdomaininfolist {
167843e1988Sjohnlev     /* IN variables. */
168843e1988Sjohnlev     domid_t               first_domain;
169843e1988Sjohnlev     uint32_t              max_domains;
170a576ab5bSrab     XEN_GUEST_HANDLE_64(xen_domctl_getdomaininfo_t) buffer;
171843e1988Sjohnlev     /* OUT variables. */
172843e1988Sjohnlev     uint32_t              num_domains;
173843e1988Sjohnlev };
174843e1988Sjohnlev typedef struct xen_sysctl_getdomaininfolist xen_sysctl_getdomaininfolist_t;
175843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getdomaininfolist_t);
176843e1988Sjohnlev 
177a576ab5bSrab /* Inject debug keys into Xen. */
178a576ab5bSrab #define XEN_SYSCTL_debug_keys        7
179a576ab5bSrab struct xen_sysctl_debug_keys {
180a576ab5bSrab     /* IN variables. */
181a576ab5bSrab     XEN_GUEST_HANDLE_64(char) keys;
182a576ab5bSrab     uint32_t nr_keys;
183a576ab5bSrab };
184a576ab5bSrab typedef struct xen_sysctl_debug_keys xen_sysctl_debug_keys_t;
185a576ab5bSrab DEFINE_XEN_GUEST_HANDLE(xen_sysctl_debug_keys_t);
186a576ab5bSrab 
187a576ab5bSrab /* Get physical CPU information. */
188a576ab5bSrab #define XEN_SYSCTL_getcpuinfo        8
189a576ab5bSrab struct xen_sysctl_cpuinfo {
190349b53ddSStuart Maybee     uint64_aligned_t idletime;
191a576ab5bSrab };
192a576ab5bSrab typedef struct xen_sysctl_cpuinfo xen_sysctl_cpuinfo_t;
193a576ab5bSrab DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpuinfo_t);
194a576ab5bSrab struct xen_sysctl_getcpuinfo {
195a576ab5bSrab     /* IN variables. */
196a576ab5bSrab     uint32_t max_cpus;
197a576ab5bSrab     XEN_GUEST_HANDLE_64(xen_sysctl_cpuinfo_t) info;
198a576ab5bSrab     /* OUT variables. */
199a576ab5bSrab     uint32_t nr_cpus;
200a576ab5bSrab };
201a576ab5bSrab typedef struct xen_sysctl_getcpuinfo xen_sysctl_getcpuinfo_t;
202a576ab5bSrab DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getcpuinfo_t);
203a576ab5bSrab 
204349b53ddSStuart Maybee #define XEN_SYSCTL_availheap         9
205349b53ddSStuart Maybee struct xen_sysctl_availheap {
206349b53ddSStuart Maybee     /* IN variables. */
207349b53ddSStuart Maybee     uint32_t min_bitwidth;  /* Smallest address width (zero if don't care). */
208349b53ddSStuart Maybee     uint32_t max_bitwidth;  /* Largest address width (zero if don't care). */
209349b53ddSStuart Maybee     int32_t  node;          /* NUMA node of interest (-1 for all nodes). */
210349b53ddSStuart Maybee     /* OUT variables. */
211349b53ddSStuart Maybee     uint64_aligned_t avail_bytes;/* Bytes available in the specified region. */
212349b53ddSStuart Maybee };
213349b53ddSStuart Maybee typedef struct xen_sysctl_availheap xen_sysctl_availheap_t;
214349b53ddSStuart Maybee DEFINE_XEN_GUEST_HANDLE(xen_sysctl_availheap_t);
215349b53ddSStuart Maybee 
216349b53ddSStuart Maybee #define XEN_SYSCTL_get_pmstat        10
217349b53ddSStuart Maybee struct pm_px_val {
218349b53ddSStuart Maybee     uint64_aligned_t freq;        /* Px core frequency */
219349b53ddSStuart Maybee     uint64_aligned_t residency;   /* Px residency time */
220349b53ddSStuart Maybee     uint64_aligned_t count;       /* Px transition count */
221349b53ddSStuart Maybee };
222349b53ddSStuart Maybee typedef struct pm_px_val pm_px_val_t;
223349b53ddSStuart Maybee DEFINE_XEN_GUEST_HANDLE(pm_px_val_t);
224349b53ddSStuart Maybee 
225349b53ddSStuart Maybee struct pm_px_stat {
226349b53ddSStuart Maybee     uint8_t total;        /* total Px states */
227349b53ddSStuart Maybee     uint8_t usable;       /* usable Px states */
228349b53ddSStuart Maybee     uint8_t last;         /* last Px state */
229349b53ddSStuart Maybee     uint8_t cur;          /* current Px state */
230349b53ddSStuart Maybee     XEN_GUEST_HANDLE_64(uint64) trans_pt;   /* Px transition table */
231349b53ddSStuart Maybee     XEN_GUEST_HANDLE_64(pm_px_val_t) pt;
232349b53ddSStuart Maybee };
233349b53ddSStuart Maybee typedef struct pm_px_stat pm_px_stat_t;
234349b53ddSStuart Maybee DEFINE_XEN_GUEST_HANDLE(pm_px_stat_t);
235349b53ddSStuart Maybee 
236349b53ddSStuart Maybee struct pm_cx_stat {
237349b53ddSStuart Maybee     uint32_t nr;    /* entry nr in triggers & residencies, including C0 */
238349b53ddSStuart Maybee     uint32_t last;  /* last Cx state */
239349b53ddSStuart Maybee     uint64_aligned_t idle_time;                 /* idle time from boot */
240349b53ddSStuart Maybee     XEN_GUEST_HANDLE_64(uint64) triggers;    /* Cx trigger counts */
241349b53ddSStuart Maybee     XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */
242349b53ddSStuart Maybee };
243349b53ddSStuart Maybee 
244349b53ddSStuart Maybee struct xen_sysctl_get_pmstat {
245349b53ddSStuart Maybee #define PMSTAT_CATEGORY_MASK 0xf0
246349b53ddSStuart Maybee #define PMSTAT_PX            0x10
247349b53ddSStuart Maybee #define PMSTAT_CX            0x20
248349b53ddSStuart Maybee #define PMSTAT_get_max_px    (PMSTAT_PX | 0x1)
249349b53ddSStuart Maybee #define PMSTAT_get_pxstat    (PMSTAT_PX | 0x2)
250349b53ddSStuart Maybee #define PMSTAT_reset_pxstat  (PMSTAT_PX | 0x3)
251349b53ddSStuart Maybee #define PMSTAT_get_max_cx    (PMSTAT_CX | 0x1)
252349b53ddSStuart Maybee #define PMSTAT_get_cxstat    (PMSTAT_CX | 0x2)
253349b53ddSStuart Maybee #define PMSTAT_reset_cxstat  (PMSTAT_CX | 0x3)
254349b53ddSStuart Maybee     uint32_t type;
255349b53ddSStuart Maybee     uint32_t cpuid;
256349b53ddSStuart Maybee     union {
257349b53ddSStuart Maybee         struct pm_px_stat getpx;
258349b53ddSStuart Maybee         struct pm_cx_stat getcx;
259349b53ddSStuart Maybee         /* other struct for tx, etc */
260349b53ddSStuart Maybee     } u;
261349b53ddSStuart Maybee };
262349b53ddSStuart Maybee typedef struct xen_sysctl_get_pmstat xen_sysctl_get_pmstat_t;
263349b53ddSStuart Maybee DEFINE_XEN_GUEST_HANDLE(xen_sysctl_get_pmstat_t);
264349b53ddSStuart Maybee 
265349b53ddSStuart Maybee /*
266349b53ddSStuart Maybee  * Status codes. Must be greater than 0 to avoid confusing
267349b53ddSStuart Maybee  * sysctl callers that see 0 as a plain successful return.
268349b53ddSStuart Maybee  */
269349b53ddSStuart Maybee #define XEN_CPU_HOTPLUG_STATUS_OFFLINE 1
270349b53ddSStuart Maybee #define XEN_CPU_HOTPLUG_STATUS_ONLINE  2
271349b53ddSStuart Maybee #define XEN_CPU_HOTPLUG_STATUS_NEW     3
272349b53ddSStuart Maybee 
273349b53ddSStuart Maybee #define XEN_SYSCTL_cpu_hotplug       11
274349b53ddSStuart Maybee struct xen_sysctl_cpu_hotplug {
275349b53ddSStuart Maybee     /* IN variables */
276349b53ddSStuart Maybee     uint32_t cpu;   /* Physical cpu. */
277349b53ddSStuart Maybee #define XEN_SYSCTL_CPU_HOTPLUG_ONLINE  0
278349b53ddSStuart Maybee #define XEN_SYSCTL_CPU_HOTPLUG_OFFLINE 1
279349b53ddSStuart Maybee #define XEN_SYSCTL_CPU_HOTPLUG_STATUS 2
280349b53ddSStuart Maybee     uint32_t op;    /* hotplug opcode */
281349b53ddSStuart Maybee };
282349b53ddSStuart Maybee typedef struct xen_sysctl_cpu_hotplug xen_sysctl_cpu_hotplug_t;
283349b53ddSStuart Maybee DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_hotplug_t);
284349b53ddSStuart Maybee 
285*ad09f8b8SMark Johnson /*
286*ad09f8b8SMark Johnson  * Get/set xen power management, include
287*ad09f8b8SMark Johnson  * 1. cpufreq governors and related parameters
288*ad09f8b8SMark Johnson  */
289*ad09f8b8SMark Johnson #define XEN_SYSCTL_pm_op        12
290*ad09f8b8SMark Johnson struct xen_userspace {
291*ad09f8b8SMark Johnson     uint32_t scaling_setspeed;
292*ad09f8b8SMark Johnson };
293*ad09f8b8SMark Johnson typedef struct xen_userspace xen_userspace_t;
294*ad09f8b8SMark Johnson 
295*ad09f8b8SMark Johnson struct xen_ondemand {
296*ad09f8b8SMark Johnson     uint32_t sampling_rate_max;
297*ad09f8b8SMark Johnson     uint32_t sampling_rate_min;
298*ad09f8b8SMark Johnson 
299*ad09f8b8SMark Johnson     uint32_t sampling_rate;
300*ad09f8b8SMark Johnson     uint32_t up_threshold;
301*ad09f8b8SMark Johnson };
302*ad09f8b8SMark Johnson typedef struct xen_ondemand xen_ondemand_t;
303*ad09f8b8SMark Johnson 
304*ad09f8b8SMark Johnson /*
305*ad09f8b8SMark Johnson  * cpufreq para name of this structure named
306*ad09f8b8SMark Johnson  * same as sysfs file name of native linux
307*ad09f8b8SMark Johnson  */
308*ad09f8b8SMark Johnson #define CPUFREQ_NAME_LEN 16
309*ad09f8b8SMark Johnson struct xen_get_cpufreq_para {
310*ad09f8b8SMark Johnson     /* IN/OUT variable */
311*ad09f8b8SMark Johnson     uint32_t cpu_num;
312*ad09f8b8SMark Johnson     uint32_t freq_num;
313*ad09f8b8SMark Johnson     uint32_t gov_num;
314*ad09f8b8SMark Johnson 
315*ad09f8b8SMark Johnson     /* for all governors */
316*ad09f8b8SMark Johnson     /* OUT variable */
317*ad09f8b8SMark Johnson     XEN_GUEST_HANDLE_64(uint32) affected_cpus;
318*ad09f8b8SMark Johnson     XEN_GUEST_HANDLE_64(uint32) scaling_available_frequencies;
319*ad09f8b8SMark Johnson     XEN_GUEST_HANDLE_64(char)   scaling_available_governors;
320*ad09f8b8SMark Johnson     char scaling_driver[CPUFREQ_NAME_LEN];
321*ad09f8b8SMark Johnson 
322*ad09f8b8SMark Johnson     uint32_t cpuinfo_cur_freq;
323*ad09f8b8SMark Johnson     uint32_t cpuinfo_max_freq;
324*ad09f8b8SMark Johnson     uint32_t cpuinfo_min_freq;
325*ad09f8b8SMark Johnson     uint32_t scaling_cur_freq;
326*ad09f8b8SMark Johnson 
327*ad09f8b8SMark Johnson     char scaling_governor[CPUFREQ_NAME_LEN];
328*ad09f8b8SMark Johnson     uint32_t scaling_max_freq;
329*ad09f8b8SMark Johnson     uint32_t scaling_min_freq;
330*ad09f8b8SMark Johnson 
331*ad09f8b8SMark Johnson     /* for specific governor */
332*ad09f8b8SMark Johnson     union {
333*ad09f8b8SMark Johnson         struct  xen_userspace userspace;
334*ad09f8b8SMark Johnson         struct  xen_ondemand ondemand;
335*ad09f8b8SMark Johnson     } u;
336*ad09f8b8SMark Johnson };
337*ad09f8b8SMark Johnson 
338*ad09f8b8SMark Johnson struct xen_set_cpufreq_gov {
339*ad09f8b8SMark Johnson     char scaling_governor[CPUFREQ_NAME_LEN];
340*ad09f8b8SMark Johnson };
341*ad09f8b8SMark Johnson 
342*ad09f8b8SMark Johnson struct xen_set_cpufreq_para {
343*ad09f8b8SMark Johnson     #define SCALING_MAX_FREQ           1
344*ad09f8b8SMark Johnson     #define SCALING_MIN_FREQ           2
345*ad09f8b8SMark Johnson     #define SCALING_SETSPEED           3
346*ad09f8b8SMark Johnson     #define SAMPLING_RATE              4
347*ad09f8b8SMark Johnson     #define UP_THRESHOLD               5
348*ad09f8b8SMark Johnson 
349*ad09f8b8SMark Johnson     uint32_t ctrl_type;
350*ad09f8b8SMark Johnson     uint32_t ctrl_value;
351*ad09f8b8SMark Johnson };
352*ad09f8b8SMark Johnson 
353*ad09f8b8SMark Johnson /* Get physical CPU topology information. */
354*ad09f8b8SMark Johnson #define INVALID_TOPOLOGY_ID  (~0U)
355*ad09f8b8SMark Johnson struct xen_get_cputopo {
356*ad09f8b8SMark Johnson      /* IN: maximum addressable entry in
357*ad09f8b8SMark Johnson       * the caller-provided cpu_to_core/socket.
358*ad09f8b8SMark Johnson       */
359*ad09f8b8SMark Johnson     uint32_t max_cpus;
360*ad09f8b8SMark Johnson     XEN_GUEST_HANDLE_64(uint32) cpu_to_core;
361*ad09f8b8SMark Johnson     XEN_GUEST_HANDLE_64(uint32) cpu_to_socket;
362*ad09f8b8SMark Johnson 
363*ad09f8b8SMark Johnson     /* OUT: number of cpus returned
364*ad09f8b8SMark Johnson      * If OUT is greater than IN then the cpu_to_core/socket is truncated!
365*ad09f8b8SMark Johnson      */
366*ad09f8b8SMark Johnson     uint32_t nr_cpus;
367*ad09f8b8SMark Johnson };
368*ad09f8b8SMark Johnson 
369*ad09f8b8SMark Johnson struct xen_sysctl_pm_op {
370*ad09f8b8SMark Johnson     #define PM_PARA_CATEGORY_MASK      0xf0
371*ad09f8b8SMark Johnson     #define CPUFREQ_PARA               0x10
372*ad09f8b8SMark Johnson 
373*ad09f8b8SMark Johnson     /* cpufreq command type */
374*ad09f8b8SMark Johnson     #define GET_CPUFREQ_PARA           (CPUFREQ_PARA | 0x01)
375*ad09f8b8SMark Johnson     #define SET_CPUFREQ_GOV            (CPUFREQ_PARA | 0x02)
376*ad09f8b8SMark Johnson     #define SET_CPUFREQ_PARA           (CPUFREQ_PARA | 0x03)
377*ad09f8b8SMark Johnson     #define GET_CPUFREQ_AVGFREQ        (CPUFREQ_PARA | 0x04)
378*ad09f8b8SMark Johnson 
379*ad09f8b8SMark Johnson     /* get CPU topology */
380*ad09f8b8SMark Johnson     #define XEN_SYSCTL_pm_op_get_cputopo  0x20
381*ad09f8b8SMark Johnson 
382*ad09f8b8SMark Johnson     /* set/reset scheduler power saving option */
383*ad09f8b8SMark Johnson     #define XEN_SYSCTL_pm_op_set_sched_opt_smt    0x21
384*ad09f8b8SMark Johnson 
385*ad09f8b8SMark Johnson     /* cpuidle max_cstate access command */
386*ad09f8b8SMark Johnson     #define XEN_SYSCTL_pm_op_get_max_cstate       0x22
387*ad09f8b8SMark Johnson     #define XEN_SYSCTL_pm_op_set_max_cstate       0x23
388*ad09f8b8SMark Johnson 
389*ad09f8b8SMark Johnson     /* set scheduler migration cost value */
390*ad09f8b8SMark Johnson     #define XEN_SYSCTL_pm_op_set_vcpu_migration_delay   0x24
391*ad09f8b8SMark Johnson     #define XEN_SYSCTL_pm_op_get_vcpu_migration_delay   0x25
392*ad09f8b8SMark Johnson 
393*ad09f8b8SMark Johnson     uint32_t cmd;
394*ad09f8b8SMark Johnson     uint32_t cpuid;
395*ad09f8b8SMark Johnson     union {
396*ad09f8b8SMark Johnson         struct xen_get_cpufreq_para get_para;
397*ad09f8b8SMark Johnson         struct xen_set_cpufreq_gov  set_gov;
398*ad09f8b8SMark Johnson         struct xen_set_cpufreq_para set_para;
399*ad09f8b8SMark Johnson         uint64_t get_avgfreq;
400*ad09f8b8SMark Johnson         struct xen_get_cputopo      get_topo;
401*ad09f8b8SMark Johnson         uint32_t                    set_sched_opt_smt;
402*ad09f8b8SMark Johnson         uint32_t                    get_max_cstate;
403*ad09f8b8SMark Johnson         uint32_t                    set_max_cstate;
404*ad09f8b8SMark Johnson         uint32_t                    get_vcpu_migration_delay;
405*ad09f8b8SMark Johnson         uint32_t                    set_vcpu_migration_delay;
406*ad09f8b8SMark Johnson     } u;
407*ad09f8b8SMark Johnson };
408*ad09f8b8SMark Johnson 
409*ad09f8b8SMark Johnson #define XEN_SYSCTL_page_offline_op        14
410*ad09f8b8SMark Johnson struct xen_sysctl_page_offline_op {
411*ad09f8b8SMark Johnson     /* IN: range of page to be offlined */
412*ad09f8b8SMark Johnson #define sysctl_page_offline     1
413*ad09f8b8SMark Johnson #define sysctl_page_online      2
414*ad09f8b8SMark Johnson #define sysctl_query_page_offline  3
415*ad09f8b8SMark Johnson     uint32_t cmd;
416*ad09f8b8SMark Johnson     uint32_t start;
417*ad09f8b8SMark Johnson     uint32_t end;
418*ad09f8b8SMark Johnson     /* OUT: result of page offline request */
419*ad09f8b8SMark Johnson     /*
420*ad09f8b8SMark Johnson      * bit 0~15: result flags
421*ad09f8b8SMark Johnson      * bit 16~31: owner
422*ad09f8b8SMark Johnson      */
423*ad09f8b8SMark Johnson     XEN_GUEST_HANDLE(uint32) status;
424*ad09f8b8SMark Johnson };
425*ad09f8b8SMark Johnson 
426*ad09f8b8SMark Johnson #define PG_OFFLINE_STATUS_MASK    (0xFFUL)
427*ad09f8b8SMark Johnson 
428*ad09f8b8SMark Johnson /* The result is invalid, i.e. HV does not handle it */
429*ad09f8b8SMark Johnson #define PG_OFFLINE_INVALID   (0x1UL << 0)
430*ad09f8b8SMark Johnson 
431*ad09f8b8SMark Johnson #define PG_OFFLINE_OFFLINED  (0x1UL << 1)
432*ad09f8b8SMark Johnson #define PG_OFFLINE_PENDING   (0x1UL << 2)
433*ad09f8b8SMark Johnson #define PG_OFFLINE_FAILED    (0x1UL << 3)
434*ad09f8b8SMark Johnson 
435*ad09f8b8SMark Johnson #define PG_ONLINE_FAILED     PG_OFFLINE_FAILED
436*ad09f8b8SMark Johnson #define PG_ONLINE_ONLINED    PG_OFFLINE_OFFLINED
437*ad09f8b8SMark Johnson 
438*ad09f8b8SMark Johnson #define PG_OFFLINE_STATUS_OFFLINED              (0x1UL << 1)
439*ad09f8b8SMark Johnson #define PG_OFFLINE_STATUS_ONLINE                (0x1UL << 2)
440*ad09f8b8SMark Johnson #define PG_OFFLINE_STATUS_OFFLINE_PENDING       (0x1UL << 3)
441*ad09f8b8SMark Johnson #define PG_OFFLINE_STATUS_BROKEN                (0x1UL << 4)
442*ad09f8b8SMark Johnson 
443*ad09f8b8SMark Johnson #define PG_OFFLINE_MISC_MASK    (0xFFUL << 4)
444*ad09f8b8SMark Johnson 
445*ad09f8b8SMark Johnson /* only valid when PG_OFFLINE_FAILED */
446*ad09f8b8SMark Johnson #define PG_OFFLINE_XENPAGE   (0x1UL << 8)
447*ad09f8b8SMark Johnson #define PG_OFFLINE_DOM0PAGE  (0x1UL << 9)
448*ad09f8b8SMark Johnson #define PG_OFFLINE_ANONYMOUS (0x1UL << 10)
449*ad09f8b8SMark Johnson #define PG_OFFLINE_NOT_CONV_RAM   (0x1UL << 11)
450*ad09f8b8SMark Johnson #define PG_OFFLINE_OWNED     (0x1UL << 12)
451*ad09f8b8SMark Johnson 
452*ad09f8b8SMark Johnson #define PG_OFFLINE_BROKEN    (0x1UL << 13)
453*ad09f8b8SMark Johnson #define PG_ONLINE_BROKEN     PG_OFFLINE_BROKEN
454*ad09f8b8SMark Johnson 
455*ad09f8b8SMark Johnson #define PG_OFFLINE_OWNER_SHIFT 16
456349b53ddSStuart Maybee 
457843e1988Sjohnlev struct xen_sysctl {
458843e1988Sjohnlev     uint32_t cmd;
459843e1988Sjohnlev     uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
460843e1988Sjohnlev     union {
461843e1988Sjohnlev         struct xen_sysctl_readconsole       readconsole;
462843e1988Sjohnlev         struct xen_sysctl_tbuf_op           tbuf_op;
463843e1988Sjohnlev         struct xen_sysctl_physinfo          physinfo;
464843e1988Sjohnlev         struct xen_sysctl_sched_id          sched_id;
465843e1988Sjohnlev         struct xen_sysctl_perfc_op          perfc_op;
466843e1988Sjohnlev         struct xen_sysctl_getdomaininfolist getdomaininfolist;
467a576ab5bSrab         struct xen_sysctl_debug_keys        debug_keys;
468a576ab5bSrab         struct xen_sysctl_getcpuinfo        getcpuinfo;
469349b53ddSStuart Maybee         struct xen_sysctl_availheap         availheap;
470349b53ddSStuart Maybee         struct xen_sysctl_get_pmstat        get_pmstat;
471349b53ddSStuart Maybee         struct xen_sysctl_cpu_hotplug       cpu_hotplug;
472*ad09f8b8SMark Johnson         struct xen_sysctl_pm_op             pm_op;
473*ad09f8b8SMark Johnson         struct xen_sysctl_page_offline_op   page_offline;
474843e1988Sjohnlev         uint8_t                             pad[128];
475843e1988Sjohnlev     } u;
476843e1988Sjohnlev };
477843e1988Sjohnlev typedef struct xen_sysctl xen_sysctl_t;
478843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_t);
479843e1988Sjohnlev 
480843e1988Sjohnlev #endif /* __XEN_PUBLIC_SYSCTL_H__ */
481843e1988Sjohnlev 
482843e1988Sjohnlev /*
483843e1988Sjohnlev  * Local variables:
484843e1988Sjohnlev  * mode: C
485843e1988Sjohnlev  * c-set-style: "BSD"
486843e1988Sjohnlev  * c-basic-offset: 4
487843e1988Sjohnlev  * tab-width: 4
488843e1988Sjohnlev  * indent-tabs-mode: nil
489843e1988Sjohnlev  * End:
490843e1988Sjohnlev  */
491