mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-17 10:24:49 +00:00
acpi: cannot have RSDT above 4 GiB
The field RsdtAddress has only 32 bit. The RSDT table cannot be located beyond 4 GiB. Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
dbdc9c6aef
commit
c7b31a9ad5
1 changed files with 16 additions and 7 deletions
|
@ -12,6 +12,7 @@
|
||||||
#include <dm/acpi.h>
|
#include <dm/acpi.h>
|
||||||
#include <mapmem.h>
|
#include <mapmem.h>
|
||||||
#include <tables_csum.h>
|
#include <tables_csum.h>
|
||||||
|
#include <linux/sizes.h>
|
||||||
|
|
||||||
void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
|
void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
|
||||||
struct acpi_xsdt *xsdt)
|
struct acpi_xsdt *xsdt)
|
||||||
|
@ -21,10 +22,13 @@ void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
|
||||||
memcpy(rsdp->signature, RSDP_SIG, 8);
|
memcpy(rsdp->signature, RSDP_SIG, 8);
|
||||||
memcpy(rsdp->oem_id, OEM_ID, 6);
|
memcpy(rsdp->oem_id, OEM_ID, 6);
|
||||||
|
|
||||||
rsdp->length = sizeof(struct acpi_rsdp);
|
if (rsdt)
|
||||||
rsdp->rsdt_address = map_to_sysmem(rsdt);
|
rsdp->rsdt_address = map_to_sysmem(rsdt);
|
||||||
|
|
||||||
rsdp->xsdt_address = map_to_sysmem(xsdt);
|
if (xsdt)
|
||||||
|
rsdp->xsdt_address = map_to_sysmem(xsdt);
|
||||||
|
|
||||||
|
rsdp->length = sizeof(struct acpi_rsdp);
|
||||||
rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;
|
rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;
|
||||||
|
|
||||||
/* Calculate checksums */
|
/* Calculate checksums */
|
||||||
|
@ -68,11 +72,15 @@ static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
|
||||||
static int acpi_write_base(struct acpi_ctx *ctx,
|
static int acpi_write_base(struct acpi_ctx *ctx,
|
||||||
const struct acpi_writer *entry)
|
const struct acpi_writer *entry)
|
||||||
{
|
{
|
||||||
/* We need at least an RSDP and an RSDT Table */
|
/* We need at least an RSDP and an XSDT Table */
|
||||||
ctx->rsdp = ctx->current;
|
ctx->rsdp = ctx->current;
|
||||||
acpi_inc_align(ctx, sizeof(struct acpi_rsdp));
|
acpi_inc_align(ctx, sizeof(struct acpi_rsdp));
|
||||||
ctx->rsdt = ctx->current;
|
if (map_to_sysmem(ctx->current) < SZ_4G - SZ_64K) {
|
||||||
acpi_inc_align(ctx, sizeof(struct acpi_rsdt));
|
ctx->rsdt = ctx->current;
|
||||||
|
acpi_inc_align(ctx, sizeof(struct acpi_rsdt));
|
||||||
|
} else {
|
||||||
|
ctx->rsdt = 0;
|
||||||
|
}
|
||||||
ctx->xsdt = ctx->current;
|
ctx->xsdt = ctx->current;
|
||||||
acpi_inc_align(ctx, sizeof(struct acpi_xsdt));
|
acpi_inc_align(ctx, sizeof(struct acpi_xsdt));
|
||||||
|
|
||||||
|
@ -80,7 +88,8 @@ static int acpi_write_base(struct acpi_ctx *ctx,
|
||||||
memset(ctx->base, '\0', ctx->current - ctx->base);
|
memset(ctx->base, '\0', ctx->current - ctx->base);
|
||||||
|
|
||||||
acpi_write_rsdp(ctx->rsdp, ctx->rsdt, ctx->xsdt);
|
acpi_write_rsdp(ctx->rsdp, ctx->rsdt, ctx->xsdt);
|
||||||
acpi_write_rsdt(ctx->rsdt);
|
if (ctx->rsdt)
|
||||||
|
acpi_write_rsdt(ctx->rsdt);
|
||||||
acpi_write_xsdt(ctx->xsdt);
|
acpi_write_xsdt(ctx->xsdt);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue