summaryrefslogtreecommitdiff
path: root/src/mainboard/asus/kfsn4-dre/acpi_tables.c
diff options
context:
space:
mode:
authorTimothy Pearson <tpearson@raptorengineeringinc.com>2015-01-23 20:35:48 -0600
committerAlexandru Gagniuc <mr.nuke.me@gmail.com>2015-01-28 22:12:06 +0100
commit80572851195243640f7531dd7f064e8b3f62a40d (patch)
tree0b265e41608243a4f54fb92150e88117628e4c93 /src/mainboard/asus/kfsn4-dre/acpi_tables.c
parenta6f669e183e1a5bac244118d9196d926c040c8db (diff)
downloadcoreboot-80572851195243640f7531dd7f064e8b3f62a40d.tar.xz
mainboards: Add support for the Asus KFSN4-DRE series of motherboards
Status: Tested with KFSN4-DRE PCB v1.04G Booted Ubuntu Linux 14.04 and all onboard peripherals appear to work. Dual Opteron 8347 CPUs tested with 8GB RAM (4GB per bank). Dual Opteron 8356 CPUs tested with 1GB RAM in slot A1. AMD PowerNow! functions correctly via ACPI. Video, network, USB, SATA, and serial have received thorough testing. Tested with KFSN4-DRE PCB v1.05G Single Opteron 2419 CPU tested with 1GB RAM in slot A1. Booted to PXE configuration menu; not tested further. Known issues: RAM initialization is a bit flaky with multiple high-density modules; this could be a generic MCT training issue but is probably bad hardware. The XGI Volari option ROM crashes SeaBIOS v1.7.5, but the video device works after Linux boots and initializes the device. Suspend/resume functions at the S1 level but sometimes hangs on resume. Wake on LAN can be flaky; the strap(s) needed to have WoL work on power application were not physically installed by ASUS so the board needs to boot at least once after power application before it will work. Change-Id: I0709f822eea8ed877f55db9443143028a5400472 Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com> Reviewed-on: http://review.coreboot.org/8270 Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com> Tested-by: build bot (Jenkins)
Diffstat (limited to 'src/mainboard/asus/kfsn4-dre/acpi_tables.c')
-rw-r--r--src/mainboard/asus/kfsn4-dre/acpi_tables.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/mainboard/asus/kfsn4-dre/acpi_tables.c b/src/mainboard/asus/kfsn4-dre/acpi_tables.c
new file mode 100644
index 0000000000..904ad38745
--- /dev/null
+++ b/src/mainboard/asus/kfsn4-dre/acpi_tables.c
@@ -0,0 +1,71 @@
+/*
+ * ACPI support
+ * written by Stefan Reinauer <stepan@openbios.org>
+ * (C) 2005 Stefan Reinauer
+ *
+ * Copyright 2005 AMD
+ * 2005.9 yhlu modify that to more dynamic for AMD Opteron Based MB
+ *
+ * Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering
+ */
+
+#include <console/console.h>
+#include <string.h>
+#include <assert.h>
+#include <arch/acpi.h>
+#include <arch/io.h>
+#include <arch/smp/mpspec.h>
+#include <device/pci.h>
+#include <device/pci_ids.h>
+#include <cpu/x86/msr.h>
+#include <cpu/amd/mtrr.h>
+#include <cpu/amd/amdfam10_sysconf.h>
+
+/* APIC */
+unsigned long acpi_fill_madt(unsigned long current)
+{
+ device_t dev;
+ struct resource *res;
+
+ /* create all subtables for processors */
+ current = acpi_create_madt_lapics(current);
+
+ /* Write NVIDIA CK804 IOAPIC. */
+ dev = dev_find_slot(0x0, PCI_DEVFN(sysconf.sbdn + 0x1, 0));
+ ASSERT(dev != NULL);
+
+ res = find_resource(dev, PCI_BASE_ADDRESS_1);
+ ASSERT(res != NULL);
+
+ current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current,
+ CONFIG_MAX_CPUS * CONFIG_MAX_PHYSICAL_CPUS, res->base, 0);
+
+ /* Initialize interrupt mapping if mptable.c didn't. */
+ if (!IS_ENABLED(CONFIG_GENERATE_MP_TABLE)) {
+ /* Copied from mptable.c */
+ /* Enable interrupts for commonly used devices (USB, SATA, etc.) */
+ pci_write_config32(dev, 0x7c, 0x0d800018);
+ pci_write_config32(dev, 0x80, 0xd8002009);
+ pci_write_config32(dev, 0x84, 0x00000001);
+ }
+
+// /* IRQ of timer (override IRQ0 --> APIC IRQ2) */
+// current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
+// current, 0, 0, 2, 0);
+ /* IRQ9 */
+ current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
+ current, 0, 9, 9, MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_HIGH);
+ /* IRQ14 */
+ current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
+ current, 0, 14, 14, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH);
+ /* IRQ15 */
+ current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
+ current, 0, 15, 15, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH);
+
+ /* create all subtables for processors */
+ /* acpi_create_madt_lapic_nmis returns current, not size. */
+ current = acpi_create_madt_lapic_nmis(current,
+ MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH, 1);
+
+ return current;
+}