Message ID | 1509001896-7182-2-git-send-email-kever.yang@rock-chips.com |
---|---|
State | Superseded |
Delegated to: | Philipp Tomsich |
Headers | show |
Series | rockchip: enable TPL/SPL for rk3328 | expand |
> rk3328 tpl suppose to init ddr sdram and then back to bootrom. > > Signed-off-by: Kever Yang <kever.yang@rock-chips.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 > Acked-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
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; > + } > +} >
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"); + + /* 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); +} + +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(); + + 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; + } +}
rk3328 tpl suppose to init ddr sdram and then back to bootrom. Signed-off-by: Kever Yang <kever.yang@rock-chips.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