]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
acpi: use 64-bit addresses in FADT table
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 16 Dec 2023 08:11:57 +0000 (09:11 +0100)
committerSimon Glass <sjg@chromium.org>
Sun, 7 Jan 2024 20:45:07 +0000 (13:45 -0700)
Fields X_FIRMWAE_CTRL and X_DSDT must be 64bit wide. Convert pointers to
to uintptr_t to fill these.

If field X_FIRMWARE_CTRL is filled, field FIRMWARE must be ignored. If
field X_DSDT is filled, field DSDT must be ignored. We should not fill
unused fields.

See the field definitions in chapter "5.2.9 Fixed ACPI Description Table
(FADT)" of the ACPI Specification 6.5.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/x86/cpu/baytrail/acpi.c
arch/x86/cpu/quark/acpi.c
arch/x86/cpu/tangier/acpi.c
arch/x86/lib/acpi_table.c
include/acpi/acpi_table.h

index 4378846f8b0c91de56ba75f316573e1dd4b68e97..ccc4851b1881dfbb94c88a1b5ef9b26dffebbebb 100644 (file)
@@ -7,6 +7,7 @@
 #include <cpu.h>
 #include <dm.h>
 #include <log.h>
+#include <mapmem.h>
 #include <acpi/acpi_s3.h>
 #include <acpi/acpi_table.h>
 #include <asm/io.h>
@@ -31,8 +32,6 @@ static int baytrail_write_fadt(struct acpi_ctx *ctx,
        header->length = sizeof(struct acpi_fadt);
        header->revision = 4;
 
-       fadt->firmware_ctrl = (u32)ctx->facs;
-       fadt->dsdt = (u32)ctx->dsdt;
        fadt->preferred_pm_profile = ACPI_PM_MOBILE;
        fadt->sci_int = 9;
        fadt->smi_cmd = 0;
@@ -79,10 +78,8 @@ static int baytrail_write_fadt(struct acpi_ctx *ctx,
        fadt->reset_reg.addrh = 0;
        fadt->reset_value = SYS_RST | RST_CPU | FULL_RST;
 
-       fadt->x_firmware_ctl_l = (u32)ctx->facs;
-       fadt->x_firmware_ctl_h = 0;
-       fadt->x_dsdt_l = (u32)ctx->dsdt;
-       fadt->x_dsdt_h = 0;
+       fadt->x_firmware_ctrl = map_to_sysmem(ctx->facs);
+       fadt->x_dsdt = map_to_sysmem(ctx->dsdt);
 
        fadt->x_pm1a_evt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
        fadt->x_pm1a_evt_blk.bit_width = fadt->pm1_evt_len * 8;
index 9a2d682451be89bde49708f8c9a05dc986c6f41c..0e18ceab68d4fe55af630cb282abb4c2f0e25fd2 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include <common.h>
+#include <mapmem.h>
 #include <acpi/acpi_table.h>
 #include <asm/processor.h>
 #include <asm/tables.h>
@@ -26,8 +27,6 @@ static int quark_write_fadt(struct acpi_ctx *ctx,
        header->length = sizeof(struct acpi_fadt);
        header->revision = 4;
 
-       fadt->firmware_ctrl = (u32)ctx->facs;
-       fadt->dsdt = (u32)ctx->dsdt;
        fadt->preferred_pm_profile = ACPI_PM_UNSPECIFIED;
        fadt->sci_int = 9;
        fadt->smi_cmd = 0;
@@ -74,10 +73,8 @@ static int quark_write_fadt(struct acpi_ctx *ctx,
        fadt->reset_reg.addrh = 0;
        fadt->reset_value = SYS_RST | RST_CPU | FULL_RST;
 
-       fadt->x_firmware_ctl_l = (u32)ctx->facs;
-       fadt->x_firmware_ctl_h = 0;
-       fadt->x_dsdt_l = (u32)ctx->dsdt;
-       fadt->x_dsdt_h = 0;
+       fadt->x_firmware_ctrl = map_to_sysmem(ctx->facs);
+       fadt->x_dsdt = map_to_sysmem(ctx->dsdt);
 
        fadt->x_pm1a_evt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
        fadt->x_pm1a_evt_blk.bit_width = fadt->pm1_evt_len * 8;
index 1c667c7d569326d3ded6f40e2b827629c42cef21..1d37cc9e2b0db384cfe951980fa8a8b71fd4886b 100644 (file)
@@ -8,6 +8,7 @@
 #include <common.h>
 #include <cpu.h>
 #include <dm.h>
+#include <mapmem.h>
 #include <acpi/acpi_table.h>
 #include <asm/ioapic.h>
 #include <asm/mpspec.h>
@@ -31,8 +32,6 @@ static int tangier_write_fadt(struct acpi_ctx *ctx,
        header->length = sizeof(struct acpi_fadt);
        header->revision = 6;
 
-       fadt->firmware_ctrl = (u32)ctx->facs;
-       fadt->dsdt = (u32)ctx->dsdt;
        fadt->preferred_pm_profile = ACPI_PM_UNSPECIFIED;
 
        fadt->iapc_boot_arch = ACPI_FADT_VGA_NOT_PRESENT |
@@ -45,10 +44,8 @@ static int tangier_write_fadt(struct acpi_ctx *ctx,
 
        fadt->minor_revision = 2;
 
-       fadt->x_firmware_ctl_l = (u32)ctx->facs;
-       fadt->x_firmware_ctl_h = 0;
-       fadt->x_dsdt_l = (u32)ctx->dsdt;
-       fadt->x_dsdt_h = 0;
+       fadt->x_firmware_ctrl = map_to_sysmem(ctx->facs);
+       fadt->x_dsdt = map_to_sysmem(ctx->dsdt);
 
        header->checksum = table_compute_checksum(fadt, header->length);
 
index b366e44e337703930184163d82bab0cb4981b4b5..5ecd3d4b651a5d7de8f3376bbc5439b5b5969ca4 100644 (file)
@@ -572,13 +572,8 @@ void acpi_fadt_common(struct acpi_fadt *fadt, struct acpi_facs *facs,
        memcpy(header->aslc_id, ASLC_ID, 4);
        header->aslc_revision = 1;
 
-       fadt->firmware_ctrl = (unsigned long)facs;
-       fadt->dsdt = (unsigned long)dsdt;
-
-       fadt->x_firmware_ctl_l = (unsigned long)facs;
-       fadt->x_firmware_ctl_h = 0;
-       fadt->x_dsdt_l = (unsigned long)dsdt;
-       fadt->x_dsdt_h = 0;
+       fadt->x_firmware_ctrl = map_to_sysmem(facs);
+       fadt->x_dsdt = map_to_sysmem(dsdt);
 
        fadt->preferred_pm_profile = ACPI_PM_MOBILE;
 
index 20ac3b51ba7fcac3cb28d863b0d7afa74f945cd8..e67562ef654c79f7e6deb75b86a177739cbed5bf 100644 (file)
@@ -228,10 +228,8 @@ struct __packed acpi_fadt {
        u8 reset_value;
        u16 arm_boot_arch;
        u8 minor_revision;
-       u32 x_firmware_ctl_l;
-       u32 x_firmware_ctl_h;
-       u32 x_dsdt_l;
-       u32 x_dsdt_h;
+       u64 x_firmware_ctrl;
+       u64 x_dsdt;
        struct acpi_gen_regaddr x_pm1a_evt_blk;
        struct acpi_gen_regaddr x_pm1b_evt_blk;
        struct acpi_gen_regaddr x_pm1a_cnt_blk;