/*
* Fixed ACPI Description Table Structure (FADT).
*/
-struct acpi_20_fadt {
+struct acpi_fadt {
struct acpi_header header;
uint32_t firmware_ctrl;
uint32_t dsdt;
struct acpi_20_generic_address x_pm_tmr_blk;
struct acpi_20_generic_address x_gpe0_blk;
struct acpi_20_generic_address x_gpe1_blk;
+ /* Only available starting from FADT revision 5. */
+ struct acpi_20_generic_address sleep_control;
+ struct acpi_20_generic_address sleep_status;
};
/*
*/
#define ACPI_2_0_RSDP_SIGNATURE ASCII64('R','S','D',' ','P','T','R',' ')
#define ACPI_2_0_FACS_SIGNATURE ASCII32('F','A','C','S')
-#define ACPI_2_0_FADT_SIGNATURE ASCII32('F','A','C','P')
+#define ACPI_FADT_SIGNATURE ASCII32('F','A','C','P')
#define ACPI_2_0_MADT_SIGNATURE ASCII32('A','P','I','C')
#define ACPI_2_0_RSDT_SIGNATURE ASCII32('R','S','D','T')
#define ACPI_2_0_XSDT_SIGNATURE ASCII32('X','S','D','T')
* Table revision numbers.
*/
#define ACPI_2_0_RSDP_REVISION 0x02
-#define ACPI_2_0_FADT_REVISION 0x04
#define ACPI_2_0_MADT_REVISION 0x02
#define ACPI_2_0_RSDT_REVISION 0x01
#define ACPI_2_0_XSDT_REVISION 0x01
extern struct acpi_20_rsdp Rsdp;
extern struct acpi_20_rsdt Rsdt;
extern struct acpi_20_xsdt Xsdt;
-extern struct acpi_20_fadt Fadt;
+extern struct acpi_fadt Fadt;
extern struct acpi_20_facs Facs;
extern struct acpi_20_waet Waet;
struct acpi_20_rsdp *rsdp;
struct acpi_20_rsdt *rsdt;
struct acpi_20_xsdt *xsdt;
- struct acpi_20_fadt *fadt;
+ struct acpi_fadt *fadt;
struct acpi_10_fadt *fadt_10;
struct acpi_20_facs *facs;
unsigned char *dsdt;
unsigned long secondary_tables[ACPI_MAX_SECONDARY_TABLES];
int nr_secondaries, i;
+ unsigned int fadt_size;
acpi_info = (struct acpi_info *)config->infop;
memset(acpi_info, 0, sizeof(*acpi_info));
offsetof(struct acpi_header, checksum),
sizeof(struct acpi_10_fadt));
- fadt = ctxt->mem_ops.alloc(ctxt, sizeof(struct acpi_20_fadt), 16);
+ switch ( config->acpi_revision )
+ {
+ case 4:
+ /*
+ * NB: we can use offsetof because there's no padding between
+ * x_gpe1_blk and sleep_control.
+ */
+ fadt_size = offsetof(struct acpi_fadt, sleep_control);
+ break;
+ case 5:
+ fadt_size = sizeof(*fadt);
+ break;
+ default:
+ printf("ACPI revision %u not supported\n", config->acpi_revision);
+ return -1;
+ }
+ fadt = ctxt->mem_ops.alloc(ctxt, fadt_size, 16);
if (!fadt) goto oom;
if ( !(config->table_flags & ACPI_HAS_PMTIMER) )
{
}
if ( !(config->table_flags & ACPI_HAS_BUTTONS) )
Fadt.flags |= (ACPI_PWR_BUTTON | ACPI_SLP_BUTTON);
- memcpy(fadt, &Fadt, sizeof(struct acpi_20_fadt));
+ memcpy(fadt, &Fadt, fadt_size);
+ /*
+ * For both ACPI 4 and 5 the revision of the FADT matches the ACPI
+ * revision.
+ */
+ fadt->header.revision = config->acpi_revision;
+ fadt->header.length = fadt_size;
fadt->dsdt = ctxt->mem_ops.v2p(ctxt, dsdt);
fadt->x_dsdt = ctxt->mem_ops.v2p(ctxt, dsdt);
fadt->firmware_ctrl = ctxt->mem_ops.v2p(ctxt, facs);
fadt->iapc_boot_arch |= ACPI_FADT_NO_VGA;
if ( config->table_flags & ACPI_HAS_8042 )
fadt->iapc_boot_arch |= ACPI_FADT_8042;
- set_checksum(fadt,
- offsetof(struct acpi_header, checksum),
- sizeof(struct acpi_20_fadt));
+ set_checksum(fadt, offsetof(struct acpi_header, checksum), fadt_size);
nr_secondaries = construct_secondary_tables(ctxt, secondary_tables,
config, acpi_info);
#define ACPI_PM_TMR_BLK_BIT_WIDTH 0x20
#define ACPI_PM_TMR_BLK_BIT_OFFSET 0x00
-struct acpi_20_fadt Fadt = {
+struct acpi_fadt Fadt = {
.header = {
- .signature = ACPI_2_0_FADT_SIGNATURE,
- .length = sizeof(struct acpi_20_fadt),
- .revision = ACPI_2_0_FADT_REVISION,
+ .signature = ACPI_FADT_SIGNATURE,
.oem_id = ACPI_OEM_ID,
.oem_table_id = ACPI_OEM_TABLE_ID,
.oem_revision = ACPI_OEM_REVISION,