summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPatrick Georgi <patrick.georgi@coresystems.de>2009-04-24 06:28:48 +0000
committerPatrick Georgi <patrick.georgi@coresystems.de>2009-04-24 06:28:48 +0000
commitcec6dc4c15f7c2bb7c245c76e61f2ee41c3fa649 (patch)
treebf8eaa5f933bd211aa0b9fde4a64347a64b141d8 /src
parente9149038ee852df06ca1269d9179f84e91353bfa (diff)
Change the behaviour of the ACPI generating code so it only
writes at most one full ACPI table. In the cases where both HAVE_LOW_TABLES and HAVE_HIGH_TABLES are enabled, the table is written to high memory, and an RSDP is written to the low memory that points to the high mem one. All other cases work exactly the same way as before. Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de> Acked-by: Myles Watson <mylesgw@gmail.com> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4202 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'src')
-rw-r--r--src/arch/i386/boot/tables.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/arch/i386/boot/tables.c b/src/arch/i386/boot/tables.c
index 470afe82c1..6959ae3036 100644
--- a/src/arch/i386/boot/tables.c
+++ b/src/arch/i386/boot/tables.c
@@ -112,15 +112,22 @@ struct lb_memory *write_tables(void)
/* write them in the rom area because DSDT can be large (8K on epia-m) which
* pushes coreboot table out of first 4K if set up in low table area
*/
-#if HAVE_LOW_TABLES == 1
- rom_table_end = write_acpi_tables(rom_table_end);
- rom_table_end = (rom_table_end+1023) & ~1023;
-#endif
#if HAVE_HIGH_TABLES == 1
+ unsigned long high_rsdp=ALIGN(high_table_end, 16);
if (high_tables_base) {
high_table_end = write_acpi_tables(high_table_end);
high_table_end = (high_table_end+1023) & ~1023;
}
+#if HAVE_LOW_TABLES == 1
+ unsigned long rsdt_location=(unsigned long*)(((acpi_rsdp_t*)high_rsdp)->rsdt_address);
+ acpi_write_rsdp(rom_table_end, rsdt_location);
+ rom_table_end = ALIGN(ALIGN(rom_table_end, 16) + sizeof(acpi_rsdp_t), 16);
+#endif
+#else
+#if HAVE_LOW_TABLES == 1
+ rom_table_end = write_acpi_tables(rom_table_end);
+ rom_table_end = (rom_table_end+1023) & ~1023;
+#endif
#endif
/* copy the smp block to address 0 */
post_code(0x96);