]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
acpi: support 64bit in acpi_find_table for DSDT and FACS
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 16 Dec 2023 08:12:00 +0000 (09:12 +0100)
committerSimon Glass <sjg@chromium.org>
Sun, 7 Jan 2024 20:49:08 +0000 (13:49 -0700)
Use X_DSDT and X_FIRMWARE_CTRL if available.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Rebased on -next to use nomap:
Signed-off-by: Simon Glass <sjg@chromium.org>
lib/acpi/acpi.c

index bcafd771750afdb8a64d0d41219b9d5d2268273f..f4d5c1e25d02022e8a0a333c66638a47083ba724 100644 (file)
@@ -44,11 +44,30 @@ struct acpi_table_header *acpi_find_table(const char *sig)
                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 nomap_sysmem(fadt->dsdt, 0);
-                       if (!memcmp(sig, "FACS", ACPI_NAME_LEN) &&
-                           fadt->firmware_ctrl)
-                               return nomap_sysmem(fadt->firmware_ctrl, 0);
+                       if (!memcmp(sig, "DSDT", ACPI_NAME_LEN)) {
+                               void *dsdt;
+
+                               if (fadt->header.revision >= 3 && fadt->x_dsdt)
+                                       dsdt = nomap_sysmem(fadt->x_dsdt, 0);
+                               else if (fadt->dsdt)
+                                       dsdt = nomap_sysmem(fadt->dsdt, 0);
+                               else
+                                       dsdt = NULL;
+                               return dsdt;
+                       }
+
+                       if (!memcmp(sig, "FACS", ACPI_NAME_LEN)) {
+                               void *facs;
+
+                               if (fadt->header.revision >= 3 &&
+                                   fadt->x_firmware_ctrl)
+                                       facs = nomap_sysmem(fadt->x_firmware_ctrl, 0);
+                               else if (fadt->firmware_ctrl)
+                                       facs = nomap_sysmem(fadt->firmware_ctrl, 0);
+                               else
+                                       facs = NULL;
+                               return facs;
+                       }
                }
        }