mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-03-13 21:36:57 +00:00
efi_loader: create memory reservations in ACPI case
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>
This commit is contained in:
parent
8c06b27eec
commit
1be415b21b
2 changed files with 10 additions and 17 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue