summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorMichael Brown2016-07-10 20:25:26 +0200
committerMichael Brown2016-07-11 15:05:18 +0200
commite19c0a8fd2bc8c2331c5fabe17ea56e7c35d1900 (patch)
tree0aba5ee1c1274ff613d786c18b0d004cce7b9dc4 /src/include
parent[rng] Check for functioning RTC interrupt (diff)
downloadipxe-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')
-rw-r--r--src/include/ipxe/acpi.h75
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 */