]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
acpi: x86: Write FADT in common code
authorMaximilian Brune <maximilian.brune@9elements.com>
Wed, 23 Oct 2024 13:19:45 +0000 (15:19 +0200)
committerTom Rini <trini@konsulko.com>
Sun, 27 Oct 2024 23:12:44 +0000 (17:12 -0600)
Write the FADT in common code since it's used on all architectures.
Since the FADT is mandatory all SoCs or mainboards must implement the
introduced function acpi_fill_fadt() and properly update the FADT.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Cc: Simon Glass <sjg@chromium.org>
Cc: Bin Meng <bmeng.cn@gmail.com>
arch/sandbox/lib/acpi_table.c [new file with mode: 0644]
arch/x86/cpu/apollolake/acpi.c
arch/x86/cpu/baytrail/acpi.c
arch/x86/cpu/quark/acpi.c
arch/x86/cpu/tangier/acpi.c
arch/x86/include/asm/acpi_table.h
arch/x86/lib/acpi_table.c
include/acpi/acpi_table.h
lib/acpi/acpi_table.c

diff --git a/arch/sandbox/lib/acpi_table.c b/arch/sandbox/lib/acpi_table.c
new file mode 100644 (file)
index 0000000..10b7ce4
--- /dev/null
@@ -0,0 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0+
+#include <acpi/acpi_table.h>
+
+void acpi_fill_fadt(struct acpi_fadt *fadt)
+{
+}
\ No newline at end of file
index 76230aea837d9051179ad730ad4a2103cc88c3bf..93040e7bb37fd6fdc328d30cc3120ce4285927c4 100644 (file)
@@ -128,8 +128,10 @@ int arch_madt_sci_irq_polarity(int sci)
        return MP_IRQ_POLARITY_LOW;
 }
 
-void fill_fadt(struct acpi_fadt *fadt)
+void acpi_fill_fadt(struct acpi_fadt *fadt)
 {
+       intel_acpi_fill_fadt(fadt);
+
        fadt->pm_tmr_blk = IOMAP_ACPI_BASE + PM1_TMR;
 
        fadt->p_lvl2_lat = ACPI_FADT_C2_NOT_SUPPORTED;
@@ -143,23 +145,9 @@ void fill_fadt(struct acpi_fadt *fadt)
        fadt->x_pm_tmr_blk.space_id = 1;
        fadt->x_pm_tmr_blk.bit_width = fadt->pm_tmr_len * 8;
        fadt->x_pm_tmr_blk.addrl = IOMAP_ACPI_BASE + PM1_TMR;
-}
-
-static int apl_write_fadt(struct acpi_ctx *ctx, const struct acpi_writer *entry)
-{
-       struct acpi_table_header *header;
-       struct acpi_fadt *fadt;
-
-       fadt = ctx->current;
-       acpi_fadt_common(fadt, ctx->facs, ctx->dsdt);
-       intel_acpi_fill_fadt(fadt);
-       fill_fadt(fadt);
-       header = &fadt->header;
-       header->checksum = table_compute_checksum(fadt, header->length);
 
-       return acpi_add_fadt(ctx, fadt);
+       fadt->preferred_pm_profile = ACPI_PM_MOBILE;
 }
-ACPI_WRITER(5fadt, "FADT", apl_write_fadt, 0);
 
 int apl_acpi_fill_dmar(struct acpi_ctx *ctx)
 {
index 7821964f1fca96c385140b3dc48808c47c4609a9..7e1c2de3d39ad520c323ed0ebd0366d627066b35 100644 (file)
 #include <asm/arch/iomap.h>
 #include <dm/uclass-internal.h>
 
-static int baytrail_write_fadt(struct acpi_ctx *ctx,
-                              const struct acpi_writer *entry)
+void acpi_fill_fadt(struct acpi_fadt *fadt)
 {
        struct acpi_table_header *header;
-       struct acpi_fadt *fadt;
 
-       fadt = ctx->current;
        header = &fadt->header;
        u16 pmbase = ACPI_BASE_ADDRESS;
 
-       memset(fadt, '\0', sizeof(struct acpi_fadt));
-
-       acpi_fill_header(header, "FACP");
-       header->length = sizeof(struct acpi_fadt);
        header->revision = 4;
 
        fadt->preferred_pm_profile = ACPI_PM_MOBILE;
@@ -77,9 +70,6 @@ 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_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;
        fadt->x_pm1a_evt_blk.bit_offset = 0;
@@ -135,12 +125,7 @@ static int baytrail_write_fadt(struct acpi_ctx *ctx,
        fadt->x_gpe1_blk.access_size = 0;
        fadt->x_gpe1_blk.addrl = 0x0;
        fadt->x_gpe1_blk.addrh = 0x0;
-
-       header->checksum = table_compute_checksum(fadt, header->length);
-
-       return acpi_add_fadt(ctx, fadt);
 }
-ACPI_WRITER(5fadt, "FADT", baytrail_write_fadt, 0);
 
 int acpi_create_gnvs(struct acpi_global_nvs *gnvs)
 {
index 80e94600fc5af04d5180227dc5dc7c89d111c82d..0fe5f2bafb410e5a96f669f84ff6fe6a842733c5 100644 (file)
 #include <asm/arch/iomap.h>
 #include <linux/string.h>
 
-static int quark_write_fadt(struct acpi_ctx *ctx,
-                           const struct acpi_writer *entry)
+void acpi_fill_fadt(struct acpi_fadt *fadt)
 {
        u16 pmbase = ACPI_PM1_BASE_ADDRESS;
        struct acpi_table_header *header;
-       struct acpi_fadt *fadt;
 
-       fadt = ctx->current;
        header = &fadt->header;
-
-       memset(fadt, '\0', sizeof(struct acpi_fadt));
-
-       acpi_fill_header(header, "FACP");
-       header->length = sizeof(struct acpi_fadt);
        header->revision = 4;
 
-       fadt->preferred_pm_profile = ACPI_PM_UNSPECIFIED;
        fadt->sci_int = 9;
        fadt->smi_cmd = 0;
        fadt->acpi_enable = 0;
@@ -73,9 +64,6 @@ 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_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;
        fadt->x_pm1a_evt_blk.bit_offset = 0;
@@ -131,12 +119,7 @@ static int quark_write_fadt(struct acpi_ctx *ctx,
        fadt->x_gpe1_blk.access_size = 0;
        fadt->x_gpe1_blk.addrl = 0x0;
        fadt->x_gpe1_blk.addrh = 0x0;
-
-       header->checksum = table_compute_checksum(fadt, header->length);
-
-       return acpi_add_fadt(ctx, fadt);
 }
-ACPI_WRITER(5fadt, "FADT", quark_write_fadt, 0);
 
 int acpi_create_gnvs(struct acpi_global_nvs *gnvs)
 {
index d4d0ef6f855269e2c3f24bc0bdc59f9e77d71d65..1c73a9dbfece1c0562eaf02cf3abfc2ef7ca08fe 100644 (file)
 #include <asm/arch/iomap.h>
 #include <dm/uclass-internal.h>
 
-static int tangier_write_fadt(struct acpi_ctx *ctx,
-                             const struct acpi_writer *entry)
+void acpi_fill_fadt(struct acpi_fadt *fadt)
 {
-       struct acpi_table_header *header;
-       struct acpi_fadt *fadt;
-
-       fadt = ctx->current;
-       header = &fadt->header;
-
-       memset(fadt, '\0', sizeof(struct acpi_fadt));
-
-       acpi_fill_header(header, "FACP");
-       header->length = sizeof(struct acpi_fadt);
-       header->revision = 6;
-
        fadt->preferred_pm_profile = ACPI_PM_UNSPECIFIED;
 
        fadt->iapc_boot_arch = ACPI_FADT_VGA_NOT_PRESENT |
@@ -40,17 +27,9 @@ static int tangier_write_fadt(struct acpi_ctx *ctx,
                ACPI_FADT_POWER_BUTTON | ACPI_FADT_SLEEP_BUTTON |
                ACPI_FADT_SEALED_CASE | ACPI_FADT_HEADLESS |
                ACPI_FADT_HW_REDUCED_ACPI;
-
+       fadt->header.revision = 6;
        fadt->minor_revision = 2;
-
-       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);
-
-       return acpi_add_fadt(ctx, fadt);
 }
-ACPI_WRITER(5fadt, "FADT", tangier_write_fadt, 0);
 
 u32 acpi_fill_madt(u32 current)
 {
index e6175246173c4105c345ae65ba67a8d62d741b32..3988898f66eb4b7e2cd83be0899aa4ff94cb1522 100644 (file)
@@ -168,18 +168,6 @@ int acpi_create_dmar_ds_ioapic(struct acpi_ctx *ctx, uint enumeration_id,
 int acpi_create_dmar_ds_msi_hpet(struct acpi_ctx *ctx, uint enumeration_id,
                                 pci_dev_t bdf);
 
-/**
- * acpi_fadt_common() - Handle common parts of filling out an FADT
- *
- * This sets up the Fixed ACPI Description Table
- *
- * @fadt: Pointer to place to put FADT
- * @facs: Pointer to the FACS
- * @dsdt: Pointer to the DSDT
- */
-void acpi_fadt_common(struct acpi_fadt *fadt, struct acpi_facs *facs,
-                     void *dsdt);
-
 /**
  * intel_acpi_fill_fadt() - Set up the contents of the FADT
  *
index 08fd1e54ce3fae29ddaea2f63e38e854a4eec74f..ff02ce80d15f8bd25a2631cce24b4c1f6a6e5b4e 100644 (file)
@@ -381,29 +381,6 @@ int acpi_write_hpet(struct acpi_ctx *ctx)
        return 0;
 }
 
-void acpi_fadt_common(struct acpi_fadt *fadt, struct acpi_facs *facs,
-                     void *dsdt)
-{
-       struct acpi_table_header *header = &fadt->header;
-
-       memset((void *)fadt, '\0', sizeof(struct acpi_fadt));
-
-       acpi_fill_header(header, "FACP");
-       header->length = sizeof(struct acpi_fadt);
-       header->revision = 4;
-       memcpy(header->oem_id, OEM_ID, 6);
-       memcpy(header->oem_table_id, OEM_TABLE_ID, 8);
-       memcpy(header->creator_id, ASLC_ID, 4);
-
-       fadt->x_firmware_ctrl = map_to_sysmem(facs);
-       fadt->x_dsdt = map_to_sysmem(dsdt);
-
-       fadt->preferred_pm_profile = ACPI_PM_MOBILE;
-
-       /* Use ACPI 3.0 revision */
-       fadt->header.revision = 4;
-}
-
 void acpi_create_dmar_drhd(struct acpi_ctx *ctx, uint flags, uint segment,
                           u64 bar)
 {
index a37243549203f62757611b1000f4745492263c6e..19cf0fb43cac949d666a8174fc28715afc7b7b98 100644 (file)
@@ -954,6 +954,15 @@ void acpi_fill_header(struct acpi_table_header *header, char *signature);
  */
 int acpi_fill_csrt(struct acpi_ctx *ctx);
 
+/**
+ * acpi_fill_fadt() - Fill out the body of the FADT
+ *
+ * Must be implemented in SoC specific code or in mainboard code.
+ *
+ * @fadt: Pointer to FADT to update
+ */
+void acpi_fill_fadt(struct acpi_fadt *fadt);
+
 /**
  * acpi_get_rsdp_addr() - get ACPI RSDP table address
  *
index c9ddcca8cb558396ca26c4ff0eb965df8e64fb6a..9eb0b507a09a130dd22dfd99f86e0ea9cbcd1e69 100644 (file)
@@ -202,6 +202,44 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table)
        return 0;
 }
 
+int acpi_write_fadt(struct acpi_ctx *ctx, const struct acpi_writer *entry)
+{
+       struct acpi_table_header *header;
+       struct acpi_fadt *fadt;
+
+       fadt = ctx->current;
+       header = &fadt->header;
+
+       memset((void *)fadt, '\0', sizeof(struct acpi_fadt));
+
+       acpi_fill_header(header, "FACP");
+       header->length = sizeof(struct acpi_fadt);
+       header->revision = acpi_get_table_revision(ACPITAB_FADT);
+       memcpy(header->oem_id, OEM_ID, 6);
+       memcpy(header->oem_table_id, OEM_TABLE_ID, 8);
+       memcpy(header->creator_id, ASLC_ID, 4);
+       header->creator_revision = 1;
+
+       fadt->x_firmware_ctrl = map_to_sysmem(ctx->facs);
+       fadt->x_dsdt = map_to_sysmem(ctx->dsdt);
+
+       if (fadt->x_firmware_ctrl < 0x100000000ULL)
+               fadt->firmware_ctrl = fadt->x_firmware_ctrl;
+
+       if (fadt->x_dsdt < 0x100000000ULL)
+               fadt->dsdt = fadt->x_dsdt;
+
+       fadt->preferred_pm_profile = ACPI_PM_UNSPECIFIED;
+
+       acpi_fill_fadt(fadt);
+
+       header->checksum = table_compute_checksum(fadt, header->length);
+
+       return acpi_add_fadt(ctx, fadt);
+}
+
+ACPI_WRITER(5fadt, "FADT", acpi_write_fadt, 0);
+
 void acpi_create_dbg2(struct acpi_dbg2_header *dbg2,
                      int port_type, int port_subtype,
                      struct acpi_gen_regaddr *address, u32 address_size,