summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2023-12-31 08:25:54 -0700
committerSimon Glass <sjg@chromium.org>2024-01-07 13:45:07 -0700
commita8efebe71978b3b21e04c7f104987ada879e0800 (patch)
treebd0394b2a6d67b3e40d13fe538576e91259a1708 /lib
parent5e3adc44a4da72b25fa78e9f9847a8c297b3ebaf (diff)
downloadu-boot-a8efebe71978b3b21e04c7f104987ada879e0800.tar.gz
u-boot-a8efebe71978b3b21e04c7f104987ada879e0800.tar.bz2
u-boot-a8efebe71978b3b21e04c7f104987ada879e0800.zip
acpi: Write pointers to tables instead of addresses
Sandbox uses an API to map between addresses and pointers. This allows it to have (emulated) memory at zero and avoid arch-specific addressing details. It also allows memory-mapped peripherals to work. As an example, on many machines sandbox maps address 100 to pointer value 10000000. However this is not correct for ACPI, if sandbox starts another program (e.g EFI app) and passes it the tables. That app has no knowledge of sandbox's address mapping. So to make this work we want to store 10000000 as the value in the table. Add two new 'nomap' functions which clearly make this exeption to how sandbox works. This should allow EFI apps to access ACPI tables with sandbox, e.g. for testing purposes. Signed-off-by: Simon Glass <sjg@chromium.org> Suggested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Diffstat (limited to 'lib')
-rw-r--r--lib/acpi/acpi.c12
-rw-r--r--lib/acpi/acpi_table.c4
-rw-r--r--lib/acpi/base.c4
3 files changed, 10 insertions, 10 deletions
diff --git a/lib/acpi/acpi.c b/lib/acpi/acpi.c
index 939a638bb5..bcafd77175 100644
--- a/lib/acpi/acpi.c
+++ b/lib/acpi/acpi.c
@@ -22,13 +22,13 @@ struct acpi_table_header *acpi_find_table(const char *sig)
if (!rsdp)
return NULL;
if (rsdp->xsdt_address) {
- xsdt = map_sysmem(rsdp->xsdt_address, 0);
+ xsdt = nomap_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);
+ rsdt = nomap_sysmem(rsdp->rsdt_address, 0);
len = rsdt->header.length - sizeof(rsdt->header);
count = len / sizeof(u32);
}
@@ -36,19 +36,19 @@ struct acpi_table_header *acpi_find_table(const char *sig)
struct acpi_table_header *hdr;
if (rsdp->xsdt_address)
- hdr = map_sysmem(xsdt->entry[i], 0);
+ hdr = nomap_sysmem(xsdt->entry[i], 0);
else
- hdr = map_sysmem(rsdt->entry[i], 0);
+ hdr = nomap_sysmem(rsdt->entry[i], 0);
if (!memcmp(hdr->signature, sig, ACPI_NAME_LEN))
return hdr;
if (!memcmp(hdr->signature, "FACP", ACPI_NAME_LEN)) {
struct acpi_fadt *fadt = (struct acpi_fadt *)hdr;
if (!memcmp(sig, "DSDT", ACPI_NAME_LEN) && fadt->dsdt)
- return map_sysmem(fadt->dsdt, 0);
+ return nomap_sysmem(fadt->dsdt, 0);
if (!memcmp(sig, "FACS", ACPI_NAME_LEN) &&
fadt->firmware_ctrl)
- return map_sysmem(fadt->firmware_ctrl, 0);
+ return nomap_sysmem(fadt->firmware_ctrl, 0);
}
}
diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
index e74522e997..39dd53ec40 100644
--- a/lib/acpi/acpi_table.c
+++ b/lib/acpi/acpi_table.c
@@ -167,7 +167,7 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table)
}
/* Add table to the RSDT */
- rsdt->entry[i] = map_to_sysmem(table);
+ rsdt->entry[i] = nomap_to_sysmem(table);
/* Fix RSDT length or the kernel will assume invalid entries */
rsdt->header.length = sizeof(struct acpi_table_header) +
@@ -185,7 +185,7 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table)
xsdt = ctx->xsdt;
/* Add table to the XSDT */
- xsdt->entry[i] = map_to_sysmem(table);
+ xsdt->entry[i] = nomap_to_sysmem(table);
/* Fix XSDT length */
xsdt->header.length = sizeof(struct acpi_table_header) +
diff --git a/lib/acpi/base.c b/lib/acpi/base.c
index 07b53e0c56..8b6af2bc43 100644
--- a/lib/acpi/base.c
+++ b/lib/acpi/base.c
@@ -24,10 +24,10 @@ void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
memcpy(rsdp->oem_id, OEM_ID, 6);
if (rsdt)
- rsdp->rsdt_address = map_to_sysmem(rsdt);
+ rsdp->rsdt_address = nomap_to_sysmem(rsdt);
if (xsdt)
- rsdp->xsdt_address = map_to_sysmem(xsdt);
+ rsdp->xsdt_address = nomap_to_sysmem(xsdt);
rsdp->length = sizeof(struct acpi_rsdp);
rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;