[PATCH v3 1/6] rockchip: Add common default bss and stack addresses
Kever Yang
kever.yang at rock-chips.com
Mon Mar 11 10:55:50 CET 2024
Hi Jonas,
On 2024/3/3 03:16, Jonas Karlman wrote:
> On Rockchip the typical aarch64 boot steps are as follows:
> - BROM load TPL to SRAM
> - TPL init full DRAM
> - use stack in SRAM at TPL_STACK addr
> - use malloc heap on stack, size is TPL_SYS_MALLOC_F_LEN
> - TPL jump back to BROM
> - BROM load SPL to beginning of DRAM
> - SPL init storage devices
> - use bss in DRAM at SPL_BSS_START_ADDR, size is SPL_BSS_MAX_SIZE
> - use stack in DRAM at SPL_STACK addr (or CUSTOM_SYS_INIT_SP_ADDR)
> - use malloc heap on stack, size is SPL_SYS_MALLOC_F_LEN
> - SPL load FIT images from storage to DRAM
> - use stack in DRAM at SPL_STACK_R_ADDR
> - use new malloc heap on stack, size is SPL_STACK_R_MALLOC_SIMPLE_LEN
> - SPL jump to TF-A at 0x40000
> - (optional) TF-A load OPTEE
> - TF-A jump to U-Boot proper at TEXT_BASE
> - U-Boot proper init pre-reloc devices
> - use stack in DRAM at CUSTOM_SYS_INIT_SP_ADDR
> - use malloc heap on stack, size is SYS_MALLOC_F_LEN
> - U-Boot proper relocate to end of usable DRAM
> - U-Boot proper init devices and complete boot
>
> SPL have access to full DRAM, however, current configuration for text
> base, stack addr and malloc heap size used at the different boot steps
> are at risk of overlapping, e.g. when U-Boot proper + FDT grows close
> to 1 MiB on RK3328/RK3399 or when pre-reloc and reloc stack and malloc
> heap overlap on ROCK 5A.
>
> Fix this by defining safe defaults for bss, stack and malloc size and
> addresses. A range at around [60 MiB, 64 MiB) was chosen to be used for
> bss and stack until U-Boot proper have been relocated to end of usable
> DRAM. The range was primarily chosen to be able to accommodate SoCs with
> a small amount of embedded DRAM, e.g. RK3308G has 64 MiB DRAM.
>
> Overiew of the new common memory layout:
> [ 0, 2M) - SPL / TF-A / reserved
> [ 2M, +X) - U-Boot proper pre-reloc
> [ -X, 64M) - bss, stack and malloc heap
>
> During SPL pre-reloc phase:
> [ 0, 256K) - SPL binary is loaded by BROM to beginning of DRAM
> [ -X, 63M) - SPL pre-reloc stack
> [ -32K, 63M) - SPL pre-reloc malloc heap
> [63.5M, +32K) - SPL bss
>
> After SPL reloc phase:
> [ 0, 256K) - SPL binary
> [ 256K, +X) - TF-A image is loaded by SPL
> [ 2M, +X) - U-Boot proper + FDT image is loaded by SPL
> [ -X, 62M) - SPL reloc stack
> [ 60M, 62M) - SPL reloc malloc heap
> [ -32K, 63M) - SPL init malloc heap, memory allocated during SPL
> pre-reloc phase is still in use at reloc phase
> [63.5M, +32K) - SPL bss
>
> During U-Boot proper pre-reloc phase:
> [ 0, 2M) - TF-A / reserved
> [ 2M, +X) - U-Boot proper + FDT
> [ -X, 63M) - U-Boot proper pre-reloc stack (shared addr with SPL)
> [ -64K, 63M) - U-Boot proper pre-reloc malloc heap
>
> After U-Boot proper has relocated to top of memory we should be able to
> use 2M+ for loading kernel, initrd, scripts etc.
Very good update and also good description here, can we also add the
memory usage
description after update to rockchip.rst?
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Thanks,
- Kever
>
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
> ---
> arch/arm/mach-rockchip/Kconfig | 55 ++++++++++++++++++++++++++++++++++
> 1 file changed, 55 insertions(+)
>
> diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
> index 2c6b045c51c8..edbe3fd30853 100644
> --- a/arch/arm/mach-rockchip/Kconfig
> +++ b/arch/arm/mach-rockchip/Kconfig
> @@ -534,6 +534,21 @@ config ROCKCHIP_SPI_IMAGE
> config LNX_KRNL_IMG_TEXT_OFFSET_BASE
> default TEXT_BASE
>
> +config ROCKCHIP_COMMON_STACK_ADDR
> + bool
> + depends on SPL_SHARES_INIT_SP_ADDR
> + select HAS_CUSTOM_SYS_INIT_SP_ADDR
> + imply SPL_LIBCOMMON_SUPPORT if SPL
> + imply SPL_LIBGENERIC_SUPPORT if SPL
> + imply SPL_ROCKCHIP_COMMON_BOARD if SPL
> + imply SPL_SYS_MALLOC_F if SPL
> + imply SPL_SYS_MALLOC_SIMPLE if SPL
> + imply TPL_LIBCOMMON_SUPPORT if TPL
> + imply TPL_LIBGENERIC_SUPPORT if TPL
> + imply TPL_ROCKCHIP_COMMON_BOARD if TPL
> + imply TPL_SYS_MALLOC_F if TPL
> + imply TPL_SYS_MALLOC_SIMPLE if TPL
> +
> source "arch/arm/mach-rockchip/px30/Kconfig"
> source "arch/arm/mach-rockchip/rk3036/Kconfig"
> source "arch/arm/mach-rockchip/rk3066/Kconfig"
> @@ -549,4 +564,44 @@ source "arch/arm/mach-rockchip/rk3568/Kconfig"
> source "arch/arm/mach-rockchip/rk3588/Kconfig"
> source "arch/arm/mach-rockchip/rv1108/Kconfig"
> source "arch/arm/mach-rockchip/rv1126/Kconfig"
> +
> +if ROCKCHIP_COMMON_STACK_ADDR && SPL_SHARES_INIT_SP_ADDR
> +
> +config CUSTOM_SYS_INIT_SP_ADDR
> + default 0x3f00000
> +
> +config SYS_MALLOC_F_LEN
> + default 0x10000 if CUSTOM_SYS_INIT_SP_ADDR = 0x3f00000
> +
> +config SPL_SYS_MALLOC_F_LEN
> + default 0x8000 if CUSTOM_SYS_INIT_SP_ADDR = 0x3f00000
> +
> +config TPL_SYS_MALLOC_F_LEN
> + default 0x4000 if CUSTOM_SYS_INIT_SP_ADDR = 0x3f00000
> +
> +config TEXT_BASE
> + default 0x00200000 if ARM64
> +
> +config SPL_TEXT_BASE
> + default 0x0 if ARM64
> +
> +config SPL_HAS_BSS_LINKER_SECTION
> + default y if ARM64
> +
> +config SPL_BSS_START_ADDR
> + default 0x3f80000
> +
> +config SPL_BSS_MAX_SIZE
> + default 0x8000 if SPL_BSS_START_ADDR = 0x3f80000
> +
> +config SPL_STACK_R
> + default y if CUSTOM_SYS_INIT_SP_ADDR = 0x3f00000
> +
> +config SPL_STACK_R_ADDR
> + default 0x3e00000 if CUSTOM_SYS_INIT_SP_ADDR = 0x3f00000
> +
> +config SPL_STACK_R_MALLOC_SIMPLE_LEN
> + default 0x200000 if SPL_STACK_R_ADDR = 0x3e00000
> +
> +endif
> endif
More information about the U-Boot
mailing list