// SPDX-License-Identifier: GPL-2.0-or-later #pragma once // ACPI, in two layers. // // kernel/arch/x86_64/acpi.c reads the static tables at boot, before anything // else can run: the MADT for the processors and the I/O APIC and its // interrupt source overrides, the FADT for the PM timer. // // kernel/acpi/ is everything that needs AML, which is the firmware's own code // and has to be interpreted: uACPI (ports/uacpi) runs it, and aml.c uses it // for PCI interrupt routing, the power button, power-off and reset. Every // function below that depends on it does nothing, and says so by returning // -1, on a machine whose AML could not be loaded. // The RSDP's physical address, or 0 if there is none. uint64 acpi_rsdp_phys(void); // The GSI an ISA IRQ is wired to, after the MADT's interrupt source // overrides, and its trigger mode (an IRQ_* from irq.h) in *mode. `dflt` is // the mode when the override says "conforms to the bus" or there is none: // edge/high for an ISA device, level/low for the SCI. int acpi_isa_gsi(int isa, int dflt, int *mode); // Load and initialize the namespace. After kinit, before pci_init. void acpi_aml_init(void); // The worker thread that runs AML on behalf of interrupts. After sinit. void acpi_thread_start(void); // Route every PCI device's INTx through _PRT. From pci_init, before binding. void acpi_pci_route(void); int acpi_poweroff(void); // S5; returns only on failure int acpi_reboot(void); // the FADT reset register; ditto