]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi_loader: create memory reservations in ACPI case
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Thu, 16 Nov 2023 09:29:28 +0000 (10:29 +0100)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Tue, 5 Dec 2023 00:38:56 +0000 (01:38 +0100)
ACPI tables cannot convey memory reservations for ARM and RISC-V.
x86 uses the BIOS E820 table for this purpose. We cannot simply ignore the
device-tree when booting via ACPI. We have to assign EfiReservedMemory
according to the prior stage device-tree ($fdtaddr) or as fallback the
control device-tree ($fdtcontroladdr).

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
cmd/bootefi.c
lib/efi_loader/Makefile

index 20e5c94a33a428cac5be0bbadd4e90d080128d85..395b0629de2895aa79c4d66de7d650179b11be36 100644 (file)
@@ -162,8 +162,6 @@ static efi_status_t efi_env_set_load_options(efi_handle_t handle,
        return ret;
 }
 
-#if !CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE)
-
 /**
  * copy_fdt() - Copy the device tree to a new location available to EFI
  *
@@ -237,8 +235,6 @@ static void *get_config_table(const efi_guid_t *guid)
        return NULL;
 }
 
-#endif /* !CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE) */
-
 /**
  * efi_install_fdt() - install device tree
  *
@@ -258,18 +254,15 @@ static void *get_config_table(const efi_guid_t *guid)
  */
 efi_status_t efi_install_fdt(void *fdt)
 {
+       struct bootm_headers img = { 0 };
+       efi_status_t ret;
+
        /*
         * The EBBR spec requires that we have either an FDT or an ACPI table
         * but not both.
         */
-#if CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE)
-       if (fdt) {
+       if (CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE) && fdt)
                log_warning("WARNING: Can't have ACPI table and device tree - ignoring DT.\n");
-               return EFI_SUCCESS;
-       }
-#else
-       struct bootm_headers img = { 0 };
-       efi_status_t ret;
 
        if (fdt == EFI_FDT_USE_INTERNAL) {
                const char *fdt_opt;
@@ -302,6 +295,12 @@ efi_status_t efi_install_fdt(void *fdt)
                return EFI_LOAD_ERROR;
        }
 
+       /* Create memory reservations as indicated by the device tree */
+       efi_carve_out_dt_rsv(fdt);
+
+       if (CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE))
+               return EFI_SUCCESS;
+
        /* Prepare device tree for payload */
        ret = copy_fdt(&fdt);
        if (ret) {
@@ -314,9 +313,6 @@ efi_status_t efi_install_fdt(void *fdt)
                return EFI_LOAD_ERROR;
        }
 
-       /* Create memory reservations as indicated by the device tree */
-       efi_carve_out_dt_rsv(fdt);
-
        efi_try_purge_kaslr_seed(fdt);
 
        if (CONFIG_IS_ENABLED(EFI_TCG2_PROTOCOL_MEASURE_DTB)) {
@@ -333,7 +329,6 @@ efi_status_t efi_install_fdt(void *fdt)
                log_err("ERROR: failed to install device tree\n");
                return ret;
        }
-#endif /* GENERATE_ACPI_TABLE */
 
        return EFI_SUCCESS;
 }
index 8d31fc61c60171803444fee9fd8c616d55f925f2..d476df112b85876a57fd80bf189081a360feae2b 100644 (file)
@@ -51,9 +51,7 @@ obj-y += efi_console.o
 obj-y += efi_device_path.o
 obj-$(CONFIG_EFI_DEVICE_PATH_TO_TEXT) += efi_device_path_to_text.o
 obj-$(CONFIG_EFI_DEVICE_PATH_UTIL) += efi_device_path_utilities.o
-ifeq ($(CONFIG_GENERATE_ACPI_TABLE),)
 obj-y += efi_dt_fixup.o
-endif
 obj-y += efi_file.o
 obj-$(CONFIG_EFI_LOADER_HII) += efi_hii.o
 obj-y += efi_image_loader.o