[PATCH RFC 08/14] mach-snapdragon: support booting with EFISTUB

Caleb Connolly caleb.connolly at linaro.org
Sun Nov 24 21:27:04 CET 2024


Retrieve the EFI info header passed in via x0 and use it to populate the
memory banks when booting with CONFIG_EFI_STUB.

Signed-off-by: Caleb Connolly <caleb.connolly at linaro.org>
---
 arch/arm/mach-snapdragon/board.c     | 15 +++++++++++++++
 arch/arm/mach-snapdragon/dram.c      | 15 ++++++++++++++-
 arch/arm/mach-snapdragon/qcom-priv.h |  2 ++
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
index dbac8aa2709a..f92b26c88d46 100644
--- a/arch/arm/mach-snapdragon/board.c
+++ b/arch/arm/mach-snapdragon/board.c
@@ -41,8 +41,10 @@ DECLARE_GLOBAL_DATA_PTR;
 static struct mm_region rbx_mem_map[CONFIG_NR_DRAM_BANKS + 2] = { { 0 } };
 
 struct mm_region *mem_map = rbx_mem_map;
 
+struct efi_info_hdr *efi_info __section(".data") = NULL;
+
 static void show_psci_version(void)
 {
 	struct arm_smccc_res res;
 
@@ -59,15 +61,28 @@ static void show_psci_version(void)
  */
 void *board_fdt_blob_setup(int *err)
 {
 	struct fdt_header *fdt;
+	struct efi_info_hdr *info = NULL;
 	bool internal_valid, external_valid;
 
 	*err = 0;
 	fdt = (struct fdt_header *)get_prev_bl_fdt_addr();
 	external_valid = fdt && !fdt_check_header(fdt);
 	internal_valid = !fdt_check_header(gd->fdt_blob);
 
+	/*
+	 * If EFI_STUB is enabled, we got handed a pointer and it's NOT
+	 * a valid FDT, then it might be the efi_info table!
+	 */
+	if (CONFIG_IS_ENABLED(EFI_STUB) && fdt && !external_valid)
+		info = (struct efi_info_hdr *)fdt;
+
+	if (info->version == 1) {
+		debug("Got EFI info header!\n");
+		efi_info = info;
+	}
+
 	/*
 	 * There is no point returning an error here, U-Boot can't do anything useful in this situation.
 	 * Bail out while we can still print a useful error message.
 	 */
diff --git a/arch/arm/mach-snapdragon/dram.c b/arch/arm/mach-snapdragon/dram.c
index ef226e000858..0493653e432b 100644
--- a/arch/arm/mach-snapdragon/dram.c
+++ b/arch/arm/mach-snapdragon/dram.c
@@ -7,12 +7,15 @@
 #define pr_fmt(fmt) "QCOM-DRAM: " fmt
 
 #include <asm-generic/unaligned.h>
 #include <dm.h>
+#include <efi_stub.h>
 #include <log.h>
 #include <sort.h>
 #include <soc/qcom/smem.h>
 
+#include "qcom-priv.h"
+
 #define SMEM_USABLE_RAM_PARTITION_TABLE 402
 #define RAM_PART_NAME_LENGTH            16
 #define RAM_NUM_PART_ENTRIES            32
 #define CATEGORY_SDRAM 0x0E
@@ -89,9 +92,19 @@ static void qcom_configure_bi_dram(void)
 }
 
 int dram_init_banksize(void)
 {
-	qcom_configure_bi_dram();
+#ifdef CONFIG_EFI_STUB
+	gd->arch.table = (phys_addr_t)efi_info;
+	/* We actually parsed a memory map from SMEM (and used it to
+	 * set ram_base/ram_top), but it's better to respect the table
+	 * from the EFI bootloader.
+	 */
+	if (efi_info)
+		dram_init_banksize_from_efi();
+	else
+#endif
+		qcom_configure_bi_dram();
 
 	return 0;
 }
 
diff --git a/arch/arm/mach-snapdragon/qcom-priv.h b/arch/arm/mach-snapdragon/qcom-priv.h
index 690557463642..58b8cb497482 100644
--- a/arch/arm/mach-snapdragon/qcom-priv.h
+++ b/arch/arm/mach-snapdragon/qcom-priv.h
@@ -4,8 +4,10 @@
 #define __QCOM_PRIV_H__
 
 #include <stdbool.h>
 
+extern struct efi_info_hdr *efi_info;
+
 #if IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT)
 void qcom_configure_capsule_updates(void);
 #else
 void qcom_configure_capsule_updates(void) {}

-- 
2.47.0



More information about the U-Boot mailing list