@@ -56,5 +56,12 @@ int of_populate_from_efi(struct device_node *root);
* EFI payload with CONFIG_EFI_STUB enabled.
*/
int dram_init_banksize_from_efi(void);
+/**
+ * efi_add_known_memory_from_efi() - Add known memory pages from the memory map
+ * of the EFI bootloader that booted U-Boot. This is only applicable when running
+ * U-Boot as an EFI payload with CONFIG_EFI_STUB enabled.
+ */
+void efi_add_known_memory_from_efi(void);
+
#endif /* _EFI_STUB_H */
@@ -5,8 +5,9 @@
* Access to the EFI information table
*/
#include <efi.h>
+#include <efi_loader.h>
#include <efi_stub.h>
#include <errno.h>
#include <mapmem.h>
#include <asm/global_data.h>
@@ -177,4 +178,34 @@ int dram_init_banksize_from_efi(void)
}
return 0;
}
+
+/* Called by U-Boot's EFI subsystem to add known memory. In our case
+ * we need to add some specific memory types from the original bootloaders
+ * EFI memory map
+ */
+void efi_add_known_memory_from_efi(void)
+{
+ struct efi_mem_desc *desc, *end;
+ struct efi_entry_memmap *map;
+ int ret, size;
+
+ EFI_PRINT("Adding known memory from previous stage EFI bootloader\n");
+
+ ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size);
+ if (ret) {
+ EFI_PRINT("%s: Missing memory map\n", __func__);
+ return;
+ }
+ end = (struct efi_mem_desc *)((ulong)map + size);
+
+ for (desc = map->desc; desc < end; desc = efi_get_next_mem_desc(desc, map->desc_size)) {
+ switch (desc->type) {
+ case EFI_RESERVED_MEMORY_TYPE:
+ efi_add_memory_map_pg(desc->physical_start, desc->num_pages, desc->type, false);
+ break;
+ default:
+ continue;
+ }
+ }
+}
@@ -7,8 +7,9 @@
#define LOG_CATEGORY LOGC_EFI
#include <efi_loader.h>
+#include <efi_stub.h>
#include <init.h>
#include <lmb.h>
#include <log.h>
#include <malloc.h>
@@ -834,8 +835,12 @@ static void add_u_boot_and_runtime(void)
int efi_memory_init(void)
{
efi_add_known_memory();
+#ifdef CONFIG_EFI_STUB
+ efi_add_known_memory_from_efi();
+#endif
+
add_u_boot_and_runtime();
#ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
/* Request a 32bit 64MB bounce buffer region */
When running U-Boot as an EFI payload with CONFIG_EFI_STUB, the reserved regions from the previous stage EFI bootloader should be carried over since they may not fully align with the reserved-memory regions in devicetree. Implement a helper to map these pages when the EFI subsystem starts up. Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org> --- include/efi_stub.h | 7 +++++++ lib/efi/efi_info.c | 31 +++++++++++++++++++++++++++++++ lib/efi_loader/efi_memory.c | 5 +++++ 3 files changed, 43 insertions(+)