[U-Boot] [PATCH] igep00x0: Falcon mode

Implement spl_start_uboot to let Falcon mode work. Also as board comes either with 256 or 512MB of memory, fixup fdt before jumping to kernel. ATAG support for doing the same is left as an excercise for readers loving legacy stuff.
Signed-off-by: Ladislav Michl ladis@linux-mips.org --- board/isee/igep00x0/igep00x0.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
diff --git a/board/isee/igep00x0/igep00x0.c b/board/isee/igep00x0/igep00x0.c index e2fce50..b25716a 100644 --- a/board/isee/igep00x0/igep00x0.c +++ b/board/isee/igep00x0/igep00x0.c @@ -10,6 +10,8 @@ #include <ns16550.h> #include <twl4030.h> #include <netdev.h> +#include <spl.h> +#include <fdt_support.h> #include <asm/gpio.h> #include <asm/io.h> #include <asm/arch/mem.h> @@ -212,3 +214,26 @@ int board_eth_init(bd_t *bis) #endif } #endif + +#ifdef CONFIG_SPL_OS_BOOT +int spl_start_uboot(void) +{ + /* break into full u-boot on 'c' */ + if (serial_tstc() && serial_getc() == 'c') + return 1; + + return 0; +} + +void spl_board_prepare_for_linux(void) +{ + /* SPL initializes only first bank by default, so init both */ + dram_init(); +#ifdef CONFIG_SPL_OF_TRANSLATE + /* Verify that ARGS is device tree blob and fixup memory node */ + if (fdt_check_header((const void *)CONFIG_SYS_SPL_ARGS_ADDR) == 0) + fdt_fixup_memory((void *)CONFIG_SYS_SPL_ARGS_ADDR, + PHYS_SDRAM_1, gd->ram_size); +#endif +} +#endif

On Thu, Jan 14, 2016 at 01:44:20AM +0100, Ladislav Michl wrote:
Implement spl_start_uboot to let Falcon mode work. Also as board comes either with 256 or 512MB of memory, fixup fdt before jumping to kernel. ATAG support for doing the same is left as an excercise for readers loving legacy stuff.
Signed-off-by: Ladislav Michl ladis@linux-mips.org
So, I want to hear more about how you're using Falcon mode here. Usually memory size is corrected as part of the spl export step. Or are you using the raw fdt coming from the kernel build?

On Thu, Jan 14, 2016 at 12:10:25PM -0500, Tom Rini wrote:
On Thu, Jan 14, 2016 at 01:44:20AM +0100, Ladislav Michl wrote:
Implement spl_start_uboot to let Falcon mode work. Also as board comes either with 256 or 512MB of memory, fixup fdt before jumping to kernel. ATAG support for doing the same is left as an excercise for readers loving legacy stuff.
Signed-off-by: Ladislav Michl ladis@linux-mips.org
So, I want to hear more about how you're using Falcon mode here. Usually memory size is corrected as part of the spl export step. Or are you using the raw fdt coming from the kernel build?
Yes, I'm using raw ftd from kernel build. Other posibility is doing some scripting with spl export step and then storing fdt into UBI volume. That would bring in also advantage of taking bootargs into account. However I have prepared whole UBI image with all UBI volumes and then I'm using something like that: flash_erase /dev/mtd0 0 0 writeloader -i MLO -o /dev/mtd0 ubiformat /dev/mtd1 -f root.ubi
So, system is booted with initramfs using SD card and NAND is reflashed with new content - ftd manipulation would be done from Linux then.
Other possibility is to find a way, how to transfer large file into NAND UBI aware way (without destroying erase counters) and do the same using U-Boot scripting. I didn't look into this way (yet). Proposed patch is the easiest way to fix that isue (I need to do it on thousands of boards, so it has to be automated).
Also note, that if you are going to use falcon mode from FAT on SD card you simply cannot move that SD card between boards, as you do not know amount of memory installed.
Of course, I do not refuse to do anything better to solve this problem :)
As a side note, this solution brings in some more code (libfdt) into SPL, so I'm playing with -flto and -fwole-program a bit. Just in case anyone wants continue (for ARM only and incomplete):
diff --git a/Kbuild b/Kbuild index e2e3b29..349ecce 100644 --- a/Kbuild +++ b/Kbuild @@ -30,6 +30,9 @@ define filechk_offsets echo "#endif" ) endef
+CFLAGS_REMOVE_asm-offsets.o = -flto +CFLAGS_REMOVE_generic-asm-offsets.o = -flto + ##### # 1) Generate generic-asm-offsets.h
diff --git a/Makefile b/Makefile index aa19cc6..64062a2 100644 --- a/Makefile +++ b/Makefile @@ -331,12 +331,7 @@ include scripts/Kbuild.include # Make variables (CC, etc...)
AS = $(CROSS_COMPILE)as -# Always use GNU ld -ifneq ($(shell $(CROSS_COMPILE)ld.bfd -v 2> /dev/null),) -LD = $(CROSS_COMPILE)ld.bfd -else -LD = $(CROSS_COMPILE)ld -endif +LD = $(CROSS_COMPILE)gcc CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E AR = $(CROSS_COMPILE)ar @@ -786,7 +781,7 @@ endif
LDFLAGS_u-boot += $(LDFLAGS_FINAL) ifneq ($(CONFIG_SYS_TEXT_BASE),) -LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE) +LDFLAGS_u-boot += -Wl,-Ttext,$(CONFIG_SYS_TEXT_BASE) endif
# Normally we fill empty space with 0xff @@ -1178,9 +1173,9 @@ u-boot.elf: u-boot.bin # May be overridden by arch/$(ARCH)/config.mk quiet_cmd_u-boot__ ?= LD $@ cmd_u-boot__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_u-boot) -o $@ \ - -T u-boot.lds $(u-boot-init) \ - --start-group $(u-boot-main) --end-group \ - $(PLATFORM_LIBS) -Map u-boot.map + -Wl,-T,u-boot.lds $(u-boot-init) \ + -Wl,--start-group $(u-boot-main) -Wl,--end-group \ + $(PLATFORM_LIBS) -Wl,-Map,u-boot.map
quiet_cmd_smap = GEN common/system_map.o cmd_smap = \ diff --git a/arch/arm/config.mk b/arch/arm/config.mk index 0550225..09fe270 100644 --- a/arch/arm/config.mk +++ b/arch/arm/config.mk @@ -13,7 +13,7 @@ CONFIG_STANDALONE_LOAD_ADDR = 0xc100000 endif endif
-LDFLAGS_FINAL += --gc-sections +LDFLAGS_FINAL += -Wl,--gc-sections PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections \ -fno-common -ffixed-r9 PLATFORM_RELFLAGS += $(call cc-option, -msoft-float) \ @@ -79,7 +79,7 @@ PLATFORM_LIBS := arch/arm/lib/eabi_compat.o \ endif
# needed for relocation -LDFLAGS_u-boot += -pie +LDFLAGS_u-boot += -Wl,-pie
# # FIXME: binutils versions < 2.22 have a bug in the assembler where diff --git a/config.mk b/config.mk index b77d589..7c4892c 100644 --- a/config.mk +++ b/config.mk @@ -74,10 +74,10 @@ endif RELFLAGS := $(PLATFORM_RELFLAGS)
PLATFORM_CPPFLAGS += $(RELFLAGS) -PLATFORM_CPPFLAGS += -pipe +PLATFORM_CPPFLAGS += -pipe -flto
-LDFLAGS += $(PLATFORM_LDFLAGS) -LDFLAGS_FINAL += -Bstatic +LDFLAGS += $(PLATFORM_LDFLAGS) -Wl,--build-id=none -nostdlib -flto +LDFLAGS_FINAL += -Wl,-Bstatic -Wl,-allow-multiple-definition -fwhole-program
export PLATFORM_CPPFLAGS export RELFLAGS diff --git a/examples/standalone/Makefile b/examples/standalone/Makefile index 5a6ae00..578cac2 100644 --- a/examples/standalone/Makefile +++ b/examples/standalone/Makefile @@ -60,7 +60,8 @@ $(LIB): $(LIBOBJS) FORCE $(call if_changed,link_lib)
quiet_cmd_link_elf = LD $@ - cmd_link_elf = $(LD) $(LDFLAGS) -g -Ttext $(CONFIG_STANDALONE_LOAD_ADDR) \ + cmd_link_elf = $(LD) $(LDFLAGS) -g \ + -Wl,-Ttext,$(CONFIG_STANDALONE_LOAD_ADDR) \ -o $@ -e $(SYM_PREFIX)$(@F) $< $(LIB) $(PLATFORM_LIBGCC)
$(ELF): $(obj)/%: $(obj)/%.o $(LIB) FORCE diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl index 96f414a..ceac958 100644 --- a/scripts/Makefile.spl +++ b/scripts/Makefile.spl @@ -40,7 +40,7 @@ include $(srctree)/arch/$(ARCH)/Makefile
# Enable garbage collection of un-used sections for SPL KBUILD_CFLAGS += -ffunction-sections -fdata-sections -LDFLAGS_FINAL += --gc-sections +LDFLAGS_FINAL += -Wl,--gc-sections
# FIX ME cpp_flags := $(KBUILD_CPPFLAGS) $(PLATFORM_CPPFLAGS) $(UBOOTINCLUDE) \ @@ -216,9 +216,9 @@ OBJCOPYFLAGS_$(SPL_BIN).bin = $(SPL_OBJCFLAGS) -O binary $(obj)/$(SPL_BIN).bin: $(obj)/$(SPL_BIN) FORCE $(call if_changed,objcopy)
-LDFLAGS_$(SPL_BIN) += -T u-boot-spl.lds $(LDFLAGS_FINAL) +LDFLAGS_$(SPL_BIN) += -Wl,-T,u-boot-spl.lds $(LDFLAGS_FINAL) ifneq ($(CONFIG_SPL_TEXT_BASE),) -LDFLAGS_$(SPL_BIN) += -Ttext $(CONFIG_SPL_TEXT_BASE) +LDFLAGS_$(SPL_BIN) += -Wl,-Ttext,$(CONFIG_SPL_TEXT_BASE) endif
ifdef CONFIG_ARCH_SOCFPGA @@ -236,9 +236,9 @@ endif
quiet_cmd_u-boot-spl = LD $@ cmd_u-boot-spl = (cd $(obj) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \ - $(patsubst $(obj)/%,%,$(u-boot-spl-init)) --start-group \ - $(patsubst $(obj)/%,%,$(u-boot-spl-main)) --end-group \ - $(PLATFORM_LIBS) -Map $(SPL_BIN).map -o $(SPL_BIN)) + $(patsubst $(obj)/%,%,$(u-boot-spl-init)) -Wl,--start-group \ + $(patsubst $(obj)/%,%,$(u-boot-spl-main)) -Wl,--end-group \ + $(PLATFORM_LIBS) -Wl,-Map,$(SPL_BIN).map -o $(SPL_BIN))
$(obj)/$(SPL_BIN): $(u-boot-spl-init) $(u-boot-spl-main) $(obj)/u-boot-spl.lds FORCE $(call if_changed,u-boot-spl) ladis
participants (2)
-
Ladislav Michl
-
Tom Rini