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 <s...@chromium.org>
Reviewed-by: Bin Meng <bmeng...@gmail.com>
---

(no changes since v3)

Changes in v3:
- Avoid a build error with the ASL compiler

Changes in v2:
- Add new patch to move acpi-table-finding functions into the library

 cmd/acpi.c                | 40 +---------------------------------
 include/acpi/acpi_table.h |  8 +++++++
 lib/acpi/Makefile         |  2 ++
 lib/acpi/acpi.c           | 45 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 56 insertions(+), 39 deletions(-)
 create mode 100644 lib/acpi/acpi.c

diff --git a/cmd/acpi.c b/cmd/acpi.c
index 991b5235e28..e70913e40bf 100644
--- a/cmd/acpi.c
+++ b/cmd/acpi.c
@@ -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,
diff --git a/include/acpi/acpi_table.h b/include/acpi/acpi_table.h
index 4030d25c66a..7ed0443c821 100644
--- a/include/acpi/acpi_table.h
+++ b/include/acpi/acpi_table.h
@@ -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>
diff --git a/lib/acpi/Makefile b/lib/acpi/Makefile
index 12337abaecf..c1c9675b5d2 100644
--- a/lib/acpi/Makefile
+++ b/lib/acpi/Makefile
@@ -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
index 00000000000..14b15754f49
--- /dev/null
+++ b/lib/acpi/acpi.c
@@ -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;
+}
-- 
2.40.1.521.gf1e218fcd8-goog

Reply via email to