[coreboot-gerrit] Patch set updated for coreboot: 5799978 amdfam10: Move to per-device ACPI

Vladimir Serbinenko (phcoder@gmail.com) gerrit at coreboot.org
Wed Oct 8 08:48:17 CEST 2014


Vladimir Serbinenko (phcoder at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/7027

-gerrit

commit 5799978ad85e3e599c9aa5082e40f275d915643d
Author: Vladimir Serbinenko <phcoder at gmail.com>
Date:   Thu Oct 2 20:09:19 2014 +0200

    amdfam10: Move to per-device ACPI
    
    Change-Id: I9ce2333e1ea527843f83d411dea2a669263156c2
    Signed-off-by: Vladimir Serbinenko <phcoder at gmail.com>
---
 src/cpu/amd/model_10xxx/Makefile.inc               |   1 +
 src/cpu/amd/model_10xxx/powernow_acpi.c            |  31 ++
 src/mainboard/advansus/a785e-i/acpi_tables.c       | 173 -----------
 src/mainboard/amd/bimini_fam10/acpi_tables.c       | 173 -----------
 src/mainboard/amd/mahogany_fam10/acpi_tables.c     | 136 --------
 .../amd/serengeti_cheetah_fam10/acpi_tables.c      | 116 +------
 .../amd/serengeti_cheetah_fam10/mainboard.c        |  15 +
 .../amd/serengeti_cheetah_fam10/mainboard.h        |   2 +
 src/mainboard/amd/tilapia_fam10/acpi_tables.c      | 167 ----------
 src/mainboard/asus/m4a78-em/acpi_tables.c          | 167 ----------
 src/mainboard/asus/m4a785-m/acpi_tables.c          | 136 --------
 src/mainboard/asus/m5a88-v/acpi_tables.c           | 173 -----------
 src/mainboard/avalue/eax-785e/acpi_tables.c        | 173 -----------
 src/mainboard/gigabyte/ma785gm/acpi_tables.c       | 167 ----------
 src/mainboard/gigabyte/ma785gmt/acpi_tables.c      | 167 ----------
 src/mainboard/iei/kino-780am2-fam10/acpi_tables.c  | 136 --------
 src/mainboard/jetway/pa78vm5/acpi_tables.c         | 167 ----------
 src/mainboard/msi/ms9652_fam10/acpi_tables.c       | 112 -------
 src/mainboard/supermicro/h8scm_fam10/acpi_tables.c | 167 ----------
 src/northbridge/amd/amdfam10/Kconfig               |   1 +
 src/northbridge/amd/amdfam10/Makefile.inc          |   1 -
 src/northbridge/amd/amdfam10/acpi.c                | 215 ++++++++-----
 src/northbridge/amd/amdfam10/amdfam10.h            |   6 +
 src/northbridge/amd/amdfam10/northbridge.c         |   2 +
 src/northbridge/amd/amdfam10/ssdt.asl              | 345 ---------------------
 src/northbridge/amd/amdfam10/sspr1.asl             |  39 ---
 src/northbridge/amd/amdfam10/sspr2.asl             |  40 ---
 src/northbridge/amd/amdfam10/sspr3.asl             |  41 ---
 src/northbridge/amd/amdfam10/sspr4.asl             |  42 ---
 src/northbridge/amd/amdfam10/sspr5.asl             |  43 ---
 src/northbridge/amd/amdk8/acpi.c                   |   4 -
 src/northbridge/amd/amdk8/northbridge.c            |   3 +
 src/southbridge/amd/cimx/sb800/late.c              |   9 +
 src/southbridge/amd/sb800/lpc.c                    |  10 +
 34 files changed, 213 insertions(+), 2967 deletions(-)

diff --git a/src/cpu/amd/model_10xxx/Makefile.inc b/src/cpu/amd/model_10xxx/Makefile.inc
index c82a26e..cfa0007 100644
--- a/src/cpu/amd/model_10xxx/Makefile.inc
+++ b/src/cpu/amd/model_10xxx/Makefile.inc
@@ -3,3 +3,4 @@ ramstage-y += model_10xxx_init.c
 ramstage-y += processor_name.c
 
 romstage-$(CONFIG_UPDATE_CPU_MICROCODE) += update_microcode.c
+ramstage-$(CONFIG_GENERATE_ACPI_TABLES) += powernow_acpi.c
diff --git a/src/cpu/amd/model_10xxx/powernow_acpi.c b/src/cpu/amd/model_10xxx/powernow_acpi.c
new file mode 100644
index 0000000..b39532f
--- /dev/null
+++ b/src/cpu/amd/model_10xxx/powernow_acpi.c
@@ -0,0 +1,31 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2009 Rudolf Marek <r.marek at assembler.cz>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <console/console.h>
+#include <stdint.h>
+#include <cpu/x86/msr.h>
+#include <arch/acpigen.h>
+#include <cpu/amd/powernow.h>
+
+/* FIXME: this should be implemented but right now all boards hardcode it.  */
+int amd_generate_powernow(u32 pcontrol_blk, u8 plen, u8 onlyBSP)
+{
+	return 0;
+}
diff --git a/src/mainboard/advansus/a785e-i/acpi_tables.c b/src/mainboard/advansus/a785e-i/acpi_tables.c
index 3f9bd60..ce32c97 100644
--- a/src/mainboard/advansus/a785e-i/acpi_tables.c
+++ b/src/mainboard/advansus/a785e-i/acpi_tables.c
@@ -29,22 +29,6 @@
 
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-#endif
-
-unsigned long acpi_fill_mcfg(unsigned long current)
-{
-	/* Just a dummy */
-	return current;
-}
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -69,160 +53,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-	acpi_header_t *ssdtx;
-	void *p;
-	int i;
-#endif
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
-	acpi_add_table(rsdp,ssdt);
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-
-	/* same htio, but different position? We may have to copy,
-	change HCIN, and recalculate the checknum and add_table */
-
-	for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
-		if((sysconf.pci1234[i] & 1) != 1 ) continue;
-		u8 c;
-		if (i < 7) {
-			c = (u8) ('4' + i - 1);
-		} else {
-			c = (u8) ('A' + i - 1 - 6);
-		}
-		current = ALIGN(current, 8);
-		printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c at %lx\n", c, current); //pci0 and pci1 are in dsdt
-		ssdtx = (acpi_header_t *)current;
-		switch (sysconf.hcid[i]) {
-		case 1:
-			p = &AmlCode_ssdt2;
-			break;
-		case 2:
-			p = &AmlCode_ssdt3;
-			break;
-		case 3:	/* 8131 */
-			p = &AmlCode_ssdt4;
-			break;
-		default:
-			/* HTX no io apic */
-			p = &AmlCode_ssdt5;
-			break;
-		}
-		memcpy(ssdtx, p, sizeof(acpi_header_t));
-		current += ssdtx->length;
-		memcpy(ssdtx, p, ssdtx->length);
-		update_ssdtx((void *)ssdtx, i);
-		ssdtx->checksum = 0;
-		ssdtx->checksum = acpi_checksum((u8 *)ssdtx, ssdtx->length);
-		acpi_add_table(rsdp, ssdtx);
-	}
-#endif
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/amd/bimini_fam10/acpi_tables.c b/src/mainboard/amd/bimini_fam10/acpi_tables.c
index 84abaaa..1f26283 100644
--- a/src/mainboard/amd/bimini_fam10/acpi_tables.c
+++ b/src/mainboard/amd/bimini_fam10/acpi_tables.c
@@ -29,22 +29,6 @@
 
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-#endif
-
-unsigned long acpi_fill_mcfg(unsigned long current)
-{
-	/* Just a dummy */
-	return current;
-}
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -69,160 +53,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-	acpi_header_t *ssdtx;
-	void *p;
-	int i;
-#endif
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
-	acpi_add_table(rsdp,ssdt);
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-
-	/* same htio, but different position? We may have to copy,
-	change HCIN, and recalculate the checknum and add_table */
-
-	for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
-		if((sysconf.pci1234[i] & 1) != 1 ) continue;
-		u8 c;
-		if (i < 7) {
-			c = (u8) ('4' + i - 1);
-		} else {
-			c = (u8) ('A' + i - 1 - 6);
-		}
-		current = ALIGN(current, 8);
-		printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c at %lx\n", c, current); //pci0 and pci1 are in dsdt
-		ssdtx = (acpi_header_t *)current;
-		switch (sysconf.hcid[i]) {
-		case 1:
-			p = &AmlCode_ssdt2;
-			break;
-		case 2:
-			p = &AmlCode_ssdt3;
-			break;
-		case 3:	/* 8131 */
-			p = &AmlCode_ssdt4;
-			break;
-		default:
-			/* HTX no io apic */
-			p = &AmlCode_ssdt5;
-			break;
-		}
-		memcpy(ssdtx, p, sizeof(acpi_header_t));
-		current += ssdtx->length;
-		memcpy(ssdtx, p, ssdtx->length);
-		update_ssdtx((void *)ssdtx, i);
-		ssdtx->checksum = 0;
-		ssdtx->checksum = acpi_checksum((u8 *)ssdtx, ssdtx->length);
-		acpi_add_table(rsdp, ssdtx);
-	}
-#endif
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/amd/mahogany_fam10/acpi_tables.c b/src/mainboard/amd/mahogany_fam10/acpi_tables.c
index 5efb0ee..bc3b49d 100644
--- a/src/mainboard/amd/mahogany_fam10/acpi_tables.c
+++ b/src/mainboard/amd/mahogany_fam10/acpi_tables.c
@@ -29,37 +29,6 @@
 #include <cpu/amd/amdfam10_sysconf.h>
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-unsigned long acpi_fill_ssdt_generator(unsigned long current, const char *oem_table_id)
-{
-	int lens;
-	msr_t msr;
-	char pscope[] = "\\_SB.PCI0";
-
-	lens = acpigen_write_scope(pscope);
-	msr = rdmsr(TOP_MEM);
-	lens += acpigen_write_name_dword("TOM1", msr.lo);
-	msr = rdmsr(TOP_MEM2);
-	/*
-	 * Since XP only implements parts of ACPI 2.0, we can't use a qword
-	 * here.
-	 * See http://www.acpi.info/presentations/S01USMOBS169_OS%2520new.ppt
-	 * slide 22ff.
-	 * Shift value right by 20 bit to make it fit into 32bit,
-	 * giving us 1MB granularity and a limit of almost 4Exabyte of memory.
-	 */
-	lens += acpigen_write_name_dword("TOM2", (msr.hi << 12) | msr.lo >> 20);
-	acpigen_patch_len(lens - 1);
-
-	/* TODO: More HT and other tables need to go into this table generation.
-	 * This should also be moved out to the silicon level if it can.
-	 */
-
-	return (unsigned long) (acpigen_get_current());
-}
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -84,108 +53,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:  * coreboot PSTATE/TOM SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *) current;
-	acpi_create_ssdt_generator(ssdt, ACPI_TABLE_CREATOR);
-	current += ssdt->length;
-	acpi_add_table(rsdp,ssdt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c b/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c
index 32649ba..ea3ec6c 100644
--- a/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c
+++ b/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c
@@ -28,9 +28,7 @@
 #include <cpu/amd/amdfam10_sysconf.h>
 
 #include "mb_sysconf.h"
-
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
+#include "mainboard.h"
 
 #if CONFIG_ACPI_SSDTX_NUM >= 1
 extern const unsigned char AmlCode_ssdt2[];
@@ -39,12 +37,6 @@ extern const unsigned char AmlCode_ssdt4[];
 extern const unsigned char AmlCode_ssdt5[];
 #endif
 
-unsigned long acpi_fill_mcfg(unsigned long current)
-{
-	/* Just a dummy */
-	return current;
-}
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	u32 gsi_base=0x18;
@@ -141,19 +133,9 @@ unsigned long acpi_fill_madt(unsigned long current)
 	return current;
 }
 
-unsigned long write_acpi_tables(unsigned long start)
+unsigned long mainboard_write_acpi_tables(unsigned long current,
+					  acpi_rsdp_t *rsdp)
 {
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
 	acpi_header_t *ssdtx;
 	void *p;
 
@@ -161,97 +143,6 @@ unsigned long write_acpi_tables(unsigned long start)
 
 	get_bus_conf(); //it will get sblk, pci1234, hcdn, and sbdn
 
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current;
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n", dsdt, dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current;
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n", current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current+=madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current+=srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current+=slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt, ssdt->length);
-	acpi_add_table(rsdp, ssdt);
-
 #if CONFIG_ACPI_SSDTX_NUM >= 1
 
 	/* same htio, but different possition? We may have to copy,
@@ -293,6 +184,5 @@ unsigned long write_acpi_tables(unsigned long start)
 	}
 #endif
 
-	printk(BIOS_INFO, "ACPI: done.\n");
 	return current;
 }
diff --git a/src/mainboard/amd/serengeti_cheetah_fam10/mainboard.c b/src/mainboard/amd/serengeti_cheetah_fam10/mainboard.c
new file mode 100644
index 0000000..b9c88f6
--- /dev/null
+++ b/src/mainboard/amd/serengeti_cheetah_fam10/mainboard.c
@@ -0,0 +1,15 @@
+#include <console/console.h>
+#include <device/device.h>
+#include <arch/acpi.h>
+#include <arch/acpi.h>
+#include <arch/acpigen.h>
+#include "mainboard.h"
+
+static void mainboard_enable(device_t dev)
+{
+	dev->ops->write_acpi_tables = mainboard_write_acpi_tables;
+}
+
+struct chip_operations mainboard_ops = {
+	.enable_dev = mainboard_enable,
+};
diff --git a/src/mainboard/amd/serengeti_cheetah_fam10/mainboard.h b/src/mainboard/amd/serengeti_cheetah_fam10/mainboard.h
new file mode 100644
index 0000000..8f17804
--- /dev/null
+++ b/src/mainboard/amd/serengeti_cheetah_fam10/mainboard.h
@@ -0,0 +1,2 @@
+unsigned long mainboard_write_acpi_tables(unsigned long start, acpi_rsdp_t *rsdp);
+
diff --git a/src/mainboard/amd/tilapia_fam10/acpi_tables.c b/src/mainboard/amd/tilapia_fam10/acpi_tables.c
index 30a7388..df89e8c 100644
--- a/src/mainboard/amd/tilapia_fam10/acpi_tables.c
+++ b/src/mainboard/amd/tilapia_fam10/acpi_tables.c
@@ -29,16 +29,6 @@
 
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-#endif
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -63,160 +53,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-	acpi_header_t *ssdtx;
-	void *p;
-	int i;
-#endif
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
-	acpi_add_table(rsdp,ssdt);
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-
-	/* same htio, but different position? We may have to copy,
-	change HCIN, and recalculate the checknum and add_table */
-
-	for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
-		if((sysconf.pci1234[i] & 1) != 1 ) continue;
-		u8 c;
-		if (i < 7) {
-			c = (u8) ('4' + i - 1);
-		} else {
-			c = (u8) ('A' + i - 1 - 6);
-		}
-		current = ALIGN(current, 8);
-		printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c at %lx\n", c, current); //pci0 and pci1 are in dsdt
-		ssdtx = (acpi_header_t *)current;
-		switch (sysconf.hcid[i]) {
-		case 1:
-			p = &AmlCode_ssdt2;
-			break;
-		case 2:
-			p = &AmlCode_ssdt3;
-			break;
-		case 3:	/* 8131 */
-			p = &AmlCode_ssdt4;
-			break;
-		default:
-			/* HTX no io apic */
-			p = &AmlCode_ssdt5;
-			break;
-		}
-		memcpy(ssdtx, p, sizeof(acpi_header_t));
-		current += ssdtx->length;
-		memcpy(ssdtx, p, ssdtx->length);
-		update_ssdtx((void *)ssdtx, i);
-		ssdtx->checksum = 0;
-		ssdtx->checksum = acpi_checksum((u8 *)ssdtx, ssdtx->length);
-		acpi_add_table(rsdp, ssdtx);
-	}
-#endif
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/asus/m4a78-em/acpi_tables.c b/src/mainboard/asus/m4a78-em/acpi_tables.c
index 7e159b4..41d2b6c 100644
--- a/src/mainboard/asus/m4a78-em/acpi_tables.c
+++ b/src/mainboard/asus/m4a78-em/acpi_tables.c
@@ -28,16 +28,6 @@
 #include <cpu/amd/amdfam10_sysconf.h>
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-#endif
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -62,160 +52,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-	acpi_header_t *ssdtx;
-	void *p;
-	int i;
-#endif
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
-	acpi_add_table(rsdp,ssdt);
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-
-	/* same htio, but different position? We may have to copy,
-	change HCIN, and recalculate the checknum and add_table */
-
-	for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
-		if((sysconf.pci1234[i] & 1) != 1 ) continue;
-		u8 c;
-		if (i < 7) {
-			c = (u8) ('4' + i - 1);
-		} else {
-			c = (u8) ('A' + i - 1 - 6);
-		}
-		current = ALIGN(current, 8);
-		printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c at %lx\n", c, current); //pci0 and pci1 are in dsdt
-		ssdtx = (acpi_header_t *)current;
-		switch (sysconf.hcid[i]) {
-		case 1:
-			p = &AmlCode_ssdt2;
-			break;
-		case 2:
-			p = &AmlCode_ssdt3;
-			break;
-		case 3:	/* 8131 */
-			p = &AmlCode_ssdt4;
-			break;
-		default:
-			/* HTX no io apic */
-			p = &AmlCode_ssdt5;
-			break;
-		}
-		memcpy(ssdtx, p, sizeof(acpi_header_t));
-		current += ssdtx->length;
-		memcpy(ssdtx, p, ssdtx->length);
-		update_ssdtx((void *)ssdtx, i);
-		ssdtx->checksum = 0;
-		ssdtx->checksum = acpi_checksum((u8 *)ssdtx, ssdtx->length);
-		acpi_add_table(rsdp, ssdtx);
-	}
-#endif
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/asus/m4a785-m/acpi_tables.c b/src/mainboard/asus/m4a785-m/acpi_tables.c
index 1c0afeb..4de1ebf 100644
--- a/src/mainboard/asus/m4a785-m/acpi_tables.c
+++ b/src/mainboard/asus/m4a785-m/acpi_tables.c
@@ -29,37 +29,6 @@
 #include <cpu/amd/amdfam10_sysconf.h>
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-unsigned long acpi_fill_ssdt_generator(unsigned long current, const char *oem_table_id)
-{
-	int lens;
-	msr_t msr;
-	char pscope[] = "\\_SB.PCI0";
-
-	lens = acpigen_write_scope(pscope);
-	msr = rdmsr(TOP_MEM);
-	lens += acpigen_write_name_dword("TOM1", msr.lo);
-	msr = rdmsr(TOP_MEM2);
-	/*
-	 * Since XP only implements parts of ACPI 2.0, we can't use a qword
-	 * here.
-	 * See http://www.acpi.info/presentations/S01USMOBS169_OS%2520new.ppt
-	 * slide 22ff.
-	 * Shift value right by 20 bit to make it fit into 32bit,
-	 * giving us 1MB granularity and a limit of almost 4Exabyte of memory.
-	 */
-	lens += acpigen_write_name_dword("TOM2", (msr.hi << 12) | msr.lo >> 20);
-	acpigen_patch_len(lens - 1);
-
-	/* TODO: More HT and other tables need to go into this table generation.
-	 * This should also be moved out to the silicon level if it can.
-	 */
-
-	return (unsigned long) (acpigen_get_current());
-}
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -84,108 +53,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:  * coreboot PSTATE/TOM SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *) current;
-	acpi_create_ssdt_generator(ssdt, ACPI_TABLE_CREATOR);
-	current += ssdt->length;
-	acpi_add_table(rsdp,ssdt);
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/asus/m5a88-v/acpi_tables.c b/src/mainboard/asus/m5a88-v/acpi_tables.c
index 3f9bd60..ce32c97 100644
--- a/src/mainboard/asus/m5a88-v/acpi_tables.c
+++ b/src/mainboard/asus/m5a88-v/acpi_tables.c
@@ -29,22 +29,6 @@
 
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-#endif
-
-unsigned long acpi_fill_mcfg(unsigned long current)
-{
-	/* Just a dummy */
-	return current;
-}
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -69,160 +53,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-	acpi_header_t *ssdtx;
-	void *p;
-	int i;
-#endif
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
-	acpi_add_table(rsdp,ssdt);
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-
-	/* same htio, but different position? We may have to copy,
-	change HCIN, and recalculate the checknum and add_table */
-
-	for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
-		if((sysconf.pci1234[i] & 1) != 1 ) continue;
-		u8 c;
-		if (i < 7) {
-			c = (u8) ('4' + i - 1);
-		} else {
-			c = (u8) ('A' + i - 1 - 6);
-		}
-		current = ALIGN(current, 8);
-		printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c at %lx\n", c, current); //pci0 and pci1 are in dsdt
-		ssdtx = (acpi_header_t *)current;
-		switch (sysconf.hcid[i]) {
-		case 1:
-			p = &AmlCode_ssdt2;
-			break;
-		case 2:
-			p = &AmlCode_ssdt3;
-			break;
-		case 3:	/* 8131 */
-			p = &AmlCode_ssdt4;
-			break;
-		default:
-			/* HTX no io apic */
-			p = &AmlCode_ssdt5;
-			break;
-		}
-		memcpy(ssdtx, p, sizeof(acpi_header_t));
-		current += ssdtx->length;
-		memcpy(ssdtx, p, ssdtx->length);
-		update_ssdtx((void *)ssdtx, i);
-		ssdtx->checksum = 0;
-		ssdtx->checksum = acpi_checksum((u8 *)ssdtx, ssdtx->length);
-		acpi_add_table(rsdp, ssdtx);
-	}
-#endif
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/avalue/eax-785e/acpi_tables.c b/src/mainboard/avalue/eax-785e/acpi_tables.c
index 3f9bd60..ce32c97 100644
--- a/src/mainboard/avalue/eax-785e/acpi_tables.c
+++ b/src/mainboard/avalue/eax-785e/acpi_tables.c
@@ -29,22 +29,6 @@
 
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-#endif
-
-unsigned long acpi_fill_mcfg(unsigned long current)
-{
-	/* Just a dummy */
-	return current;
-}
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -69,160 +53,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-	acpi_header_t *ssdtx;
-	void *p;
-	int i;
-#endif
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
-	acpi_add_table(rsdp,ssdt);
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-
-	/* same htio, but different position? We may have to copy,
-	change HCIN, and recalculate the checknum and add_table */
-
-	for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
-		if((sysconf.pci1234[i] & 1) != 1 ) continue;
-		u8 c;
-		if (i < 7) {
-			c = (u8) ('4' + i - 1);
-		} else {
-			c = (u8) ('A' + i - 1 - 6);
-		}
-		current = ALIGN(current, 8);
-		printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c at %lx\n", c, current); //pci0 and pci1 are in dsdt
-		ssdtx = (acpi_header_t *)current;
-		switch (sysconf.hcid[i]) {
-		case 1:
-			p = &AmlCode_ssdt2;
-			break;
-		case 2:
-			p = &AmlCode_ssdt3;
-			break;
-		case 3:	/* 8131 */
-			p = &AmlCode_ssdt4;
-			break;
-		default:
-			/* HTX no io apic */
-			p = &AmlCode_ssdt5;
-			break;
-		}
-		memcpy(ssdtx, p, sizeof(acpi_header_t));
-		current += ssdtx->length;
-		memcpy(ssdtx, p, ssdtx->length);
-		update_ssdtx((void *)ssdtx, i);
-		ssdtx->checksum = 0;
-		ssdtx->checksum = acpi_checksum((u8 *)ssdtx, ssdtx->length);
-		acpi_add_table(rsdp, ssdtx);
-	}
-#endif
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/gigabyte/ma785gm/acpi_tables.c b/src/mainboard/gigabyte/ma785gm/acpi_tables.c
index 4c0cb77..df89e8c 100644
--- a/src/mainboard/gigabyte/ma785gm/acpi_tables.c
+++ b/src/mainboard/gigabyte/ma785gm/acpi_tables.c
@@ -29,16 +29,6 @@
 
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-#endif
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -63,160 +53,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-	acpi_header_t *ssdtx;
-	void *p;
-	int i;
-#endif
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
-	acpi_add_table(rsdp,ssdt);
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-
-	/* same htio, but different position? We may have to copy,
-	change HCIN, and recalculate the checknum and add_table */
-
-	for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
-		if((sysconf.pci1234[i] & 1) != 1 ) continue;
-		u8 c;
-		if (i < 7) {
-			c = (u8) ('4' + i - 1);
-		} else {
-			c = (u8) ('A' + i - 1 - 6);
-		}
-		current = ALIGN(current, 8);
-		printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c at %lx\n", c, current); //pci0 and pci1 are in dsdt
-		ssdtx = (acpi_header_t *)current;
-		switch (sysconf.hcid[i]) {
-		case 1:
-			p = &AmlCode_ssdt2;
-			break;
-		case 2:
-			p = &AmlCode_ssdt3;
-			break;
-		case 3:	/* 8131 */
-			p = &AmlCode_ssdt4;
-			break;
-		default:
-			/* HTX no io apic */
-			p = &AmlCode_ssdt5;
-			break;
-		}
-		memcpy(ssdtx, p, sizeof(acpi_header_t));
-		current += ssdtx->length;
-		memcpy(ssdtx, p, ssdtx->length);
-		update_ssdtx((void *)ssdtx, i);
-		ssdtx->checksum = 0;
-		ssdtx->checksum = acpi_checksum((u8 *)ssdtx, ssdtx->length);
-		acpi_add_table(rsdp, ssdtx);
-	}
-#endif
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/gigabyte/ma785gmt/acpi_tables.c b/src/mainboard/gigabyte/ma785gmt/acpi_tables.c
index a9e72eb..5057442 100644
--- a/src/mainboard/gigabyte/ma785gmt/acpi_tables.c
+++ b/src/mainboard/gigabyte/ma785gmt/acpi_tables.c
@@ -27,16 +27,6 @@
 #include <cpu/amd/mtrr.h>
 #include <cpu/amd/amdfam10_sysconf.h>
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-#endif
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -61,160 +51,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-	acpi_header_t *ssdtx;
-	void *p;
-	int i;
-#endif
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
-	acpi_add_table(rsdp,ssdt);
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-
-	/* same htio, but different position? We may have to copy,
-	change HCIN, and recalculate the checknum and add_table */
-
-	for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
-		if((sysconf.pci1234[i] & 1) != 1 ) continue;
-		u8 c;
-		if (i < 7) {
-			c = (u8) ('4' + i - 1);
-		} else {
-			c = (u8) ('A' + i - 1 - 6);
-		}
-		current = ALIGN(current, 8);
-		printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c at %lx\n", c, current); //pci0 and pci1 are in dsdt
-		ssdtx = (acpi_header_t *)current;
-		switch (sysconf.hcid[i]) {
-		case 1:
-			p = &AmlCode_ssdt2;
-			break;
-		case 2:
-			p = &AmlCode_ssdt3;
-			break;
-		case 3:	/* 8131 */
-			p = &AmlCode_ssdt4;
-			break;
-		default:
-			/* HTX no io apic */
-			p = &AmlCode_ssdt5;
-			break;
-		}
-		memcpy(ssdtx, p, sizeof(acpi_header_t));
-		current += ssdtx->length;
-		memcpy(ssdtx, p, ssdtx->length);
-		update_ssdtx((void *)ssdtx, i);
-		ssdtx->checksum = 0;
-		ssdtx->checksum = acpi_checksum((u8 *)ssdtx, ssdtx->length);
-		acpi_add_table(rsdp, ssdtx);
-	}
-#endif
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/iei/kino-780am2-fam10/acpi_tables.c b/src/mainboard/iei/kino-780am2-fam10/acpi_tables.c
index 5efb0ee..bc3b49d 100644
--- a/src/mainboard/iei/kino-780am2-fam10/acpi_tables.c
+++ b/src/mainboard/iei/kino-780am2-fam10/acpi_tables.c
@@ -29,37 +29,6 @@
 #include <cpu/amd/amdfam10_sysconf.h>
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-unsigned long acpi_fill_ssdt_generator(unsigned long current, const char *oem_table_id)
-{
-	int lens;
-	msr_t msr;
-	char pscope[] = "\\_SB.PCI0";
-
-	lens = acpigen_write_scope(pscope);
-	msr = rdmsr(TOP_MEM);
-	lens += acpigen_write_name_dword("TOM1", msr.lo);
-	msr = rdmsr(TOP_MEM2);
-	/*
-	 * Since XP only implements parts of ACPI 2.0, we can't use a qword
-	 * here.
-	 * See http://www.acpi.info/presentations/S01USMOBS169_OS%2520new.ppt
-	 * slide 22ff.
-	 * Shift value right by 20 bit to make it fit into 32bit,
-	 * giving us 1MB granularity and a limit of almost 4Exabyte of memory.
-	 */
-	lens += acpigen_write_name_dword("TOM2", (msr.hi << 12) | msr.lo >> 20);
-	acpigen_patch_len(lens - 1);
-
-	/* TODO: More HT and other tables need to go into this table generation.
-	 * This should also be moved out to the silicon level if it can.
-	 */
-
-	return (unsigned long) (acpigen_get_current());
-}
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -84,108 +53,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:  * coreboot PSTATE/TOM SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *) current;
-	acpi_create_ssdt_generator(ssdt, ACPI_TABLE_CREATOR);
-	current += ssdt->length;
-	acpi_add_table(rsdp,ssdt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/jetway/pa78vm5/acpi_tables.c b/src/mainboard/jetway/pa78vm5/acpi_tables.c
index 1c5404f..3d5fd35 100644
--- a/src/mainboard/jetway/pa78vm5/acpi_tables.c
+++ b/src/mainboard/jetway/pa78vm5/acpi_tables.c
@@ -28,16 +28,6 @@
 #include <cpu/amd/mtrr.h>
 #include <cpu/amd/amdfam10_sysconf.h>
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-#endif
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	/* create all subtables for processors */
@@ -62,160 +52,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-	acpi_header_t *ssdtx;
-	void *p;
-	int i;
-#endif
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
-	acpi_add_table(rsdp,ssdt);
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-
-	/* same htio, but different position? We may have to copy,
-	change HCIN, and recalculate the checknum and add_table */
-
-	for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
-		if((sysconf.pci1234[i] & 1) != 1 ) continue;
-		u8 c;
-		if (i < 7) {
-			c = (u8) ('4' + i - 1);
-		} else {
-			c = (u8) ('A' + i - 1 - 6);
-		}
-		current = ALIGN(current, 8);
-		printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c at %lx\n", c, current); //pci0 and pci1 are in dsdt
-		ssdtx = (acpi_header_t *)current;
-		switch (sysconf.hcid[i]) {
-		case 1:
-			p = &AmlCode_ssdt2;
-			break;
-		case 2:
-			p = &AmlCode_ssdt3;
-			break;
-		case 3:	/* 8131 */
-			p = &AmlCode_ssdt4;
-			break;
-		default:
-			/* HTX no io apic */
-			p = &AmlCode_ssdt5;
-			break;
-		}
-		memcpy(ssdtx, p, sizeof(acpi_header_t));
-		current += ssdtx->length;
-		memcpy(ssdtx, p, ssdtx->length);
-		update_ssdtx((void *)ssdtx, i);
-		ssdtx->checksum = 0;
-		ssdtx->checksum = acpi_checksum((u8 *)ssdtx, ssdtx->length);
-		acpi_add_table(rsdp, ssdtx);
-	}
-#endif
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/msi/ms9652_fam10/acpi_tables.c b/src/mainboard/msi/ms9652_fam10/acpi_tables.c
index 148ac1a..eb1531a 100644
--- a/src/mainboard/msi/ms9652_fam10/acpi_tables.c
+++ b/src/mainboard/msi/ms9652_fam10/acpi_tables.c
@@ -35,8 +35,6 @@
 #include <cpu/amd/amdfam10_sysconf.h>
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	unsigned int gsi_base = 0x18;
@@ -89,113 +87,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long acpi_fill_ssdt_generator(unsigned long current, const char *oem_table_id)
-{
-	//k8acpi_write_vars();
-	//amd_generate_powernow(0, 0, 0);
-	//return (unsigned long) (acpigen_get_current());
-	return 0;
-}
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_srat_t *srat;
-	acpi_rsdt_t *rsdt;
-	acpi_mcfg_t *mcfg;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_slit_t *slit;
-	acpi_header_t *ssdt;
-	acpi_header_t *dsdt;
-
-	/* Align ACPI tables to 16 byte. */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT table. */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* Clear all table memory. */
-	memset((void *) start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/* We explicitly add these tables later on: */
-	printk(BIOS_DEBUG, "ACPI:     * FACS\n");
-
-	/* we should align FACS to 64B as per ACPI specs */
-	current = ALIGN(current, 64);
-	facs = (acpi_facs_t *) current;
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	dsdt = (acpi_header_t *) current;
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	dsdt->checksum = 0;	/* Don't trust iasl to get this right. */
-	dsdt->checksum = acpi_checksum((u8 *)dsdt, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:     * DSDT @ %p Length %x\n", dsdt,
-		     dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:     * FADT\n");
-
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	printk(BIOS_DEBUG, "ACPI:    * HPET\n");
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET timers Linux wants an MADT. */
-	printk(BIOS_DEBUG, "ACPI:    * MADT\n");
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	printk(BIOS_DEBUG, "ACPI:    * MCFG\n");
-	mcfg = (acpi_mcfg_t *) current;
-	acpi_create_mcfg(mcfg);
-	current += mcfg->header.length;
-	acpi_add_table(rsdp, mcfg);
-
-	printk(BIOS_DEBUG, "ACPI:    * SRAT\n");
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	printk(BIOS_DEBUG, "ACPI:    * SLIT\n");
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current+=slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	printk(BIOS_DEBUG, "ACPI:    * SSDT\n");
-	ssdt = (acpi_header_t *)current;
-
-	acpi_create_ssdt_generator(ssdt, ACPI_TABLE_CREATOR);
-	current += ssdt->length;
-	acpi_add_table(rsdp, ssdt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/mainboard/supermicro/h8scm_fam10/acpi_tables.c b/src/mainboard/supermicro/h8scm_fam10/acpi_tables.c
index 66a5239..5e3170d 100644
--- a/src/mainboard/supermicro/h8scm_fam10/acpi_tables.c
+++ b/src/mainboard/supermicro/h8scm_fam10/acpi_tables.c
@@ -29,16 +29,6 @@
 
 #include "mb_sysconf.h"
 
-extern const unsigned char AmlCode[];
-extern const unsigned char AmlCode_ssdt[];
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-#endif
-
 unsigned long acpi_fill_madt(unsigned long current)
 {
 	device_t dev;
@@ -76,160 +66,3 @@ unsigned long acpi_fill_madt(unsigned long current)
 
 	return current;
 }
-
-unsigned long write_acpi_tables(unsigned long start)
-{
-	unsigned long current;
-	acpi_rsdp_t *rsdp;
-	acpi_rsdt_t *rsdt;
-	acpi_hpet_t *hpet;
-	acpi_madt_t *madt;
-	acpi_srat_t *srat;
-	acpi_slit_t *slit;
-	acpi_fadt_t *fadt;
-	acpi_facs_t *facs;
-	acpi_header_t *dsdt;
-	acpi_header_t *ssdt;
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-	acpi_header_t *ssdtx;
-	void *p;
-	int i;
-#endif
-
-	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
-
-	/* Align ACPI tables to 16 bytes */
-	start = ALIGN(start, 16);
-	current = start;
-
-	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
-
-	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (acpi_rsdp_t *) current;
-	current += sizeof(acpi_rsdp_t);
-	rsdt = (acpi_rsdt_t *) current;
-	current += sizeof(acpi_rsdt_t);
-
-	/* clear all table memory */
-	memset((void *)start, 0, current - start);
-
-	acpi_write_rsdp(rsdp, rsdt, NULL);
-	acpi_write_rsdt(rsdt);
-
-	/*
-	 * We explicitly add these tables later on:
-	 */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
-	hpet = (acpi_hpet_t *) current;
-	current += sizeof(acpi_hpet_t);
-	acpi_create_hpet(hpet);
-	acpi_add_table(rsdp, hpet);
-
-	/* If we want to use HPET Timers Linux wants an MADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
-	madt = (acpi_madt_t *) current;
-	acpi_create_madt(madt);
-	current += madt->header.length;
-	acpi_add_table(rsdp, madt);
-
-	/* SRAT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
-	srat = (acpi_srat_t *) current;
-	acpi_create_srat(srat);
-	current += srat->header.length;
-	acpi_add_table(rsdp, srat);
-
-	/* SLIT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
-	slit = (acpi_slit_t *) current;
-	acpi_create_slit(slit);
-	current += slit->header.length;
-	acpi_add_table(rsdp, slit);
-
-	/* SSDT */
-	current = ALIGN(current, 16);
-	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
-	ssdt = (acpi_header_t *)current;
-	memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
-	current += ssdt->length;
-	memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
-	//Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c
-	update_ssdt((void*)ssdt);
-	/* recalculate checksum */
-	ssdt->checksum = 0;
-	ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
-	acpi_add_table(rsdp,ssdt);
-
-#if CONFIG_ACPI_SSDTX_NUM >= 1
-
-	/* same htio, but different position? We may have to copy,
-	change HCIN, and recalculate the checknum and add_table */
-
-	for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
-		if((sysconf.pci1234[i] & 1) != 1 ) continue;
-		u8 c;
-		if (i < 7) {
-			c = (u8) ('4' + i - 1);
-		} else {
-			c = (u8) ('A' + i - 1 - 6);
-		}
-		current = ALIGN(current, 8);
-		printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c at %lx\n", c, current); //pci0 and pci1 are in dsdt
-		ssdtx = (acpi_header_t *)current;
-		switch (sysconf.hcid[i]) {
-		case 1:
-			p = &AmlCode_ssdt2;
-			break;
-		case 2:
-			p = &AmlCode_ssdt3;
-			break;
-		case 3:	/* 8131 */
-			p = &AmlCode_ssdt4;
-			break;
-		default:
-			/* HTX no io apic */
-			p = &AmlCode_ssdt5;
-			break;
-		}
-		memcpy(ssdtx, p, sizeof(acpi_header_t));
-		current += ssdtx->length;
-		memcpy(ssdtx, p, ssdtx->length);
-		update_ssdtx((void *)ssdtx, i);
-		ssdtx->checksum = 0;
-		ssdtx->checksum = acpi_checksum((u8 *)ssdtx, ssdtx->length);
-		acpi_add_table(rsdp, ssdtx);
-	}
-#endif
-
-	/* DSDT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
-	dsdt = (acpi_header_t *)current; // it will used by fadt
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	current += dsdt->length;
-	memcpy(dsdt, &AmlCode, dsdt->length);
-	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
-
-	/* FACS */ // it needs 64 bit alignment
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:	* FACS at %lx\n", current);
-	facs = (acpi_facs_t *) current; // it will be used by fadt
-	current += sizeof(acpi_facs_t);
-	acpi_create_facs(facs);
-
-	/* FADT */
-	current = ALIGN(current, 8);
-	printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
-	fadt = (acpi_fadt_t *) current;
-	current += sizeof(acpi_fadt_t);
-
-	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
-
-	printk(BIOS_INFO, "ACPI: done.\n");
-	return current;
-}
diff --git a/src/northbridge/amd/amdfam10/Kconfig b/src/northbridge/amd/amdfam10/Kconfig
index d26b05e..71339a7 100644
--- a/src/northbridge/amd/amdfam10/Kconfig
+++ b/src/northbridge/amd/amdfam10/Kconfig
@@ -24,6 +24,7 @@ config NORTHBRIDGE_AMD_AMDFAM10
 	select HAVE_DEBUG_CAR
 	select HYPERTRANSPORT_PLUGIN_SUPPORT
 	select MMCONF_SUPPORT
+	select PER_DEVICE_ACPI_TABLES
 
 if NORTHBRIDGE_AMD_AMDFAM10
 config AGP_APERTURE_SIZE
diff --git a/src/northbridge/amd/amdfam10/Makefile.inc b/src/northbridge/amd/amdfam10/Makefile.inc
index 7dc74df..f46027a 100644
--- a/src/northbridge/amd/amdfam10/Makefile.inc
+++ b/src/northbridge/amd/amdfam10/Makefile.inc
@@ -2,7 +2,6 @@ ramstage-y += northbridge.c
 ramstage-y += misc_control.c
 
 ramstage-$(CONFIG_GENERATE_ACPI_TABLES) += acpi.c
-ramstage-$(CONFIG_GENERATE_ACPI_TABLES) += ssdt.asl
 
 ramstage-y += get_pci1234.c
 
diff --git a/src/northbridge/amd/amdfam10/acpi.c b/src/northbridge/amd/amdfam10/acpi.c
index 513fa58..3fcb570 100644
--- a/src/northbridge/amd/amdfam10/acpi.c
+++ b/src/northbridge/amd/amdfam10/acpi.c
@@ -20,6 +20,7 @@
 #include <console/console.h>
 #include <string.h>
 #include <arch/acpi.h>
+#include <arch/acpigen.h>
 #include <device/pci.h>
 #include <cpu/x86/msr.h>
 #include <cpu/amd/mtrr.h>
@@ -162,131 +163,175 @@ unsigned long acpi_fill_slit(unsigned long current)
 	return current;
 }
 
-// moved from mb acpi_tables.c
-static void intx_to_stream(u32 val, u32 len, u8 *dest)
+void update_ssdtx(void *ssdtx, int i)
 {
-	int i;
-	for(i=0;i<len;i++) {
-		*(dest+i) = (val >> (8*i)) & 0xff;
+	u8 *PCI;
+	u8 *HCIN;
+	u8 *UID;
+
+	PCI = ssdtx + 0x32;
+	HCIN = ssdtx + 0x39;
+	UID = ssdtx + 0x40;
+
+	if (i < 7) {
+		*PCI = (u8) ('4' + i - 1);
+	} else {
+		*PCI = (u8) ('A' + i - 1 - 6);
 	}
-}
+	*HCIN = (u8) i;
+	*UID = (u8) (i + 3);
+
+	/* FIXME: need to update the GSI id in the ssdtx too */
 
-static void int_to_stream(u32 val, u8 *dest)
-{
-	return intx_to_stream(val, 4, dest);
 }
 
-// used by acpi_tables.h
-void update_ssdt(void *ssdt)
+void northbridge_acpi_write_vars(void)
 {
-	u8 *BUSN;
-	u8 *MMIO;
-	u8 *PCIO;
-	u8 *SBLK;
-	u8 *TOM1;
-	u8 *SBDN;
-	u8 *HCLK;
-	u8 *HCDN;
-	u8 *CBST;
-	u8 *CBBX;
-	u8 *CBS2;
-	u8 *CBB2;
+	int lens, lenp;
+	msr_t msr;
+	char pscope[] = "\\_SB.PCI0";
+	int i;
 
+	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
 
-	int i;
-	u32 dword;
-	msr_t msr;
+	lens = acpigen_write_scope(pscope);
 
-	// the offset could be different if have different HC_NUMS, and HC_POSSIBLE_NUM and ssdt.asl
-	BUSN = ssdt+0x3b; //+5 will be next BUSN
-	MMIO = ssdt+0xe4; //+5 will be next MMIO
-	PCIO = ssdt+0x36d; //+5 will be next PCIO
-	SBLK = ssdt+0x4b2; // one byte
-	TOM1 = ssdt+0x4b9; //
-	SBDN = ssdt+0x4c3;//
-	HCLK = ssdt+0x4d1; //+5 will be next HCLK
-	HCDN = ssdt+0x57a; //+5 will be next HCDN
-	CBBX = ssdt+0x61f; //
-	CBST = ssdt+0x626;
-	CBB2 = ssdt+0x62d; //
-	CBS2 = ssdt+0x634;
-
-	for(i=0;i<HC_NUMS;i++) {
-		dword = sysconf.ht_c_conf_bus[i];
-		int_to_stream(dword, BUSN+i*5);
+	lens += acpigen_write_name("BUSN");
+	lenp = acpigen_write_package(HC_NUMS);
+	for(i=0; i<HC_NUMS; i++) {
+		lenp += acpigen_write_dword(sysconf.ht_c_conf_bus[i]);
 	}
+	// minus the opcode
+	acpigen_patch_len(lenp - 1);
+	lens += lenp;
+
+	lens += acpigen_write_name("MMIO");
+
+	lenp = acpigen_write_package(HC_NUMS * 4);
 
 	for(i=0;i<(HC_NUMS*2);i++) { // FIXME: change to more chain
-		dword = sysconf.conf_mmio_addrx[i]; //base
-		int_to_stream(dword, MMIO+(i*2)*5);
-		dword = sysconf.conf_mmio_addr[i]; //mask
-		int_to_stream(dword, MMIO+(i*2+1)*5);
+		lenp += acpigen_write_dword(sysconf.conf_mmio_addrx[i]); //base
+		lenp += acpigen_write_dword(sysconf.conf_mmio_addr[i]); //mask
 	}
+	// minus the opcode
+	acpigen_patch_len(lenp - 1);
+	lens += lenp;
+
+	lens += acpigen_write_name("PCIO");
+
+	lenp = acpigen_write_package(HC_NUMS * 2);
+
 	for(i=0;i<HC_NUMS;i++) { // FIXME: change to more chain
-		dword = sysconf.conf_io_addrx[i];
-		int_to_stream(dword, PCIO+(i*2)*5);
-		dword = sysconf.conf_io_addr[i];
-		int_to_stream(dword, PCIO+(i*2+1)*5);
+		lenp += acpigen_write_dword(sysconf.conf_io_addrx[i]);
+		lenp += acpigen_write_dword(sysconf.conf_io_addr[i]);
 	}
 
-	*SBLK = (u8)(sysconf.sblk);
+	// minus the opcode
+	acpigen_patch_len(lenp - 1);
+	lens += lenp;
+
+	lens += acpigen_write_name_byte("SBLK", sysconf.sblk);
 
 	msr = rdmsr(TOP_MEM);
-	int_to_stream(msr.lo, TOM1);
+	lens += acpigen_write_name_dword("TOM1", msr.lo);
+
+	msr = rdmsr(TOP_MEM2);
+	/*
+	 * Since XP only implements parts of ACPI 2.0, we can't use a qword
+	 * here.
+	 * See http://www.acpi.info/presentations/S01USMOBS169_OS%2520new.ppt
+	 * slide 22ff.
+	 * Shift value right by 20 bit to make it fit into 32bit,
+	 * giving us 1MB granularity and a limit of almost 4Exabyte of memory.
+	 */
+	lens += acpigen_write_name_dword("TOM2", (msr.hi << 12) | msr.lo >> 20);
 
-	int_to_stream(sysconf.sbdn, SBDN);
+
+	lens += acpigen_write_name_dword("SBDN", sysconf.sbdn);
+
+	lens += acpigen_write_name("HCLK");
+
+	lenp = acpigen_write_package(HC_POSSIBLE_NUM);
 
 	for(i=0;i<sysconf.hc_possible_num;i++) {
-		int_to_stream(sysconf.pci1234[i], HCLK + i*5);
-		int_to_stream(sysconf.hcdn[i],	   HCDN + i*5);
+		lenp += acpigen_write_dword(sysconf.pci1234[i]);
 	}
 	for(i=sysconf.hc_possible_num; i<HC_POSSIBLE_NUM; i++) { // in case we set array size to other than 8
-		int_to_stream(0x00000000, HCLK + i*5);
-		int_to_stream(0x20202020, HCDN + i*5);
+		lenp += acpigen_write_dword(0x00000000);
 	}
+	// minus the opcode
+	acpigen_patch_len(lenp - 1);
+	lens += lenp;
+
+	lens += acpigen_write_name("HCDN");
+
+	lenp = acpigen_write_package(HC_POSSIBLE_NUM);
 
-	*CBBX = (u8)(CONFIG_CBB);
+	for(i=0;i<sysconf.hc_possible_num;i++) {
+		lenp += acpigen_write_dword(sysconf.hcdn[i]);
+	}
+	for(i=sysconf.hc_possible_num; i<HC_POSSIBLE_NUM; i++) { // in case we set array size to other than 8
+		lenp += acpigen_write_dword(0x20202020);
+	}
+	// minus the opcode
+	acpigen_patch_len(lenp - 1);
+	lens += lenp;
+
+	lens += acpigen_write_name_byte("CBB", CONFIG_CBB);
+
+	u8 CBST, CBB2, CBS2;
 
 	if(CONFIG_CBB == 0xff) {
-		*CBST = (u8) (0x0f);
+		CBST = (u8) (0x0f);
 	} else {
 		if((sysconf.pci1234[0] >> 12) & 0xff) { //sb chain on  other than bus 0
-			*CBST = (u8) (0x0f);
+			CBST = (u8) (0x0f);
 		}
 		else {
-			*CBST = (u8) (0x00);
+			CBST = (u8) (0x00);
 		}
 	}
 
+	lens += acpigen_write_name_byte("CBST", CBST);
+
 	if((CONFIG_CBB == 0xff) && (sysconf.nodes>32)) {
-		 *CBS2 = 0x0f;
-		 *CBB2 = (u8)(CONFIG_CBB-1);
+		 CBS2 = 0x0f;
+		 CBB2 = (u8)(CONFIG_CBB-1);
 	} else {
-		*CBS2 = 0x00;
-		*CBB2 = 0x00;
+		CBS2 = 0x00;
+		CBB2 = 0x00;
 	}
 
+	lens += acpigen_write_name_byte("CBB2", CBB2);
+	lens += acpigen_write_name_byte("CBS2", CBS2);
+
+	//minus opcode
+	acpigen_patch_len(lens - 1);
 }
 
-void update_ssdtx(void *ssdtx, int i)
+unsigned long northbridge_write_acpi_tables(unsigned long current,
+	struct acpi_rsdp *rsdp)
 {
-	u8 *PCI;
-	u8 *HCIN;
-	u8 *UID;
-
-	PCI = ssdtx + 0x32;
-	HCIN = ssdtx + 0x39;
-	UID = ssdtx + 0x40;
-
-	if (i < 7) {
-		*PCI = (u8) ('4' + i - 1);
-	} else {
-		*PCI = (u8) ('A' + i - 1 - 6);
-	}
-	*HCIN = (u8) i;
-	*UID = (u8) (i + 3);
-
-	/* FIXME: need to update the GSI id in the ssdtx too */
+	acpi_srat_t *srat;
+	acpi_slit_t *slit;
+
+	get_bus_conf();	/* it will get sblk, pci1234, hcdn, and sbdn */
+
+	/* SRAT */
+	current = ALIGN(current, 8);
+	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
+	srat = (acpi_srat_t *) current;
+	acpi_create_srat(srat);
+	current += srat->header.length;
+	acpi_add_table(rsdp, srat);
+
+	/* SLIT */
+	current = ALIGN(current, 8);
+	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
+	slit = (acpi_slit_t *) current;
+	acpi_create_slit(slit);
+	current += slit->header.length;
+	acpi_add_table(rsdp, slit);
 
+	return current;
 }
-
diff --git a/src/northbridge/amd/amdfam10/amdfam10.h b/src/northbridge/amd/amdfam10/amdfam10.h
index 6e71b4e..d292306 100644
--- a/src/northbridge/amd/amdfam10/amdfam10.h
+++ b/src/northbridge/amd/amdfam10/amdfam10.h
@@ -1200,4 +1200,10 @@ u8 get_sbbusn(u8 sblk);
 #include "northbridge/amd/amdht/porting.h"
 BOOL AMD_CB_ManualBUIDSwapList(u8 Node, u8 Link, const u8 **List);
 
+struct acpi_rsdp;
+
+unsigned long northbridge_write_acpi_tables(unsigned long start,
+					    struct acpi_rsdp *rsdp);
+void northbridge_acpi_write_vars(void);
+
 #endif /* AMDFAM10_H */
diff --git a/src/northbridge/amd/amdfam10/northbridge.c b/src/northbridge/amd/amdfam10/northbridge.c
index 529dc0a..bb329e2 100644
--- a/src/northbridge/amd/amdfam10/northbridge.c
+++ b/src/northbridge/amd/amdfam10/northbridge.c
@@ -613,6 +613,8 @@ static struct device_operations northbridge_operations = {
 	.enable_resources = pci_dev_enable_resources,
 	.init		  = mcf0_control_init,
 	.scan_bus	  = amdfam10_scan_chains,
+	.write_acpi_tables = northbridge_write_acpi_tables,
+	.acpi_fill_ssdt_generator = northbridge_acpi_write_vars,
 	.enable		  = 0,
 	.ops_pci	  = 0,
 };
diff --git a/src/northbridge/amd/amdfam10/ssdt.asl b/src/northbridge/amd/amdfam10/ssdt.asl
deleted file mode 100644
index 500446a..0000000
--- a/src/northbridge/amd/amdfam10/ssdt.asl
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2007 Advanced Micro Devices, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/*
- * Make sure HC_NUMS and HC_POSSIBLE_NUM setting is consistent to this file
- */
-
-DefinitionBlock ("SSDT.aml", "SSDT", 1, "AMD-FAM10", "AMD-ACPI", 100925440)
-{
-	/*
-	 * These objects were referenced but not defined in this table
-	 */
-	External (\_SB_.PCI0, DeviceObj)
-
-	Scope (\_SB.PCI0)
-	{
-		Name (BUSN, Package (0x20) /* HC_NUMS */
-		{
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0x10101010,
-			0x11111111,
-			0x12121212,
-			0x13131313,
-			0x14141414,
-			0x15151515,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc
-		})
-		Name (MMIO, Package (0x80) /* HC_NUMS * 4 */
-		{
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0x11111111,
-			0x22222222,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0x11111111,
-			0x22222222,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0x11111111,
-			0x22222222,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0x11111111,
-			0x22222222,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0x11111111,
-			0x22222222,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888
-		})
-		Name (PCIO, Package (0x40) /* HC_NUMS * 2 */
-		{
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0xaaaaaaaa,
-			0xbbbbbbbb,
-			0xcccccccc,
-			0xdddddddd,
-			0xeeeeeeee,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x99999999,
-			0xaaaaaaaa,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444
-		})
-		Name (SBLK, 0x11)
-		Name (TOM1, 0xaaaaaaaa)
-		Name (SBDN, 0xbbbbbbbb)
-		Name (HCLK, Package (0x20) /* HC_POSSIBLE_NUM */
-		{
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888
-		})
-		Name (HCDN, Package (0x20) /* HC_POSSIBLE_NUM */
-		{
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888,
-			0x11111111,
-			0x22222222,
-			0x33333333,
-			0x44444444,
-			0x55555555,
-			0x66666666,
-			0x77777777,
-			0x88888888
-		})
-		Name (CBB, 0x99)
-		Name (CBST, 0x88)
-		Name (CBB2, 0x77)
-		Name (CBS2, 0x66)
-
-	}
-}
diff --git a/src/northbridge/amd/amdfam10/sspr1.asl b/src/northbridge/amd/amdfam10/sspr1.asl
deleted file mode 100644
index ec1dc01..0000000
--- a/src/northbridge/amd/amdfam10/sspr1.asl
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2007 Advanced Micro Devices, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-DefinitionBlock ("SSPR.aml", "SSDT", 1, "AMD-FAM10", "AMD-ACPI", 100925441)
-{
-	Scope (\_SB)
-	{
-		Processor (\_SB.CPAA, 0xbb, 0x120, 6) // CPU0 and 0x01 need to be updated
-		{
-			Name(_PCT, Package ()
-			{
-				ResourceTemplate() {Register (FFixedHW, 0, 0, 0)}, //PERF_CTRL
-				ResourceTemplate() {Register (FFixedHW, 0, 0, 0)}, //PERF_STATUS
-			})
-
-			Name(_PSS, Package()
-			{
-				Package(0x06) {0x1111, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-			})
-		}
-
-	}
-}
diff --git a/src/northbridge/amd/amdfam10/sspr2.asl b/src/northbridge/amd/amdfam10/sspr2.asl
deleted file mode 100644
index d51f2b2..0000000
--- a/src/northbridge/amd/amdfam10/sspr2.asl
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2007 Advanced Micro Devices, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-DefinitionBlock ("SSPR.aml", "SSDT", 1, "AMD-FAM10", "AMD-ACPI", 100925441)
-{
-	Scope (\_SB)
-	{
-		Processor (\_SB.CPAA, 0xbb, 0x120, 6) // CPU0 and 0x01 need to be updated
-		{
-			Name(_PCT, Package ()
-			{
-				ResourceTemplate() {Register (FFixedHW, 0, 0, 0)}, //PERF_CTRL
-				ResourceTemplate() {Register (FFixedHW, 0, 0, 0)}, //PERF_STATUS
-			})
-
-			Name(_PSS, Package()
-			{
-				Package(0x06) {0x1111, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-				Package(0x06) {0x7777, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-			})
-		}
-
-	}
-}
diff --git a/src/northbridge/amd/amdfam10/sspr3.asl b/src/northbridge/amd/amdfam10/sspr3.asl
deleted file mode 100644
index ac99c47..0000000
--- a/src/northbridge/amd/amdfam10/sspr3.asl
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2007 Advanced Micro Devices, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-DefinitionBlock ("SSPR.aml", "SSDT", 1, "AMD-FAM10", "AMD-ACPI", 100925441)
-{
-	Scope (\_SB)
-	{
-		Processor (\_SB.CPAA, 0xbb, 0x120, 6) // CPU0 and 0x01 need to be updated
-		{
-			Name(_PCT, Package ()
-			{
-				ResourceTemplate() {Register (FFixedHW, 0, 0, 0)}, //PERF_CTRL
-				ResourceTemplate() {Register (FFixedHW, 0, 0, 0)}, //PERF_STATUS
-			})
-
-			Name(_PSS, Package()
-			{
-				Package(0x06) {0x1111, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-				Package(0x06) {0x7777, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-				Package(0x06) {0x8888, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-			})
-		}
-
-	}
-}
diff --git a/src/northbridge/amd/amdfam10/sspr4.asl b/src/northbridge/amd/amdfam10/sspr4.asl
deleted file mode 100644
index fac59bf..0000000
--- a/src/northbridge/amd/amdfam10/sspr4.asl
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2007 Advanced Micro Devices, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-DefinitionBlock ("SSPR.aml", "SSDT", 1, "AMD-FAM10", "AMD-ACPI", 100925441)
-{
-	Scope (\_SB)
-	{
-		Processor (\_SB.CPAA, 0xbb, 0x120, 6) // CPU0 and 0x01 need to be updated
-		{
-			Name(_PCT, Package ()
-			{
-				ResourceTemplate() {Register (FFixedHW, 0, 0, 0)}, //PERF_CTRL
-				ResourceTemplate() {Register (FFixedHW, 0, 0, 0)}, //PERF_STATUS
-			})
-
-			Name(_PSS, Package()
-			{
-				Package(0x06) {0x1111, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-				Package(0x06) {0x7777, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-				Package(0x06) {0x8888, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-				Package(0x06) {0x9999, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-			})
-		}
-
-	}
-}
diff --git a/src/northbridge/amd/amdfam10/sspr5.asl b/src/northbridge/amd/amdfam10/sspr5.asl
deleted file mode 100644
index 19c0cc9..0000000
--- a/src/northbridge/amd/amdfam10/sspr5.asl
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2007 Advanced Micro Devices, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-DefinitionBlock ("SSPR.aml", "SSDT", 1, "AMD-FAM10", "AMD-ACPI", 100925441)
-{
-	Scope (\_SB)
-	{
-		Processor (\_SB.CPAA, 0xbb, 0x120, 6) // CPU0 and 0x01 need to be updated
-		{
-			Name(_PCT, Package ()
-			{
-				ResourceTemplate() {Register (FFixedHW, 0, 0, 0)}, //PERF_CTRL
-				ResourceTemplate() {Register (FFixedHW, 0, 0, 0)}, //PERF_STATUS
-			})
-
-			Name(_PSS, Package()
-			{
-				Package(0x06) {0x1111, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-				Package(0x06) {0x7777, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-				Package(0x06) {0x8888, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-				Package(0x06) {0x9999, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-				Package(0x06) {0xaaaa, 0x222222, 0x3333, 0x4444, 0x55, 0x66 },
-			})
-		}
-
-	}
-}
diff --git a/src/northbridge/amd/amdk8/acpi.c b/src/northbridge/amd/amdk8/acpi.c
index a2dedd3..2706c64 100644
--- a/src/northbridge/amd/amdk8/acpi.c
+++ b/src/northbridge/amd/amdk8/acpi.c
@@ -118,8 +118,6 @@ unsigned long acpi_fill_srat(unsigned long current)
 {
 	struct acpi_srat_mem_state srat_mem_state;
 
-	get_bus_conf();
-
 	/* create all subtables for processors */
 	current = acpi_create_srat_lapics(current);
 
@@ -143,8 +141,6 @@ unsigned long acpi_fill_slit(unsigned long current)
 	/* fill the first 8 byte with that num */
 	/* fill the next num*num byte with distance, local is 10, 1 hop mean 20, and 2 hop with 30.... */
 
-	get_bus_conf();
-
 	/* because We has assume that we know the topology of the HT connection, So we can have set if we know the node_num */
 	static u8 hops_8[] = {   0, 1, 1, 2, 2, 3, 3, 4,
 				      1, 0, 2, 1, 3, 2, 4, 3,
diff --git a/src/northbridge/amd/amdk8/northbridge.c b/src/northbridge/amd/amdk8/northbridge.c
index bfd2c0f..c3a3b6d 100644
--- a/src/northbridge/amd/amdk8/northbridge.c
+++ b/src/northbridge/amd/amdk8/northbridge.c
@@ -593,6 +593,9 @@ static unsigned long northbridge_write_acpi_tables(unsigned long start, acpi_rsd
 
 	current = start;
 
+	/* Fills sysconf structure needed for SRAT and SLIT.  */
+	get_bus_conf();
+
 	current = ALIGN(current, 16);
 	srat = (acpi_srat_t *) current;
 	printk(BIOS_DEBUG, "ACPI:    * SRAT @ %p\n", srat);
diff --git a/src/southbridge/amd/cimx/sb800/late.c b/src/southbridge/amd/cimx/sb800/late.c
index b132bf1..9c0a7d1 100644
--- a/src/southbridge/amd/cimx/sb800/late.c
+++ b/src/southbridge/amd/cimx/sb800/late.c
@@ -147,10 +147,19 @@ static void lpc_init(device_t dev)
 	printk(BIOS_DEBUG, "SB800 - Late.c - lpc_init - End.\n");
 }
 
+unsigned long acpi_fill_mcfg(unsigned long current)
+{
+	/* Just a dummy */
+	return current;
+}
+
 static struct device_operations lpc_ops = {
         .read_resources = lpc_read_resources,
         .set_resources = lpc_set_resources,
         .enable_resources = pci_dev_enable_resources,
+#if IS_ENABLED(CONFIG_GENERATE_ACPI_TABLES) && IS_ENABLED(CONFIG_PER_DEVICE_ACPI_TABLES)
+	.write_acpi_tables = acpi_write_hpet,
+#endif
         .init = lpc_init,
         .scan_bus = scan_static_bus,
         .ops_pci = &lops_pci,
diff --git a/src/southbridge/amd/sb800/lpc.c b/src/southbridge/amd/sb800/lpc.c
index 12fd96f..2f2a7ec 100644
--- a/src/southbridge/amd/sb800/lpc.c
+++ b/src/southbridge/amd/sb800/lpc.c
@@ -26,8 +26,15 @@
 #include <pc80/mc146818rtc.h>
 #include <pc80/isa-dma.h>
 #include <arch/io.h>
+#include <arch/acpi.h>
 #include "sb800.h"
 
+unsigned long acpi_fill_mcfg(unsigned long current)
+{
+       /* Just a dummy */
+       return current;
+}
+
 static void lpc_init(device_t dev)
 {
 	u8 byte;
@@ -243,6 +250,9 @@ static struct device_operations lpc_ops = {
 	.read_resources = sb800_lpc_read_resources,
 	.set_resources = sb800_lpc_set_resources,
 	.enable_resources = sb800_lpc_enable_resources,
+#if IS_ENABLED(CONFIG_GENERATE_ACPI_TABLES) && IS_ENABLED(CONFIG_PER_DEVICE_ACPI_TABLES)
+	.write_acpi_tables      = acpi_write_hpet,
+#endif
 	.init = lpc_init,
 	.scan_bus = scan_static_bus,
 	.ops_pci = &lops_pci,



More information about the coreboot-gerrit mailing list