]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi: Use the installed ACPI tables
authorSimon Glass <sjg@chromium.org>
Sun, 16 Jul 2023 03:39:17 +0000 (21:39 -0600)
committerBin Meng <bmeng@tinylab.org>
Mon, 17 Jul 2023 09:23:15 +0000 (17:23 +0800)
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.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
lib/efi_loader/efi_acpi.c

index 2ddc3502b5df2a9adc22fbead14f64938f751e16..f755af76f8665ff5261c6141f6e9038d5c4395d0 100644 (file)
@@ -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);
 }