> From: Bo Gan <ganbo...@gmail.com> > Sent: Monday, June 12, 2023 7:59 AM > To: u-boot@lists.denx.de > Cc: Bo Gan <ganbo...@gmail.com>; samin . guo <samin....@starfivetech.com>; > Yanhong Wang <yanhong.w...@starfivetech.com>; Rick Jian-Zhi Chen(陳建志) > <r...@andestech.com>; Leo Yu-Chi Liang(梁育齊) <ycli...@andestech.com>; Sean > Anderson <sean...@gmail.com>; Lukasz Majewski <lu...@denx.de> > Subject: [RESEND PATCH v1] arch: riscv: jh7110: Correctly zero L2 LIM > > Background information: > JH7110 SPL runs in L2 LIM (2M in size mapped at 0x8000000). It consists of > 16 0x20000 sized regions, each one can be used as either L2 cache way or > SRAM (not both). From top to bottom, there're ways 0-15. The way 0 is always > enabled, at most 0x1e0000 can be used. > > In SPL, we don't enable any cache ways, thus all 15 (except way 0) ways can > be used. However, due to HW requirement, we must zero the LIM before use. > This is because ECC is applied to LIM, and if not cleared first, the ECC part > is invalid, which can trigger ECC errors when reading/writing data. > > There are several issues currently. We clear L2 LIM from __bss_end to > 0x81FFFFF in `harts_early_init`. This is wrong because: > > a. Each hart (in the middle of a function call) overwriting its own > stack and other harts' stacks. > (data-race and data-corruption) > b. Lottery winner hart can be doing `board_init_f_init_reserve`, > while other harts're in the middle of zeroing L2 LIM. > (data-race) > > To fix this, we split the job, such that there's one and only one owner of > zeroing a specific region (No data-race). A new SPL config option > `SPL_ZERO_MEM_BEFORE_USE` is introduced. Allowing The zeroing to happen in > the same code path. (much easier to reason about). > > Another option `SPL_SYS_MALLOC_CLEAR_ON_INIT` also gets introduced. > It allows us to also zero late malloc (dlmalloc) area, in case it gets > configured to be inside L2 LIM (via `CUSTOM_SYS_SPL_MALLOC_ADDR`) We by > default enable it to be on the safe side. > > `CONFIG_SPL_STACK` is adjusted to reduce the waste of L2 LIM space. > When setting > > CONFIG_CUSTOM_SYS_SPL_MALLOC_ADDR=0x8100000 > CONFIG_SYS_SPL_MALLOC_SIZE=0xe0000 > > A 0.875M late malloc arena is available in L2 LIM. It's sufficient for > loading JH7110 FIT Image (gzip compressed OpenSBI+UBOOT+DTB). > The advantage of this config is allowing OpenSBI/UBOOT to be loaded at any > DDR memory address. By default the malloc arena is configured in DDR memory, > so OpenSBI/UBOOT loading address must not collide with it. > > CONFIG_CUSTOM_SYS_SPL_MALLOC_ADDR=0x80000000 (DDR +1GB) > CONFIG_SYS_SPL_MALLOC_SIZE=0x400000 > > JH7110 SPL memory map (based on the following defconfig): > > CONFIG_NR_CPUS=8 > CONFIG_STACK_SIZE_SHIFT=14 > CONFIG_SPL_STACK=0x8100000 > CONFIG_SPL_SYS_MALLOC_F_LEN=0x10000 > CONFIG_SPL_BSS_START_ADDR=0x8040000 > > +----------------+ 0x81e0000 > | Free | > | | > +----------------+ 0x8100000 > | hart 0 stack | <--- cleared by each hart (start.S) > +----------------+ 0x80fc000 > | hart 1 stack | . > +----------------+ 0x80f8000 . > | ...... | . > +----------------+ > | hart N-1 stack| <--- cleared by each hart (start.S) > +----------------+ 0x80e0000 > | ...... | <--- cleared by lottery winner hart > | malloc_base | board_init_f_init_reserve() > +----------------+ 0x80d0000 > | GD | <--- cleared by lottery winner hart > +----------------+ board_init_f_init_reserve() > | | > | hole | > | | > +----------------+ > | BSS | <--- cleared by lottery winner hart > +----------------+ 0x8040000 spl_clear_bss (start.S) > | hole | > +----------------+ > | Image+DTB | <--- Assuming cleared/loaded by ROM > +----------------+ 0x8000000 > > Signed-off-by: Bo Gan <ganbo...@gmail.com> > Cc: samin . guo <samin....@starfivetech.com> > Cc: Yanhong Wang <yanhong.w...@starfivetech.com> > Cc: Rick Chen <r...@andestech.com> > Cc: Leo <ycli...@andestech.com> > Cc: Sean Anderson <sean...@gmail.com> > Cc: Lukasz Majewski <lu...@denx.de> > --- > > v1: > - patch is on top of > https://patchwork.ozlabs.org/project/uboot/patch/1684650044-313122-1-git-send-email-ganbo...@gmail.com/ > - Tested on VisionFive 2 board (4G) > --- > Kconfig | 11 +++++++++++ > arch/riscv/Kconfig | 7 +++++++ > arch/riscv/cpu/jh7110/Kconfig | 2 ++ > arch/riscv/cpu/jh7110/spl.c | 25 ------------------------- > arch/riscv/cpu/start.S | 12 ++++++++++++ > common/dlmalloc.c | 6 +++--- > common/init/board_init.c | 3 +++ > configs/starfive_visionfive2_defconfig | 3 ++- > 8 files changed, 40 insertions(+), 29 deletions(-)
Please separate as several PATCHs, but not mix them as one PATCH Thanks, Rick