[U-Boot] [PATCH v2 0/8] arm: Tidy up early init

This series collects the previous RFT patches I sent out.
https://patchwork.ozlabs.org/patch/508167/ https://patchwork.ozlabs.org/patch/508168/
It turns out that I originally sent a version of these in April:
https://patchwork.ozlabs.org/patch/461687/ https://patchwork.ozlabs.org/patch/461690/
so this series mirrors that one and includes the Zynq patches from that series.
I hope these can sneak in to this release so that I don't forget them again!
I have tested this on a few ARM platforms: Zynq Zybo, Beaglebone Black, pcduino3 (sunxi), Jetson-TK1 (tegra).
Changes in v2: - Put this into common/init/ and just Makefiles accordingly - Add comments as to why this is needed, deal with arch-specific memset()
Simon Glass (8): Move board_init_f_mem() into a common location board_init_f_mem(): Don't require memset() board_init_f_mem(): Don't create an unused early malloc() area arm: Switch aarch64 to using generic global_data setup arm: Switch 32-bit ARM to using generic global_data setup microblaze: Add a TODO to call board_init_f_mem() zynq: Move SPL console init out of board_init_f() Revert "ARM: zynq: disable CONFIG_SYS_MALLOC_F to fix MMC boot"
arch/arm/lib/crt0.S | 28 +++--------------- arch/arm/lib/crt0_64.S | 15 ++-------- arch/arm/mach-zynq/spl.c | 2 +- arch/microblaze/cpu/start.S | 2 ++ common/Makefile | 1 + common/board_f.c | 29 ------------------ common/init/Makefile | 7 +++++ common/init/board_init.c | 60 ++++++++++++++++++++++++++++++++++++++ configs/zynq_microzed_defconfig | 1 - configs/zynq_zc702_defconfig | 1 - configs/zynq_zc706_defconfig | 1 - configs/zynq_zc70x_defconfig | 1 - configs/zynq_zc770_xm010_defconfig | 1 - configs/zynq_zc770_xm011_defconfig | 1 - configs/zynq_zc770_xm012_defconfig | 1 - configs/zynq_zc770_xm013_defconfig | 1 - configs/zynq_zed_defconfig | 1 - configs/zynq_zybo_defconfig | 1 - scripts/Makefile.spl | 1 + 19 files changed, 79 insertions(+), 76 deletions(-) create mode 100644 common/init/Makefile create mode 100644 common/init/board_init.c

This function will be used by both SPL and U-Boot proper. So move it into a common place. Also change the #ifdef so that the early malloc() area is not set up in SPL if CONFIG_SYS_SPL_MALLOC_START is defined. In that case it would never actually be used, and just chews up stack space.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v2: - Put this into common/init/ and just Makefiles accordingly
common/Makefile | 1 + common/board_f.c | 29 ----------------------------- common/init/Makefile | 7 +++++++ common/init/board_init.c | 41 +++++++++++++++++++++++++++++++++++++++++ scripts/Makefile.spl | 1 + 5 files changed, 50 insertions(+), 29 deletions(-) create mode 100644 common/init/Makefile create mode 100644 common/init/board_init.c
diff --git a/common/Makefile b/common/Makefile index dc82433..35b47a9 100644 --- a/common/Makefile +++ b/common/Makefile @@ -7,6 +7,7 @@
# core ifndef CONFIG_SPL_BUILD +obj-y += init/ obj-y += main.o obj-y += exports.o obj-y += hash.o diff --git a/common/board_f.c b/common/board_f.c index fe75656..85ae7a9 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -1026,32 +1026,3 @@ void board_init_f_r(void) hang(); } #endif /* CONFIG_X86 */ - -/* Unfortunately x86 can't compile this code as gd cannot be assigned */ -#ifndef CONFIG_X86 -__weak void arch_setup_gd(struct global_data *gd_ptr) -{ - gd = gd_ptr; -} -#endif /* !CONFIG_X86 */ - -ulong board_init_f_mem(ulong top) -{ - struct global_data *gd_ptr; - - /* Leave space for the stack we are running with now */ - top -= 0x40; - - top -= sizeof(struct global_data); - top = ALIGN(top, 16); - gd_ptr = (struct global_data *)top; - memset(gd_ptr, '\0', sizeof(*gd)); - arch_setup_gd(gd_ptr); - -#ifdef CONFIG_SYS_MALLOC_F_LEN - top -= CONFIG_SYS_MALLOC_F_LEN; - gd->malloc_base = top; -#endif - - return top; -} diff --git a/common/init/Makefile b/common/init/Makefile new file mode 100644 index 0000000..4902635 --- /dev/null +++ b/common/init/Makefile @@ -0,0 +1,7 @@ +# +# Copyright (c) 2015 Google, Inc +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y += board_init.o diff --git a/common/init/board_init.c b/common/init/board_init.c new file mode 100644 index 0000000..e7ebca7 --- /dev/null +++ b/common/init/board_init.c @@ -0,0 +1,41 @@ +/* + * Code shared between SPL and U-Boot proper + * + * Copyright (c) 2015 Google, Inc + * Written by Simon Glass sjg@chromium.org + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> + +DECLARE_GLOBAL_DATA_PTR; + +/* Unfortunately x86 can't compile this code as gd cannot be assigned */ +#ifndef CONFIG_X86 +__weak void arch_setup_gd(struct global_data *gd_ptr) +{ + gd = gd_ptr; +} +#endif /* !CONFIG_X86 */ + +ulong board_init_f_mem(ulong top) +{ + struct global_data *gd_ptr; + + /* Leave space for the stack we are running with now */ + top -= 0x40; + + top -= sizeof(struct global_data); + top = ALIGN(top, 16); + gd_ptr = (struct global_data *)top; + memset(gd_ptr, '\0', sizeof(*gd)); + arch_setup_gd(gd_ptr); + +#if defined(CONFIG_SYS_MALLOC_F) + top -= CONFIG_SYS_MALLOC_F_LEN; + gd->malloc_base = top; +#endif + + return top; +} diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl index 58442f1..2df93c8 100644 --- a/scripts/Makefile.spl +++ b/scripts/Makefile.spl @@ -52,6 +52,7 @@ libs-y += $(if $(BOARDDIR),board/$(BOARDDIR)/) libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/
libs-$(CONFIG_SPL_FRAMEWORK) += common/spl/ +libs-y += common/init/ libs-$(CONFIG_SPL_LIBCOMMON_SUPPORT) += common/ libs-$(CONFIG_SPL_LIBDISK_SUPPORT) += disk/ libs-y += drivers/

Unfortunately memset() is not always available, so provide a substitute when needed.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v2: - Add comments as to why this is needed, deal with arch-specific memset()
common/init/board_init.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
diff --git a/common/init/board_init.c b/common/init/board_init.c index e7ebca7..b6a1a17 100644 --- a/common/init/board_init.c +++ b/common/init/board_init.c @@ -11,6 +11,16 @@
DECLARE_GLOBAL_DATA_PTR;
+/* + * It isn't trivial to figure out whether memcpy() exists. The arch-specific + * memcpy() is not normally available in SPL due to code size. + */ +#if !defined(CONFIG_SPL_BUILD) || \ + (defined(CONFIG_SPL_LIBGENERIC_SUPPORT) && \ + !defined(CONFIG_USE_ARCH_MEMSET)) +#define USE_MEMCPY +#endif + /* Unfortunately x86 can't compile this code as gd cannot be assigned */ #ifndef CONFIG_X86 __weak void arch_setup_gd(struct global_data *gd_ptr) @@ -22,6 +32,9 @@ __weak void arch_setup_gd(struct global_data *gd_ptr) ulong board_init_f_mem(ulong top) { struct global_data *gd_ptr; +#ifndef USE_MEMCPY + int *ptr, *end; +#endif
/* Leave space for the stack we are running with now */ top -= 0x40; @@ -29,7 +42,12 @@ ulong board_init_f_mem(ulong top) top -= sizeof(struct global_data); top = ALIGN(top, 16); gd_ptr = (struct global_data *)top; +#ifdef USE_MEMCPY memset(gd_ptr, '\0', sizeof(*gd)); +#else + for (ptr = (int *)gd_ptr, end = (int *)(gd_ptr + 1); ptr < end; ) + *ptr++ = 0; +#endif arch_setup_gd(gd_ptr);
#if defined(CONFIG_SYS_MALLOC_F)

Change the #ifdef so that the early malloc() area is not set up in SPL if CONFIG_SYS_SPL_MALLOC_START is defined. In that case it would never actually be used, and just chews up stack space.
Signed-off-by: Simon Glass sjg@chromium.org Tested-by: Masahiro Yamada yamada.masahiro@socionext.com ---
Changes in v2: None
common/init/board_init.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/common/init/board_init.c b/common/init/board_init.c index b6a1a17..65391a5 100644 --- a/common/init/board_init.c +++ b/common/init/board_init.c @@ -50,7 +50,8 @@ ulong board_init_f_mem(ulong top) #endif arch_setup_gd(gd_ptr);
-#if defined(CONFIG_SYS_MALLOC_F) +#if defined(CONFIG_SYS_MALLOC_F) && \ + (!defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SYS_SPL_MALLOC_START)) top -= CONFIG_SYS_MALLOC_F_LEN; gd->malloc_base = top; #endif

There is quite a bit of assembler code that can be removed if we use the generic global_data setup. Less arch-specific code makes it easier to add new features and maintain the start-up code.
Drop the unneeded code and adjust the hooks in board_f.c to cope.
Tested on LS2085ARDB and LS2085AQDS (armv8 SoC). Tested-by: York Sun yorksun@freescale.com
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v2: None
arch/arm/lib/crt0_64.S | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-)
diff --git a/arch/arm/lib/crt0_64.S b/arch/arm/lib/crt0_64.S index 98a906e..31fc3b4 100644 --- a/arch/arm/lib/crt0_64.S +++ b/arch/arm/lib/crt0_64.S @@ -66,19 +66,10 @@ ENTRY(_main) #else ldr x0, =(CONFIG_SYS_INIT_SP_ADDR) #endif - sub x18, x0, #GD_SIZE /* allocate one GD above SP */ - bic x18, x18, #0x7 /* 8-byte alignment for GD */ -zero_gd: - sub x0, x0, #0x8 - str xzr, [x0] - cmp x0, x18 - b.gt zero_gd -#if defined(CONFIG_SYS_MALLOC_F_LEN) - ldr x0, =CONFIG_SYS_MALLOC_F_LEN - sub x0, x18, x0 - str x0, [x18, #GD_MALLOC_BASE] -#endif bic sp, x0, #0xf /* 16-byte alignment for ABI compliance */ + bl board_init_f_mem + mov sp, x0 + mov x0, #0 bl board_init_f

There is quite a bit of assembler code that can be removed if we use the generic global_data setup. Less arch-specific code makes it easier to add new features and maintain the start-up code.
Drop the unneeded code and adjust the hooks in board_f.c to cope.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v2: None
arch/arm/lib/crt0.S | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-)
diff --git a/arch/arm/lib/crt0.S b/arch/arm/lib/crt0.S index afd4f10..fc1252d 100644 --- a/arch/arm/lib/crt0.S +++ b/arch/arm/lib/crt0.S @@ -76,31 +76,11 @@ ENTRY(_main) #else bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ #endif - mov r2, sp - sub sp, sp, #GD_SIZE /* allocate one GD above SP */ -#if defined(CONFIG_CPU_V7M) /* v7M forbids using SP as BIC destination */ - mov r3, sp - bic r3, r3, #7 - mov sp, r3 -#else - bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ -#endif - mov r9, sp /* GD is above SP */ - mov r1, sp + mov r0, sp + bl board_init_f_mem + mov sp, r0 + mov r0, #0 -clr_gd: - cmp r1, r2 /* while not at end of GD */ -#if defined(CONFIG_CPU_V7M) - itt lo -#endif - strlo r0, [r1] /* clear 32-bit GD word */ - addlo r1, r1, #4 /* move to next */ - blo clr_gd -#if defined(CONFIG_SYS_MALLOC_F_LEN) - sub sp, sp, #CONFIG_SYS_MALLOC_F_LEN - str sp, [r9, #GD_MALLOC_BASE] -#endif - /* mov r0, #0 not needed due to above code */ bl board_init_f
#if ! defined(CONFIG_SPL_BUILD)

This C function should be used to do the early memory layout and init. This is beyond my powers, so just add a TODO for the maintainer.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v2: None
arch/microblaze/cpu/start.S | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/microblaze/cpu/start.S b/arch/microblaze/cpu/start.S index 953d3a1..14f46a8 100644 --- a/arch/microblaze/cpu/start.S +++ b/arch/microblaze/cpu/start.S @@ -25,6 +25,7 @@ _start:
addi r8, r0, __end mts rslr, r8 + /* TODO: Redo this code to call board_init_f_mem() */ #if defined(CONFIG_SPL_BUILD) addi r1, r0, CONFIG_SPL_STACK_ADDR mts rshr, r1 @@ -141,6 +142,7 @@ _start: ori r12, r12, 0x1a0 mts rmsr, r12
+ /* TODO: Redo this code to call board_init_f_mem() */ clear_bss: /* clear BSS segments */ addi r5, r0, __bss_start

On 08/28/2015 10:50 PM, Simon Glass wrote:
This C function should be used to do the early memory layout and init. This is beyond my powers, so just add a TODO for the maintainer.
Signed-off-by: Simon Glass sjg@chromium.org
Changes in v2: None
arch/microblaze/cpu/start.S | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/microblaze/cpu/start.S b/arch/microblaze/cpu/start.S index 953d3a1..14f46a8 100644 --- a/arch/microblaze/cpu/start.S +++ b/arch/microblaze/cpu/start.S @@ -25,6 +25,7 @@ _start:
addi r8, r0, __end mts rslr, r8
- /* TODO: Redo this code to call board_init_f_mem() */
#if defined(CONFIG_SPL_BUILD) addi r1, r0, CONFIG_SPL_STACK_ADDR mts rshr, r1 @@ -141,6 +142,7 @@ _start: ori r12, r12, 0x1a0 mts rmsr, r12
- /* TODO: Redo this code to call board_init_f_mem() */
clear_bss: /* clear BSS segments */ addi r5, r0, __bss_start
Acked-by: Michal Simek michal.simek@xilinx.com
Thanks, Michal

We should not init the console this early and there is no need to. If we want to do early init it can be done in spl_board_init(). Move the preloader_console_init() call from board_init_f() to board_init_r().
Signed-off-by: Simon Glass sjg@chromium.org Tested-by: Masahiro Yamada yamada.masahiro@socionext.com ---
Changes in v2: None
arch/arm/mach-zynq/spl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/mach-zynq/spl.c b/arch/arm/mach-zynq/spl.c index e7df6d3..7bdac3b 100644 --- a/arch/arm/mach-zynq/spl.c +++ b/arch/arm/mach-zynq/spl.c @@ -20,7 +20,6 @@ void board_init_f(ulong dummy) /* Clear the BSS. */ memset(__bss_start, 0, __bss_end - __bss_start);
- preloader_console_init(); arch_cpu_init(); board_init_r(NULL, 0); } @@ -28,6 +27,7 @@ void board_init_f(ulong dummy) #ifdef CONFIG_SPL_BOARD_INIT void spl_board_init(void) { + preloader_console_init(); board_init(); } #endif

On 08/28/2015 10:50 PM, Simon Glass wrote:
We should not init the console this early and there is no need to. If we want to do early init it can be done in spl_board_init(). Move the preloader_console_init() call from board_init_f() to board_init_r().
Signed-off-by: Simon Glass sjg@chromium.org Tested-by: Masahiro Yamada yamada.masahiro@socionext.com
Changes in v2: None
arch/arm/mach-zynq/spl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/mach-zynq/spl.c b/arch/arm/mach-zynq/spl.c index e7df6d3..7bdac3b 100644 --- a/arch/arm/mach-zynq/spl.c +++ b/arch/arm/mach-zynq/spl.c @@ -20,7 +20,6 @@ void board_init_f(ulong dummy) /* Clear the BSS. */ memset(__bss_start, 0, __bss_end - __bss_start);
- preloader_console_init(); arch_cpu_init(); board_init_r(NULL, 0);
} @@ -28,6 +27,7 @@ void board_init_f(ulong dummy) #ifdef CONFIG_SPL_BOARD_INIT void spl_board_init(void) {
- preloader_console_init(); board_init();
} #endif
Tested-by: Michal Simek michal.simek@xilinx.com
Thanks, Michal

This reverts commit 321f86e18d6aae9f7b7ba3ef1eb0cec769481874.
The original bug has been fixed.
Signed-off-by: Simon Glass sjg@chromium.org Tested-on: Zedboard and ZC706 board Tested-by: Masahiro Yamada yamada.masahiro@socionext.com ---
Changes in v2: None
configs/zynq_microzed_defconfig | 1 - configs/zynq_zc702_defconfig | 1 - configs/zynq_zc706_defconfig | 1 - configs/zynq_zc70x_defconfig | 1 - configs/zynq_zc770_xm010_defconfig | 1 - configs/zynq_zc770_xm011_defconfig | 1 - configs/zynq_zc770_xm012_defconfig | 1 - configs/zynq_zc770_xm013_defconfig | 1 - configs/zynq_zed_defconfig | 1 - configs/zynq_zybo_defconfig | 1 - 10 files changed, 10 deletions(-)
diff --git a/configs/zynq_microzed_defconfig b/configs/zynq_microzed_defconfig index 3e141a8..e9c3209 100644 --- a/configs/zynq_microzed_defconfig +++ b/configs/zynq_microzed_defconfig @@ -2,7 +2,6 @@ CONFIG_ARM=y CONFIG_ARCH_ZYNQ=y CONFIG_TARGET_ZYNQ_MICROZED=y CONFIG_DEFAULT_DEVICE_TREE="zynq-microzed" -# CONFIG_SYS_MALLOC_F is not set CONFIG_SPL=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y diff --git a/configs/zynq_zc702_defconfig b/configs/zynq_zc702_defconfig index f94bdde..0abb7a8 100644 --- a/configs/zynq_zc702_defconfig +++ b/configs/zynq_zc702_defconfig @@ -1,7 +1,6 @@ CONFIG_ARM=y CONFIG_ARCH_ZYNQ=y CONFIG_DEFAULT_DEVICE_TREE="zynq-zc702" -# CONFIG_SYS_MALLOC_F is not set CONFIG_SPL=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y diff --git a/configs/zynq_zc706_defconfig b/configs/zynq_zc706_defconfig index 49efc6b..d67f507 100644 --- a/configs/zynq_zc706_defconfig +++ b/configs/zynq_zc706_defconfig @@ -2,7 +2,6 @@ CONFIG_ARM=y CONFIG_ARCH_ZYNQ=y CONFIG_TARGET_ZYNQ_ZC706=y CONFIG_DEFAULT_DEVICE_TREE="zynq-zc706" -# CONFIG_SYS_MALLOC_F is not set CONFIG_SPL=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y diff --git a/configs/zynq_zc70x_defconfig b/configs/zynq_zc70x_defconfig index 633c521..37c249f 100644 --- a/configs/zynq_zc70x_defconfig +++ b/configs/zynq_zc70x_defconfig @@ -2,7 +2,6 @@ CONFIG_ARM=y CONFIG_ARCH_ZYNQ=y CONFIG_TARGET_ZYNQ_ZC70X=y CONFIG_DEFAULT_DEVICE_TREE="zynq-zc702" -# CONFIG_SYS_MALLOC_F is not set CONFIG_SPL=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y diff --git a/configs/zynq_zc770_xm010_defconfig b/configs/zynq_zc770_xm010_defconfig index c608029..0e826bb 100644 --- a/configs/zynq_zc770_xm010_defconfig +++ b/configs/zynq_zc770_xm010_defconfig @@ -2,7 +2,6 @@ CONFIG_ARM=y CONFIG_ARCH_ZYNQ=y CONFIG_TARGET_ZYNQ_ZC770=y CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm010" -# CONFIG_SYS_MALLOC_F is not set CONFIG_SPL=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y diff --git a/configs/zynq_zc770_xm011_defconfig b/configs/zynq_zc770_xm011_defconfig index 123e461..46d043b 100644 --- a/configs/zynq_zc770_xm011_defconfig +++ b/configs/zynq_zc770_xm011_defconfig @@ -2,7 +2,6 @@ CONFIG_ARM=y CONFIG_ARCH_ZYNQ=y CONFIG_TARGET_ZYNQ_ZC770=y CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm011" -# CONFIG_SYS_MALLOC_F is not set CONFIG_SPL=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y diff --git a/configs/zynq_zc770_xm012_defconfig b/configs/zynq_zc770_xm012_defconfig index 3da5168..34d479f 100644 --- a/configs/zynq_zc770_xm012_defconfig +++ b/configs/zynq_zc770_xm012_defconfig @@ -2,7 +2,6 @@ CONFIG_ARM=y CONFIG_ARCH_ZYNQ=y CONFIG_TARGET_ZYNQ_ZC770=y CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm012" -# CONFIG_SYS_MALLOC_F is not set CONFIG_SPL=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y diff --git a/configs/zynq_zc770_xm013_defconfig b/configs/zynq_zc770_xm013_defconfig index 015ec79..c59599f 100644 --- a/configs/zynq_zc770_xm013_defconfig +++ b/configs/zynq_zc770_xm013_defconfig @@ -2,7 +2,6 @@ CONFIG_ARM=y CONFIG_ARCH_ZYNQ=y CONFIG_TARGET_ZYNQ_ZC770=y CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm013" -# CONFIG_SYS_MALLOC_F is not set CONFIG_SPL=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y diff --git a/configs/zynq_zed_defconfig b/configs/zynq_zed_defconfig index ce414b7..886b4a5 100644 --- a/configs/zynq_zed_defconfig +++ b/configs/zynq_zed_defconfig @@ -2,7 +2,6 @@ CONFIG_ARM=y CONFIG_ARCH_ZYNQ=y CONFIG_TARGET_ZYNQ_ZED=y CONFIG_DEFAULT_DEVICE_TREE="zynq-zed" -# CONFIG_SYS_MALLOC_F is not set CONFIG_SPL=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y diff --git a/configs/zynq_zybo_defconfig b/configs/zynq_zybo_defconfig index defcac9..77b9409 100644 --- a/configs/zynq_zybo_defconfig +++ b/configs/zynq_zybo_defconfig @@ -2,7 +2,6 @@ CONFIG_ARM=y CONFIG_ARCH_ZYNQ=y CONFIG_TARGET_ZYNQ_ZYBO=y CONFIG_DEFAULT_DEVICE_TREE="zynq-zybo" -# CONFIG_SYS_MALLOC_F is not set CONFIG_SPL=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y

On 08/28/2015 10:50 PM, Simon Glass wrote:
This reverts commit 321f86e18d6aae9f7b7ba3ef1eb0cec769481874.
The original bug has been fixed.
Signed-off-by: Simon Glass sjg@chromium.org Tested-on: Zedboard and ZC706 board Tested-by: Masahiro Yamada yamada.masahiro@socionext.com
Changes in v2: None
configs/zynq_microzed_defconfig | 1 - configs/zynq_zc702_defconfig | 1 - configs/zynq_zc706_defconfig | 1 - configs/zynq_zc70x_defconfig | 1 - configs/zynq_zc770_xm010_defconfig | 1 - configs/zynq_zc770_xm011_defconfig | 1 - configs/zynq_zc770_xm012_defconfig | 1 - configs/zynq_zc770_xm013_defconfig | 1 - configs/zynq_zed_defconfig | 1 - configs/zynq_zybo_defconfig | 1 - 10 files changed, 10 deletions(-)
Tested-on: zc702 Tested-by: Michal Simek michal.simek@xilinx.com
Thanks, Michal

Hi Simon,
On 08/28/2015 10:50 PM, Simon Glass wrote:
This series collects the previous RFT patches I sent out.
https://patchwork.ozlabs.org/patch/508167/ https://patchwork.ozlabs.org/patch/508168/
It turns out that I originally sent a version of these in April:
https://patchwork.ozlabs.org/patch/461687/ https://patchwork.ozlabs.org/patch/461690/
so this series mirrors that one and includes the Zynq patches from that series.
I hope these can sneak in to this release so that I don't forget them again!
I have tested this on a few ARM platforms: Zynq Zybo, Beaglebone Black, pcduino3 (sunxi), Jetson-TK1 (tegra).
Changes in v2:
- Put this into common/init/ and just Makefiles accordingly
- Add comments as to why this is needed, deal with arch-specific memset()
Simon Glass (8): Move board_init_f_mem() into a common location board_init_f_mem(): Don't require memset() board_init_f_mem(): Don't create an unused early malloc() area arm: Switch aarch64 to using generic global_data setup arm: Switch 32-bit ARM to using generic global_data setup microblaze: Add a TODO to call board_init_f_mem() zynq: Move SPL console init out of board_init_f() Revert "ARM: zynq: disable CONFIG_SYS_MALLOC_F to fix MMC boot"
arch/arm/lib/crt0.S | 28 +++--------------- arch/arm/lib/crt0_64.S | 15 ++-------- arch/arm/mach-zynq/spl.c | 2 +- arch/microblaze/cpu/start.S | 2 ++ common/Makefile | 1 + common/board_f.c | 29 ------------------ common/init/Makefile | 7 +++++ common/init/board_init.c | 60 ++++++++++++++++++++++++++++++++++++++ configs/zynq_microzed_defconfig | 1 - configs/zynq_zc702_defconfig | 1 - configs/zynq_zc706_defconfig | 1 - configs/zynq_zc70x_defconfig | 1 - configs/zynq_zc770_xm010_defconfig | 1 - configs/zynq_zc770_xm011_defconfig | 1 - configs/zynq_zc770_xm012_defconfig | 1 - configs/zynq_zc770_xm013_defconfig | 1 - configs/zynq_zed_defconfig | 1 - configs/zynq_zybo_defconfig | 1 - scripts/Makefile.spl | 1 + 19 files changed, 79 insertions(+), 76 deletions(-) create mode 100644 common/init/Makefile create mode 100644 common/init/board_init.c
I am getting compilation warning about USE_MEMCPY which should be resolved too.
[u-boot]$ ./tools/buildman/buildman -b xnext/serial2 zynq_zc702 -sSed boards.cfg is up to date. Nothing to do. Summary of 9 commits for 1 boards (1 thread, 8 jobs per thread) 01: Merge branch 'master' of http://git.denx.de/u-boot-sunxi 02: Move board_init_f_mem() into a common location 03: board_init_f_mem(): Don't require memset() arm: + zynq_zc702 + #define USE_MEMCPY + ^ +In file included from ../include/common.h:1064:0, + from ../common/init/board_init.c:10: +../include/malloc.h:355:0: note: this is the location of the previous definition + #define USE_MEMCPY 1 w+../common/init/board_init.c:21:0: warning: "USE_MEMCPY" redefined [enabled by default] 04: board_init_f_mem(): Don't create an unused early malloc() area 05: arm: Switch aarch64 to using generic global_data setup 06: arm: Switch 32-bit ARM to using generic global_data setup arm: (for 1/1 boards) all +28.0 spl/u-boot-spl:all +28.0 spl/u-boot-spl:text +28.0 text +28.0 zynq_zc702 : all +28 spl/u-boot-spl:all +28 spl/u-boot-spl:text +28 text +28 07: microblaze: Add a TODO to call board_init_f_mem() 08: zynq: Move SPL console init out of board_init_f() arm: (for 1/1 boards) spl/u-boot-spl:all +8.0 spl/u-boot-spl:text +8.0 zynq_zc702 : spl/u-boot-spl:all +8 spl/u-boot-spl:text +8 09: Revert "ARM: zynq: disable CONFIG_SYS_MALLOC_F to fix MMC boot" arm: (for 1/1 boards) all +257.0 rodata +37.0 spl/u-boot-spl:all +180.0 spl/u-boot-spl:text +180.0 text +220.0 zynq_zc702 : all +257 rodata +37 spl/u-boot-spl:all +180 spl/u-boot-spl:text +180 text +220
Thanks, Michal

Hi Mchal,
On 1 September 2015 at 03:10, Michal Simek monstr@monstr.eu wrote:
Hi Simon,
On 08/28/2015 10:50 PM, Simon Glass wrote:
This series collects the previous RFT patches I sent out.
https://patchwork.ozlabs.org/patch/508167/ https://patchwork.ozlabs.org/patch/508168/
It turns out that I originally sent a version of these in April:
https://patchwork.ozlabs.org/patch/461687/ https://patchwork.ozlabs.org/patch/461690/
so this series mirrors that one and includes the Zynq patches from that series.
I hope these can sneak in to this release so that I don't forget them again!
I have tested this on a few ARM platforms: Zynq Zybo, Beaglebone Black, pcduino3 (sunxi), Jetson-TK1 (tegra).
Changes in v2:
- Put this into common/init/ and just Makefiles accordingly
- Add comments as to why this is needed, deal with arch-specific memset()
Simon Glass (8): Move board_init_f_mem() into a common location board_init_f_mem(): Don't require memset() board_init_f_mem(): Don't create an unused early malloc() area arm: Switch aarch64 to using generic global_data setup arm: Switch 32-bit ARM to using generic global_data setup microblaze: Add a TODO to call board_init_f_mem() zynq: Move SPL console init out of board_init_f() Revert "ARM: zynq: disable CONFIG_SYS_MALLOC_F to fix MMC boot"
arch/arm/lib/crt0.S | 28 +++--------------- arch/arm/lib/crt0_64.S | 15 ++-------- arch/arm/mach-zynq/spl.c | 2 +- arch/microblaze/cpu/start.S | 2 ++ common/Makefile | 1 + common/board_f.c | 29 ------------------ common/init/Makefile | 7 +++++ common/init/board_init.c | 60 ++++++++++++++++++++++++++++++++++++++ configs/zynq_microzed_defconfig | 1 - configs/zynq_zc702_defconfig | 1 - configs/zynq_zc706_defconfig | 1 - configs/zynq_zc70x_defconfig | 1 - configs/zynq_zc770_xm010_defconfig | 1 - configs/zynq_zc770_xm011_defconfig | 1 - configs/zynq_zc770_xm012_defconfig | 1 - configs/zynq_zc770_xm013_defconfig | 1 - configs/zynq_zed_defconfig | 1 - configs/zynq_zybo_defconfig | 1 - scripts/Makefile.spl | 1 + 19 files changed, 79 insertions(+), 76 deletions(-) create mode 100644 common/init/Makefile create mode 100644 common/init/board_init.c
I am getting compilation warning about USE_MEMCPY which should be resolved too.
[u-boot]$ ./tools/buildman/buildman -b xnext/serial2 zynq_zc702 -sSed boards.cfg is up to date. Nothing to do. Summary of 9 commits for 1 boards (1 thread, 8 jobs per thread) 01: Merge branch 'master' of http://git.denx.de/u-boot-sunxi 02: Move board_init_f_mem() into a common location 03: board_init_f_mem(): Don't require memset() arm: + zynq_zc702
- #define USE_MEMCPY
- ^
+In file included from ../include/common.h:1064:0,
from ../common/init/board_init.c:10:
+../include/malloc.h:355:0: note: this is the location of the previous definition
- #define USE_MEMCPY 1
w+../common/init/board_init.c:21:0: warning: "USE_MEMCPY" redefined [enabled by default] 04: board_init_f_mem(): Don't create an unused early malloc() area 05: arm: Switch aarch64 to using generic global_data setup 06: arm: Switch 32-bit ARM to using generic global_data setup arm: (for 1/1 boards) all +28.0 spl/u-boot-spl:all +28.0 spl/u-boot-spl:text +28.0 text +28.0 zynq_zc702 : all +28 spl/u-boot-spl:all +28 spl/u-boot-spl:text +28 text +28 07: microblaze: Add a TODO to call board_init_f_mem() 08: zynq: Move SPL console init out of board_init_f() arm: (for 1/1 boards) spl/u-boot-spl:all +8.0 spl/u-boot-spl:text +8.0 zynq_zc702 : spl/u-boot-spl:all +8 spl/u-boot-spl:text +8 09: Revert "ARM: zynq: disable CONFIG_SYS_MALLOC_F to fix MMC boot" arm: (for 1/1 boards) all +257.0 rodata +37.0 spl/u-boot-spl:all +180.0 spl/u-boot-spl:text +180.0 text +220.0 zynq_zc702 : all +257 rodata +37 spl/u-boot-spl:all +180 spl/u-boot-spl:text +180 text +220
Yes, unfortunately I found that later and also I found a conflict with the malloc change also:
http://patchwork.ozlabs.org/patch/512147/
Once we figure out zynqmp I can resend it.
Regards, Simon

Hi Simon,
On 09/02/2015 04:48 AM, Simon Glass wrote:
Hi Mchal,
On 1 September 2015 at 03:10, Michal Simek monstr@monstr.eu wrote:
Hi Simon,
On 08/28/2015 10:50 PM, Simon Glass wrote:
This series collects the previous RFT patches I sent out.
https://patchwork.ozlabs.org/patch/508167/ https://patchwork.ozlabs.org/patch/508168/
It turns out that I originally sent a version of these in April:
https://patchwork.ozlabs.org/patch/461687/ https://patchwork.ozlabs.org/patch/461690/
so this series mirrors that one and includes the Zynq patches from that series.
I hope these can sneak in to this release so that I don't forget them again!
I have tested this on a few ARM platforms: Zynq Zybo, Beaglebone Black, pcduino3 (sunxi), Jetson-TK1 (tegra).
Changes in v2:
- Put this into common/init/ and just Makefiles accordingly
- Add comments as to why this is needed, deal with arch-specific memset()
Simon Glass (8): Move board_init_f_mem() into a common location board_init_f_mem(): Don't require memset() board_init_f_mem(): Don't create an unused early malloc() area arm: Switch aarch64 to using generic global_data setup arm: Switch 32-bit ARM to using generic global_data setup microblaze: Add a TODO to call board_init_f_mem() zynq: Move SPL console init out of board_init_f() Revert "ARM: zynq: disable CONFIG_SYS_MALLOC_F to fix MMC boot"
arch/arm/lib/crt0.S | 28 +++--------------- arch/arm/lib/crt0_64.S | 15 ++-------- arch/arm/mach-zynq/spl.c | 2 +- arch/microblaze/cpu/start.S | 2 ++ common/Makefile | 1 + common/board_f.c | 29 ------------------ common/init/Makefile | 7 +++++ common/init/board_init.c | 60 ++++++++++++++++++++++++++++++++++++++ configs/zynq_microzed_defconfig | 1 - configs/zynq_zc702_defconfig | 1 - configs/zynq_zc706_defconfig | 1 - configs/zynq_zc70x_defconfig | 1 - configs/zynq_zc770_xm010_defconfig | 1 - configs/zynq_zc770_xm011_defconfig | 1 - configs/zynq_zc770_xm012_defconfig | 1 - configs/zynq_zc770_xm013_defconfig | 1 - configs/zynq_zed_defconfig | 1 - configs/zynq_zybo_defconfig | 1 - scripts/Makefile.spl | 1 + 19 files changed, 79 insertions(+), 76 deletions(-) create mode 100644 common/init/Makefile create mode 100644 common/init/board_init.c
I am getting compilation warning about USE_MEMCPY which should be resolved too.
[u-boot]$ ./tools/buildman/buildman -b xnext/serial2 zynq_zc702 -sSed boards.cfg is up to date. Nothing to do. Summary of 9 commits for 1 boards (1 thread, 8 jobs per thread) 01: Merge branch 'master' of http://git.denx.de/u-boot-sunxi 02: Move board_init_f_mem() into a common location 03: board_init_f_mem(): Don't require memset() arm: + zynq_zc702
- #define USE_MEMCPY
- ^
+In file included from ../include/common.h:1064:0,
from ../common/init/board_init.c:10:
+../include/malloc.h:355:0: note: this is the location of the previous definition
- #define USE_MEMCPY 1
w+../common/init/board_init.c:21:0: warning: "USE_MEMCPY" redefined [enabled by default] 04: board_init_f_mem(): Don't create an unused early malloc() area 05: arm: Switch aarch64 to using generic global_data setup 06: arm: Switch 32-bit ARM to using generic global_data setup arm: (for 1/1 boards) all +28.0 spl/u-boot-spl:all +28.0 spl/u-boot-spl:text +28.0 text +28.0 zynq_zc702 : all +28 spl/u-boot-spl:all +28 spl/u-boot-spl:text +28 text +28 07: microblaze: Add a TODO to call board_init_f_mem() 08: zynq: Move SPL console init out of board_init_f() arm: (for 1/1 boards) spl/u-boot-spl:all +8.0 spl/u-boot-spl:text +8.0 zynq_zc702 : spl/u-boot-spl:all +8 spl/u-boot-spl:text +8 09: Revert "ARM: zynq: disable CONFIG_SYS_MALLOC_F to fix MMC boot" arm: (for 1/1 boards) all +257.0 rodata +37.0 spl/u-boot-spl:all +180.0 spl/u-boot-spl:text +180.0 text +220.0 zynq_zc702 : all +257 rodata +37 spl/u-boot-spl:all +180 spl/u-boot-spl:text +180 text +220
Yes, unfortunately I found that later and also I found a conflict with the malloc change also:
http://patchwork.ozlabs.org/patch/512147/
Once we figure out zynqmp I can resend it.
Here is the branch with ZynqMP changes for DM.
http://git.denx.de/?p=u-boot/u-boot-microblaze.git;a=shortlog;h=refs/heads/s...
I have added comments to commits. The most problematic part for ZynqMP is that you have reverted "fdt: Fix fdtdec_get_addr_size() for 64-bit" (sha1: 5b34436035fc862b5e8d0d2c3eab74ba36f1a7f4) which is able to handle address-cells = 2, size-cells = 1 case which ZynqMP is using.
Anyway you should be able to run u-boot on qemu. Here is the log I am getting.
[qemu]$ ./aarch64-softmmu/qemu-system-aarch64 -M xlnx-ep108 -display none -kernel /mnt/disk/u-boot/u-boot.elf -m 8000000 -nographic -serial mon:stdio qemu-system-aarch64: WARNING: RAM size 7a120000000 above max supported, reduced to 80000000
U-Boot 2015.10-rc2-00326-g13bbf74f7d63 (Sep 03 2015 - 13:11:47 +0200) Xilinx ZynqMP
I2C: ready DRAM: 1 GiB Enabling Caches... EL Level: EL1 MMC: zynq_sdhci: 0 Using default environment
In: serial@ff000000 Out: serial@ff000000 Err: serial@ff000000 Invalid Boot Mode:0x0 SCSI: AHCI 0000.0000 1 slots 1 ports ? Gbps 0x0 impl SATA mode flags: scanning bus for devices... Found 0 device(s). Net: Gem.ff0b0000 Warning: Gem.ff0b0000 (eth0) using random MAC address - 8e:46:f3:b5:70:eb
Hit any key to stop autoboot: 0 ZynqMP> QEMU: Terminated [qemu]$
Please let me know if you need any input on this.
Thanks, Michal

Hi Michal,
On 3 September 2015 at 05:13, Michal Simek monstr@monstr.eu wrote:
Hi Simon,
On 09/02/2015 04:48 AM, Simon Glass wrote:
Hi Mchal,
On 1 September 2015 at 03:10, Michal Simek monstr@monstr.eu wrote:
Hi Simon,
On 08/28/2015 10:50 PM, Simon Glass wrote:
This series collects the previous RFT patches I sent out.
https://patchwork.ozlabs.org/patch/508167/ https://patchwork.ozlabs.org/patch/508168/
It turns out that I originally sent a version of these in April:
https://patchwork.ozlabs.org/patch/461687/ https://patchwork.ozlabs.org/patch/461690/
so this series mirrors that one and includes the Zynq patches from that series.
I hope these can sneak in to this release so that I don't forget them again!
I have tested this on a few ARM platforms: Zynq Zybo, Beaglebone Black, pcduino3 (sunxi), Jetson-TK1 (tegra).
Changes in v2:
- Put this into common/init/ and just Makefiles accordingly
- Add comments as to why this is needed, deal with arch-specific memset()
Simon Glass (8): Move board_init_f_mem() into a common location board_init_f_mem(): Don't require memset() board_init_f_mem(): Don't create an unused early malloc() area arm: Switch aarch64 to using generic global_data setup arm: Switch 32-bit ARM to using generic global_data setup microblaze: Add a TODO to call board_init_f_mem() zynq: Move SPL console init out of board_init_f() Revert "ARM: zynq: disable CONFIG_SYS_MALLOC_F to fix MMC boot"
arch/arm/lib/crt0.S | 28 +++--------------- arch/arm/lib/crt0_64.S | 15 ++-------- arch/arm/mach-zynq/spl.c | 2 +- arch/microblaze/cpu/start.S | 2 ++ common/Makefile | 1 + common/board_f.c | 29 ------------------ common/init/Makefile | 7 +++++ common/init/board_init.c | 60 ++++++++++++++++++++++++++++++++++++++ configs/zynq_microzed_defconfig | 1 - configs/zynq_zc702_defconfig | 1 - configs/zynq_zc706_defconfig | 1 - configs/zynq_zc70x_defconfig | 1 - configs/zynq_zc770_xm010_defconfig | 1 - configs/zynq_zc770_xm011_defconfig | 1 - configs/zynq_zc770_xm012_defconfig | 1 - configs/zynq_zc770_xm013_defconfig | 1 - configs/zynq_zed_defconfig | 1 - configs/zynq_zybo_defconfig | 1 - scripts/Makefile.spl | 1 + 19 files changed, 79 insertions(+), 76 deletions(-) create mode 100644 common/init/Makefile create mode 100644 common/init/board_init.c
I am getting compilation warning about USE_MEMCPY which should be resolved too.
[u-boot]$ ./tools/buildman/buildman -b xnext/serial2 zynq_zc702 -sSed boards.cfg is up to date. Nothing to do. Summary of 9 commits for 1 boards (1 thread, 8 jobs per thread) 01: Merge branch 'master' of http://git.denx.de/u-boot-sunxi 02: Move board_init_f_mem() into a common location 03: board_init_f_mem(): Don't require memset() arm: + zynq_zc702
- #define USE_MEMCPY
- ^
+In file included from ../include/common.h:1064:0,
from ../common/init/board_init.c:10:
+../include/malloc.h:355:0: note: this is the location of the previous definition
- #define USE_MEMCPY 1
w+../common/init/board_init.c:21:0: warning: "USE_MEMCPY" redefined [enabled by default] 04: board_init_f_mem(): Don't create an unused early malloc() area 05: arm: Switch aarch64 to using generic global_data setup 06: arm: Switch 32-bit ARM to using generic global_data setup arm: (for 1/1 boards) all +28.0 spl/u-boot-spl:all +28.0 spl/u-boot-spl:text +28.0 text +28.0 zynq_zc702 : all +28 spl/u-boot-spl:all +28 spl/u-boot-spl:text +28 text +28 07: microblaze: Add a TODO to call board_init_f_mem() 08: zynq: Move SPL console init out of board_init_f() arm: (for 1/1 boards) spl/u-boot-spl:all +8.0 spl/u-boot-spl:text +8.0 zynq_zc702 : spl/u-boot-spl:all +8 spl/u-boot-spl:text +8 09: Revert "ARM: zynq: disable CONFIG_SYS_MALLOC_F to fix MMC boot" arm: (for 1/1 boards) all +257.0 rodata +37.0 spl/u-boot-spl:all +180.0 spl/u-boot-spl:text +180.0 text +220.0 zynq_zc702 : all +257 rodata +37 spl/u-boot-spl:all +180 spl/u-boot-spl:text +180 text +220
Yes, unfortunately I found that later and also I found a conflict with the malloc change also:
http://patchwork.ozlabs.org/patch/512147/
Once we figure out zynqmp I can resend it.
Here is the branch with ZynqMP changes for DM.
http://git.denx.de/?p=u-boot/u-boot-microblaze.git;a=shortlog;h=refs/heads/s...
I have added comments to commits. The most problematic part for ZynqMP is that you have reverted "fdt: Fix fdtdec_get_addr_size() for 64-bit" (sha1: 5b34436035fc862b5e8d0d2c3eab74ba36f1a7f4) which is able to handle address-cells = 2, size-cells = 1 case which ZynqMP is using.
Anyway you should be able to run u-boot on qemu. Here is the log I am getting.
[qemu]$ ./aarch64-softmmu/qemu-system-aarch64 -M xlnx-ep108 -display none -kernel /mnt/disk/u-boot/u-boot.elf -m 8000000 -nographic -serial mon:stdio qemu-system-aarch64: WARNING: RAM size 7a120000000 above max supported, reduced to 80000000
U-Boot 2015.10-rc2-00326-g13bbf74f7d63 (Sep 03 2015 - 13:11:47 +0200) Xilinx ZynqMP
I2C: ready DRAM: 1 GiB Enabling Caches... EL Level: EL1 MMC: zynq_sdhci: 0 Using default environment
In: serial@ff000000 Out: serial@ff000000 Err: serial@ff000000 Invalid Boot Mode:0x0 SCSI: AHCI 0000.0000 1 slots 1 ports ? Gbps 0x0 impl SATA mode flags: scanning bus for devices... Found 0 device(s). Net: Gem.ff0b0000 Warning: Gem.ff0b0000 (eth0) using random MAC address - 8e:46:f3:b5:70:eb
Hit any key to stop autoboot: 0 ZynqMP> QEMU: Terminated [qemu]$
Please let me know if you need any input on this.
I followed up on the other thread.
But for the memalign issue I've come up with two new patches:
http://patchwork.ozlabs.org/patch/513690/ http://patchwork.ozlabs.org/patch/513779/
Regards, Simon
participants (2)
-
Michal Simek
-
Simon Glass