[PATCH v7 14/37] acpi: Allocate and write ACPI tables

Simon Glass sjg at chromium.org
Sun Oct 13 21:37:04 CEST 2024


Hi Patrick,

On Fri, 11 Oct 2024 at 04:34, Patrick Rudolph
<patrick.rudolph at 9elements.com> wrote:
>
> Allocate memory for ACPI tables in generic acpi code. When ACPI wasn't
> installed in other places, install the ACPI table using either BLOBLISTs
> or EFI allocate pages.
>
> This allows non x86 platforms to boot using ACPI only in case the
> EFI loader is being used, since EFI is necessary to advertise the location
> of the ACPI tables in memory.
>
> TEST: Booted QEMU SBSA (no QFW) using EFI and ACPI only.
>
> Signed-off-by: Patrick Rudolph <patrick.rudolph at 9elements.com>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Tom Rini <trini at konsulko.com>
> ---
>  lib/acpi/acpi_table.c            | 80 +++++++++++++++++++++++++++++++-
>  test/py/tests/test_event_dump.py |  1 +
>  2 files changed, 80 insertions(+), 1 deletion(-)
>
> diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
> index d6357bdc4d..d8112e58ca 100644
> --- a/lib/acpi/acpi_table.c
> +++ b/lib/acpi/acpi_table.c
> @@ -5,8 +5,11 @@
>   * Copyright 2019 Google LLC
>   */
>
> -#include <dm.h>
> +#include <bloblist.h>
>  #include <cpu.h>
> +#include <dm.h>
> +#include <efi_api.h>
> +#include <efi_loader.h>
>  #include <log.h>
>  #include <mapmem.h>
>  #include <tables_csum.h>
> @@ -16,6 +19,14 @@
>  #include <acpi/acpi_device.h>
>  #include <asm/global_data.h>
>  #include <dm/acpi.h>
> +#include <linux/sizes.h>
> +#include <linux/log2.h>
> +
> +enum {
> +       TABLE_SIZE      = SZ_64K,
> +};
> +
> +DECLARE_GLOBAL_DATA_PTR;
>
>  /*
>   * OEM_REVISION is 32-bit unsigned number. It should be increased only when
> @@ -752,3 +763,70 @@ static int acpi_write_iort(struct acpi_ctx *ctx, const struct acpi_writer *entry
>  }
>
>  ACPI_WRITER(5iort, "IORT", acpi_write_iort, 0);
> +
> +/*
> + * Allocate memory for ACPI tables and write ACPI tables to the
> + * allocated buffer.
> + *
> + * Return:     status code
> + */
> +static int alloc_write_acpi_tables(void)
> +{
> +       u64 table_addr, table_end;
> +       u64 new_acpi_addr = 0;
> +       efi_uintn_t pages;
> +       efi_status_t ret;
> +       void *addr;
> +
> +       if (IS_ENABLED(CONFIG_X86) ||
> +           IS_ENABLED(CONFIG_QFW_ACPI) ||
> +           IS_ENABLED(CONFIG_SANDBOX)) {
> +               log_debug("Skipping writing ACPI tables as already done\n");
> +               return 0;
> +       }
> +
> +       /* Align the table to a 4KB boundary to keep EFI happy */
> +       if (IS_ENABLED(CONFIG_BLOBLIST_TABLES)) {
> +               addr = bloblist_add(BLOBLISTT_ACPI_TABLES, TABLE_SIZE,
> +                                   ilog2(SZ_4K));
> +
> +               if (!addr)
> +                       return log_msg_ret("mem", -ENOMEM);
> +       } else if (IS_ENABLED(CONFIG_EFI_LOADER)) {
> +               pages = efi_size_in_pages(TABLE_SIZE);
> +
> +               ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES,
> +                                        EFI_ACPI_RECLAIM_MEMORY,
> +                                        pages, &new_acpi_addr);
> +               if (ret != EFI_SUCCESS)
> +                       return log_msg_ret("mem", -ENOMEM);
> +
> +               addr = (void *)(uintptr_t)new_acpi_addr;

Please remove the else () part, as discussed before. We don't need it
as the bloblist is always used. We don't want it since EFI is not in
chanre of creating the tables. It also duplicates code in efi_acpi.c
which creates the mapping. You just need to set the table start and
end:

gd->arch.table_start = addr;
gd->arch.table_size = TABLE_SIZE;

> +       } else {
> +               return log_msg_ret("mem", -ENOMEM);
> +       }
> +
> +       table_addr = virt_to_phys(addr);
> +
> +       gd->arch.table_start_high = table_addr;
> +
> +       table_end = write_acpi_tables(table_addr);
> +       if (!table_end) {
> +               log_err("Can't create ACPI configuration table\n");
> +               return -EINTR;
> +       }
> +
> +       log_debug("- wrote 'acpi' to %llx, end %llx\n", table_addr, table_end);
> +       if (table_end - table_addr > TABLE_SIZE) {
> +               log_err("Out of space for configuration tables: need %llx, have %x\n",
> +                       table_end - table_addr, TABLE_SIZE);
> +               return log_msg_ret("acpi", -ENOSPC);
> +       }
> +       gd->arch.table_end_high = table_end;
> +
> +       log_debug("- done writing tables\n");
> +
> +       return 0;
> +}
> +
> +EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, alloc_write_acpi_tables);
> diff --git a/test/py/tests/test_event_dump.py b/test/py/tests/test_event_dump.py
> index e282c67335..45143c1c7d 100644
> --- a/test/py/tests/test_event_dump.py
> +++ b/test/py/tests/test_event_dump.py
> @@ -18,6 +18,7 @@ def test_event_dump(u_boot_console):
>  --------------------  ------------------------------  ------------------------------
>  EVT_FT_FIXUP          bootmeth_vbe_ft_fixup           .*boot/vbe_request.c:.*
>  EVT_FT_FIXUP          bootmeth_vbe_simple_ft_fixup    .*boot/vbe_simple_os.c:.*
> +EVT_LAST_STAGE_INIT   alloc_write_acpi_tables         .*lib/acpi/acpi_table.c:.*
>  EVT_LAST_STAGE_INIT   install_smbios_table            .*lib/efi_loader/efi_smbios.c:.*
>  EVT_MISC_INIT_F       sandbox_early_getopt_check      .*arch/sandbox/cpu/start.c:.*
>  EVT_TEST              h_adder_simple                  .*test/common/event.c:'''
> --
> 2.46.2
>

Regards,
Simon


More information about the U-Boot mailing list