
On Thu, 26 Oct 2017, Kever Yang wrote:
rk3328 tpl suppose to init ddr sdram and then back to bootrom.
Signed-off-by: Kever Yang kever.yang@rock-chips.com Acked-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
arch/arm/mach-rockchip/Makefile | 1 + arch/arm/mach-rockchip/rk3328-board-tpl.c | 114 ++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 arch/arm/mach-rockchip/rk3328-board-tpl.c
diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile index cc3a63e..49bdd36 100644 --- a/arch/arm/mach-rockchip/Makefile +++ b/arch/arm/mach-rockchip/Makefile @@ -14,6 +14,7 @@ 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_RK3368) += rk3368-board-tpl.o obj-tpl-$(CONFIG_ROCKCHIP_RK322X) += rk322x-board-tpl.o +obj-tpl-$(CONFIG_ROCKCHIP_RK3328) += rk3328-board-tpl.o
obj-spl-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o obj-spl-$(CONFIG_ROCKCHIP_RK3188) += rk3188-board-spl.o diff --git a/arch/arm/mach-rockchip/rk3328-board-tpl.c b/arch/arm/mach-rockchip/rk3328-board-tpl.c new file mode 100644 index 0000000..1c74ff2 --- /dev/null +++ b/arch/arm/mach-rockchip/rk3328-board-tpl.c @@ -0,0 +1,114 @@ +/*
- (C) Copyright 2016 Rockchip Electronics Co., Ltd
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <debug_uart.h> +#include <dm.h> +#include <fdtdec.h> +#include <led.h> +#include <malloc.h> +#include <mmc.h> +#include <ram.h> +#include <spl.h> +#include <asm/gpio.h> +#include <asm/io.h> +#include <asm/arch/bootrom.h> +#include <asm/arch/clock.h> +#include <asm/arch/hardware.h> +#include <asm/arch/periph.h> +#include <asm/arch/sdram.h> +#include <asm/arch/timer.h> +#include <dm/pinctrl.h> +#include <dm/root.h> +#include <dm/test.h> +#include <dm/util.h> +#include <power/regulator.h> +#include <asm/arch/grf_rk3328.h> +#include <asm/arch/uart.h>
+#define CRU_BASE 0xFF440000 +#define GRF_BASE 0xFF100000 +#define UART2_BASE 0xFF130000 +#define STIMER_BASE_ADDR 0xFF1d0000 +#define CPU_TIMER_BASE (STIMER_BASE_ADDR + 0x20)
+void board_timer_init(void) +{
- /* Initialize CNTFRQ */
- __asm__ volatile ("LDR x0,=24000000");
- __asm__ volatile ("MSR CNTFRQ_EL0, x0");
This should be done by setting COUNTER_FREQUENCY and having start.s take care of this...
- /* Enable STimer1 for core */
- writel(0x0, CPU_TIMER_BASE + 0x0010);
- writel(0xffffffff, CPU_TIMER_BASE + 0x0000);
- writel(0xffffffff, CPU_TIMER_BASE + 0x0004);
- writel(0x1, CPU_TIMER_BASE + 0x0010);
Can we use the DM timer (same as for the RK3368) and not initialise the secure timer here? We should keep U-Boot and this initialisation separate, as ATF will take care of this (and U-Boot can just use a regular tick timer).
+}
+void board_debug_uart_init(void) +{
- struct rk3328_grf_regs * const grf = (void *)GRF_BASE;
- struct rk_uart * const uart = (void *)UART2_BASE;
- /* uart_sel_clk default select 24MHz */
- writel((3 << (8 + 16)) | (2 << 8), CRU_BASE + 0x148);
- /* init uart baud rate 1500000 */
- writel(0x83, &uart->lcr);
- writel(0x1, &uart->rbr);
- writel(0x3, &uart->lcr);
- /* Enable early UART2 */
- rk_clrsetreg(&grf->com_iomux,
IOMUX_SEL_UART2_MASK,
IOMUX_SEL_UART2_M1 << IOMUX_SEL_UART2_SHIFT);
- rk_clrsetreg(&grf->gpio2a_iomux,
GPIO2A0_SEL_MASK,
GPIO2A0_UART2_TX_M1 << GPIO2A0_SEL_SHIFT);
- rk_clrsetreg(&grf->gpio2a_iomux,
GPIO2A1_SEL_MASK,
GPIO2A1_UART2_RX_M1 << GPIO2A1_SEL_SHIFT);
- /* enable FIFO */
- writel(0x1, &uart->sfe);
+}
+void board_return_to_bootrom(void) +{
- back_to_bootrom();
+}
+u32 spl_boot_device(void) +{
- return BOOT_DEVICE_BOOTROM;
+}
+void board_init_f(ulong dummy) +{
- struct udevice *dev;
- int ret;
+#define EARLY_UART +#ifdef EARLY_UART
- debug_uart_init();
- printascii("U-Boot TPL board init\n");
+#endif
- board_timer_init();
If we use the DM timer, we don't have to do this any longer (see the RK3368 TPL support code).
- ret = spl_early_init();
- if (ret) {
printf("spl_early_init() failed: %d\n", ret);
hang();
- }
- ret = uclass_get_device(UCLASS_RAM, 0, &dev);
- if (ret) {
printf("DRAM init failed: %d\n", ret);
return;
- }
+}