[PATCH 38/38] efi: Use the installed ACPI tables

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Mar 30 23:53:52 CEST 2023



Am 30. März 2023 23:32:27 MESZ schrieb Simon Glass <sjg at chromium.org>:
>U-Boot sets up the ACPI tables during startup. Rather than creating a
>new set, install the existing ones. Create a memory-map record to cover
>the tables.

I understand that this works on QEMU which provides ACPI tables. But on all other systems that use ACPI you will still have to generate ACPI tables.

So you cannot simply drop the table generation.

If you have moved the generation step somewhere else, this patch should mention the new location.

Best regards

Heinrich


>
>Signed-off-by: Simon Glass <sjg at chromium.org>
>---
>
> lib/efi_loader/efi_acpi.c | 33 +++++++++++++++++++--------------
> 1 file changed, 19 insertions(+), 14 deletions(-)
>
>diff --git a/lib/efi_loader/efi_acpi.c b/lib/efi_loader/efi_acpi.c
>index 2ddc3502b5df..f755af76f866 100644
>--- a/lib/efi_loader/efi_acpi.c
>+++ b/lib/efi_loader/efi_acpi.c
>@@ -10,6 +10,9 @@
> #include <log.h>
> #include <mapmem.h>
> #include <acpi/acpi_table.h>
>+#include <asm/global_data.h>
>+
>+DECLARE_GLOBAL_DATA_PTR;
> 
> static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID;
> 
>@@ -20,26 +23,28 @@ static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID;
>  */
> efi_status_t efi_acpi_register(void)
> {
>-	/* Map within the low 32 bits, to allow for 32bit ACPI tables */
>-	u64 acpi = U32_MAX;
>+	ulong addr, start, end;
> 	efi_status_t ret;
>-	ulong addr;
> 
>-	/* Reserve 64kiB page for ACPI */
>-	ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
>-				 EFI_ACPI_RECLAIM_MEMORY, 16, &acpi);
>+	/* Mark space used for tables */
>+	start = ALIGN_DOWN(gd->arch.table_start, EFI_PAGE_MASK);
>+	end = ALIGN(gd->arch.table_end, EFI_PAGE_MASK);
>+	ret = efi_add_memory_map(start, end - start, EFI_ACPI_RECLAIM_MEMORY);
> 	if (ret != EFI_SUCCESS)
> 		return ret;
>+	if (gd->arch.table_start_high) {
>+		start = ALIGN_DOWN(gd->arch.table_start_high, EFI_PAGE_MASK);
>+		end = ALIGN(gd->arch.table_end_high, EFI_PAGE_MASK);
>+		ret = efi_add_memory_map(start, end - start,
>+					 EFI_ACPI_RECLAIM_MEMORY);
>+		if (ret != EFI_SUCCESS)
>+			return ret;
>+	}
> 
>-	/*
>-	 * Generate ACPI tables - we know that efi_allocate_pages() returns
>-	 * a 4k-aligned address, so it is safe to assume that
>-	 * write_acpi_tables() will write the table at that address.
>-	 */
>-	addr = map_to_sysmem((void *)(ulong)acpi);
>-	write_acpi_tables(addr);
>+	addr = gd_acpi_start();
>+	printf("EFI using ACPI tables at %lx\n", addr);
> 
> 	/* And expose them to our EFI payload */
> 	return efi_install_configuration_table(&acpi_guid,
>-					       (void *)(uintptr_t)acpi);
>+					       (void *)(ulong)addr);
> }


More information about the U-Boot mailing list