[U-Boot] [U-Boot,1/3] rk3288: vyasa: Add TPL support
Philipp Tomsich
philipp.tomsich at theobroma-systems.com
Mon Sep 11 20:15:45 UTC 2017
On Mon, 28 Aug 2017, Jagan Teki wrote:
> From: Jagan Teki <jagan at amarulasolutions.com>
>
> Since the size of SPL can't be exceeded 0x8000 bytes in RK3288,
^^^^^^^^^^^
> it is not possible add new SPL features like Falcon mode or etc.
>
> So add TPL stage so-that adding new features to SPL is possible.
> - TPL: DRAM init, clocks
> - SPL: MMC, falcon, etc
>
> Booting from SD with TPL:
> ------------------------
> U-Boot TPL 2017.09-rc2-13369-gfa72baf-dirty (Aug 26 2017 - 15:48:54)
> Trying to boot from BOOTROM
> Returning to boot ROM...
>
> U-Boot SPL 2017.09-rc2-13369-gfa72baf-dirty (Aug 26 2017 - 15:48:54)
> Trying to boot from MMC1
>
> U-Boot 2017.09-rc2-13369-gfa72baf-dirty (Aug 26 2017 - 15:48:54 +0530)
>
> Model: Amarula Vyasa-RK3288
> DRAM: 2 GiB
> MMC: dwmmc at ff0c0000: 1
> Using default environment
>
> In: serial at ff690000
> Out: serial at ff690000
> Err: serial at ff690000
> Model: Amarula Vyasa-RK3288
> Net: Net Initialization Skipped
> No ethernet found.
> Hit any key to stop autoboot: 0
> =>
I think the console output does not provide any useful info as part of
the commit message.
>
> Signed-off-by: Jagan Teki <jagan at amarulasolutions.com>
Reviewed-by: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>
> ---
> Note:
> Right now TPL added in vyasa board, ie reason some clock code
> is duplicate in SPL and TPL. Once all rk3288 agree the will remove
> duplicates.
>
> arch/arm/mach-rockchip/Makefile | 1 +
> arch/arm/mach-rockchip/rk3288-board-spl.c | 3 +
> arch/arm/mach-rockchip/rk3288-board-tpl.c | 124 ++++++++++++++++++++++++++++++
> arch/arm/mach-rockchip/rk3288/Kconfig | 15 ++++
> configs/vyasa-rk3288_defconfig | 2 +
> doc/README.rockchip | 18 +++++
> include/configs/rk3288_common.h | 8 +-
> 7 files changed, 170 insertions(+), 1 deletion(-)
> create mode 100644 arch/arm/mach-rockchip/rk3288-board-tpl.c
>
> diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
> index 79e9704..daafc8d 100644
> --- a/arch/arm/mach-rockchip/Makefile
> +++ b/arch/arm/mach-rockchip/Makefile
> @@ -12,6 +12,7 @@ obj-spl-$(CONFIG_ROCKCHIP_BROM_HELPER) += bootrom.o save_boot_param.o
> obj-tpl-$(CONFIG_ROCKCHIP_BROM_HELPER) += bootrom.o save_boot_param.o
>
> obj-tpl-$(CONFIG_ROCKCHIP_RK3188) += rk3188-board-tpl.o
> +obj-tpl-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board-tpl.o
> obj-tpl-$(CONFIG_ROCKCHIP_RK3368) += rk3368-board-tpl.o
>
> obj-spl-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o
> diff --git a/arch/arm/mach-rockchip/rk3288-board-spl.c b/arch/arm/mach-rockchip/rk3288-board-spl.c
> index 6b7bf85..febc1ef 100644
> --- a/arch/arm/mach-rockchip/rk3288-board-spl.c
> +++ b/arch/arm/mach-rockchip/rk3288-board-spl.c
> @@ -243,12 +243,15 @@ void board_init_f(ulong dummy)
> }
> #endif
>
> +#if !defined(CONFIG_SUPPORT_TPL)
Should this be CONFIG_TPL_BUILD?
> debug("\nspl:init dram\n");
> ret = uclass_get_device(UCLASS_RAM, 0, &dev);
> if (ret) {
> debug("DRAM init failed: %d\n", ret);
> return;
> }
> +#endif
> +
> #if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_SPL_BOARD_INIT)
> back_to_bootrom();
> #endif
Could this be done using BOOT_DEVICE_BOOTROM?
> diff --git a/arch/arm/mach-rockchip/rk3288-board-tpl.c b/arch/arm/mach-rockchip/rk3288-board-tpl.c
> new file mode 100644
> index 0000000..7a7fd05
> --- /dev/null
> +++ b/arch/arm/mach-rockchip/rk3288-board-tpl.c
> @@ -0,0 +1,124 @@
> +/*
> + * (C) Copyright 2015 Google, Inc
Are you sure?
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <debug_uart.h>
> +#include <dm.h>
> +#include <ram.h>
> +#include <spl.h>
> +#include <version.h>
> +#include <asm/io.h>
> +#include <asm/arch/bootrom.h>
> +#include <asm/arch/clock.h>
> +#include <asm/arch/periph.h>
> +#include <asm/arch/pmu_rk3288.h>
> +#include <asm/arch/timer.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +/* read L2 control register (L2CTLR) */
> +static inline uint32_t read_l2ctlr(void)
Could this be shared between rk3288-board-spl.c and rk3288-board-tpl.c?
I am not particularily keen on duplicating code.
An even better idea: can this mave a armv7-wide function that can be
shared across all cores that need to read/write the L2CTRL in p15?
I've found the same inline assemly in a few other places...
> +{
> + uint32_t val = 0;
> +
> + asm volatile ("mrc p15, 1, %0, c9, c0, 2" : "=r" (val));
> +
> + return val;
> +}
> +
> +/* write L2 control register (L2CTLR) */
> +static inline void write_l2ctlr(uint32_t val)
Same as above.
> +{
> + /*
> + * Note: L2CTLR can only be written when the L2 memory system
> + * is idle, ie before the MMU is enabled.
> + */
> + asm volatile("mcr p15, 1, %0, c9, c0, 2" : : "r" (val) : "memory");
> + isb();
> +}
> +
> +static void configure_l2ctlr(void)
> +{
> + uint32_t l2ctlr;
> +
> + l2ctlr = read_l2ctlr();
> + l2ctlr &= 0xfffc0000; /* clear bit0~bit17 */
> +
> + /*
> + * Data RAM write latency: 2 cycles
> + * Data RAM read latency: 2 cycles
> + * Data RAM setup latency: 1 cycle
> + * Tag RAM write latency: 1 cycle
> + * Tag RAM read latency: 1 cycle
> + * Tag RAM setup latency: 1 cycle
> + */
> + l2ctlr |= (1 << 3 | 1 << 0);
> + write_l2ctlr(l2ctlr);
> +}
> +
> +
> +void board_init_f(ulong dummy)
> +{
> + struct udevice *dev;
> + int ret;
> +
> + /* Example code showing how to enable the debug UART on RK3288 */
> +#include <asm/arch/grf_rk3288.h>
Please don't include header files in the middle of a function.
> + /* Enable early UART on the RK3288 */
> +#define GRF_BASE 0xff770000
Please don't define preprocessor macros in the middle of a function.
> + struct rk3288_grf * const grf = (void *)GRF_BASE;
> +
> + rk_clrsetreg(&grf->gpio7ch_iomux, GPIO7C7_MASK << GPIO7C7_SHIFT |
> + GPIO7C6_MASK << GPIO7C6_SHIFT,
> + GPIO7C7_UART2DBG_SOUT << GPIO7C7_SHIFT |
> + GPIO7C6_UART2DBG_SIN << GPIO7C6_SHIFT);
> + /*
> + * Debug UART can be used from here if required:
> + *
> + * debug_uart_init();
> + * printch('a');
> + * printhex8(0x1234);
> + * printascii("string");
> + */
> + debug_uart_init();
> +
> + ret = spl_early_init();
> + if (ret) {
> + debug("spl_early_init() failed: %d\n", ret);
> + hang();
> + }
> +
> + rockchip_timer_init();
> + configure_l2ctlr();
> +
> + ret = rockchip_get_clk(&dev);
> + if (ret) {
> + debug("CLK init failed: %d\n", ret);
> + return;
> + }
> +
> + ret = uclass_get_device(UCLASS_RAM, 0, &dev);
> + if (ret) {
> + debug("DRAM init failed: %d\n", ret);
> + return;
> + }
> +}
> +
> +void board_return_to_bootrom(void)
> +{
> + back_to_bootrom();
> +}
> +
> +u32 spl_boot_device(void)
> +{
> + return BOOT_DEVICE_BOOTROM;
> +}
> +
> +void spl_board_init(void)
> +{
> + puts("\nU-Boot TPL " PLAIN_VERSION " (" U_BOOT_DATE " - " \
> + U_BOOT_TIME ")\n");
> +}
> diff --git a/arch/arm/mach-rockchip/rk3288/Kconfig b/arch/arm/mach-rockchip/rk3288/Kconfig
> index 4ad2940..833073d 100644
> --- a/arch/arm/mach-rockchip/rk3288/Kconfig
> +++ b/arch/arm/mach-rockchip/rk3288/Kconfig
> @@ -87,6 +87,21 @@ config TARGET_POPMETAL_RK3288
> config TARGET_VYASA_RK3288
> bool "Vyasa-RK3288"
> select BOARD_LATE_INIT
> + select TPL
> + select SUPPORT_TPL
> + select TPL_DM
> + select TPL_REGMAP
> + select TPL_SYSCON
> + select TPL_CLK
> + select TPL_RAM
> + select TPL_OF_PLATDATA
> + select TPL_OF_CONTROL
> + select TPL_BOOTROM_SUPPORT
> + select ROCKCHIP_BROM_HELPER
> + select TPL_DRIVERS_MISC_SUPPORT
> + select TPL_LIBCOMMON_SUPPORT
> + select TPL_LIBGENERIC_SUPPORT
> + select TPL_SERIAL_SUPPORT
> help
> Vyasa is a RK3288-based development board with 2 USB ports,
> HDMI, VGA, micro-SD card, audio, WiFi and Gigabit Ethernet, It
> diff --git a/configs/vyasa-rk3288_defconfig b/configs/vyasa-rk3288_defconfig
> index 7db7b0b..239409f 100644
> --- a/configs/vyasa-rk3288_defconfig
> +++ b/configs/vyasa-rk3288_defconfig
> @@ -1,4 +1,6 @@
> CONFIG_ARM=y
> +# CONFIG_SPL_USE_ARCH_MEMCPY is not set
> +# CONFIG_SPL_USE_ARCH_MEMSET is not set
> CONFIG_ARCH_ROCKCHIP=y
> CONFIG_SYS_MALLOC_F_LEN=0x2000
> CONFIG_ROCKCHIP_RK3288=y
> diff --git a/doc/README.rockchip b/doc/README.rockchip
> index 12fec38..4b7be0b 100644
> --- a/doc/README.rockchip
> +++ b/doc/README.rockchip
> @@ -150,6 +150,24 @@ Note: rk3036 SDMMC and debug uart use the same iomux, so if you boot from SD, th
> debug uart must be disabled
>
>
> +Booting from an SD card on RK3288 with TPL
> +==========================================
> +
> +Since the size of SPL can't be exceeded 0x8000 bytes in RK3288, it is not possible add
> +new SPL features like Falcon mode or etc.
> +
> +So introduce TPL so-that adding new features to SPL is possible because now TPL should
> +run minimal with code like DDR, clock etc and rest of new features in SPL.
> +
> +As of now TPL is added on Vyasa-RK3288 board.
> +
> +To write an image that boots from an SD card (assumed to be /dev/mmcblk0):
> +
> + ./tools/mkimage -n rk3288 -T rksd -d ./tpl/u-boot-tpl.bin out &&
> + cat ./spl/u-boot-spl-dtb.bin >> out &&
> + sudo dd if=out of=/dev/mmcblk0 seek=64 &&
> + sudo dd if=u-boot-dtb.img of=/dev/mmcblk0 seek=256
> +
> Booting from an SD card on RK3188
> =================================
>
> diff --git a/include/configs/rk3288_common.h b/include/configs/rk3288_common.h
> index ade6caf..e3e59c2 100644
> --- a/include/configs/rk3288_common.h
> +++ b/include/configs/rk3288_common.h
> @@ -33,7 +33,13 @@
> #define CONFIG_SYS_INIT_SP_ADDR 0x00100000
> #define CONFIG_SYS_LOAD_ADDR 0x00800800
> #define CONFIG_SPL_STACK 0xff718000
> -#define CONFIG_SPL_TEXT_BASE 0xff704004
> +#ifdef CONFIG_TPL_BUILD
> +# define CONFIG_SPL_TEXT_BASE 0xff704004
Could you use TPL_TEXT_BASE (see common/spl/Kconfig)?
> +#elif defined(CONFIG_SPL_BUILD) && defined(CONFIG_TPL_BOOTROM_SUPPORT)
> +# define CONFIG_SPL_TEXT_BASE 0x0
> +#else
> +# define CONFIG_SPL_TEXT_BASE 0xff704004
> +#endif
>
> /* MMC/SD IP block */
> #define CONFIG_BOUNCE_BUFFER
>
More information about the U-Boot
mailing list