acpi: Move the table-finding functions into the libary
authorSimon Glass <sjg@chromium.org>
Thu, 4 May 2023 22:54:58 +0000 (16:54 -0600)
committerBin Meng <bmeng@tinylab.org>
Thu, 11 May 2023 02:25:29 +0000 (10:25 +0800)
This is useful for other features. Move the function into library code
so it can be used outside just the 'acpi' command.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
cmd/acpi.c
include/acpi/acpi_table.h
lib/acpi/Makefile
lib/acpi/acpi.c [new file with mode: 0644]

index 991b523..e70913e 100644 (file)
@@ -36,49 +36,11 @@ static void dump_hdr(struct acpi_table_header *hdr)
        }
 }
 
-/**
- * find_table() - Look up an ACPI table
- *
- * @sig: Signature of table (4 characters, upper case)
- * Return: pointer to table header, or NULL if not found
- */
-struct acpi_table_header *find_table(const char *sig)
-{
-       struct acpi_rsdp *rsdp;
-       struct acpi_rsdt *rsdt;
-       int len, i, count;
-
-       rsdp = map_sysmem(gd_acpi_start(), 0);
-       if (!rsdp)
-               return NULL;
-       rsdt = map_sysmem(rsdp->rsdt_address, 0);
-       len = rsdt->header.length - sizeof(rsdt->header);
-       count = len / sizeof(u32);
-       for (i = 0; i < count; i++) {
-               struct acpi_table_header *hdr;
-
-               hdr = map_sysmem(rsdt->entry[i], 0);
-               if (!memcmp(hdr->signature, sig, ACPI_NAME_LEN))
-                       return hdr;
-               if (!memcmp(hdr->signature, "FACP", ACPI_NAME_LEN)) {
-                       struct acpi_fadt *fadt = (struct acpi_fadt *)hdr;
-
-                       if (!memcmp(sig, "DSDT", ACPI_NAME_LEN) && fadt->dsdt)
-                               return map_sysmem(fadt->dsdt, 0);
-                       if (!memcmp(sig, "FACS", ACPI_NAME_LEN) &&
-                           fadt->firmware_ctrl)
-                               return map_sysmem(fadt->firmware_ctrl, 0);
-               }
-       }
-
-       return NULL;
-}
-
 static int dump_table_name(const char *sig)
 {
        struct acpi_table_header *hdr;
 
-       hdr = find_table(sig);
+       hdr = acpi_find_table(sig);
        if (!hdr)
                return -ENOENT;
        printf("%.*s @ %08lx\n", ACPI_NAME_LEN, hdr->signature,
index 4030d25..7ed0443 100644 (file)
@@ -923,6 +923,14 @@ int acpi_fill_csrt(struct acpi_ctx *ctx);
  */
 ulong write_acpi_tables(ulong start);
 
+/**
+ * acpi_find_table() - Look up an ACPI table
+ *
+ * @sig: Signature of table (4 characters, upper case)
+ * Return: pointer to table header, or NULL if not found
+ */
+struct acpi_table_header *acpi_find_table(const char *sig);
+
 #endif /* !__ACPI__*/
 
 #include <asm/acpi_table.h>
index 12337ab..c1c9675 100644 (file)
@@ -1,6 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0+
 #
 
+obj-y += acpi.o
+
 ifdef CONFIG_$(SPL_TPL_)GENERATE_ACPI_TABLE
 
 obj-$(CONFIG_$(SPL_)ACPIGEN) += acpigen.o
diff --git a/lib/acpi/acpi.c b/lib/acpi/acpi.c
new file mode 100644 (file)
index 0000000..14b1575
--- /dev/null
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Utility functions for ACPI
+ *
+ * Copyright 2023 Google LLC
+ */
+
+#include <common.h>
+#include <mapmem.h>
+#include <acpi/acpi_table.h>
+#include <asm/global_data.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+struct acpi_table_header *acpi_find_table(const char *sig)
+{
+       struct acpi_rsdp *rsdp;
+       struct acpi_rsdt *rsdt;
+       int len, i, count;
+
+       rsdp = map_sysmem(gd_acpi_start(), 0);
+       if (!rsdp)
+               return NULL;
+       rsdt = map_sysmem(rsdp->rsdt_address, 0);
+       len = rsdt->header.length - sizeof(rsdt->header);
+       count = len / sizeof(u32);
+       for (i = 0; i < count; i++) {
+               struct acpi_table_header *hdr;
+
+               hdr = map_sysmem(rsdt->entry[i], 0);
+               if (!memcmp(hdr->signature, sig, ACPI_NAME_LEN))
+                       return hdr;
+               if (!memcmp(hdr->signature, "FACP", ACPI_NAME_LEN)) {
+                       struct acpi_fadt *fadt = (struct acpi_fadt *)hdr;
+
+                       if (!memcmp(sig, "DSDT", ACPI_NAME_LEN) && fadt->dsdt)
+                               return map_sysmem(fadt->dsdt, 0);
+                       if (!memcmp(sig, "FACS", ACPI_NAME_LEN) &&
+                           fadt->firmware_ctrl)
+                               return map_sysmem(fadt->firmware_ctrl, 0);
+               }
+       }
+
+       return NULL;
+}