Hi Varada,
On 6/23/2026 12:18 PM, Varadarajan Narayanan wrote:
The IPQ5210 boot ROM expects the SPL binary image to be embedded within
an ELF along with additional binaries. Hence add the relevant commands
and linker script needed to convert u-boot-spl.bin to the expected
format.
Signed-off-by: Varadarajan Narayanan <[email protected]>
Reviewed-by: Balaji Selvanathan <[email protected]>
Regards,
Balaji
---
v4: Use $(obj) for u-boot-spl.wrap-elf
v3: s/a image/an image/
Add SPDX header to linker script
Pre-process linker script to use IMAGE_TEXT_BASE instead of hard coding it
---
arch/arm/mach-snapdragon/Kconfig | 7 ++++++
.../mach-snapdragon/ipq5210-spl-wrap-elf.lds | 18 ++++++++++++++
scripts/Makefile.xpl | 24 +++++++++++++++++++
3 files changed, 49 insertions(+)
create mode 100644 arch/arm/mach-snapdragon/ipq5210-spl-wrap-elf.lds
diff --git a/arch/arm/mach-snapdragon/Kconfig b/arch/arm/mach-snapdragon/Kconfig
index d3de8693b5a..d94cb6206e8 100644
--- a/arch/arm/mach-snapdragon/Kconfig
+++ b/arch/arm/mach-snapdragon/Kconfig
@@ -42,4 +42,11 @@ config SYS_CONFIG_NAME
Based on this option include/configs/<CONFIG_SYS_CONFIG_NAME>.h header
will be used for board configuration.
+config SPL_WRAPPER_ELF
+ bool "Create wrapper ELF for applicable platforms"
+ depends on SPL
+ help
+ Some platforms embed the U-Boot SPL binary within an ELF as a segment.
+ Additional tools are used to convert this ELF into an image that is
+ usable for the boot ROM.
endif
diff --git a/arch/arm/mach-snapdragon/ipq5210-spl-wrap-elf.lds
b/arch/arm/mach-snapdragon/ipq5210-spl-wrap-elf.lds
new file mode 100644
index 00000000000..5a582e65ca0
--- /dev/null
+++ b/arch/arm/mach-snapdragon/ipq5210-spl-wrap-elf.lds
@@ -0,0 +1,18 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+PHDRS {
+ ptype PT_LOAD FLAGS(0x7);
+}
+
+ENTRY(_entry)
+
+SECTIONS {
+ . = IMAGE_TEXT_BASE;
+ _entry = . ;
+ data : {
+ *(.data)
+ . = ALIGN(4);
+ } :ptype
+}
diff --git a/scripts/Makefile.xpl b/scripts/Makefile.xpl
index a3fd3e1375f..6e9f24b748a 100644
--- a/scripts/Makefile.xpl
+++ b/scripts/Makefile.xpl
@@ -256,6 +256,26 @@ MKIMAGEFLAGS_boot.bin = -T zynqmpimage -R
$(srctree)/$(CONFIG_BOOT_INIT_FILE) \
-n "$(shell cd $(srctree); readlink -f $(CONFIG_PMUFW_INIT_FILE))"
endif
+ifeq ($(CONFIG_SPL_WRAPPER_ELF),y)
+# Convert ELF to object file
+OBJCOPYFLAGS_$(SPL_BIN).bin.o = -I binary -O elf64-littleaarch64
+
+# Wrap the object file inside a ELF
+QCOM_SPL_SOC = $(shell echo $(notdir "$(CONFIG_DEFAULT_DEVICE_TREE)") | cut
-f1 -d-)
+QCOM_SPL_WRAP_LDS =
$(srctree)/arch/arm/mach-snapdragon/$(QCOM_SPL_SOC)-spl-wrap-elf.lds
+LDFLAGS_$(SPL_BIN).wrap-elf = -T $(obj)/$(SPL_BIN).wrap-elf.lds
+
+$(obj)/$(SPL_BIN).wrap-elf.lds: $(QCOM_SPL_WRAP_LDS) FORCE
+ $(call if_changed_dep,cpp_lds)
+
+$(obj)/$(SPL_BIN).bin.o: $(obj)/$(SPL_BIN).bin $(obj)/$(SPL_BIN).wrap-elf.lds
FORCE
+ $(call if_changed,objcopy)
+
+$(obj)/$(SPL_BIN).wrap-elf: $(obj)/$(SPL_BIN).bin.o FORCE
+ $(call if_changed,ld)
+
+endif
+
$(obj)/$(SPL_BIN)-align.bin: $(obj)/$(SPL_BIN).bin
@dd if=$< of=$@ conv=sync bs=4 2>/dev/null;
@@ -302,6 +322,10 @@ INPUTS-$(CONFIG_ARCH_ZYNQMP) += $(obj)/boot.bin
INPUTS-$(CONFIG_ARCH_MEDIATEK) += $(obj)/u-boot-spl-mtk.bin
+ifeq ($(CONFIG_ARCH_SNAPDRAGON),y)
+INPUTS-$(CONFIG_SPL_WRAPPER_ELF) += $(obj)/u-boot-spl.wrap-elf
+endif
+
all: $(INPUTS-y)
quiet_cmd_cat = CAT $@