Add support for this new phase, which runs after TPL. It determines the state of the machine, then selects which SPL image to use. SDRAM init is then done in SPL, so that it is updatable.
Signed-off-by: Simon Glass <s...@chromium.org> --- arch/arm/include/asm/spl.h | 1 + arch/arm/mach-rockchip/Kconfig | 25 +++++- arch/arm/mach-rockchip/Makefile | 6 +- arch/arm/mach-rockchip/rk3399/Kconfig | 9 ++ arch/arm/mach-rockchip/spl-boot-order.c | 3 +- arch/arm/mach-rockchip/spl.c | 3 + arch/arm/mach-rockchip/tpl.c | 2 +- arch/arm/mach-rockchip/u-boot-vpl-v8.lds | 107 +++++++++++++++++++++++ arch/arm/mach-rockchip/vpl.c | 53 +++++++++++ common/spl/Kconfig | 1 + 10 files changed, 203 insertions(+), 7 deletions(-) create mode 100644 arch/arm/mach-rockchip/u-boot-vpl-v8.lds create mode 100644 arch/arm/mach-rockchip/vpl.c diff --git a/arch/arm/include/asm/spl.h b/arch/arm/include/asm/spl.h index ee79a19c05c..62844d64cab 100644 --- a/arch/arm/include/asm/spl.h +++ b/arch/arm/include/asm/spl.h @@ -30,6 +30,7 @@ enum { BOOT_DEVICE_XIP, BOOT_DEVICE_BOOTROM, BOOT_DEVICE_SMH, + BOOT_DEVICE_VBE, BOOT_DEVICE_NONE }; #endif diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig index 269c219a6f8..7e6e9411e79 100644 --- a/arch/arm/mach-rockchip/Kconfig +++ b/arch/arm/mach-rockchip/Kconfig @@ -250,13 +250,15 @@ config ROCKCHIP_RK3399 select SPL_ATF select SPL_BOARD_INIT if SPL select SPL_LOAD_FIT - select SPL_CLK if SPL + select SPL_CLK if SPL && !VPL select SPL_PINCTRL if SPL select SPL_RAM if SPL select SPL_REGMAP if SPL select SPL_SYSCON if SPL select TPL_NEEDS_SEPARATE_STACK if TPL - select SPL_SEPARATE_BSS + select VPL_NEEDS_SEPARATE_STACK if VPL + select SPL_SEPARATE_BSS if !VPL + select SPL_RAW_IMAGE_SUPPORT if VPL select CLK select FIT select PINCTRL @@ -266,6 +268,7 @@ config ROCKCHIP_RK3399 select DM_PMIC select DM_REGULATOR_FIXED select BOARD_LATE_INIT + select SUPPORT_VPL imply ARMV8_CRYPTO imply ARMV8_SET_SMPEN imply BOOTSTD_FULL @@ -294,13 +297,14 @@ config ROCKCHIP_RK3399 imply TPL_LIBCOMMON_SUPPORT imply TPL_LIBGENERIC_SUPPORT imply TPL_OF_CONTROL - imply TPL_RAM + imply TPL_RAM if !VPL imply TPL_REGMAP imply TPL_ROCKCHIP_COMMON_BOARD imply TPL_SERIAL imply TPL_SYS_MALLOC_SIMPLE imply TPL_SYSCON imply TPL_TINY_MEMSET + imply TPL_DM_MMC if VPL help The Rockchip RK3399 is a ARM-based SoC with a dual-core Cortex-A72 and quad-core Cortex-A53. @@ -455,7 +459,7 @@ config SPL_ROCKCHIP_BACK_TO_BROM config TPL_ROCKCHIP_BACK_TO_BROM bool "TPL returns to bootrom" - default y + default y if !VPL select ROCKCHIP_BROM_HELPER if !ROCKCHIP_RK3066 select TPL_BOOTROM_SUPPORT depends on TPL @@ -496,6 +500,16 @@ config ROCKCHIP_EXTERNAL_TPL Enable this option and build with ROCKCHIP_TPL=/path/to/ddr.bin to include the external TPL in the image built by binman. +config VPL_ROCKCHIP_COMMON_BOARD + bool "Rockchip VPL common board file" + depends on VPL + default y + help + Rockchip SoCs have similar boot process, prefer to use TPL to start + VPL, then ATF for DRAM init and back to bootrom, and SPL as Trust + ATF/U-Boot loader. VPL common board is a basic VPL board init which + can be shared for most SoCs to avoid copy-paste for different SoCs. + config ROCKCHIP_BOOT_MODE_REG hex "Rockchip boot mode flag register address" help @@ -587,6 +601,9 @@ config TPL_ROCKCHIP_EARLYRETURN_TO_BROM config SPL_MMC default y if !SPL_ROCKCHIP_BACK_TO_BROM +config TPL_MMC + default y if !TPL_ROCKCHIP_BACK_TO_BROM + config ROCKCHIP_SPI_IMAGE bool "Build a SPI image for rockchip" help diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile index 5e7edc99cdc..c878f2d3e8d 100644 --- a/arch/arm/mach-rockchip/Makefile +++ b/arch/arm/mach-rockchip/Makefile @@ -13,6 +13,8 @@ obj-tpl-$(CONFIG_ROCKCHIP_BROM_HELPER) += bootrom.o obj-tpl-$(CONFIG_TPL_ROCKCHIP_COMMON_BOARD) += tpl.o spl_common.o obj-tpl-$(CONFIG_ROCKCHIP_PX30) += px30-board-tpl.o +obj-vpl-$(CONFIG_VPL_ROCKCHIP_COMMON_BOARD) += vpl.o + obj-spl-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o ifeq ($(CONFIG_XPL_BUILD)$(CONFIG_TPL_BUILD),) @@ -47,9 +49,11 @@ obj-$(CONFIG_ROCKCHIP_RK3588) += rk3588/ obj-$(CONFIG_ROCKCHIP_RV1108) += rv1108/ obj-$(CONFIG_ROCKCHIP_RV1126) += rv1126/ -# Clear out SPL objects, in case this is a TPL build +# Clear out SPL objects, in case this is a TPL or VPL build obj-spl-$(CONFIG_TPL_BUILD) = +obj-spl-$(CONFIG_VPL_BUILD) = # Now add SPL/TPL objects back into the main build obj-$(CONFIG_XPL_BUILD) += $(obj-spl-y) obj-$(CONFIG_TPL_BUILD) += $(obj-tpl-y) +obj-$(CONFIG_VPL_BUILD) += $(obj-vpl-y) diff --git a/arch/arm/mach-rockchip/rk3399/Kconfig b/arch/arm/mach-rockchip/rk3399/Kconfig index 04a84e2f6a0..fc55b498111 100644 --- a/arch/arm/mach-rockchip/rk3399/Kconfig +++ b/arch/arm/mach-rockchip/rk3399/Kconfig @@ -164,6 +164,15 @@ config TPL_STACK config TPL_TEXT_BASE default 0xff8c2000 +config VPL_STACK + default 0xff8eff00 + +config VPL_TEXT_BASE + default 0xff8c2000 + +config VPL_LDSCRIPT + default "arch/arm/mach-rockchip/u-boot-vpl-v8.lds" + config SPL_STACK_R_ADDR default 0x04000000 if !SPL_SHARES_INIT_SP_ADDR diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c index 3dce9b30898..d580d4fc84c 100644 --- a/arch/arm/mach-rockchip/spl-boot-order.c +++ b/arch/arm/mach-rockchip/spl-boot-order.c @@ -99,7 +99,8 @@ __weak const char *board_spl_was_booted_from(void) void board_boot_order(u32 *spl_boot_list) { /* In case of no fdt (or only plat), use spl_boot_device() */ - if (!CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_PLATDATA)) { + if (IS_ENABLED(CONFIG_VPL) || !CONFIG_IS_ENABLED(OF_CONTROL) || + CONFIG_IS_ENABLED(OF_PLATDATA)) { spl_boot_list[0] = spl_boot_device(); return; } diff --git a/arch/arm/mach-rockchip/spl.c b/arch/arm/mach-rockchip/spl.c index f4d29bbdd17..305373a161c 100644 --- a/arch/arm/mach-rockchip/spl.c +++ b/arch/arm/mach-rockchip/spl.c @@ -61,6 +61,9 @@ u32 spl_boot_device(void) { u32 boot_device = BOOT_DEVICE_MMC1; + if (IS_ENABLED(CONFIG_VPL)) + return BOOT_DEVICE_VBE; + #if defined(CONFIG_TARGET_CHROMEBOOK_JERRY) || \ defined(CONFIG_TARGET_CHROMEBIT_MICKEY) || \ defined(CONFIG_TARGET_CHROMEBOOK_MINNIE) || \ diff --git a/arch/arm/mach-rockchip/tpl.c b/arch/arm/mach-rockchip/tpl.c index 6b880f19f84..cc794a7dca2 100644 --- a/arch/arm/mach-rockchip/tpl.c +++ b/arch/arm/mach-rockchip/tpl.c @@ -84,5 +84,5 @@ int board_return_to_bootrom(struct spl_image_info *spl_image, u32 spl_boot_device(void) { - return BOOT_DEVICE_BOOTROM; + return IS_ENABLED(CONFIG_VPL) ? BOOT_DEVICE_VBE : BOOT_DEVICE_BOOTROM; } diff --git a/arch/arm/mach-rockchip/u-boot-vpl-v8.lds b/arch/arm/mach-rockchip/u-boot-vpl-v8.lds new file mode 100644 index 00000000000..d2a5cf61581 --- /dev/null +++ b/arch/arm/mach-rockchip/u-boot-vpl-v8.lds @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2019 + * Rockchip Electronics Co., Ltd + * Kever Yang<kever.y...@rock-chips.com> + * + * (C) Copyright 2013 + * David Feng <feng...@phytium.com.cn> + * + * (C) Copyright 2002 + * Gary Jennejohn, DENX Software Engineering, <ga...@denx.de> + * + * (C) Copyright 2010 + * Texas Instruments, <www.ti.com> + * Aneesh V <ane...@ti.com> + */ + +OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64") +OUTPUT_ARCH(aarch64) +ENTRY(_start) +SECTIONS +{ + . = 0x00000000; + + .text : { + . = ALIGN(8); + __image_copy_start = .; + CPUDIR/start.o (.text*) + + /* put relocation code all together */ + //. = . + 0xc0; + _rcode_start = .; + *(.text.rcode) + *(.text.rdata) + _rcode_end = .; + + *(.text*) + } + + .rodata : { + . = ALIGN(8); + *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) + } + + .data : { + . = ALIGN(8); + *(.data*) + } + + __u_boot_list : { + . = ALIGN(8); + KEEP(*(SORT(__u_boot_list*))); + } + + .image_copy_end : { + . = ALIGN(8); + *(.__image_copy_end) + } + + .end : { + . = ALIGN(8); + *(.__end) + } + + _image_binary_end = .; + _end = .; + __image_copy_end = .; + + __bss_start = .; + .bss_start (NOLOAD) : { + . = ALIGN(8); + KEEP(*(.__bss_start)); + } + + .bss (NOLOAD) : { + *(.bss*) + . = ALIGN(8); + } + + .bss_end (NOLOAD) : { + KEEP(*(.__bss_end)); + } + __bss_end = .; + __bss_size = __bss_end - __bss_start; + + /DISCARD/ : { *(.dynsym) } + /DISCARD/ : { *(.dynstr*) } + /DISCARD/ : { *(.dynamic*) } + /DISCARD/ : { *(.plt*) } + /DISCARD/ : { *(.interp*) } + /DISCARD/ : { *(.gnu*) } +} + +#if defined(CONFIG_TPL_MAX_SIZE) +ASSERT(__image_copy_end - __image_copy_start < (CONFIG_TPL_MAX_SIZE), \ + "TPL image too big"); +#endif + +#if defined(CONFIG_TPL_BSS_MAX_SIZE) +ASSERT(__bss_end - __bss_start < (CONFIG_TPL_BSS_MAX_SIZE), \ + "TPL image BSS too big"); +#endif + +#if defined(CONFIG_TPL_MAX_FOOTPRINT) +ASSERT(__bss_end - _start < (CONFIG_TPL_MAX_FOOTPRINT), \ + "TPL image plus BSS too big"); +#endif diff --git a/arch/arm/mach-rockchip/vpl.c b/arch/arm/mach-rockchip/vpl.c new file mode 100644 index 00000000000..55a8dabc2da --- /dev/null +++ b/arch/arm/mach-rockchip/vpl.c @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2019 Rockchip Electronics Co., Ltd + */ + +#include <bootstage.h> +#include <debug_uart.h> +#include <dm.h> +#include <hang.h> +#include <init.h> +#include <log.h> +#include <ram.h> +#include <spl.h> +#include <version.h> +#include <asm/io.h> +#include <asm/arch-rockchip/bootrom.h> +#include <linux/bitops.h> + +#if CONFIG_IS_ENABLED(BANNER_PRINT) +#include <timestamp.h> +#endif + +void board_init_f(ulong dummy) +{ + int ret; + +#if defined(CONFIG_DEBUG_UART) && defined(CONFIG_VPL_SERIAL) + /* + * Debug UART can be used from here if required: + * + * debug_uart_init(); + * printch('a'); + * printhex8(0x1234); + * printascii("string"); + */ + debug_uart_init(); +#ifdef CONFIG_VPL_BANNER_PRINT + printascii("\nU-Boot VPL " PLAIN_VERSION " (" U_BOOT_DATE " - " + U_BOOT_TIME ")\n"); +#endif +#endif + + ret = spl_early_init(); + if (ret) { + debug("spl_early_init() failed: %d\n", ret); + hang(); + } +} + +u32 spl_boot_device(void) +{ + return BOOT_DEVICE_VBE; +} diff --git a/common/spl/Kconfig b/common/spl/Kconfig index a250bde779f..92cc83be436 100644 --- a/common/spl/Kconfig +++ b/common/spl/Kconfig @@ -554,6 +554,7 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR default 0x200 if ARCH_SOCFPGA || ARCH_AT91 default 0x300 if ARCH_ZYNQ || ARCH_KEYSTONE || OMAP34XX || \ OMAP54XX || AM33XX || AM43XX || ARCH_K3 + default 0x800 if ARCH_ROCKCHIP && VPL default 0x4000 if ARCH_ROCKCHIP default 0x822 if TARGET_SIFIVE_UNLEASHED || TARGET_SIFIVE_UNMATCHED help -- 2.43.0