[U-Boot] [PATCH] SPL: sunxi: don't force .BSS into DRAM
Marek Vasut
marex at denx.de
Thu Jun 30 03:54:23 CEST 2016
On 06/30/2016 02:29 AM, Andre Przywara wrote:
> Probably due to some (ill-founded) fear of a large BSS all sunxi boards
> forced their SPL BSS section into DRAM.
> This only works if there is no usage of a .BSS variable before the DRAM
> is initialised.
> The recent inclusion of tiny-printf breaks this assumption (it has two
> variables in .BSS), so any early printf (printing a number) hangs a board.
I believe you should fix tiny-printf instead, try this patch:
diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
index 451f4f7..5b9b0dc 100644
--- a/lib/tiny-printf.c
+++ b/lib/tiny-printf.c
@@ -17,7 +17,7 @@ static char *bf;
static char zs;
/* Current position in sprintf() output string */
-static char *outstr;
+static char *outstr __section(".data");
static void out(char c)
{
> This in particular breaks the (WIP) Pine64 SPL, which at the moment links
> Allwinner's libdram library, trying to print debug information:
> DRAM:DRAM driver version: V1.0
> DRAM Type = <hangs>
>
> As it turns out the normal BSS size for sunxi is about 256 Bytes, so we
> can happily remove the symbols and the linker script part that was
> forcing the section into DRAM and let the linker naturally put it into
> SRAM.
Except SRAM is limited, which is why bss was in DRAM.
> Tested on BananaPi M1 and Pine64(-SPL), also buildman sunxi was happy.
>
> Thanks to Siarhei for providing helpful hints!
>
> Signed-off-by: Andre Przywara <andre.przywara at arm.com>
> ---
>
> (and now with the list in CC: as well) ...
>
> arch/arm/cpu/armv7/sunxi/u-boot-spl.lds | 4 +---
> include/configs/sunxi-common.h | 4 ----
> 2 files changed, 1 insertion(+), 7 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds b/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds
> index 53f0cbd..a90404f 100644
> --- a/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds
> +++ b/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds
> @@ -16,8 +16,6 @@
> */
> MEMORY { .sram : ORIGIN = CONFIG_SPL_TEXT_BASE,\
> LENGTH = CONFIG_SPL_MAX_SIZE }
> -MEMORY { .sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR, \
> - LENGTH = CONFIG_SPL_BSS_MAX_SIZE }
>
> OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
> OUTPUT_ARCH(arm)
> @@ -54,5 +52,5 @@ SECTIONS
> *(.bss*)
> . = ALIGN(4);
> __bss_end = .;
> - } > .sdram
> + } > .sram
> }
> diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h
> index 94275a7..e3fe965 100644
> --- a/include/configs/sunxi-common.h
> +++ b/include/configs/sunxi-common.h
> @@ -75,7 +75,6 @@
> * since it needs to fit in with the other values. By also #defining it
> * we get warnings if the Kconfig value mismatches. */
> #define CONFIG_SPL_STACK_R_ADDR 0x2fe00000
> -#define CONFIG_SPL_BSS_START_ADDR 0x2ff80000
> #else
> #define SDRAM_OFFSET(x) 0x4##x
> #define CONFIG_SYS_SDRAM_BASE 0x40000000
> @@ -86,11 +85,8 @@
> * since it needs to fit in with the other values. By also #defining it
> * we get warnings if the Kconfig value mismatches. */
> #define CONFIG_SPL_STACK_R_ADDR 0x4fe00000
> -#define CONFIG_SPL_BSS_START_ADDR 0x4ff80000
> #endif
>
> -#define CONFIG_SPL_BSS_MAX_SIZE 0x00080000 /* 512 KiB */
> -
> #if defined(CONFIG_MACH_SUN9I) || defined(CONFIG_MACH_SUN50I)
> /*
> * The A80's A1 sram starts at 0x00010000 rather then at 0x00000000 and is
>
--
Best regards,
Marek Vasut
More information about the U-Boot
mailing list