[PATCH 1/1] acpi: consider XSDT in acpi_find_table()
Simon Glass
sjg at chromium.org
Sat Nov 18 18:10:14 CET 2023
Hi Heinrich,
On Tue, 14 Nov 2023 at 09:39, Heinrich Schuchardt
<heinrich.schuchardt at 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 at 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
More information about the U-Boot
mailing list