x86: Use the ACPI table writer
Use the new ACPI writer to write the ACPI tables. At present this is all
done in one monolithic function. Future work will split this out.
Unfortunately the QFW write_acpi_tables() function conflicts with the
'writer' version, so disable that for sandbox.
Signed-off-by: Simon Glass <sjg@chromium.org>
diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index f57323b..321faae 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -503,10 +503,10 @@
/*
* QEMU's version of write_acpi_tables is defined in drivers/misc/qfw.c
*/
-ulong write_acpi_tables(ulong start_addr)
+static int write_acpi_tables_x86(struct acpi_ctx *ctx,
+ const struct acpi_writer *entry)
{
const int thl = sizeof(struct acpi_table_header);
- struct acpi_ctx *ctx;
struct acpi_facs *facs;
struct acpi_table_header *dsdt;
struct acpi_fadt *fadt;
@@ -516,22 +516,11 @@
struct acpi_madt *madt;
struct acpi_csrt *csrt;
struct acpi_spcr *spcr;
- void *start;
int aml_len;
ulong addr;
int ret;
int i;
- ctx = malloc(sizeof(*ctx));
- if (!ctx)
- return log_msg_ret("mem", -ENOMEM);
-
- start = map_sysmem(start_addr, 0);
-
- debug("ACPI: Writing ACPI tables at %lx\n", start_addr);
-
- acpi_reset_items();
- acpi_setup_ctx(ctx, start);
acpi_setup_base_tables(ctx);
debug("ACPI: * FACS\n");
@@ -674,14 +663,12 @@
acpi_write_dev_tables(ctx);
- addr = map_to_sysmem(ctx->current);
- debug("current = %lx\n", addr);
-
acpi_rsdp_addr = (unsigned long)ctx->rsdp;
debug("ACPI: done\n");
- return addr;
+ return 0;
}
+ACPI_WRITER(x86, NULL, write_acpi_tables_x86, 0);
ulong acpi_get_rsdp_addr(void)
{
diff --git a/drivers/misc/qfw.c b/drivers/misc/qfw.c
index a298e5c..677841a 100644
--- a/drivers/misc/qfw.c
+++ b/drivers/misc/qfw.c
@@ -19,7 +19,7 @@
#include <asm/tables.h>
#endif
-#ifdef CONFIG_GENERATE_ACPI_TABLE
+#if defined(CONFIG_GENERATE_ACPI_TABLE) && !defined(CONFIG_SANDBOX)
/*
* This function allocates memory for ACPI tables
*
diff --git a/lib/acpi/acpi_writer.c b/lib/acpi/acpi_writer.c
index 7779bf3..53fc753 100644
--- a/lib/acpi/acpi_writer.c
+++ b/lib/acpi/acpi_writer.c
@@ -40,6 +40,7 @@
return 0;
}
+#ifndef CONFIG_QEMU
static int acpi_write_all(struct acpi_ctx *ctx)
{
const struct acpi_writer *writer =
@@ -60,7 +61,7 @@
/*
* QEMU's version of write_acpi_tables is defined in drivers/misc/qfw.c
*/
-ulong new_write_acpi_tables(ulong start_addr)
+ulong write_acpi_tables(ulong start_addr)
{
struct acpi_ctx *ctx;
ulong addr;
@@ -86,6 +87,7 @@
return addr;
}
+#endif /* QEMU */
void acpi_setup_ctx(struct acpi_ctx *ctx, ulong start)
{
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index a1d70b5..49b71be 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -322,8 +322,8 @@
}
DM_TEST(dm_test_acpi_basic, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
-/* Test acpi_setup_base_tables */
-static int dm_test_acpi_setup_base_tables(struct unit_test_state *uts)
+/* Test setup_ctx_and_base_tables */
+static int dm_test_setup_ctx_and_base_tables(struct unit_test_state *uts)
{
struct acpi_rsdp *rsdp;
struct acpi_rsdt *rsdt;
@@ -369,7 +369,7 @@
return 0;
}
-DM_TEST(dm_test_acpi_setup_base_tables,
+DM_TEST(dm_test_setup_ctx_and_base_tables,
UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
/* Test 'acpi list' command */