^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * acpi.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * acpi file for domain 0 kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2011 Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (c) 2011 Yu Ke <ke.yu@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * This program is free software; you can redistribute it and/or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * modify it under the terms of the GNU General Public License version 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * as published by the Free Software Foundation; or, when distributed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * separately from the Linux kernel or incorporated into other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * software packages, subject to the following license:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * Permission is hereby granted, free of charge, to any person obtaining a copy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * of this source file (the "Software"), to deal in the Software without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * restriction, including without limitation the rights to use, copy, modify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * merge, publish, distribute, sublicense, and/or sell copies of the Software,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * and to permit persons to whom the Software is furnished to do so, subject to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * the following conditions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * The above copyright notice and this permission notice shall be included in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * all copies or substantial portions of the Software.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * IN THE SOFTWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #ifndef _XEN_ACPI_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define _XEN_ACPI_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #ifdef CONFIG_XEN_DOM0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <asm/xen/hypervisor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <xen/xen.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include <linux/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define ACPI_MEMORY_DEVICE_CLASS "memory"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define ACPI_MEMORY_DEVICE_HID "PNP0C80"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define ACPI_MEMORY_DEVICE_NAME "Hotplug Mem Device"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) int xen_stub_memory_device_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) void xen_stub_memory_device_exit(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define ACPI_PROCESSOR_CLASS "processor"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define ACPI_PROCESSOR_DEVICE_HID "ACPI0007"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define ACPI_PROCESSOR_DEVICE_NAME "Processor"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) int xen_stub_processor_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) void xen_stub_processor_exit(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) void xen_pcpu_hotplug_sync(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) int xen_pcpu_id(uint32_t acpi_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) static inline int xen_acpi_get_pxm(acpi_handle h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) unsigned long long pxm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) acpi_handle handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) acpi_handle phandle = h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) handle = phandle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) status = acpi_evaluate_integer(handle, "_PXM", NULL, &pxm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) if (ACPI_SUCCESS(status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) return pxm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) status = acpi_get_parent(handle, &phandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) } while (ACPI_SUCCESS(status));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) int xen_acpi_notify_hypervisor_sleep(u8 sleep_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u32 pm1a_cnt, u32 pm1b_cnd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) int xen_acpi_notify_hypervisor_extended_sleep(u8 sleep_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u32 val_a, u32 val_b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) static inline int xen_acpi_suspend_lowlevel(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * Xen will save and restore CPU context, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * we can skip that and just go straight to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * the suspend.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) acpi_enter_sleep_state(ACPI_STATE_S3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) static inline void xen_acpi_sleep_register(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) if (xen_initial_domain()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) acpi_os_set_prepare_sleep(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) &xen_acpi_notify_hypervisor_sleep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) acpi_os_set_prepare_extended_sleep(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) &xen_acpi_notify_hypervisor_extended_sleep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) acpi_suspend_lowlevel = xen_acpi_suspend_lowlevel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) static inline void xen_acpi_sleep_register(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #endif /* _XEN_ACPI_H */