]> git.sur5r.net Git - u-boot/commitdiff
efi_loader: Install ACPI configuration tables
authorBin Meng <bmeng.cn@gmail.com>
Thu, 28 Jun 2018 03:38:03 +0000 (20:38 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 2 Jul 2018 01:23:28 +0000 (09:23 +0800)
ACPI tables can be passed via EFI configuration table to an EFI
application. This is only supported on x86 so far.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
cmd/bootefi.c
include/efi_api.h
include/efi_loader.h
lib/efi_loader/Makefile
lib/efi_loader/efi_acpi.c [new file with mode: 0644]

index f55a40dc84cd05dc2f3cbb39583f9c70f7e5a68c..cd755b6bf44441a9d25ff0356a9d10066f9e4c56 100644 (file)
@@ -61,6 +61,11 @@ efi_status_t efi_init_obj_list(void)
        if (ret != EFI_SUCCESS)
                goto out;
 #endif
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+       ret = efi_acpi_register();
+       if (ret != EFI_SUCCESS)
+               goto out;
+#endif
 #ifdef CONFIG_GENERATE_SMBIOS_TABLE
        ret = efi_smbios_register();
        if (ret != EFI_SUCCESS)
index 094be6edf9b055e6fc1cdf2cd66c97c6187aa709..0c3dd3cdd49c609c8006e5bd4d4b3c11de8f2ebd 100644 (file)
@@ -282,6 +282,10 @@ struct efi_runtime_services {
        EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \
                 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
 
+#define EFI_ACPI_TABLE_GUID \
+       EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, \
+                0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
+
 #define SMBIOS_TABLE_GUID \
        EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  \
                 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
index c66252a7dd2accc4be5be86260f38fd49fc02281..d837e7b157fda8167b1889e9ef9079f9ce2c877d 100644 (file)
@@ -214,6 +214,14 @@ efi_status_t efi_net_register(void);
 /* Called by bootefi to make the watchdog available */
 efi_status_t efi_watchdog_register(void);
 /* Called by bootefi to make SMBIOS tables available */
+/**
+ * efi_acpi_register() - write out ACPI tables
+ *
+ * Called by bootefi to make ACPI tables available
+ *
+ * @return 0 if OK, -ENOMEM if no memory is available for the tables
+ */
+efi_status_t efi_acpi_register(void);
 /**
  * efi_smbios_register() - write out SMBIOS tables
  *
index c6046e36d2647409151cfc114fa90857ca32a96e..d6402c4615faa4e3ae0a8f4e2edfe4c699632790 100644 (file)
@@ -22,4 +22,5 @@ obj-$(CONFIG_LCD) += efi_gop.o
 obj-$(CONFIG_DM_VIDEO) += efi_gop.o
 obj-$(CONFIG_PARTITIONS) += efi_disk.o
 obj-$(CONFIG_NET) += efi_net.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += efi_acpi.o
 obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += efi_smbios.o
diff --git a/lib/efi_loader/efi_acpi.c b/lib/efi_loader/efi_acpi.c
new file mode 100644 (file)
index 0000000..a4e5e53
--- /dev/null
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  EFI application ACPI tables support
+ *
+ *  Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com>
+ */
+
+#include <common.h>
+#include <efi_loader.h>
+#include <asm/acpi_table.h>
+
+static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID;
+
+/*
+ * Install the ACPI table as a configuration table.
+ *
+ * @return     status code
+ */
+efi_status_t efi_acpi_register(void)
+{
+       /* Map within the low 32 bits, to allow for 32bit ACPI tables */
+       u64 acpi = U32_MAX;
+       efi_status_t ret;
+
+       /* Reserve 64kiB page for ACPI */
+       ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
+                                EFI_RUNTIME_SERVICES_DATA, 16, &acpi);
+       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.
+        */
+       assert(!(acpi & 0xf));
+       write_acpi_tables(acpi);
+
+       /* And expose them to our EFI payload */
+       return efi_install_configuration_table(&acpi_guid,
+                                              (void *)(uintptr_t)acpi);
+}