summaryrefslogtreecommitdiff
path: root/lib/acpi
diff options
context:
space:
mode:
authorHeinrich Schuchardt <[email protected]>2023-11-18 22:57:26 +0100
committerTom Rini <[email protected]>2023-12-13 18:39:05 -0500
commit5574d82fbc3ed1e150f6151ad20be968819baa88 (patch)
treee172a3d2d069793b324b443ed15f65db3b8f9b2e /lib/acpi
parentfef4896dc8a4479a6197c0057edde9d2d8c6dbac (diff)
acpi: consider XSDT in acpi_find_table()
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 <[email protected]> Reviewed-by: Simon Glass <[email protected]> Reviewed-by: Ilias Apalodimas <[email protected]>
Diffstat (limited to 'lib/acpi')
-rw-r--r--lib/acpi/acpi.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/acpi/acpi.c b/lib/acpi/acpi.c
index 14b15754f49..f21e5094615 100644
--- a/lib/acpi/acpi.c
+++ b/lib/acpi/acpi.c
@@ -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)) {