162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */ 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * platform.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Hardware platform operations. Intended for use by domain-0 kernel. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (c) 2002-2006, K Fraser 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef __XEN_PUBLIC_PLATFORM_H__ 1162306a36Sopenharmony_ci#define __XEN_PUBLIC_PLATFORM_H__ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <xen/interface/xen.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define XENPF_INTERFACE_VERSION 0x03000001 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* 1862306a36Sopenharmony_ci * Set clock such that it would read <secs,nsecs> after 00:00:00 UTC, 1962306a36Sopenharmony_ci * 1 January, 1970 if the current system time was <system_time>. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci#define XENPF_settime32 17 2262306a36Sopenharmony_cistruct xenpf_settime32 { 2362306a36Sopenharmony_ci /* IN variables. */ 2462306a36Sopenharmony_ci uint32_t secs; 2562306a36Sopenharmony_ci uint32_t nsecs; 2662306a36Sopenharmony_ci uint64_t system_time; 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_settime32_t); 2962306a36Sopenharmony_ci#define XENPF_settime64 62 3062306a36Sopenharmony_cistruct xenpf_settime64 { 3162306a36Sopenharmony_ci /* IN variables. */ 3262306a36Sopenharmony_ci uint64_t secs; 3362306a36Sopenharmony_ci uint32_t nsecs; 3462306a36Sopenharmony_ci uint32_t mbz; 3562306a36Sopenharmony_ci uint64_t system_time; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_settime64_t); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* 4062306a36Sopenharmony_ci * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type. 4162306a36Sopenharmony_ci * On x86, @type is an architecture-defined MTRR memory type. 4262306a36Sopenharmony_ci * On success, returns the MTRR that was used (@reg) and a handle that can 4362306a36Sopenharmony_ci * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting. 4462306a36Sopenharmony_ci * (x86-specific). 4562306a36Sopenharmony_ci */ 4662306a36Sopenharmony_ci#define XENPF_add_memtype 31 4762306a36Sopenharmony_cistruct xenpf_add_memtype { 4862306a36Sopenharmony_ci /* IN variables. */ 4962306a36Sopenharmony_ci xen_pfn_t mfn; 5062306a36Sopenharmony_ci uint64_t nr_mfns; 5162306a36Sopenharmony_ci uint32_t type; 5262306a36Sopenharmony_ci /* OUT variables. */ 5362306a36Sopenharmony_ci uint32_t handle; 5462306a36Sopenharmony_ci uint32_t reg; 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_add_memtype_t); 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/* 5962306a36Sopenharmony_ci * Tear down an existing memory-range type. If @handle is remembered then it 6062306a36Sopenharmony_ci * should be passed in to accurately tear down the correct setting (in case 6162306a36Sopenharmony_ci * of overlapping memory regions with differing types). If it is not known 6262306a36Sopenharmony_ci * then @handle should be set to zero. In all cases @reg must be set. 6362306a36Sopenharmony_ci * (x86-specific). 6462306a36Sopenharmony_ci */ 6562306a36Sopenharmony_ci#define XENPF_del_memtype 32 6662306a36Sopenharmony_cistruct xenpf_del_memtype { 6762306a36Sopenharmony_ci /* IN variables. */ 6862306a36Sopenharmony_ci uint32_t handle; 6962306a36Sopenharmony_ci uint32_t reg; 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_del_memtype_t); 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/* Read current type of an MTRR (x86-specific). */ 7462306a36Sopenharmony_ci#define XENPF_read_memtype 33 7562306a36Sopenharmony_cistruct xenpf_read_memtype { 7662306a36Sopenharmony_ci /* IN variables. */ 7762306a36Sopenharmony_ci uint32_t reg; 7862306a36Sopenharmony_ci /* OUT variables. */ 7962306a36Sopenharmony_ci xen_pfn_t mfn; 8062306a36Sopenharmony_ci uint64_t nr_mfns; 8162306a36Sopenharmony_ci uint32_t type; 8262306a36Sopenharmony_ci}; 8362306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_read_memtype_t); 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define XENPF_microcode_update 35 8662306a36Sopenharmony_cistruct xenpf_microcode_update { 8762306a36Sopenharmony_ci /* IN variables. */ 8862306a36Sopenharmony_ci GUEST_HANDLE(void) data; /* Pointer to microcode data */ 8962306a36Sopenharmony_ci uint32_t length; /* Length of microcode data. */ 9062306a36Sopenharmony_ci}; 9162306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_microcode_update_t); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#define XENPF_platform_quirk 39 9462306a36Sopenharmony_ci#define QUIRK_NOIRQBALANCING 1 /* Do not restrict IO-APIC RTE targets */ 9562306a36Sopenharmony_ci#define QUIRK_IOAPIC_BAD_REGSEL 2 /* IO-APIC REGSEL forgets its value */ 9662306a36Sopenharmony_ci#define QUIRK_IOAPIC_GOOD_REGSEL 3 /* IO-APIC REGSEL behaves properly */ 9762306a36Sopenharmony_cistruct xenpf_platform_quirk { 9862306a36Sopenharmony_ci /* IN variables. */ 9962306a36Sopenharmony_ci uint32_t quirk_id; 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_platform_quirk_t); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#define XENPF_efi_runtime_call 49 10462306a36Sopenharmony_ci#define XEN_EFI_get_time 1 10562306a36Sopenharmony_ci#define XEN_EFI_set_time 2 10662306a36Sopenharmony_ci#define XEN_EFI_get_wakeup_time 3 10762306a36Sopenharmony_ci#define XEN_EFI_set_wakeup_time 4 10862306a36Sopenharmony_ci#define XEN_EFI_get_next_high_monotonic_count 5 10962306a36Sopenharmony_ci#define XEN_EFI_get_variable 6 11062306a36Sopenharmony_ci#define XEN_EFI_set_variable 7 11162306a36Sopenharmony_ci#define XEN_EFI_get_next_variable_name 8 11262306a36Sopenharmony_ci#define XEN_EFI_query_variable_info 9 11362306a36Sopenharmony_ci#define XEN_EFI_query_capsule_capabilities 10 11462306a36Sopenharmony_ci#define XEN_EFI_update_capsule 11 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistruct xenpf_efi_runtime_call { 11762306a36Sopenharmony_ci uint32_t function; 11862306a36Sopenharmony_ci /* 11962306a36Sopenharmony_ci * This field is generally used for per sub-function flags (defined 12062306a36Sopenharmony_ci * below), except for the XEN_EFI_get_next_high_monotonic_count case, 12162306a36Sopenharmony_ci * where it holds the single returned value. 12262306a36Sopenharmony_ci */ 12362306a36Sopenharmony_ci uint32_t misc; 12462306a36Sopenharmony_ci xen_ulong_t status; 12562306a36Sopenharmony_ci union { 12662306a36Sopenharmony_ci#define XEN_EFI_GET_TIME_SET_CLEARS_NS 0x00000001 12762306a36Sopenharmony_ci struct { 12862306a36Sopenharmony_ci struct xenpf_efi_time { 12962306a36Sopenharmony_ci uint16_t year; 13062306a36Sopenharmony_ci uint8_t month; 13162306a36Sopenharmony_ci uint8_t day; 13262306a36Sopenharmony_ci uint8_t hour; 13362306a36Sopenharmony_ci uint8_t min; 13462306a36Sopenharmony_ci uint8_t sec; 13562306a36Sopenharmony_ci uint32_t ns; 13662306a36Sopenharmony_ci int16_t tz; 13762306a36Sopenharmony_ci uint8_t daylight; 13862306a36Sopenharmony_ci } time; 13962306a36Sopenharmony_ci uint32_t resolution; 14062306a36Sopenharmony_ci uint32_t accuracy; 14162306a36Sopenharmony_ci } get_time; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci struct xenpf_efi_time set_time; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci#define XEN_EFI_GET_WAKEUP_TIME_ENABLED 0x00000001 14662306a36Sopenharmony_ci#define XEN_EFI_GET_WAKEUP_TIME_PENDING 0x00000002 14762306a36Sopenharmony_ci struct xenpf_efi_time get_wakeup_time; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci#define XEN_EFI_SET_WAKEUP_TIME_ENABLE 0x00000001 15062306a36Sopenharmony_ci#define XEN_EFI_SET_WAKEUP_TIME_ENABLE_ONLY 0x00000002 15162306a36Sopenharmony_ci struct xenpf_efi_time set_wakeup_time; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci#define XEN_EFI_VARIABLE_NON_VOLATILE 0x00000001 15462306a36Sopenharmony_ci#define XEN_EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002 15562306a36Sopenharmony_ci#define XEN_EFI_VARIABLE_RUNTIME_ACCESS 0x00000004 15662306a36Sopenharmony_ci struct { 15762306a36Sopenharmony_ci GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ 15862306a36Sopenharmony_ci xen_ulong_t size; 15962306a36Sopenharmony_ci GUEST_HANDLE(void) data; 16062306a36Sopenharmony_ci struct xenpf_efi_guid { 16162306a36Sopenharmony_ci uint32_t data1; 16262306a36Sopenharmony_ci uint16_t data2; 16362306a36Sopenharmony_ci uint16_t data3; 16462306a36Sopenharmony_ci uint8_t data4[8]; 16562306a36Sopenharmony_ci } vendor_guid; 16662306a36Sopenharmony_ci } get_variable, set_variable; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci struct { 16962306a36Sopenharmony_ci xen_ulong_t size; 17062306a36Sopenharmony_ci GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ 17162306a36Sopenharmony_ci struct xenpf_efi_guid vendor_guid; 17262306a36Sopenharmony_ci } get_next_variable_name; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci struct { 17562306a36Sopenharmony_ci uint32_t attr; 17662306a36Sopenharmony_ci uint64_t max_store_size; 17762306a36Sopenharmony_ci uint64_t remain_store_size; 17862306a36Sopenharmony_ci uint64_t max_size; 17962306a36Sopenharmony_ci } query_variable_info; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci struct { 18262306a36Sopenharmony_ci GUEST_HANDLE(void) capsule_header_array; 18362306a36Sopenharmony_ci xen_ulong_t capsule_count; 18462306a36Sopenharmony_ci uint64_t max_capsule_size; 18562306a36Sopenharmony_ci uint32_t reset_type; 18662306a36Sopenharmony_ci } query_capsule_capabilities; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci struct { 18962306a36Sopenharmony_ci GUEST_HANDLE(void) capsule_header_array; 19062306a36Sopenharmony_ci xen_ulong_t capsule_count; 19162306a36Sopenharmony_ci uint64_t sg_list; /* machine address */ 19262306a36Sopenharmony_ci } update_capsule; 19362306a36Sopenharmony_ci } u; 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_efi_runtime_call); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci#define XEN_FW_EFI_VERSION 0 19862306a36Sopenharmony_ci#define XEN_FW_EFI_CONFIG_TABLE 1 19962306a36Sopenharmony_ci#define XEN_FW_EFI_VENDOR 2 20062306a36Sopenharmony_ci#define XEN_FW_EFI_MEM_INFO 3 20162306a36Sopenharmony_ci#define XEN_FW_EFI_RT_VERSION 4 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci#define XENPF_firmware_info 50 20462306a36Sopenharmony_ci#define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ 20562306a36Sopenharmony_ci#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ 20662306a36Sopenharmony_ci#define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ 20762306a36Sopenharmony_ci#define XEN_FW_EFI_INFO 4 /* from EFI */ 20862306a36Sopenharmony_ci#define XEN_FW_KBD_SHIFT_FLAGS 5 /* Int16, Fn02: Get keyboard shift flags. */ 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistruct xenpf_firmware_info { 21162306a36Sopenharmony_ci /* IN variables. */ 21262306a36Sopenharmony_ci uint32_t type; 21362306a36Sopenharmony_ci uint32_t index; 21462306a36Sopenharmony_ci /* OUT variables. */ 21562306a36Sopenharmony_ci union { 21662306a36Sopenharmony_ci struct { 21762306a36Sopenharmony_ci /* Int13, Fn48: Check Extensions Present. */ 21862306a36Sopenharmony_ci uint8_t device; /* %dl: bios device number */ 21962306a36Sopenharmony_ci uint8_t version; /* %ah: major version */ 22062306a36Sopenharmony_ci uint16_t interface_support; /* %cx: support bitmap */ 22162306a36Sopenharmony_ci /* Int13, Fn08: Legacy Get Device Parameters. */ 22262306a36Sopenharmony_ci uint16_t legacy_max_cylinder; /* %cl[7:6]:%ch: max cyl # */ 22362306a36Sopenharmony_ci uint8_t legacy_max_head; /* %dh: max head # */ 22462306a36Sopenharmony_ci uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector # */ 22562306a36Sopenharmony_ci /* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */ 22662306a36Sopenharmony_ci /* NB. First uint16_t of buffer must be set to buffer size. */ 22762306a36Sopenharmony_ci GUEST_HANDLE(void) edd_params; 22862306a36Sopenharmony_ci } disk_info; /* XEN_FW_DISK_INFO */ 22962306a36Sopenharmony_ci struct { 23062306a36Sopenharmony_ci uint8_t device; /* bios device number */ 23162306a36Sopenharmony_ci uint32_t mbr_signature; /* offset 0x1b8 in mbr */ 23262306a36Sopenharmony_ci } disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */ 23362306a36Sopenharmony_ci struct { 23462306a36Sopenharmony_ci /* Int10, AX=4F15: Get EDID info. */ 23562306a36Sopenharmony_ci uint8_t capabilities; 23662306a36Sopenharmony_ci uint8_t edid_transfer_time; 23762306a36Sopenharmony_ci /* must refer to 128-byte buffer */ 23862306a36Sopenharmony_ci GUEST_HANDLE(uchar) edid; 23962306a36Sopenharmony_ci } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci union xenpf_efi_info { 24262306a36Sopenharmony_ci uint32_t version; 24362306a36Sopenharmony_ci struct { 24462306a36Sopenharmony_ci uint64_t addr; /* EFI_CONFIGURATION_TABLE */ 24562306a36Sopenharmony_ci uint32_t nent; 24662306a36Sopenharmony_ci } cfg; 24762306a36Sopenharmony_ci struct { 24862306a36Sopenharmony_ci uint32_t revision; 24962306a36Sopenharmony_ci uint32_t bufsz; /* input, in bytes */ 25062306a36Sopenharmony_ci GUEST_HANDLE(void) name; 25162306a36Sopenharmony_ci /* UCS-2/UTF-16 string */ 25262306a36Sopenharmony_ci } vendor; 25362306a36Sopenharmony_ci struct { 25462306a36Sopenharmony_ci uint64_t addr; 25562306a36Sopenharmony_ci uint64_t size; 25662306a36Sopenharmony_ci uint64_t attr; 25762306a36Sopenharmony_ci uint32_t type; 25862306a36Sopenharmony_ci } mem; 25962306a36Sopenharmony_ci } efi_info; /* XEN_FW_EFI_INFO */ 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */ 26262306a36Sopenharmony_ci } u; 26362306a36Sopenharmony_ci}; 26462306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t); 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci#define XENPF_enter_acpi_sleep 51 26762306a36Sopenharmony_cistruct xenpf_enter_acpi_sleep { 26862306a36Sopenharmony_ci /* IN variables */ 26962306a36Sopenharmony_ci uint16_t val_a; /* PM1a control / sleep type A. */ 27062306a36Sopenharmony_ci uint16_t val_b; /* PM1b control / sleep type B. */ 27162306a36Sopenharmony_ci uint32_t sleep_state; /* Which state to enter (Sn). */ 27262306a36Sopenharmony_ci#define XENPF_ACPI_SLEEP_EXTENDED 0x00000001 27362306a36Sopenharmony_ci uint32_t flags; /* XENPF_ACPI_SLEEP_*. */ 27462306a36Sopenharmony_ci}; 27562306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_enter_acpi_sleep_t); 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci#define XENPF_change_freq 52 27862306a36Sopenharmony_cistruct xenpf_change_freq { 27962306a36Sopenharmony_ci /* IN variables */ 28062306a36Sopenharmony_ci uint32_t flags; /* Must be zero. */ 28162306a36Sopenharmony_ci uint32_t cpu; /* Physical cpu. */ 28262306a36Sopenharmony_ci uint64_t freq; /* New frequency (Hz). */ 28362306a36Sopenharmony_ci}; 28462306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_change_freq_t); 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci/* 28762306a36Sopenharmony_ci * Get idle times (nanoseconds since boot) for physical CPUs specified in the 28862306a36Sopenharmony_ci * @cpumap_bitmap with range [0..@cpumap_nr_cpus-1]. The @idletime array is 28962306a36Sopenharmony_ci * indexed by CPU number; only entries with the corresponding @cpumap_bitmap 29062306a36Sopenharmony_ci * bit set are written to. On return, @cpumap_bitmap is modified so that any 29162306a36Sopenharmony_ci * non-existent CPUs are cleared. Such CPUs have their @idletime array entry 29262306a36Sopenharmony_ci * cleared. 29362306a36Sopenharmony_ci */ 29462306a36Sopenharmony_ci#define XENPF_getidletime 53 29562306a36Sopenharmony_cistruct xenpf_getidletime { 29662306a36Sopenharmony_ci /* IN/OUT variables */ 29762306a36Sopenharmony_ci /* IN: CPUs to interrogate; OUT: subset of IN which are present */ 29862306a36Sopenharmony_ci GUEST_HANDLE(uchar) cpumap_bitmap; 29962306a36Sopenharmony_ci /* IN variables */ 30062306a36Sopenharmony_ci /* Size of cpumap bitmap. */ 30162306a36Sopenharmony_ci uint32_t cpumap_nr_cpus; 30262306a36Sopenharmony_ci /* Must be indexable for every cpu in cpumap_bitmap. */ 30362306a36Sopenharmony_ci GUEST_HANDLE(uint64_t) idletime; 30462306a36Sopenharmony_ci /* OUT variables */ 30562306a36Sopenharmony_ci /* System time when the idletime snapshots were taken. */ 30662306a36Sopenharmony_ci uint64_t now; 30762306a36Sopenharmony_ci}; 30862306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_getidletime_t); 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci#define XENPF_set_processor_pminfo 54 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci/* ability bits */ 31362306a36Sopenharmony_ci#define XEN_PROCESSOR_PM_CX 1 31462306a36Sopenharmony_ci#define XEN_PROCESSOR_PM_PX 2 31562306a36Sopenharmony_ci#define XEN_PROCESSOR_PM_TX 4 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci/* cmd type */ 31862306a36Sopenharmony_ci#define XEN_PM_CX 0 31962306a36Sopenharmony_ci#define XEN_PM_PX 1 32062306a36Sopenharmony_ci#define XEN_PM_TX 2 32162306a36Sopenharmony_ci#define XEN_PM_PDC 3 32262306a36Sopenharmony_ci/* Px sub info type */ 32362306a36Sopenharmony_ci#define XEN_PX_PCT 1 32462306a36Sopenharmony_ci#define XEN_PX_PSS 2 32562306a36Sopenharmony_ci#define XEN_PX_PPC 4 32662306a36Sopenharmony_ci#define XEN_PX_PSD 8 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistruct xen_power_register { 32962306a36Sopenharmony_ci uint32_t space_id; 33062306a36Sopenharmony_ci uint32_t bit_width; 33162306a36Sopenharmony_ci uint32_t bit_offset; 33262306a36Sopenharmony_ci uint32_t access_size; 33362306a36Sopenharmony_ci uint64_t address; 33462306a36Sopenharmony_ci}; 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_cistruct xen_processor_csd { 33762306a36Sopenharmony_ci uint32_t domain; /* domain number of one dependent group */ 33862306a36Sopenharmony_ci uint32_t coord_type; /* coordination type */ 33962306a36Sopenharmony_ci uint32_t num; /* number of processors in same domain */ 34062306a36Sopenharmony_ci}; 34162306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xen_processor_csd); 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistruct xen_processor_cx { 34462306a36Sopenharmony_ci struct xen_power_register reg; /* GAS for Cx trigger register */ 34562306a36Sopenharmony_ci uint8_t type; /* cstate value, c0: 0, c1: 1, ... */ 34662306a36Sopenharmony_ci uint32_t latency; /* worst latency (ms) to enter/exit this cstate */ 34762306a36Sopenharmony_ci uint32_t power; /* average power consumption(mW) */ 34862306a36Sopenharmony_ci uint32_t dpcnt; /* number of dependency entries */ 34962306a36Sopenharmony_ci GUEST_HANDLE(xen_processor_csd) dp; /* NULL if no dependency */ 35062306a36Sopenharmony_ci}; 35162306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xen_processor_cx); 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_cistruct xen_processor_flags { 35462306a36Sopenharmony_ci uint32_t bm_control:1; 35562306a36Sopenharmony_ci uint32_t bm_check:1; 35662306a36Sopenharmony_ci uint32_t has_cst:1; 35762306a36Sopenharmony_ci uint32_t power_setup_done:1; 35862306a36Sopenharmony_ci uint32_t bm_rld_set:1; 35962306a36Sopenharmony_ci}; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_cistruct xen_processor_power { 36262306a36Sopenharmony_ci uint32_t count; /* number of C state entries in array below */ 36362306a36Sopenharmony_ci struct xen_processor_flags flags; /* global flags of this processor */ 36462306a36Sopenharmony_ci GUEST_HANDLE(xen_processor_cx) states; /* supported c states */ 36562306a36Sopenharmony_ci}; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_cistruct xen_pct_register { 36862306a36Sopenharmony_ci uint8_t descriptor; 36962306a36Sopenharmony_ci uint16_t length; 37062306a36Sopenharmony_ci uint8_t space_id; 37162306a36Sopenharmony_ci uint8_t bit_width; 37262306a36Sopenharmony_ci uint8_t bit_offset; 37362306a36Sopenharmony_ci uint8_t reserved; 37462306a36Sopenharmony_ci uint64_t address; 37562306a36Sopenharmony_ci}; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_cistruct xen_processor_px { 37862306a36Sopenharmony_ci uint64_t core_frequency; /* megahertz */ 37962306a36Sopenharmony_ci uint64_t power; /* milliWatts */ 38062306a36Sopenharmony_ci uint64_t transition_latency; /* microseconds */ 38162306a36Sopenharmony_ci uint64_t bus_master_latency; /* microseconds */ 38262306a36Sopenharmony_ci uint64_t control; /* control value */ 38362306a36Sopenharmony_ci uint64_t status; /* success indicator */ 38462306a36Sopenharmony_ci}; 38562306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xen_processor_px); 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_cistruct xen_psd_package { 38862306a36Sopenharmony_ci uint64_t num_entries; 38962306a36Sopenharmony_ci uint64_t revision; 39062306a36Sopenharmony_ci uint64_t domain; 39162306a36Sopenharmony_ci uint64_t coord_type; 39262306a36Sopenharmony_ci uint64_t num_processors; 39362306a36Sopenharmony_ci}; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistruct xen_processor_performance { 39662306a36Sopenharmony_ci uint32_t flags; /* flag for Px sub info type */ 39762306a36Sopenharmony_ci uint32_t platform_limit; /* Platform limitation on freq usage */ 39862306a36Sopenharmony_ci struct xen_pct_register control_register; 39962306a36Sopenharmony_ci struct xen_pct_register status_register; 40062306a36Sopenharmony_ci uint32_t state_count; /* total available performance states */ 40162306a36Sopenharmony_ci GUEST_HANDLE(xen_processor_px) states; 40262306a36Sopenharmony_ci struct xen_psd_package domain_info; 40362306a36Sopenharmony_ci uint32_t shared_type; /* coordination type of this processor */ 40462306a36Sopenharmony_ci}; 40562306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xen_processor_performance); 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_cistruct xenpf_set_processor_pminfo { 40862306a36Sopenharmony_ci /* IN variables */ 40962306a36Sopenharmony_ci uint32_t id; /* ACPI CPU ID */ 41062306a36Sopenharmony_ci uint32_t type; /* {XEN_PM_CX, XEN_PM_PX} */ 41162306a36Sopenharmony_ci union { 41262306a36Sopenharmony_ci struct xen_processor_power power;/* Cx: _CST/_CSD */ 41362306a36Sopenharmony_ci struct xen_processor_performance perf; /* Px: _PPC/_PCT/_PSS/_PSD */ 41462306a36Sopenharmony_ci GUEST_HANDLE(uint32_t) pdc; 41562306a36Sopenharmony_ci }; 41662306a36Sopenharmony_ci}; 41762306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_set_processor_pminfo); 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci#define XENPF_get_cpuinfo 55 42062306a36Sopenharmony_cistruct xenpf_pcpuinfo { 42162306a36Sopenharmony_ci /* IN */ 42262306a36Sopenharmony_ci uint32_t xen_cpuid; 42362306a36Sopenharmony_ci /* OUT */ 42462306a36Sopenharmony_ci /* The maxium cpu_id that is present */ 42562306a36Sopenharmony_ci uint32_t max_present; 42662306a36Sopenharmony_ci#define XEN_PCPU_FLAGS_ONLINE 1 42762306a36Sopenharmony_ci /* Correponding xen_cpuid is not present*/ 42862306a36Sopenharmony_ci#define XEN_PCPU_FLAGS_INVALID 2 42962306a36Sopenharmony_ci uint32_t flags; 43062306a36Sopenharmony_ci uint32_t apic_id; 43162306a36Sopenharmony_ci uint32_t acpi_id; 43262306a36Sopenharmony_ci}; 43362306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_pcpuinfo); 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci#define XENPF_cpu_online 56 43662306a36Sopenharmony_ci#define XENPF_cpu_offline 57 43762306a36Sopenharmony_cistruct xenpf_cpu_ol { 43862306a36Sopenharmony_ci uint32_t cpuid; 43962306a36Sopenharmony_ci}; 44062306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_cpu_ol); 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci#define XENPF_cpu_hotadd 58 44362306a36Sopenharmony_cistruct xenpf_cpu_hotadd { 44462306a36Sopenharmony_ci uint32_t apic_id; 44562306a36Sopenharmony_ci uint32_t acpi_id; 44662306a36Sopenharmony_ci uint32_t pxm; 44762306a36Sopenharmony_ci}; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci#define XENPF_mem_hotadd 59 45062306a36Sopenharmony_cistruct xenpf_mem_hotadd { 45162306a36Sopenharmony_ci uint64_t spfn; 45262306a36Sopenharmony_ci uint64_t epfn; 45362306a36Sopenharmony_ci uint32_t pxm; 45462306a36Sopenharmony_ci uint32_t flags; 45562306a36Sopenharmony_ci}; 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci#define XENPF_core_parking 60 45862306a36Sopenharmony_cistruct xenpf_core_parking { 45962306a36Sopenharmony_ci /* IN variables */ 46062306a36Sopenharmony_ci#define XEN_CORE_PARKING_SET 1 46162306a36Sopenharmony_ci#define XEN_CORE_PARKING_GET 2 46262306a36Sopenharmony_ci uint32_t type; 46362306a36Sopenharmony_ci /* IN variables: set cpu nums expected to be idled */ 46462306a36Sopenharmony_ci /* OUT variables: get cpu nums actually be idled */ 46562306a36Sopenharmony_ci uint32_t idle_nums; 46662306a36Sopenharmony_ci}; 46762306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_core_parking); 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_ci#define XENPF_get_symbol 63 47062306a36Sopenharmony_cistruct xenpf_symdata { 47162306a36Sopenharmony_ci /* IN/OUT variables */ 47262306a36Sopenharmony_ci uint32_t namelen; /* size of 'name' buffer */ 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci /* IN/OUT variables */ 47562306a36Sopenharmony_ci uint32_t symnum; /* IN: Symbol to read */ 47662306a36Sopenharmony_ci /* OUT: Next available symbol. If same as IN */ 47762306a36Sopenharmony_ci /* then we reached the end */ 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci /* OUT variables */ 48062306a36Sopenharmony_ci GUEST_HANDLE(char) name; 48162306a36Sopenharmony_ci uint64_t address; 48262306a36Sopenharmony_ci char type; 48362306a36Sopenharmony_ci}; 48462306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xenpf_symdata); 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ci#define XENPF_get_dom0_console 64 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_cistruct xen_platform_op { 48962306a36Sopenharmony_ci uint32_t cmd; 49062306a36Sopenharmony_ci uint32_t interface_version; /* XENPF_INTERFACE_VERSION */ 49162306a36Sopenharmony_ci union { 49262306a36Sopenharmony_ci struct xenpf_settime32 settime32; 49362306a36Sopenharmony_ci struct xenpf_settime64 settime64; 49462306a36Sopenharmony_ci struct xenpf_add_memtype add_memtype; 49562306a36Sopenharmony_ci struct xenpf_del_memtype del_memtype; 49662306a36Sopenharmony_ci struct xenpf_read_memtype read_memtype; 49762306a36Sopenharmony_ci struct xenpf_microcode_update microcode; 49862306a36Sopenharmony_ci struct xenpf_platform_quirk platform_quirk; 49962306a36Sopenharmony_ci struct xenpf_efi_runtime_call efi_runtime_call; 50062306a36Sopenharmony_ci struct xenpf_firmware_info firmware_info; 50162306a36Sopenharmony_ci struct xenpf_enter_acpi_sleep enter_acpi_sleep; 50262306a36Sopenharmony_ci struct xenpf_change_freq change_freq; 50362306a36Sopenharmony_ci struct xenpf_getidletime getidletime; 50462306a36Sopenharmony_ci struct xenpf_set_processor_pminfo set_pminfo; 50562306a36Sopenharmony_ci struct xenpf_pcpuinfo pcpu_info; 50662306a36Sopenharmony_ci struct xenpf_cpu_ol cpu_ol; 50762306a36Sopenharmony_ci struct xenpf_cpu_hotadd cpu_add; 50862306a36Sopenharmony_ci struct xenpf_mem_hotadd mem_add; 50962306a36Sopenharmony_ci struct xenpf_core_parking core_parking; 51062306a36Sopenharmony_ci struct xenpf_symdata symdata; 51162306a36Sopenharmony_ci struct dom0_vga_console_info dom0_console; 51262306a36Sopenharmony_ci uint8_t pad[128]; 51362306a36Sopenharmony_ci } u; 51462306a36Sopenharmony_ci}; 51562306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(xen_platform_op_t); 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci#endif /* __XEN_PUBLIC_PLATFORM_H__ */ 518