]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
acpi: consider XSDT in acpi_find_table()
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 18 Nov 2023 21:57:26 +0000 (22:57 +0100)
committerTom Rini <trini@konsulko.com>
Wed, 13 Dec 2023 23:39:05 +0000 (18:39 -0500)
The RSDT table is deprecated and does not exist on all systems.

By preference scan XSDT for the table to find. If no XSDT table exists, try
to use the RSDT table.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
lib/acpi/acpi.c

index 14b15754f4926ffe32aaf6a971e3ecaae91dd023..f21e5094615c23c8fbe2a19b91b12a0b1d4660b8 100644 (file)
@@ -16,18 +16,30 @@ struct acpi_table_header *acpi_find_table(const char *sig)
 {
        struct acpi_rsdp *rsdp;
        struct acpi_rsdt *rsdt;
+       struct acpi_xsdt *xsdt;
        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);
+       if (rsdp->xsdt_address) {
+               xsdt = map_sysmem(rsdp->xsdt_address, 0);
+               len = xsdt->header.length - sizeof(xsdt->header);
+               count = len / sizeof(u64);
+       } else {
+               if (!rsdp->rsdt_address)
+                       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 (rsdp->xsdt_address)
+                       hdr = map_sysmem(xsdt->entry[i], 0);
+               else
+                       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)) {