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>
This commit is contained in:
Vladimir Serbinenko 2015-05-31 12:31:59 +02:00
parent 1cac2c9713
commit 36f8d27ea9
9 changed files with 75 additions and 51 deletions

View File

@ -169,15 +169,15 @@ endef
#######################################################################
# Add handler to compile ACPI's ASL
define ramstage-objs_asl_template
$$(call src-to-obj,ramstage,$(1).asl): $(1).asl $(obj)/config.h
define asl_template
$(call strip_quotes,$(CONFIG_CBFS_PREFIX))/$(1).aml-file = $(obj)/$(1).aml
$(call strip_quotes,$(CONFIG_CBFS_PREFIX))/$(1).aml-type = raw
$(call strip_quotes,$(CONFIG_CBFS_PREFIX))/$(1).aml-compression = none
cbfs-files-y += $(call strip_quotes,$(CONFIG_CBFS_PREFIX))/$(1).aml
$(obj)/$(1).aml: $(src)/mainboard/$(MAINBOARDDIR)/$(1).asl $(obj)/config.h
@printf " IASL $$(subst $(top)/,,$$(@))\n"
$(CC_ramstage) -x assembler-with-cpp -E -MMD -MT $$(@) $$(CPPFLAGS_ramstage) -D__ACPI__ -P -include $(src)/include/kconfig.h -I$(obj) -I$(src) -I$(src)/include -I$(src)/arch/$(ARCHDIR-$(ARCH-ramstage-y))/include -I$(src)/mainboard/$(MAINBOARDDIR) $$< -o $$@
cd $$(dir $$@); $(IASL) -p $$(notdir $$@) -tc $$(notdir $$@)
mv $$(basename $$@).hex $$(basename $$@).c
$(CC_ramstage) $$(CFLAGS_ramstage) $$(CPPFLAGS_ramstage) $$(if $$(subst dsdt,,$$(basename $$(notdir $(1)))), -DAmlCode=AmlCode_$$(basename $$(notdir $(1)))) -c -o $$@ $$(basename $$@).c
# keep %.o: %.c rule from catching the temporary .c file after a make clean
mv $$(basename $$@).c $$(basename $$@).hex
cd $$(dir $$@); $(IASL) -p $$(notdir $$@) $$(notdir $$@)
endef
#######################################################################

View File

@ -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

View File

@ -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);

View File

@ -0,0 +1,3 @@
$(eval $(call asl_template,ssdt2))
$(eval $(call asl_template,ssdt3))
$(eval $(call asl_template,ssdt4))

View File

@ -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);

View File

@ -0,0 +1,4 @@
$(eval $(call asl_template,ssdt2))
$(eval $(call asl_template,ssdt3))
$(eval $(call asl_template,ssdt4))
$(eval $(call asl_template,ssdt5))

View File

@ -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);

View File

@ -0,0 +1,4 @@
$(eval $(call asl_template,ssdt2))
$(eval $(call asl_template,ssdt3))
$(eval $(call asl_template,ssdt4))
$(eval $(call asl_template,ssdt5))

View File

@ -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);