acpi: Add a table start
authorSimon Glass <sjg@chromium.org>
Wed, 1 Dec 2021 16:02:46 +0000 (09:02 -0700)
committerSimon Glass <sjg@chromium.org>
Tue, 25 Jan 2022 18:44:36 +0000 (11:44 -0700)
It is useful to record the start of an ACPI table so that offsets from
that point can be easily calculated.

Add this to the context and set it before calling the writer method.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/core/acpi.c
include/dm/acpi.h

index e988a65..5425e4d 100644 (file)
@@ -266,19 +266,18 @@ int acpi_recurse_method(struct acpi_ctx *ctx, struct udevice *parent,
 
        func = acpi_get_method(parent, method);
        if (func) {
-               void *start = ctx->current;
-
                log_debug("- method %d, %s %p\n", method, parent->name, func);
                ret = device_of_to_plat(parent);
                if (ret)
                        return log_msg_ret("ofdata", ret);
+               ctx->tab_start = ctx->current;
                ret = func(parent, ctx);
                if (ret)
                        return log_msg_ret("func", ret);
 
                /* Add the item to the internal list */
                if (type != TYPE_NONE) {
-                       ret = acpi_add_item(ctx, parent, type, start);
+                       ret = acpi_add_item(ctx, parent, type, ctx->tab_start);
                        if (ret)
                                return log_msg_ret("add", ret);
                }
index 0fa239e..a2da57f 100644 (file)
@@ -43,6 +43,9 @@ enum acpi_dump_option {
  *
  * @base: Base address of ACPI tables
  * @current: Current address for writing
+ * @tab_start: Address of start of the table being written. This is set up
+ * before the writer or driver method is called. It must not be changed by the
+ * method
  * @rsdp: Pointer to the Root System Description Pointer, typically used when
  *     adding a new table. The RSDP holds pointers to the RSDT and XSDT.
  * @rsdt: Pointer to the Root System Description Table
@@ -56,6 +59,7 @@ enum acpi_dump_option {
 struct acpi_ctx {
        void *base;
        void *current;
+       void *tab_start;
        struct acpi_rsdp *rsdp;
        struct acpi_rsdt *rsdt;
        struct acpi_xsdt *xsdt;