mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
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> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
parent
fef4896dc8
commit
5574d82fbc
1 changed files with 16 additions and 4 deletions
|
@ -16,18 +16,30 @@ struct acpi_table_header *acpi_find_table(const char *sig)
|
||||||
{
|
{
|
||||||
struct acpi_rsdp *rsdp;
|
struct acpi_rsdp *rsdp;
|
||||||
struct acpi_rsdt *rsdt;
|
struct acpi_rsdt *rsdt;
|
||||||
|
struct acpi_xsdt *xsdt;
|
||||||
int len, i, count;
|
int len, i, count;
|
||||||
|
|
||||||
rsdp = map_sysmem(gd_acpi_start(), 0);
|
rsdp = map_sysmem(gd_acpi_start(), 0);
|
||||||
if (!rsdp)
|
if (!rsdp)
|
||||||
return NULL;
|
return NULL;
|
||||||
rsdt = map_sysmem(rsdp->rsdt_address, 0);
|
if (rsdp->xsdt_address) {
|
||||||
len = rsdt->header.length - sizeof(rsdt->header);
|
xsdt = map_sysmem(rsdp->xsdt_address, 0);
|
||||||
count = len / sizeof(u32);
|
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++) {
|
for (i = 0; i < count; i++) {
|
||||||
struct acpi_table_header *hdr;
|
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))
|
if (!memcmp(hdr->signature, sig, ACPI_NAME_LEN))
|
||||||
return hdr;
|
return hdr;
|
||||||
if (!memcmp(hdr->signature, "FACP", ACPI_NAME_LEN)) {
|
if (!memcmp(hdr->signature, "FACP", ACPI_NAME_LEN)) {
|
||||||
|
|
Loading…
Reference in a new issue