]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
acpi: Don't reset the tables with every new generation
authorSimon Glass <sjg@chromium.org>
Wed, 4 Nov 2020 16:57:33 +0000 (09:57 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Fri, 6 Nov 2020 01:51:31 +0000 (09:51 +0800)
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>
arch/x86/lib/acpi_table.c
drivers/core/acpi.c
include/dm/acpi.h
test/dm/acpi.c

index 423df5cbf9b33ac27bd1ac9e350d9c7cb2306a43..66cff822dc2bf35be4aec48c4baa361c6731a304 100644 (file)
@@ -531,6 +531,7 @@ ulong write_acpi_tables(ulong start_addr)
 
        debug("ACPI: Writing ACPI tables at %lx\n", start_addr);
 
+       acpi_reset_items();
        acpi_setup_base_tables(ctx, start);
 
        debug("ACPI:    * FACS\n");
index 7fe93992b5fa8933fe9c7da48650f93b93bcde8a..63a791f335e832fbe6b7970f14a21a6ef609c41c 100644 (file)
@@ -268,8 +268,7 @@ int acpi_recurse_method(struct acpi_ctx *ctx, struct udevice *parent,
        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 acpi_fill_ssdt(struct acpi_ctx *ctx)
        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 acpi_inject_dsdt(struct acpi_ctx *ctx)
        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 @@ int acpi_inject_dsdt(struct acpi_ctx *ctx)
        return ret;
 }
 
+void acpi_reset_items(void)
+{
+       item_count = 0;
+}
+
 int acpi_write_dev_tables(struct acpi_ctx *ctx)
 {
        int ret;
index e8b0336f6d8c5c040957a31e79c10c8b0150c82b..e6951b6a25d97525cbe03579d3c83ca257896e67 100644 (file)
@@ -226,6 +226,15 @@ void acpi_dump_items(enum acpi_dump_option option);
  */
 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
index 1f252a8d45402b52bd0d81cad4ffa4779a467648..f5eddac10d0ac492e670899d1c967335cb46544f 100644 (file)
@@ -477,6 +477,7 @@ static int dm_test_acpi_fill_ssdt(struct unit_test_state *uts)
        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 @@ static int dm_test_acpi_inject_dsdt(struct unit_test_state *uts)
        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 @@ static int dm_test_acpi_cmd_items(struct unit_test_state *uts)
        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 @@ static int dm_test_acpi_cmd_items(struct unit_test_state *uts)
        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();