From e19c0a8fd2bc8c2331c5fabe17ea56e7c35d1900 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 10 Jul 2016 19:25:26 +0100 Subject: [acpi] Add support for ACPI power off Signed-off-by: Michael Brown --- src/include/ipxe/acpi.h | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) (limited to 'src/include/ipxe') diff --git a/src/include/ipxe/acpi.h b/src/include/ipxe/acpi.h index 2ccd691ed..17d29b9df 100644 --- a/src/include/ipxe/acpi.h +++ b/src/include/ipxe/acpi.h @@ -11,6 +11,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include +#include /** * An ACPI description header @@ -51,6 +52,76 @@ struct acpi_description_header { #define ACPI_SIGNATURE( a, b, c, d ) \ ( ( (a) << 0 ) | ( (b) << 8 ) | ( (c) << 16 ) | ( (d) << 24 ) ) +/** Root System Description Pointer signature */ +#define RSDP_SIGNATURE { 'R', 'S', 'D', ' ', 'P', 'T', 'R', ' ' } + +/** Root System Description Pointer */ +struct acpi_rsdp { + /** Signature */ + char signature[8]; + /** To make sum of entire table == 0 */ + uint8_t checksum; + /** OEM identification */ + char oem_id[6]; + /** Revision */ + uint8_t revision; + /** Physical address of RSDT */ + uint32_t rsdt; +} __attribute__ (( packed )); + +/** EBDA RSDP length */ +#define RSDP_EBDA_LEN 0x400 + +/** Fixed BIOS area RSDP start address */ +#define RSDP_BIOS_START 0xe0000 + +/** Fixed BIOS area RSDP length */ +#define RSDP_BIOS_LEN 0x20000 + +/** Stride at which to search for RSDP */ +#define RSDP_STRIDE 16 + +/** Root System Description Table (RSDT) signature */ +#define RSDT_SIGNATURE ACPI_SIGNATURE ( 'R', 'S', 'D', 'T' ) + +/** ACPI Root System Description Table (RSDT) */ +struct acpi_rsdt { + /** ACPI header */ + struct acpi_description_header acpi; + /** ACPI table entries */ + uint32_t entry[0]; +} __attribute__ (( packed )); + +/** Fixed ACPI Description Table (FADT) signature */ +#define FADT_SIGNATURE ACPI_SIGNATURE ( 'F', 'A', 'C', 'P' ) + +/** Fixed ACPI Description Table (FADT) */ +struct acpi_fadt { + /** ACPI header */ + struct acpi_description_header acpi; + /** Physical address of FACS */ + uint32_t facs; + /** Physical address of DSDT */ + uint32_t dsdt; + /** Unused by iPXE */ + uint8_t unused[20]; + /** PM1a Control Register Block */ + uint32_t pm1a_cnt_blk; + /** PM1b Control Register Block */ + uint32_t pm1b_cnt_blk; +} __attribute__ (( packed )); + +/** ACPI PM1 Control Register (within PM1a_CNT_BLK or PM1A_CNT_BLK) */ +#define ACPI_PM1_CNT 0 +#define ACPI_PM1_CNT_SLP_TYP(x) ( (x) << 10 ) /**< Sleep type */ +#define ACPI_PM1_CNT_SLP_EN ( 1 << 13 ) /**< Sleep enable */ + +/** Differentiated System Description Table (DSDT) signature */ +#define DSDT_SIGNATURE ACPI_SIGNATURE ( 'D', 'S', 'D', 'T' ) + +/** Secondary System Description Table (SSDT) signature */ +#define SSDT_SIGNATURE ACPI_SIGNATURE ( 'S', 'S', 'D', 'T' ) + extern int acpi_describe ( struct interface *interface, struct acpi_description_header *acpi, size_t len ); #define acpi_describe_TYPE( object_type ) \ @@ -59,5 +130,9 @@ extern int acpi_describe ( struct interface *interface, size_t len ) ) extern void acpi_fix_checksum ( struct acpi_description_header *acpi ); +extern userptr_t acpi_find_rsdt ( userptr_t ebda ); +extern userptr_t acpi_find ( userptr_t rsdt, uint32_t signature, + unsigned int index ); +extern int acpi_sx ( userptr_t rsdt, uint32_t signature ); #endif /* _IPXE_ACPI_H */ -- cgit v1.2.3-55-g7522