diff options
| author | Michael Brown | 2016-07-10 20:25:26 +0200 |
|---|---|---|
| committer | Michael Brown | 2016-07-11 15:05:18 +0200 |
| commit | e19c0a8fd2bc8c2331c5fabe17ea56e7c35d1900 (patch) | |
| tree | 0aba5ee1c1274ff613d786c18b0d004cce7b9dc4 /src/include/ipxe | |
| parent | [rng] Check for functioning RTC interrupt (diff) | |
| download | ipxe-e19c0a8fd2bc8c2331c5fabe17ea56e7c35d1900.tar.gz ipxe-e19c0a8fd2bc8c2331c5fabe17ea56e7c35d1900.tar.xz ipxe-e19c0a8fd2bc8c2331c5fabe17ea56e7c35d1900.zip | |
[acpi] Add support for ACPI power off
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/ipxe')
| -rw-r--r-- | src/include/ipxe/acpi.h | 75 |
1 files changed, 75 insertions, 0 deletions
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 <stdint.h> #include <ipxe/interface.h> +#include <ipxe/uaccess.h> /** * 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 */ |
