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]> --- 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 $@ -- 2.34.1

