1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * platform.h 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Hardware platform operations. Intended for use by domain-0 kernel. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a copy 7*4882a593Smuzhiyun * of this software and associated documentation files (the "Software"), to 8*4882a593Smuzhiyun * deal in the Software without restriction, including without limitation the 9*4882a593Smuzhiyun * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10*4882a593Smuzhiyun * sell copies of the Software, and to permit persons to whom the Software is 11*4882a593Smuzhiyun * furnished to do so, subject to the following conditions: 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * The above copyright notice and this permission notice shall be included in 14*4882a593Smuzhiyun * all copies or substantial portions of the Software. 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19*4882a593Smuzhiyun * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22*4882a593Smuzhiyun * DEALINGS IN THE SOFTWARE. 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * Copyright (c) 2002-2006, K Fraser 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #ifndef __XEN_PUBLIC_PLATFORM_H__ 28*4882a593Smuzhiyun #define __XEN_PUBLIC_PLATFORM_H__ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #include <xen/interface/xen.h> 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define XENPF_INTERFACE_VERSION 0x03000001 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* 35*4882a593Smuzhiyun * Set clock such that it would read <secs,nsecs> after 00:00:00 UTC, 36*4882a593Smuzhiyun * 1 January, 1970 if the current system time was <system_time>. 37*4882a593Smuzhiyun */ 38*4882a593Smuzhiyun #define XENPF_settime32 17 39*4882a593Smuzhiyun struct xenpf_settime32 { 40*4882a593Smuzhiyun /* IN variables. */ 41*4882a593Smuzhiyun uint32_t secs; 42*4882a593Smuzhiyun uint32_t nsecs; 43*4882a593Smuzhiyun uint64_t system_time; 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_settime32_t); 46*4882a593Smuzhiyun #define XENPF_settime64 62 47*4882a593Smuzhiyun struct xenpf_settime64 { 48*4882a593Smuzhiyun /* IN variables. */ 49*4882a593Smuzhiyun uint64_t secs; 50*4882a593Smuzhiyun uint32_t nsecs; 51*4882a593Smuzhiyun uint32_t mbz; 52*4882a593Smuzhiyun uint64_t system_time; 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_settime64_t); 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* 57*4882a593Smuzhiyun * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type. 58*4882a593Smuzhiyun * On x86, @type is an architecture-defined MTRR memory type. 59*4882a593Smuzhiyun * On success, returns the MTRR that was used (@reg) and a handle that can 60*4882a593Smuzhiyun * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting. 61*4882a593Smuzhiyun * (x86-specific). 62*4882a593Smuzhiyun */ 63*4882a593Smuzhiyun #define XENPF_add_memtype 31 64*4882a593Smuzhiyun struct xenpf_add_memtype { 65*4882a593Smuzhiyun /* IN variables. */ 66*4882a593Smuzhiyun xen_pfn_t mfn; 67*4882a593Smuzhiyun uint64_t nr_mfns; 68*4882a593Smuzhiyun uint32_t type; 69*4882a593Smuzhiyun /* OUT variables. */ 70*4882a593Smuzhiyun uint32_t handle; 71*4882a593Smuzhiyun uint32_t reg; 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_add_memtype_t); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* 76*4882a593Smuzhiyun * Tear down an existing memory-range type. If @handle is remembered then it 77*4882a593Smuzhiyun * should be passed in to accurately tear down the correct setting (in case 78*4882a593Smuzhiyun * of overlapping memory regions with differing types). If it is not known 79*4882a593Smuzhiyun * then @handle should be set to zero. In all cases @reg must be set. 80*4882a593Smuzhiyun * (x86-specific). 81*4882a593Smuzhiyun */ 82*4882a593Smuzhiyun #define XENPF_del_memtype 32 83*4882a593Smuzhiyun struct xenpf_del_memtype { 84*4882a593Smuzhiyun /* IN variables. */ 85*4882a593Smuzhiyun uint32_t handle; 86*4882a593Smuzhiyun uint32_t reg; 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_del_memtype_t); 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* Read current type of an MTRR (x86-specific). */ 91*4882a593Smuzhiyun #define XENPF_read_memtype 33 92*4882a593Smuzhiyun struct xenpf_read_memtype { 93*4882a593Smuzhiyun /* IN variables. */ 94*4882a593Smuzhiyun uint32_t reg; 95*4882a593Smuzhiyun /* OUT variables. */ 96*4882a593Smuzhiyun xen_pfn_t mfn; 97*4882a593Smuzhiyun uint64_t nr_mfns; 98*4882a593Smuzhiyun uint32_t type; 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_read_memtype_t); 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #define XENPF_microcode_update 35 103*4882a593Smuzhiyun struct xenpf_microcode_update { 104*4882a593Smuzhiyun /* IN variables. */ 105*4882a593Smuzhiyun GUEST_HANDLE(void) data; /* Pointer to microcode data */ 106*4882a593Smuzhiyun uint32_t length; /* Length of microcode data. */ 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_microcode_update_t); 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #define XENPF_platform_quirk 39 111*4882a593Smuzhiyun #define QUIRK_NOIRQBALANCING 1 /* Do not restrict IO-APIC RTE targets */ 112*4882a593Smuzhiyun #define QUIRK_IOAPIC_BAD_REGSEL 2 /* IO-APIC REGSEL forgets its value */ 113*4882a593Smuzhiyun #define QUIRK_IOAPIC_GOOD_REGSEL 3 /* IO-APIC REGSEL behaves properly */ 114*4882a593Smuzhiyun struct xenpf_platform_quirk { 115*4882a593Smuzhiyun /* IN variables. */ 116*4882a593Smuzhiyun uint32_t quirk_id; 117*4882a593Smuzhiyun }; 118*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_platform_quirk_t); 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define XENPF_efi_runtime_call 49 121*4882a593Smuzhiyun #define XEN_EFI_get_time 1 122*4882a593Smuzhiyun #define XEN_EFI_set_time 2 123*4882a593Smuzhiyun #define XEN_EFI_get_wakeup_time 3 124*4882a593Smuzhiyun #define XEN_EFI_set_wakeup_time 4 125*4882a593Smuzhiyun #define XEN_EFI_get_next_high_monotonic_count 5 126*4882a593Smuzhiyun #define XEN_EFI_get_variable 6 127*4882a593Smuzhiyun #define XEN_EFI_set_variable 7 128*4882a593Smuzhiyun #define XEN_EFI_get_next_variable_name 8 129*4882a593Smuzhiyun #define XEN_EFI_query_variable_info 9 130*4882a593Smuzhiyun #define XEN_EFI_query_capsule_capabilities 10 131*4882a593Smuzhiyun #define XEN_EFI_update_capsule 11 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun struct xenpf_efi_runtime_call { 134*4882a593Smuzhiyun uint32_t function; 135*4882a593Smuzhiyun /* 136*4882a593Smuzhiyun * This field is generally used for per sub-function flags (defined 137*4882a593Smuzhiyun * below), except for the XEN_EFI_get_next_high_monotonic_count case, 138*4882a593Smuzhiyun * where it holds the single returned value. 139*4882a593Smuzhiyun */ 140*4882a593Smuzhiyun uint32_t misc; 141*4882a593Smuzhiyun xen_ulong_t status; 142*4882a593Smuzhiyun union { 143*4882a593Smuzhiyun #define XEN_EFI_GET_TIME_SET_CLEARS_NS 0x00000001 144*4882a593Smuzhiyun struct { 145*4882a593Smuzhiyun struct xenpf_efi_time { 146*4882a593Smuzhiyun uint16_t year; 147*4882a593Smuzhiyun uint8_t month; 148*4882a593Smuzhiyun uint8_t day; 149*4882a593Smuzhiyun uint8_t hour; 150*4882a593Smuzhiyun uint8_t min; 151*4882a593Smuzhiyun uint8_t sec; 152*4882a593Smuzhiyun uint32_t ns; 153*4882a593Smuzhiyun int16_t tz; 154*4882a593Smuzhiyun uint8_t daylight; 155*4882a593Smuzhiyun } time; 156*4882a593Smuzhiyun uint32_t resolution; 157*4882a593Smuzhiyun uint32_t accuracy; 158*4882a593Smuzhiyun } get_time; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun struct xenpf_efi_time set_time; 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun #define XEN_EFI_GET_WAKEUP_TIME_ENABLED 0x00000001 163*4882a593Smuzhiyun #define XEN_EFI_GET_WAKEUP_TIME_PENDING 0x00000002 164*4882a593Smuzhiyun struct xenpf_efi_time get_wakeup_time; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun #define XEN_EFI_SET_WAKEUP_TIME_ENABLE 0x00000001 167*4882a593Smuzhiyun #define XEN_EFI_SET_WAKEUP_TIME_ENABLE_ONLY 0x00000002 168*4882a593Smuzhiyun struct xenpf_efi_time set_wakeup_time; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #define XEN_EFI_VARIABLE_NON_VOLATILE 0x00000001 171*4882a593Smuzhiyun #define XEN_EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002 172*4882a593Smuzhiyun #define XEN_EFI_VARIABLE_RUNTIME_ACCESS 0x00000004 173*4882a593Smuzhiyun struct { 174*4882a593Smuzhiyun GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ 175*4882a593Smuzhiyun xen_ulong_t size; 176*4882a593Smuzhiyun GUEST_HANDLE(void) data; 177*4882a593Smuzhiyun struct xenpf_efi_guid { 178*4882a593Smuzhiyun uint32_t data1; 179*4882a593Smuzhiyun uint16_t data2; 180*4882a593Smuzhiyun uint16_t data3; 181*4882a593Smuzhiyun uint8_t data4[8]; 182*4882a593Smuzhiyun } vendor_guid; 183*4882a593Smuzhiyun } get_variable, set_variable; 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun struct { 186*4882a593Smuzhiyun xen_ulong_t size; 187*4882a593Smuzhiyun GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ 188*4882a593Smuzhiyun struct xenpf_efi_guid vendor_guid; 189*4882a593Smuzhiyun } get_next_variable_name; 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun struct { 192*4882a593Smuzhiyun uint32_t attr; 193*4882a593Smuzhiyun uint64_t max_store_size; 194*4882a593Smuzhiyun uint64_t remain_store_size; 195*4882a593Smuzhiyun uint64_t max_size; 196*4882a593Smuzhiyun } query_variable_info; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun struct { 199*4882a593Smuzhiyun GUEST_HANDLE(void) capsule_header_array; 200*4882a593Smuzhiyun xen_ulong_t capsule_count; 201*4882a593Smuzhiyun uint64_t max_capsule_size; 202*4882a593Smuzhiyun uint32_t reset_type; 203*4882a593Smuzhiyun } query_capsule_capabilities; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun struct { 206*4882a593Smuzhiyun GUEST_HANDLE(void) capsule_header_array; 207*4882a593Smuzhiyun xen_ulong_t capsule_count; 208*4882a593Smuzhiyun uint64_t sg_list; /* machine address */ 209*4882a593Smuzhiyun } update_capsule; 210*4882a593Smuzhiyun } u; 211*4882a593Smuzhiyun }; 212*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_efi_runtime_call); 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define XEN_FW_EFI_VERSION 0 215*4882a593Smuzhiyun #define XEN_FW_EFI_CONFIG_TABLE 1 216*4882a593Smuzhiyun #define XEN_FW_EFI_VENDOR 2 217*4882a593Smuzhiyun #define XEN_FW_EFI_MEM_INFO 3 218*4882a593Smuzhiyun #define XEN_FW_EFI_RT_VERSION 4 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun #define XENPF_firmware_info 50 221*4882a593Smuzhiyun #define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ 222*4882a593Smuzhiyun #define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ 223*4882a593Smuzhiyun #define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ 224*4882a593Smuzhiyun #define XEN_FW_EFI_INFO 4 /* from EFI */ 225*4882a593Smuzhiyun #define XEN_FW_KBD_SHIFT_FLAGS 5 /* Int16, Fn02: Get keyboard shift flags. */ 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun struct xenpf_firmware_info { 228*4882a593Smuzhiyun /* IN variables. */ 229*4882a593Smuzhiyun uint32_t type; 230*4882a593Smuzhiyun uint32_t index; 231*4882a593Smuzhiyun /* OUT variables. */ 232*4882a593Smuzhiyun union { 233*4882a593Smuzhiyun struct { 234*4882a593Smuzhiyun /* Int13, Fn48: Check Extensions Present. */ 235*4882a593Smuzhiyun uint8_t device; /* %dl: bios device number */ 236*4882a593Smuzhiyun uint8_t version; /* %ah: major version */ 237*4882a593Smuzhiyun uint16_t interface_support; /* %cx: support bitmap */ 238*4882a593Smuzhiyun /* Int13, Fn08: Legacy Get Device Parameters. */ 239*4882a593Smuzhiyun uint16_t legacy_max_cylinder; /* %cl[7:6]:%ch: max cyl # */ 240*4882a593Smuzhiyun uint8_t legacy_max_head; /* %dh: max head # */ 241*4882a593Smuzhiyun uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector # */ 242*4882a593Smuzhiyun /* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */ 243*4882a593Smuzhiyun /* NB. First uint16_t of buffer must be set to buffer size. */ 244*4882a593Smuzhiyun GUEST_HANDLE(void) edd_params; 245*4882a593Smuzhiyun } disk_info; /* XEN_FW_DISK_INFO */ 246*4882a593Smuzhiyun struct { 247*4882a593Smuzhiyun uint8_t device; /* bios device number */ 248*4882a593Smuzhiyun uint32_t mbr_signature; /* offset 0x1b8 in mbr */ 249*4882a593Smuzhiyun } disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */ 250*4882a593Smuzhiyun struct { 251*4882a593Smuzhiyun /* Int10, AX=4F15: Get EDID info. */ 252*4882a593Smuzhiyun uint8_t capabilities; 253*4882a593Smuzhiyun uint8_t edid_transfer_time; 254*4882a593Smuzhiyun /* must refer to 128-byte buffer */ 255*4882a593Smuzhiyun GUEST_HANDLE(uchar) edid; 256*4882a593Smuzhiyun } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun union xenpf_efi_info { 259*4882a593Smuzhiyun uint32_t version; 260*4882a593Smuzhiyun struct { 261*4882a593Smuzhiyun uint64_t addr; /* EFI_CONFIGURATION_TABLE */ 262*4882a593Smuzhiyun uint32_t nent; 263*4882a593Smuzhiyun } cfg; 264*4882a593Smuzhiyun struct { 265*4882a593Smuzhiyun uint32_t revision; 266*4882a593Smuzhiyun uint32_t bufsz; /* input, in bytes */ 267*4882a593Smuzhiyun GUEST_HANDLE(void) name; 268*4882a593Smuzhiyun /* UCS-2/UTF-16 string */ 269*4882a593Smuzhiyun } vendor; 270*4882a593Smuzhiyun struct { 271*4882a593Smuzhiyun uint64_t addr; 272*4882a593Smuzhiyun uint64_t size; 273*4882a593Smuzhiyun uint64_t attr; 274*4882a593Smuzhiyun uint32_t type; 275*4882a593Smuzhiyun } mem; 276*4882a593Smuzhiyun } efi_info; /* XEN_FW_EFI_INFO */ 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */ 279*4882a593Smuzhiyun } u; 280*4882a593Smuzhiyun }; 281*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t); 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun #define XENPF_enter_acpi_sleep 51 284*4882a593Smuzhiyun struct xenpf_enter_acpi_sleep { 285*4882a593Smuzhiyun /* IN variables */ 286*4882a593Smuzhiyun uint16_t val_a; /* PM1a control / sleep type A. */ 287*4882a593Smuzhiyun uint16_t val_b; /* PM1b control / sleep type B. */ 288*4882a593Smuzhiyun uint32_t sleep_state; /* Which state to enter (Sn). */ 289*4882a593Smuzhiyun #define XENPF_ACPI_SLEEP_EXTENDED 0x00000001 290*4882a593Smuzhiyun uint32_t flags; /* XENPF_ACPI_SLEEP_*. */ 291*4882a593Smuzhiyun }; 292*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_enter_acpi_sleep_t); 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun #define XENPF_change_freq 52 295*4882a593Smuzhiyun struct xenpf_change_freq { 296*4882a593Smuzhiyun /* IN variables */ 297*4882a593Smuzhiyun uint32_t flags; /* Must be zero. */ 298*4882a593Smuzhiyun uint32_t cpu; /* Physical cpu. */ 299*4882a593Smuzhiyun uint64_t freq; /* New frequency (Hz). */ 300*4882a593Smuzhiyun }; 301*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_change_freq_t); 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun /* 304*4882a593Smuzhiyun * Get idle times (nanoseconds since boot) for physical CPUs specified in the 305*4882a593Smuzhiyun * @cpumap_bitmap with range [0..@cpumap_nr_cpus-1]. The @idletime array is 306*4882a593Smuzhiyun * indexed by CPU number; only entries with the corresponding @cpumap_bitmap 307*4882a593Smuzhiyun * bit set are written to. On return, @cpumap_bitmap is modified so that any 308*4882a593Smuzhiyun * non-existent CPUs are cleared. Such CPUs have their @idletime array entry 309*4882a593Smuzhiyun * cleared. 310*4882a593Smuzhiyun */ 311*4882a593Smuzhiyun #define XENPF_getidletime 53 312*4882a593Smuzhiyun struct xenpf_getidletime { 313*4882a593Smuzhiyun /* IN/OUT variables */ 314*4882a593Smuzhiyun /* IN: CPUs to interrogate; OUT: subset of IN which are present */ 315*4882a593Smuzhiyun GUEST_HANDLE(uchar) cpumap_bitmap; 316*4882a593Smuzhiyun /* IN variables */ 317*4882a593Smuzhiyun /* Size of cpumap bitmap. */ 318*4882a593Smuzhiyun uint32_t cpumap_nr_cpus; 319*4882a593Smuzhiyun /* Must be indexable for every cpu in cpumap_bitmap. */ 320*4882a593Smuzhiyun GUEST_HANDLE(uint64_t) idletime; 321*4882a593Smuzhiyun /* OUT variables */ 322*4882a593Smuzhiyun /* System time when the idletime snapshots were taken. */ 323*4882a593Smuzhiyun uint64_t now; 324*4882a593Smuzhiyun }; 325*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_getidletime_t); 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun #define XENPF_set_processor_pminfo 54 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun /* ability bits */ 330*4882a593Smuzhiyun #define XEN_PROCESSOR_PM_CX 1 331*4882a593Smuzhiyun #define XEN_PROCESSOR_PM_PX 2 332*4882a593Smuzhiyun #define XEN_PROCESSOR_PM_TX 4 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun /* cmd type */ 335*4882a593Smuzhiyun #define XEN_PM_CX 0 336*4882a593Smuzhiyun #define XEN_PM_PX 1 337*4882a593Smuzhiyun #define XEN_PM_TX 2 338*4882a593Smuzhiyun #define XEN_PM_PDC 3 339*4882a593Smuzhiyun /* Px sub info type */ 340*4882a593Smuzhiyun #define XEN_PX_PCT 1 341*4882a593Smuzhiyun #define XEN_PX_PSS 2 342*4882a593Smuzhiyun #define XEN_PX_PPC 4 343*4882a593Smuzhiyun #define XEN_PX_PSD 8 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun struct xen_power_register { 346*4882a593Smuzhiyun uint32_t space_id; 347*4882a593Smuzhiyun uint32_t bit_width; 348*4882a593Smuzhiyun uint32_t bit_offset; 349*4882a593Smuzhiyun uint32_t access_size; 350*4882a593Smuzhiyun uint64_t address; 351*4882a593Smuzhiyun }; 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun struct xen_processor_csd { 354*4882a593Smuzhiyun uint32_t domain; /* domain number of one dependent group */ 355*4882a593Smuzhiyun uint32_t coord_type; /* coordination type */ 356*4882a593Smuzhiyun uint32_t num; /* number of processors in same domain */ 357*4882a593Smuzhiyun }; 358*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xen_processor_csd); 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun struct xen_processor_cx { 361*4882a593Smuzhiyun struct xen_power_register reg; /* GAS for Cx trigger register */ 362*4882a593Smuzhiyun uint8_t type; /* cstate value, c0: 0, c1: 1, ... */ 363*4882a593Smuzhiyun uint32_t latency; /* worst latency (ms) to enter/exit this cstate */ 364*4882a593Smuzhiyun uint32_t power; /* average power consumption(mW) */ 365*4882a593Smuzhiyun uint32_t dpcnt; /* number of dependency entries */ 366*4882a593Smuzhiyun GUEST_HANDLE(xen_processor_csd) dp; /* NULL if no dependency */ 367*4882a593Smuzhiyun }; 368*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xen_processor_cx); 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun struct xen_processor_flags { 371*4882a593Smuzhiyun uint32_t bm_control:1; 372*4882a593Smuzhiyun uint32_t bm_check:1; 373*4882a593Smuzhiyun uint32_t has_cst:1; 374*4882a593Smuzhiyun uint32_t power_setup_done:1; 375*4882a593Smuzhiyun uint32_t bm_rld_set:1; 376*4882a593Smuzhiyun }; 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun struct xen_processor_power { 379*4882a593Smuzhiyun uint32_t count; /* number of C state entries in array below */ 380*4882a593Smuzhiyun struct xen_processor_flags flags; /* global flags of this processor */ 381*4882a593Smuzhiyun GUEST_HANDLE(xen_processor_cx) states; /* supported c states */ 382*4882a593Smuzhiyun }; 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun struct xen_pct_register { 385*4882a593Smuzhiyun uint8_t descriptor; 386*4882a593Smuzhiyun uint16_t length; 387*4882a593Smuzhiyun uint8_t space_id; 388*4882a593Smuzhiyun uint8_t bit_width; 389*4882a593Smuzhiyun uint8_t bit_offset; 390*4882a593Smuzhiyun uint8_t reserved; 391*4882a593Smuzhiyun uint64_t address; 392*4882a593Smuzhiyun }; 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun struct xen_processor_px { 395*4882a593Smuzhiyun uint64_t core_frequency; /* megahertz */ 396*4882a593Smuzhiyun uint64_t power; /* milliWatts */ 397*4882a593Smuzhiyun uint64_t transition_latency; /* microseconds */ 398*4882a593Smuzhiyun uint64_t bus_master_latency; /* microseconds */ 399*4882a593Smuzhiyun uint64_t control; /* control value */ 400*4882a593Smuzhiyun uint64_t status; /* success indicator */ 401*4882a593Smuzhiyun }; 402*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xen_processor_px); 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun struct xen_psd_package { 405*4882a593Smuzhiyun uint64_t num_entries; 406*4882a593Smuzhiyun uint64_t revision; 407*4882a593Smuzhiyun uint64_t domain; 408*4882a593Smuzhiyun uint64_t coord_type; 409*4882a593Smuzhiyun uint64_t num_processors; 410*4882a593Smuzhiyun }; 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun struct xen_processor_performance { 413*4882a593Smuzhiyun uint32_t flags; /* flag for Px sub info type */ 414*4882a593Smuzhiyun uint32_t platform_limit; /* Platform limitation on freq usage */ 415*4882a593Smuzhiyun struct xen_pct_register control_register; 416*4882a593Smuzhiyun struct xen_pct_register status_register; 417*4882a593Smuzhiyun uint32_t state_count; /* total available performance states */ 418*4882a593Smuzhiyun GUEST_HANDLE(xen_processor_px) states; 419*4882a593Smuzhiyun struct xen_psd_package domain_info; 420*4882a593Smuzhiyun uint32_t shared_type; /* coordination type of this processor */ 421*4882a593Smuzhiyun }; 422*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xen_processor_performance); 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun struct xenpf_set_processor_pminfo { 425*4882a593Smuzhiyun /* IN variables */ 426*4882a593Smuzhiyun uint32_t id; /* ACPI CPU ID */ 427*4882a593Smuzhiyun uint32_t type; /* {XEN_PM_CX, XEN_PM_PX} */ 428*4882a593Smuzhiyun union { 429*4882a593Smuzhiyun struct xen_processor_power power;/* Cx: _CST/_CSD */ 430*4882a593Smuzhiyun struct xen_processor_performance perf; /* Px: _PPC/_PCT/_PSS/_PSD */ 431*4882a593Smuzhiyun GUEST_HANDLE(uint32_t) pdc; 432*4882a593Smuzhiyun }; 433*4882a593Smuzhiyun }; 434*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_set_processor_pminfo); 435*4882a593Smuzhiyun 436*4882a593Smuzhiyun #define XENPF_get_cpuinfo 55 437*4882a593Smuzhiyun struct xenpf_pcpuinfo { 438*4882a593Smuzhiyun /* IN */ 439*4882a593Smuzhiyun uint32_t xen_cpuid; 440*4882a593Smuzhiyun /* OUT */ 441*4882a593Smuzhiyun /* The maxium cpu_id that is present */ 442*4882a593Smuzhiyun uint32_t max_present; 443*4882a593Smuzhiyun #define XEN_PCPU_FLAGS_ONLINE 1 444*4882a593Smuzhiyun /* Correponding xen_cpuid is not present*/ 445*4882a593Smuzhiyun #define XEN_PCPU_FLAGS_INVALID 2 446*4882a593Smuzhiyun uint32_t flags; 447*4882a593Smuzhiyun uint32_t apic_id; 448*4882a593Smuzhiyun uint32_t acpi_id; 449*4882a593Smuzhiyun }; 450*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_pcpuinfo); 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun #define XENPF_cpu_online 56 453*4882a593Smuzhiyun #define XENPF_cpu_offline 57 454*4882a593Smuzhiyun struct xenpf_cpu_ol { 455*4882a593Smuzhiyun uint32_t cpuid; 456*4882a593Smuzhiyun }; 457*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_cpu_ol); 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun #define XENPF_cpu_hotadd 58 460*4882a593Smuzhiyun struct xenpf_cpu_hotadd { 461*4882a593Smuzhiyun uint32_t apic_id; 462*4882a593Smuzhiyun uint32_t acpi_id; 463*4882a593Smuzhiyun uint32_t pxm; 464*4882a593Smuzhiyun }; 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun #define XENPF_mem_hotadd 59 467*4882a593Smuzhiyun struct xenpf_mem_hotadd { 468*4882a593Smuzhiyun uint64_t spfn; 469*4882a593Smuzhiyun uint64_t epfn; 470*4882a593Smuzhiyun uint32_t pxm; 471*4882a593Smuzhiyun uint32_t flags; 472*4882a593Smuzhiyun }; 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun #define XENPF_core_parking 60 475*4882a593Smuzhiyun struct xenpf_core_parking { 476*4882a593Smuzhiyun /* IN variables */ 477*4882a593Smuzhiyun #define XEN_CORE_PARKING_SET 1 478*4882a593Smuzhiyun #define XEN_CORE_PARKING_GET 2 479*4882a593Smuzhiyun uint32_t type; 480*4882a593Smuzhiyun /* IN variables: set cpu nums expected to be idled */ 481*4882a593Smuzhiyun /* OUT variables: get cpu nums actually be idled */ 482*4882a593Smuzhiyun uint32_t idle_nums; 483*4882a593Smuzhiyun }; 484*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_core_parking); 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun #define XENPF_get_symbol 63 487*4882a593Smuzhiyun struct xenpf_symdata { 488*4882a593Smuzhiyun /* IN/OUT variables */ 489*4882a593Smuzhiyun uint32_t namelen; /* size of 'name' buffer */ 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun /* IN/OUT variables */ 492*4882a593Smuzhiyun uint32_t symnum; /* IN: Symbol to read */ 493*4882a593Smuzhiyun /* OUT: Next available symbol. If same as IN */ 494*4882a593Smuzhiyun /* then we reached the end */ 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun /* OUT variables */ 497*4882a593Smuzhiyun GUEST_HANDLE(char) name; 498*4882a593Smuzhiyun uint64_t address; 499*4882a593Smuzhiyun char type; 500*4882a593Smuzhiyun }; 501*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xenpf_symdata); 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun struct xen_platform_op { 504*4882a593Smuzhiyun uint32_t cmd; 505*4882a593Smuzhiyun uint32_t interface_version; /* XENPF_INTERFACE_VERSION */ 506*4882a593Smuzhiyun union { 507*4882a593Smuzhiyun struct xenpf_settime32 settime32; 508*4882a593Smuzhiyun struct xenpf_settime64 settime64; 509*4882a593Smuzhiyun struct xenpf_add_memtype add_memtype; 510*4882a593Smuzhiyun struct xenpf_del_memtype del_memtype; 511*4882a593Smuzhiyun struct xenpf_read_memtype read_memtype; 512*4882a593Smuzhiyun struct xenpf_microcode_update microcode; 513*4882a593Smuzhiyun struct xenpf_platform_quirk platform_quirk; 514*4882a593Smuzhiyun struct xenpf_efi_runtime_call efi_runtime_call; 515*4882a593Smuzhiyun struct xenpf_firmware_info firmware_info; 516*4882a593Smuzhiyun struct xenpf_enter_acpi_sleep enter_acpi_sleep; 517*4882a593Smuzhiyun struct xenpf_change_freq change_freq; 518*4882a593Smuzhiyun struct xenpf_getidletime getidletime; 519*4882a593Smuzhiyun struct xenpf_set_processor_pminfo set_pminfo; 520*4882a593Smuzhiyun struct xenpf_pcpuinfo pcpu_info; 521*4882a593Smuzhiyun struct xenpf_cpu_ol cpu_ol; 522*4882a593Smuzhiyun struct xenpf_cpu_hotadd cpu_add; 523*4882a593Smuzhiyun struct xenpf_mem_hotadd mem_add; 524*4882a593Smuzhiyun struct xenpf_core_parking core_parking; 525*4882a593Smuzhiyun struct xenpf_symdata symdata; 526*4882a593Smuzhiyun uint8_t pad[128]; 527*4882a593Smuzhiyun } u; 528*4882a593Smuzhiyun }; 529*4882a593Smuzhiyun DEFINE_GUEST_HANDLE_STRUCT(xen_platform_op_t); 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun #endif /* __XEN_PUBLIC_PLATFORM_H__ */ 532