Vladimir Serbinenko (phcoder@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/10385
-gerrit
commit 252ebbee7f1e4377ec23891736455fa69722f5f7 Author: Vladimir Serbinenko phcoder@gmail.com Date: Sun May 31 12:31:59 2015 +0200
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 --- Makefile.inc | 14 ++++++------ src/arch/x86/Makefile.inc | 14 +----------- src/arch/x86/boot/acpi.c | 25 ++++++++++++++++------ src/mainboard/amd/serengeti_cheetah/Makefile.inc | 3 +++ src/mainboard/amd/serengeti_cheetah/acpi_tables.c | 18 ++++++++++------ .../amd/serengeti_cheetah_fam10/Makefile.inc | 4 ++++ .../amd/serengeti_cheetah_fam10/acpi_tables.c | 20 +++++++++-------- src/mainboard/iwill/dk8_htx/Makefile.inc | 4 ++++ src/mainboard/iwill/dk8_htx/acpi_tables.c | 10 +++++---- 9 files changed, 66 insertions(+), 46 deletions(-)
diff --git a/Makefile.inc b/Makefile.inc index 49e1ba3..824f1d0 100644 --- a/Makefile.inc +++ b/Makefile.inc @@ -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))/dsdt.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
####################################################################### diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc index 49caef5..5da5a4a 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 4ce5ed6..9c75008 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_get_file_content(CBFS_DEFAULT_MEDIA, CONFIG_CBFS_PREFIX "/slic", CBFS_TYPE_RAW, &slic_size); @@ -805,7 +818,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);
@@ -816,7 +829,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 0000000..876b3ed --- /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 168793e..958128b 100644 --- a/src/mainboard/amd/serengeti_cheetah/acpi_tables.c +++ b/src/mainboard/amd/serengeti_cheetah/acpi_tables.c @@ -21,10 +21,6 @@ #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 +123,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 +136,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 +150,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 0000000..e826e81 --- /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 8c24528..5bc366c 100644 --- a/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c +++ b/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c @@ -30,11 +30,6 @@ #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 +131,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 +141,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 +155,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 0000000..e826e81 --- /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 e1c5c80..8075b22 100644 --- a/src/mainboard/iwill/dk8_htx/acpi_tables.c +++ b/src/mainboard/iwill/dk8_htx/acpi_tables.c @@ -134,6 +134,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 +147,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,17 +161,17 @@ 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; } memcpy(ssdtx, p, sizeof(acpi_header_t));