acpi: Don't reset the tables with every new generation
At present if SSDT and DSDT code is created, only the latter is retained
for examination by the 'acpi items' command. Fix this by only resetting
the list when explicitly requested.
Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index 423df5c..66cff82 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -531,6 +531,7 @@
debug("ACPI: Writing ACPI tables at %lx\n", start_addr);
+ acpi_reset_items();
acpi_setup_base_tables(ctx, start);
debug("ACPI: * FACS\n");
diff --git a/drivers/core/acpi.c b/drivers/core/acpi.c
index 7fe9399..63a791f 100644
--- a/drivers/core/acpi.c
+++ b/drivers/core/acpi.c
@@ -268,8 +268,7 @@
if (func) {
void *start = ctx->current;
- log_debug("\n");
- log_debug("- %s %p\n", parent->name, func);
+ log_debug("- method %d, %s %p\n", method, parent->name, func);
ret = device_ofdata_to_platdata(parent);
if (ret)
return log_msg_ret("ofdata", ret);
@@ -299,7 +298,6 @@
int ret;
log_debug("Writing SSDT tables\n");
- item_count = 0;
ret = acpi_recurse_method(ctx, dm_root(), METHOD_FILL_SSDT, TYPE_SSDT);
log_debug("Writing SSDT finished, err=%d\n", ret);
ret = sort_acpi_item_type(ctx, start, TYPE_SSDT);
@@ -315,7 +313,6 @@
int ret;
log_debug("Writing DSDT tables\n");
- item_count = 0;
ret = acpi_recurse_method(ctx, dm_root(), METHOD_INJECT_DSDT,
TYPE_DSDT);
log_debug("Writing DSDT finished, err=%d\n", ret);
@@ -326,6 +323,11 @@
return ret;
}
+void acpi_reset_items(void)
+{
+ item_count = 0;
+}
+
int acpi_write_dev_tables(struct acpi_ctx *ctx)
{
int ret;
diff --git a/include/dm/acpi.h b/include/dm/acpi.h
index e8b0336..e6951b6 100644
--- a/include/dm/acpi.h
+++ b/include/dm/acpi.h
@@ -226,6 +226,15 @@
*/
int acpi_get_path(const struct udevice *dev, char *out_path, int maxlen);
+/**
+ * acpi_reset_items() - Reset the list of ACPI items to empty
+ *
+ * This list keeps track of DSDT and SSDT items that are generated
+ * programmatically. The 'acpi items' command shows the list. Use this function
+ * to empty the list, before writing new items.
+ */
+void acpi_reset_items(void);
+
#endif /* __ACPI__ */
#endif
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index 1f252a8..f5eddac 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -477,6 +477,7 @@
buf = malloc(BUF_SIZE);
ut_assertnonnull(buf);
+ acpi_reset_items();
ctx.current = buf;
buf[4] = 'z'; /* sentinel */
ut_assertok(acpi_fill_ssdt(&ctx));
@@ -507,6 +508,7 @@
buf = malloc(BUF_SIZE);
ut_assertnonnull(buf);
+ acpi_reset_items();
ctx.current = buf;
buf[4] = 'z'; /* sentinel */
ut_assertok(acpi_inject_dsdt(&ctx));
@@ -537,6 +539,7 @@
buf = malloc(BUF_SIZE);
ut_assertnonnull(buf);
+ acpi_reset_items();
ctx.current = buf;
ut_assertok(acpi_fill_ssdt(&ctx));
console_record_reset();
@@ -545,6 +548,7 @@
ut_assert_nextline("dev 'acpi-test2', type 1, size 2");
ut_assert_console_end();
+ acpi_reset_items();
ctx.current = buf;
ut_assertok(acpi_inject_dsdt(&ctx));
console_record_reset();