Timothy Pearson (tpearson@raptorengineeringinc.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8259
-gerrit
commit c08ad4a18fc99cf484473fd4129833dd16955748 Author: Timothy Pearson tpearson@raptorengineeringinc.com Date: Fri Jan 23 20:18:56 2015 -0600
ACPI: Fix corrupt SSDT table on multiprocessor AMD Family 10h systems
Signed-off-by: Timothy Pearson tpearson@raptorengineeringinc.com Change-Id: I3175c8b29e94a27a2db6b11f8fc9e1d91bde11f9 --- src/arch/x86/boot/acpi.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
diff --git a/src/arch/x86/boot/acpi.c b/src/arch/x86/boot/acpi.c index 621df2f..f6548f9 100644 --- a/src/arch/x86/boot/acpi.c +++ b/src/arch/x86/boot/acpi.c @@ -4,6 +4,7 @@ * coreboot ACPI Table support * written by Stefan Reinauer stepan@openbios.org * + * Copyright (C) 2015 Timothy Pearson tpearson@raptorengineeringinc.com, Raptor Engineering * Copyright (C) 2004 SUSE LINUX AG * Copyright (C) 2005-2009 coresystems GmbH * @@ -278,10 +279,42 @@ void acpi_create_ssdt_generator(acpi_header_t *ssdt, const char *oem_table_id) acpigen_set_current((char *) current); { #if IS_ENABLED(CONFIG_PER_DEVICE_ACPI_TABLES) +#if IS_ENABLED(CONFIG_NORTHBRIDGE_AMD_AMDFAM10) + char amd_cpu_ssdt_generated = 0; +#endif struct device *dev; for (dev = all_devices; dev; dev = dev->next) if (dev->ops && dev->ops->acpi_fill_ssdt_generator) { +#if IS_ENABLED(CONFIG_NORTHBRIDGE_AMD_AMDFAM10) + /* + * HACK + * If more than one physical CPU is installed, northbridge_acpi_write_vars() + * is called more than once and the resultant SSDT table is corrupted + * (duplicated entries). + * This prevents Linux from booting, with log messages like these: + * ACPI Error: [BUSN] Namespace lookup failure, AE_ALREADY_EXISTS (/dswload-353) + * ACPI Exception: AE_ALREADY_EXISTS, During name lookup/catalog (/psobject-222) + * followed by a slew of ACPI method failures and a hang when the invalid PCI + * resource entries are used. + * + * The code in northbridge_acpi_write_vars needs to be reworked to function + * correctly when called once per device. + * Commit 2a19fb1d broke multiple physical CPUs. + */ + if ((dev->vendor == 0x1022) && (dev->device == 0x1200)) { + // AMD K10 CPU... + if (!amd_cpu_ssdt_generated) { + dev->ops->acpi_fill_ssdt_generator(); + amd_cpu_ssdt_generated = 1; + } + } + else { + // Some other device, proceed normally. + dev->ops->acpi_fill_ssdt_generator(); + } +#else dev->ops->acpi_fill_ssdt_generator(); +#endif } current = (unsigned long) acpigen_get_current(); #else