summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVladimir Serbinenko <phcoder@gmail.com>2015-05-31 12:31:59 +0200
committerVladimir Serbinenko <phcoder@gmail.com>2015-06-02 21:01:55 +0200
commit36f8d27ea9f741e184b76b5f42d7f777f207edc0 (patch)
tree440971a6f3bcdb8ca2522e6659993d155ed8ecc2 /src
parent1cac2c9713a864fe90f40040cd1ede130983544c (diff)
downloadcoreboot-36f8d27ea9f741e184b76b5f42d7f777f207edc0.tar.xz
Make DSDT a file in CBFS rather than embedding it into ramstage.
Makes it cleaner by putting AML into separate file rather than having an array in C code. Change-Id: Ia5d6b50ad9dabdb97ed05c837dc3ccc48b8f490f Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com> Reviewed-on: http://review.coreboot.org/10385 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86/Makefile.inc14
-rw-r--r--src/arch/x86/boot/acpi.c25
-rw-r--r--src/mainboard/amd/serengeti_cheetah/Makefile.inc3
-rw-r--r--src/mainboard/amd/serengeti_cheetah/acpi_tables.c19
-rw-r--r--src/mainboard/amd/serengeti_cheetah_fam10/Makefile.inc4
-rw-r--r--src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c21
-rw-r--r--src/mainboard/iwill/dk8_htx/Makefile.inc4
-rw-r--r--src/mainboard/iwill/dk8_htx/acpi_tables.c22
8 files changed, 68 insertions, 44 deletions
diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc
index 49caef5d4e..5da5a4a241 100644
--- a/src/arch/x86/Makefile.inc
+++ b/src/arch/x86/Makefile.inc
@@ -262,19 +262,7 @@ ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/reset.c
endif
ifeq ($(CONFIG_HAVE_ACPI_TABLES),y)
ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/acpi_tables.c
-ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/dsdt.asl
-ifneq ($(wildcard src/mainboard/$(MAINBOARDDIR)/ssdt2.asl),)
-ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/ssdt2.asl
-endif
-ifneq ($(wildcard src/mainboard/$(MAINBOARDDIR)/ssdt3.asl),)
-ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/ssdt3.asl
-endif
-ifneq ($(wildcard src/mainboard/$(MAINBOARDDIR)/ssdt4.asl),)
-ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/ssdt4.asl
-endif
-ifneq ($(wildcard src/mainboard/$(MAINBOARDDIR)/ssdt5.asl),)
-ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/ssdt5.asl
-endif
+$(eval $(call asl_template,dsdt))
ifneq ($(wildcard src/mainboard/$(MAINBOARDDIR)/fadt.c),)
ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/fadt.c
endif
diff --git a/src/arch/x86/boot/acpi.c b/src/arch/x86/boot/acpi.c
index bfdb18fbf8..03d40d0be3 100644
--- a/src/arch/x86/boot/acpi.c
+++ b/src/arch/x86/boot/acpi.c
@@ -723,8 +723,6 @@ void acpi_create_fadt(acpi_fadt_t *fadt,acpi_facs_t *facs, void *dsdt)
}
#endif
-extern const unsigned char AmlCode[];
-
unsigned long __attribute__ ((weak)) fw_cfg_acpi_tables(unsigned long start)
{
return 0;
@@ -741,13 +739,13 @@ unsigned long write_acpi_tables(unsigned long start)
acpi_facs_t *facs;
acpi_header_t *slic_file, *slic;
acpi_header_t *ssdt;
- acpi_header_t *dsdt;
+ acpi_header_t *dsdt_file, *dsdt;
acpi_mcfg_t *mcfg;
acpi_tcpa_t *tcpa;
acpi_madt_t *madt;
struct device *dev;
unsigned long fw;
- size_t slic_size;
+ size_t slic_size, dsdt_size;
char oem_id[6], oem_table_id[8];
current = start;
@@ -759,6 +757,21 @@ unsigned long write_acpi_tables(unsigned long start)
if (fw)
return fw;
+ dsdt_file = cbfs_get_file_content(CBFS_DEFAULT_MEDIA,
+ CONFIG_CBFS_PREFIX "/dsdt.aml",
+ CBFS_TYPE_RAW, &dsdt_size);
+ if (!dsdt_file) {
+ printk(BIOS_ERR, "No DSDT file, skipping ACPI tables\n");
+ return current;
+ }
+
+ if (dsdt_file->length > dsdt_size
+ || dsdt_file->length < sizeof (acpi_header_t)
+ || memcmp(dsdt_file->signature, "DSDT", 4) != 0) {
+ printk(BIOS_ERR, "Invalid DSDT file, skipping ACPI tables\n");
+ return current;
+ }
+
slic_file = cbfs_boot_map_with_leak(CONFIG_CBFS_PREFIX "/slic",
CBFS_TYPE_RAW, &slic_size);
if (slic_file
@@ -804,7 +817,7 @@ unsigned long write_acpi_tables(unsigned long start)
printk(BIOS_DEBUG, "ACPI: * DSDT\n");
dsdt = (acpi_header_t *) current;
- memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
+ memcpy(dsdt, dsdt_file, sizeof(acpi_header_t));
if (dsdt->length >= sizeof(acpi_header_t)) {
current += sizeof(acpi_header_t);
@@ -815,7 +828,7 @@ unsigned long write_acpi_tables(unsigned long start)
}
current = (unsigned long) acpigen_get_current();
memcpy((char *)current,
- (char *)&AmlCode + sizeof(acpi_header_t),
+ (char *)dsdt_file + sizeof(acpi_header_t),
dsdt->length - sizeof(acpi_header_t));
current += dsdt->length - sizeof(acpi_header_t);
diff --git a/src/mainboard/amd/serengeti_cheetah/Makefile.inc b/src/mainboard/amd/serengeti_cheetah/Makefile.inc
new file mode 100644
index 0000000000..876b3edbf4
--- /dev/null
+++ b/src/mainboard/amd/serengeti_cheetah/Makefile.inc
@@ -0,0 +1,3 @@
+$(eval $(call asl_template,ssdt2))
+$(eval $(call asl_template,ssdt3))
+$(eval $(call asl_template,ssdt4))
diff --git a/src/mainboard/amd/serengeti_cheetah/acpi_tables.c b/src/mainboard/amd/serengeti_cheetah/acpi_tables.c
index 168793eb82..14ef93830a 100644
--- a/src/mainboard/amd/serengeti_cheetah/acpi_tables.c
+++ b/src/mainboard/amd/serengeti_cheetah/acpi_tables.c
@@ -17,14 +17,11 @@
#include <cpu/x86/msr.h>
#include <cpu/amd/mtrr.h>
#include <cpu/amd/amdk8_sysconf.h>
+#include <cbfs.h>
#include "northbridge/amd/amdk8/acpi.h"
#include "mb_sysconf.h"
#include "mainboard.h"
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-
unsigned long acpi_fill_madt(unsigned long current)
{
u32 gsi_base=0x18;
@@ -127,6 +124,7 @@ unsigned long mainboard_write_acpi_tables(unsigned long start, acpi_rsdp_t *rsdp
unsigned long current;
acpi_header_t *ssdtx;
const void *p;
+ size_t p_size;
int i;
@@ -139,6 +137,7 @@ unsigned long mainboard_write_acpi_tables(unsigned long start, acpi_rsdp_t *rsdp
//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
+ const char *file_name;
if((sysconf.pci1234[i] & 1) != 1 ) continue;
u8 c;
if(i<7) {
@@ -152,17 +151,23 @@ unsigned long mainboard_write_acpi_tables(unsigned long start, acpi_rsdp_t *rsdp
ssdtx = (acpi_header_t *)current;
switch(sysconf.hcid[i]) {
case 1: //8132
- p = &AmlCode_ssdt2;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt2.aml";
break;
case 2: //8151
- p = &AmlCode_ssdt3;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt3.aml";
break;
case 3: //8131
- p = &AmlCode_ssdt4;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt4.aml";
break;
default:
continue;
}
+ p = cbfs_get_file_content(CBFS_DEFAULT_MEDIA,
+ file_name,
+ CBFS_TYPE_RAW, &p_size);
+ if (!p || p_size < sizeof(acpi_header_t))
+ continue;
+
memcpy(ssdtx, p, sizeof(acpi_header_t));
current += ssdtx->length;
memcpy(ssdtx, p, ssdtx->length);
diff --git a/src/mainboard/amd/serengeti_cheetah_fam10/Makefile.inc b/src/mainboard/amd/serengeti_cheetah_fam10/Makefile.inc
new file mode 100644
index 0000000000..e826e8153a
--- /dev/null
+++ b/src/mainboard/amd/serengeti_cheetah_fam10/Makefile.inc
@@ -0,0 +1,4 @@
+$(eval $(call asl_template,ssdt2))
+$(eval $(call asl_template,ssdt3))
+$(eval $(call asl_template,ssdt4))
+$(eval $(call asl_template,ssdt5))
diff --git a/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c b/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c
index 8c245285fb..cc932d2676 100644
--- a/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c
+++ b/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c
@@ -26,15 +26,11 @@
#include <cpu/x86/msr.h>
#include <cpu/amd/mtrr.h>
#include <cpu/amd/amdfam10_sysconf.h>
+#include <cbfs.h>
#include "mb_sysconf.h"
#include "mainboard.h"
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
-
unsigned long acpi_fill_madt(unsigned long current)
{
u32 gsi_base=0x18;
@@ -136,6 +132,7 @@ unsigned long mainboard_write_acpi_tables(unsigned long current,
{
acpi_header_t *ssdtx;
const void *p;
+ size_t p_size;
int i;
@@ -145,6 +142,7 @@ unsigned long mainboard_write_acpi_tables(unsigned long current,
change HCIN, and recalculate the checknum and add_table */
for(i=1;i<sysconf.hc_possible_num;i++) { // 0: is hc sblink
+ const char *file_name;
if((sysconf.pci1234[i] & 1) != 1 ) continue;
u8 c;
if(i<7) {
@@ -158,18 +156,23 @@ unsigned long mainboard_write_acpi_tables(unsigned long current,
ssdtx = (acpi_header_t *)current;
switch(sysconf.hcid[i]) {
case 1:
- p = &AmlCode_ssdt2;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt2.aml";
break;
case 2:
- p = &AmlCode_ssdt3;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt3.aml";
break;
case 3: //8131
- p = &AmlCode_ssdt4;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt4.aml";
break;
default:
//HTX no io apic
- p = &AmlCode_ssdt5;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt5.aml";
}
+ p = cbfs_get_file_content(CBFS_DEFAULT_MEDIA,
+ file_name,
+ CBFS_TYPE_RAW, &p_size);
+ if (!p || p_size < sizeof(acpi_header_t))
+ continue;
memcpy(ssdtx, p, sizeof(acpi_header_t));
current += ssdtx->length;
memcpy(ssdtx, p, ssdtx->length);
diff --git a/src/mainboard/iwill/dk8_htx/Makefile.inc b/src/mainboard/iwill/dk8_htx/Makefile.inc
new file mode 100644
index 0000000000..e826e8153a
--- /dev/null
+++ b/src/mainboard/iwill/dk8_htx/Makefile.inc
@@ -0,0 +1,4 @@
+$(eval $(call asl_template,ssdt2))
+$(eval $(call asl_template,ssdt3))
+$(eval $(call asl_template,ssdt4))
+$(eval $(call asl_template,ssdt5))
diff --git a/src/mainboard/iwill/dk8_htx/acpi_tables.c b/src/mainboard/iwill/dk8_htx/acpi_tables.c
index e1c5c8039b..834d1fe0c7 100644
--- a/src/mainboard/iwill/dk8_htx/acpi_tables.c
+++ b/src/mainboard/iwill/dk8_htx/acpi_tables.c
@@ -20,11 +20,7 @@
#include "northbridge/amd/amdk8/acpi.h"
#include "mb_sysconf.h"
#include "mainboard.h"
-
-extern const unsigned char AmlCode_ssdt2[];
-extern const unsigned char AmlCode_ssdt3[];
-extern const unsigned char AmlCode_ssdt4[];
-extern const unsigned char AmlCode_ssdt5[];
+#include <cbfs.h>
unsigned long acpi_fill_madt(unsigned long current)
{
@@ -134,6 +130,7 @@ unsigned long mainboard_write_acpi_tables(unsigned long start, acpi_rsdp_t *rsdp
unsigned long current;
acpi_header_t *ssdtx;
const void *p;
+ size_t p_size;
int i;
@@ -146,6 +143,7 @@ unsigned long mainboard_write_acpi_tables(unsigned long start, acpi_rsdp_t *rsdp
//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
+ const char *file_name;
if((sysconf.pci1234[i] & 1) != 1 ) continue;
uint8_t c;
if(i<7) {
@@ -159,19 +157,25 @@ unsigned long mainboard_write_acpi_tables(unsigned long start, acpi_rsdp_t *rsdp
ssdtx = (acpi_header_t *)current;
switch(sysconf.hcid[i]) {
case 1: //8132
- p = &AmlCode_ssdt2;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt2.aml";
break;
case 2: //8151
- p = &AmlCode_ssdt3;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt3.aml";
break;
case 3: //8131
- p = &AmlCode_ssdt4;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt4.aml";
break;
default:
//HTX no io apic
- p = &AmlCode_ssdt5;
+ file_name = CONFIG_CBFS_PREFIX "/ssdt5.aml";
break;
}
+ p = cbfs_get_file_content(CBFS_DEFAULT_MEDIA,
+ file_name,
+ CBFS_TYPE_RAW, &p_size);
+ if (!p || p_size < sizeof(acpi_header_t))
+ continue;
+
memcpy(ssdtx, p, sizeof(acpi_header_t));
current += ssdtx->length;
memcpy(ssdtx, p, ssdtx->length);