[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