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