[PATCH v5 14/36] efi_loader: Allocate and write ACPI tables
Simon Glass
sjg at chromium.org
Thu Sep 26 23:04:54 CEST 2024
Hi Patrick,
On Thu, 26 Sept 2024 at 10:02, Patrick Rudolph
<patrick.rudolph at 9elements.com> wrote:
>
> Allocate memory for ACPI tables inside the efi_loader and write out
> the tables similar to SMBIOS tables. When ACPI is enabled and wasn't
> installed in other places, install the ACPI table in EFI. Since EFI
> is necessary to pass the ACPI table location when FDT isn't used,
> there's no need to install it separately.
>
> When CONFIG_BLOBLIST_TABLES is set the tables will be stored in a
> bloblist. The tables are still passed to the OS using EFI.
>
> This allows non x86 platforms to boot using ACPI only in case the
> EFI loader is being used.
>
> 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>
> ---
> Changelog v3:
> - Drop memalign and use efi_allocate_pages
> - Use log_debug instead of debug
> - Clarify commit message
> - Skip writing ACPI tables on sandbox
> - Rename function
> - Add function comment
>
> ---
> lib/efi_loader/efi_acpi.c | 80 +++++++++++++++++++++++++++++++-
> test/py/tests/test_event_dump.py | 1 +
> 2 files changed, 79 insertions(+), 2 deletions(-)
>
> diff --git a/lib/efi_loader/efi_acpi.c b/lib/efi_loader/efi_acpi.c
> index 67bd7f8ca2..9d38d0060c 100644
> --- a/lib/efi_loader/efi_acpi.c
> +++ b/lib/efi_loader/efi_acpi.c
> @@ -6,15 +6,23 @@
> */
>
> #include <efi_loader.h>
> -#include <log.h>
> -#include <mapmem.h>
> #include <acpi/acpi_table.h>
> #include <asm/global_data.h>
> +#include <asm/io.h>
> +#include <bloblist.h>
> +#include <linux/sizes.h>
> +#include <linux/log2.h>
> +#include <log.h>
> +#include <malloc.h>
> +#include <mapmem.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID;
>
> +enum {
> + TABLE_SIZE = SZ_64K,
> +};
> /*
> * Install the ACPI table as a configuration table.
> *
> @@ -47,3 +55,71 @@ efi_status_t efi_acpi_register(void)
> return efi_install_configuration_table(&acpi_guid,
> (void *)(ulong)addr);
> }
> +
> +/*
> + * 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_GENERATE_ACPI_TABLE))
> + return 0;
> +
> + 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 {
> + 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;
> + }
You can drop the if and the else, since bloblist is always enabled for
ACPI on Arm.
If you set gd->arch.table_start and gd->arch.table_end then efi_acpi.c
will add your ACPI table to the memory map.
[..]
Regards,
Simon
More information about the U-Boot
mailing list