android13/u-boot/arch/arm/mach-rockchip/tpl.c

184 lines
3.8 KiB
C
Raw Normal View History

2024-06-22 08:45:49 -04:00
/*
* (C) Copyright 2017 Rockchip Electronics Co., Ltd
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <debug_uart.h>
#include <dm.h>
#include <ns16550.h>
#include <ram.h>
#include <spl.h>
#include <version.h>
#include <asm/io.h>
#include <asm/arch/bootrom.h>
#include <asm/arch/uart.h>
#include <asm/arch-rockchip/sys_proto.h>
#ifndef CONFIG_TPL_LIBCOMMON_SUPPORT
#define CONFIG_SYS_NS16550_COM1 CONFIG_DEBUG_UART_BASE
void puts(const char *str)
{
while (*str)
putc(*str++);
}
void putc(char c)
{
if (c == '\n')
NS16550_putc((NS16550_t)(CONFIG_SYS_NS16550_COM1), '\r');
NS16550_putc((NS16550_t)(CONFIG_SYS_NS16550_COM1), c);
}
#endif /* CONFIG_TPL_LIBCOMMON_SUPPORT */
#ifndef CONFIG_TPL_LIBGENERIC_SUPPORT
int __weak timer_init(void)
{
return 0;
}
#ifdef CONFIG_ARM64
/* for ARM64,it don't have define timer_init and __udelay except lib/timer.c */
void __weak __udelay(unsigned long usec)
{
u64 i, j, count;
asm volatile ("MRS %0, CNTPCT_EL0" : "=r"(count));
i = count;
/* usec to count,24MHz */
j = usec * 24;
i += j;
while (1) {
asm volatile ("MRS %0, CNTPCT_EL0" : "=r"(count));
if (count > i)
break;
}
}
#else
void __weak __udelay(unsigned long usec)
{
u32 nowl, nowu;
u64 cur_count, end_count;
asm volatile("mrrc p15, 0, %0, %1, c14" : "=r" (nowl), "=r" (nowu));
cur_count = (u64)nowu << 32 | nowl;
/* usec to count,24MHz */
end_count = usec * 24 + cur_count;
while (1) {
asm volatile("mrrc p15, 0, %0, %1, c14" : "=r" (nowl),
"=r" (nowu));
cur_count = (u64)nowu << 32 | nowl;
if (cur_count > end_count)
break;
}
}
#endif /* CONFIG_ARM64 */
void udelay(unsigned long usec)
{
__udelay(usec);
}
void hang(void)
{
bootstage_error(BOOTSTAGE_ID_NEED_RESET);
for (;;)
;
}
#endif /* CONFIG_TPL_LIBGENERIC_SUPPORT */
u32 spl_boot_device(void)
{
return BOOT_DEVICE_BOOTROM;
}
__weak void rockchip_stimer_init(void)
{
#ifndef CONFIG_ARM64
asm volatile("mcr p15, 0, %0, c14, c0, 0"
: : "r"(COUNTER_FREQUENCY));
#elif CONFIG_IS_ENABLED(TINY_FRAMEWORK)
/*
* For ARM64,generally initialize CNTFRQ in start.S,
* but if defined CONFIG_TPL_TINY_FRAMEWORK should skip start.S.
* So initialize CNTFRQ to 24MHz here.
*/
asm volatile("msr CNTFRQ_EL0, %0"
: : "r" (COUNTER_FREQUENCY));
#endif
writel(0, CONFIG_ROCKCHIP_STIMER_BASE + 0x10);
writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE);
writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE + 4);
writel(1, CONFIG_ROCKCHIP_STIMER_BASE + 0x10);
}
__weak int arch_cpu_init(void)
{
return 0;
}
void board_init_f(ulong dummy)
{
#if defined(CONFIG_SPL_FRAMEWORK) && !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
struct udevice *dev;
int ret;
#endif
rockchip_stimer_init();
arch_cpu_init();
#define EARLY_DEBUG
#ifdef EARLY_DEBUG
/*
* Debug UART can be used from here if required:
*
* debug_uart_init();
* printch('a');
* printhex8(0x1234);
* printascii("string");
*/
debug_uart_init();
printascii("\nU-Boot TPL " PLAIN_VERSION " (" U_BOOT_DATE " - " \
U_BOOT_TIME ")\n");
#endif
#if defined(CONFIG_SPL_FRAMEWORK) && !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
ret = spl_early_init();
if (ret) {
debug("spl_early_init() failed: %d\n", ret);
hang();
}
#endif
/* Init ARM arch timer */
timer_init();
#if defined(CONFIG_SPL_FRAMEWORK) && !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
ret = uclass_get_device(UCLASS_RAM, 0, &dev);
if (ret) {
printf("DRAM init failed: %d\n", ret);
return;
}
#else
sdram_init();
#endif
#if defined(CONFIG_TPL_ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_TPL_BOARD_INIT)
back_to_bootrom(BROM_BOOT_NEXTSTAGE);
#endif
}
#if !(defined(CONFIG_SPL_FRAMEWORK) && !CONFIG_IS_ENABLED(TINY_FRAMEWORK))
/* Place Holders */
void board_init_r(gd_t *id, ulong dest_addr)
{
/*
* Function attribute is no-return
* This Function never executes
*/
while (1)
;
}
#endif