]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
acpi: Collect tables in the acpi_item list
authorSimon Glass <sjg@chromium.org>
Wed, 1 Dec 2021 16:03:04 +0000 (09:03 -0700)
committerSimon Glass <sjg@chromium.org>
Tue, 25 Jan 2022 18:44:36 +0000 (11:44 -0700)
At present this list is used to collect items within the DSDT and SSDT
tables. It is useful for it to collect the whole tables as well, so there
is a list of what was created and which write created each one.

Refactor the code accordingly.

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

index 5425e4d0402c7b9e7f21be9b2312426ee1f10f52..1e2f5d56302cc06746381b8df0bcfab5fa9a50ad 100644 (file)
 
 #define MAX_ACPI_ITEMS 100
 
-/* Type of table that we collected */
+/**
+ * Type of table that we collected
+ *
+ * @TYPE_NONE: Not yet known
+ * @TYPE_SSDT: Items in the Secondary System Description Table
+ * @TYPE_DSDT: Items in the Differentiated System Description Table
+ * @TYPE_OTHER: Other (whole)
+ */
 enum gen_type_t {
        TYPE_NONE,
        TYPE_SSDT,
        TYPE_DSDT,
+       TYPE_OTHER,
 };
 
 /* Type of method to call */
@@ -42,11 +50,13 @@ typedef int (*acpi_method)(const struct udevice *dev, struct acpi_ctx *ctx);
  *
  * @dev: Device that generated this data
  * @type: Table type it refers to
+ * @writer: Writer that wrote this table
  * @buf: Buffer containing the data
  * @size: Size of the data in bytes
  */
 struct acpi_item {
        struct udevice *dev;
+       const struct acpi_writer *writer;
        enum gen_type_t type;
        char *buf;
        int size;
@@ -103,16 +113,18 @@ int acpi_get_path(const struct udevice *dev, char *out_path, int maxlen)
 }
 
 /**
- * acpi_add_item() - Add a new item to the list of data collected
+ * add_item() - Add a new item to the list of data collected
  *
  * @ctx: ACPI context
- * @dev: Device that generated the data
+ * @dev: Device that generated the data, if type != TYPE_OTHER
+ * @writer: Writer entry that generated the data, if type == TYPE_OTHER
  * @type: Table type it refers to
  * @start: The start of the data (the end is obtained from ctx->current)
  * Return: 0 if OK, -ENOSPC if too many items, -ENOMEM if out of memory
  */
-static int acpi_add_item(struct acpi_ctx *ctx, struct udevice *dev,
-                        enum gen_type_t type, void *start)
+static int add_item(struct acpi_ctx *ctx, struct udevice *dev,
+                   const struct acpi_writer *writer, enum gen_type_t type,
+                   void *start)
 {
        struct acpi_item *item;
        void *end = ctx->current;
@@ -124,14 +136,17 @@ static int acpi_add_item(struct acpi_ctx *ctx, struct udevice *dev,
 
        item = &acpi_item[item_count];
        item->dev = dev;
+       item->writer = writer;
        item->type = type;
        item->size = end - start;
        if (!item->size)
                return 0;
-       item->buf = malloc(item->size);
-       if (!item->buf)
-               return log_msg_ret("mem", -ENOMEM);
-       memcpy(item->buf, start, item->size);
+       if (type != TYPE_OTHER) {
+               item->buf = malloc(item->size);
+               if (!item->buf)
+                       return log_msg_ret("mem", -ENOMEM);
+               memcpy(item->buf, start, item->size);
+       }
        item_count++;
        log_debug("* %s: Added type %d, %p, size %x\n", dev->name, type, start,
                  item->size);
@@ -139,6 +154,12 @@ static int acpi_add_item(struct acpi_ctx *ctx, struct udevice *dev,
        return 0;
 }
 
+int acpi_add_other_item(struct acpi_ctx *ctx, const struct acpi_writer *writer,
+                       void *start)
+{
+       return add_item(ctx, NULL, writer, TYPE_OTHER, start);
+}
+
 void acpi_dump_items(enum acpi_dump_option option)
 {
        int i;
@@ -162,7 +183,7 @@ static struct acpi_item *find_acpi_item(const char *devname)
        for (i = 0; i < item_count; i++) {
                struct acpi_item *item = &acpi_item[i];
 
-               if (!strcmp(devname, item->dev->name))
+               if (item->dev && !strcmp(devname, item->dev->name))
                        return item;
        }
 
@@ -277,7 +298,7 @@ int acpi_recurse_method(struct acpi_ctx *ctx, struct udevice *parent,
 
                /* Add the item to the internal list */
                if (type != TYPE_NONE) {
-                       ret = acpi_add_item(ctx, parent, type, ctx->tab_start);
+                       ret = add_item(ctx, parent, NULL, type, ctx->tab_start);
                        if (ret)
                                return log_msg_ret("add", ret);
                }
index 815a887ae43151568fb188a7355e67580e5c7078..3adfe21767899018adb6f77c0ed9f2c83eb98a37 100644 (file)
@@ -262,6 +262,20 @@ int acpi_inject_dsdt(struct acpi_ctx *ctx);
  */
 int acpi_setup_nhlt(struct acpi_ctx *ctx, struct nhlt *nhlt);
 
+/**
+ * acpi_add_other_item() - Add a new table to the list of ACPI tables
+ *
+ * This adds an entry of type ACPIT_TYPE_OTHER
+ *
+ * @ctx: ACPI context
+ * @writer: Writer entry that generated the data
+ * @type: Table type it refers to
+ * @start: The start of the data (the end is obtained from ctx->current)
+ * @return 0 if OK, -ENOSPC if too many items, -ENOMEM if out of memory
+ */
+int acpi_add_other_item(struct acpi_ctx *ctx, const struct acpi_writer *writer,
+                       void *start);
+
 /**
  * acpi_dump_items() - Dump out the collected ACPI items
  *
index 9b0aa23fd78f5433504f7e76ec698c85a84ec097..946f90e8e7b1a27d70d571003e5a368c8265dbcc 100644 (file)
@@ -40,6 +40,11 @@ int acpi_write_one(struct acpi_ctx *ctx, const struct acpi_writer *entry)
        else
                acpi_align(ctx);
 
+       /* Add the item to the internal list */
+       ret = acpi_add_other_item(ctx, entry, ctx->tab_start);
+       if (ret)
+               return log_msg_ret("add", ret);
+
        return 0;
 }