mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-13 06:42:56 +00:00
a2b1db41cf
U-Boot SPL for mvebu platform is not compiled as position independent.
Therefore it is required to instruct BootROM to load U-Boot SPL at the
correct address. Loading of kwbimage binary code at specific address can be
now achieved by the new LOAD_ADDRESS token as part of BINARY command in
kwbimage config file.
Update mvebu Makefile to put value of $(CONFIG_SPL_TEXT_BASE) into
LOAD_ADDRESS token when generating kwbimage.cfg from kwbimage.cfg.in.
It is required to update regex for sed to find replacement tokens at any
position on a line in kwbimage config file and not only at the beginning of
the line. This is because LOAD_ADDRESS is specified at the end of line
containing the BINARY command.
It looks like all Armada boards set CONFIG_SPL_TEXT_BASE to value
0x40004030 or 0x40000030. Why this value? It is because main kwbimage
header is at address 0x40004030 or 0x40000000 and it is 32 bytes long.
After the main header there is the binary header, which consist of 1 byte
for type, 3 bytes for size, 1 byte for number of arguments, 3 reserved
bytes and then 4 bytes for each argument. After these arguments comes the
executable code.
So arguments start at address 0x40004028 or 0x40000028. Before commit
e6571f38c9
("arm: mvebu: Remove dummy BIN header arguments for SPL
binary") there were two (dummy) arguments, which resulted in load address
of 0x40004030 or 0x40000030, always. After that commit (which removed dummy
arguments), load address stayed same due to the 128-bit alignment done by
mkimage.
This patch now reflects the dependency between $(CONFIG_SPL_TEXT_BASE),
load address and dummy kwbimage arguments, and allows the user to adjust
$(CONFIG_SPL_TEXT_BASE) config option to some other value.
For unsupported values, when mkimage/kwbimage cannot set chosen load address
as specified by $(CONFIG_SPL_TEXT_BASE), the build process now fails,
instead of silently generating non-working kwbimage.
Removal of this alignment between $(CONFIG_SPL_TEXT_BASE) and LOAD_ADDRESS
can only be done by compiling U-Boot SPL as position independent. But this
currently is not possible for 32-bit ARM version of U-Boot SPL.
Signed-off-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Stefan Roese <sr@denx.de>
92 lines
2.3 KiB
Makefile
92 lines
2.3 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0+
|
|
#
|
|
# Copyright (C) 2014-2016 Stefan Roese <sr@denx.de>
|
|
|
|
ifdef CONFIG_ARM64
|
|
|
|
obj-$(CONFIG_ARMADA_3700) += armada3700/
|
|
obj-$(CONFIG_ARMADA_8K) += armada8k/
|
|
obj-y += arm64-common.o
|
|
|
|
else # CONFIG_ARM64
|
|
|
|
ifdef CONFIG_ARCH_KIRKWOOD
|
|
|
|
obj-y = dram.o
|
|
obj-y += gpio.o
|
|
obj-y += mbus.o
|
|
obj-y += timer.o
|
|
|
|
else # CONFIG_ARCH_KIRKWOOD
|
|
|
|
obj-y = cpu.o
|
|
obj-y += dram.o
|
|
obj-$(CONFIG_DM_RESET) += system-controller.o
|
|
ifndef CONFIG_SPL_BUILD
|
|
obj-$(CONFIG_ARMADA_375) += ../../../drivers/ddr/marvell/axp/xor.o
|
|
obj-$(CONFIG_ARMADA_38X) += ../../../drivers/ddr/marvell/a38x/xor.o
|
|
obj-$(CONFIG_ARMADA_XP) += ../../../drivers/ddr/marvell/axp/xor.o
|
|
obj-$(CONFIG_ARMADA_MSYS) += ../../../drivers/ddr/marvell/axp/xor.o
|
|
obj-$(CONFIG_MVEBU_EFUSE) += efuse.o
|
|
|
|
extra-y += kwbimage.cfg
|
|
|
|
ifneq ($(CONFIG_ARMADA_370)$(CONFIG_ARMADA_XP),)
|
|
KWB_REPLACE += CPU
|
|
KWB_CFG_CPU = SHEEVA
|
|
else ifneq ($(CONFIG_ARMADA_375)$(CONFIG_ARMADA_38X)$(CONFIG_ARMADA_39X),)
|
|
KWB_REPLACE += CPU
|
|
KWB_CFG_CPU = A9
|
|
endif
|
|
|
|
KWB_REPLACE += LOAD_ADDRESS
|
|
KWB_CFG_LOAD_ADDRESS = $(CONFIG_SPL_TEXT_BASE)
|
|
|
|
KWB_REPLACE += BOOT_FROM
|
|
ifneq ($(CONFIG_MVEBU_SPL_BOOT_DEVICE_SPI),)
|
|
KWB_CFG_BOOT_FROM=spi
|
|
endif
|
|
ifneq ($(CONFIG_MVEBU_SPL_BOOT_DEVICE_MMC),)
|
|
KWB_CFG_BOOT_FROM=sdio
|
|
endif
|
|
ifneq ($(CONFIG_MVEBU_SPL_BOOT_DEVICE_SATA),)
|
|
KWB_CFG_BOOT_FROM=sata
|
|
endif
|
|
ifneq ($(CONFIG_MVEBU_SPL_BOOT_DEVICE_UART),)
|
|
KWB_CFG_BOOT_FROM=uart
|
|
endif
|
|
|
|
ifneq ($(CONFIG_SECURED_MODE_IMAGE),)
|
|
KWB_REPLACE += CSK_INDEX
|
|
KWB_CFG_CSK_INDEX = $(CONFIG_SECURED_MODE_CSK_INDEX)
|
|
|
|
KWB_REPLACE += SEC_BOOT_DEV
|
|
KWB_CFG_SEC_BOOT_DEV=$(patsubst "%",%, \
|
|
$(if $(findstring BOOT_SPI_NOR_FLASH,$(CONFIG_SPL_BOOT_DEVICE)),0x34) \
|
|
$(if $(findstring BOOT_SDIO_MMC_CARD,$(CONFIG_SPL_BOOT_DEVICE)),0x31) \
|
|
)
|
|
|
|
KWB_REPLACE += SEC_FUSE_DUMP
|
|
KWB_CFG_SEC_FUSE_DUMP = a38x
|
|
endif
|
|
|
|
quiet_cmd_kwbcfg = KWBCFG $@
|
|
cmd_kwbcfg = sed -ne '$(foreach V,$(KWB_REPLACE),s/\#@$(V)/$(V) $(KWB_CFG_$(V))/;)p' \
|
|
<$< >$(dir $@)$(@F)
|
|
|
|
$(obj)/kwbimage.cfg: $(src)/kwbimage.cfg.in include/autoconf.mk \
|
|
include/config/auto.conf
|
|
$(call cmd,kwbcfg)
|
|
|
|
endif # CONFIG_SPL_BUILD
|
|
obj-y += gpio.o
|
|
obj-y += mbus.o
|
|
obj-y += timer.o
|
|
obj-$(CONFIG_SPL_BUILD) += spl.o
|
|
obj-$(CONFIG_SPL_BUILD) += lowlevel_spl.o
|
|
|
|
obj-$(CONFIG_ARMADA_38X) += serdes/a38x/
|
|
obj-$(CONFIG_ARMADA_XP) += serdes/axp/
|
|
|
|
endif # CONFIG_ARCH_KIRKWOOD
|
|
endif # CONFIG_ARM64
|