This fixes a couple of issues with older Linux kernels (that expect an XSDT as

soon as there's an ACPI 2.0 or later table)

* add XSDT support
* add more table types

This patch will break at least the kontron (and possibly some new boards I
missed)

Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Peter Stuge <peter@stuge.se>



git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4453 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Stefan Reinauer
2009-07-21 21:38:33 +00:00
committed by Stefan Reinauer
parent 4d933dd2d6
commit b657a3c9b7
19 changed files with 244 additions and 149 deletions

View File

@@ -123,7 +123,7 @@ unsigned long write_acpi_tables(unsigned long start)
/* Clear all table memory. */
memset((void *) start, 0, current - start);
acpi_write_rsdp(rsdp, rsdt);
acpi_write_rsdp(rsdp, rsdt, NULL);
acpi_write_rsdt(rsdt);
current = ALIGN(current, 64);
@@ -147,28 +147,28 @@ unsigned long write_acpi_tables(unsigned long start)
/* Add FADT now that we have facs and dsdt. */
acpi_create_fadt(fadt, facs, dsdt);
acpi_add_table(rsdt, fadt);
acpi_add_table(rsdp, fadt);
current = ALIGN(current, 16);
hpet = (acpi_hpet_t *) current;
printk_debug("ACPI: * HPET @ %p\n", hpet);
current += sizeof(acpi_hpet_t);
acpi_create_hpet(hpet);
acpi_add_table(rsdt, hpet);
acpi_add_table(rsdp, hpet);
current = ALIGN(current, 16);
madt = (acpi_madt_t *) current;
printk_debug("ACPI: * APIC/MADT @ %p\n", madt);
acpi_create_madt(madt);
current += madt->header.length;
acpi_add_table(rsdt, madt);
acpi_add_table(rsdp, madt);
current = ALIGN(current, 16);
srat = (acpi_srat_t *) current;
printk_debug("ACPI: * SRAT @ %p\n", srat);
acpi_create_srat(srat);
current += srat->header.length;
acpi_add_table(rsdt, srat);
acpi_add_table(rsdp, srat);
/* SLIT */
current = ALIGN(current, 16);
@@ -176,7 +176,7 @@ unsigned long write_acpi_tables(unsigned long start)
printk_debug("ACPI: * SLIT @ %p\n", slit);
acpi_create_slit(slit);
current+=slit->header.length;
acpi_add_table(rsdt,slit);
acpi_add_table(rsdp,slit);
/* SSDT */
current = ALIGN(current, 16);
@@ -184,7 +184,7 @@ unsigned long write_acpi_tables(unsigned long start)
printk_debug("ACPI: * SSDT @ %p\n", ssdt);
acpi_create_ssdt_generator(ssdt, "DYNADATA");
current += ssdt->length;
acpi_add_table(rsdt, ssdt);
acpi_add_table(rsdp, ssdt);
printk_info("ACPI: done %p.\n", (void *)current);
return current;