[PATCH 1/1] 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 heinrich.schuchardt@canonical.com --- lib/acpi/acpi.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/lib/acpi/acpi.c b/lib/acpi/acpi.c index 14b15754f4..3938946fc6 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); + xsdt = map_sysmem(rsdp->xsdt_address, 0); + if (xsdt) { + len = xsdt->header.length - sizeof(xsdt->header); + count = len / sizeof(u64); + } else { + rsdt = map_sysmem(rsdp->rsdt_address, 0); + if (!rsdt) + return NULL; + 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 (xsdt) + 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)) {

Hi Heinrich,
On Tue, 14 Nov 2023 at 09:39, Heinrich Schuchardt heinrich.schuchardt@canonical.com wrote:
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
lib/acpi/acpi.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/lib/acpi/acpi.c b/lib/acpi/acpi.c index 14b15754f4..3938946fc6 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);
xsdt = map_sysmem(rsdp->xsdt_address, 0);
if (xsdt) {
len = xsdt->header.length - sizeof(xsdt->header);
count = len / sizeof(u64);
} else {
rsdt = map_sysmem(rsdp->rsdt_address, 0);
if (!rsdt)
return NULL;
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 (xsdt)
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)) {
-- 2.40.1
Can you please expand test/dm/acpi.c to check the above? Perhaps only on sandbox64 ?
Regards, Simon
participants (2)
-
Heinrich Schuchardt
-
Simon Glass