mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-10 06:43:28 +09:00
![Tom Rini](/assets/img/avatar_default.png)
When U-Boot started using SPDX tags we were among the early adopters and there weren't a lot of other examples to borrow from. So we picked the area of the file that usually had a full license text and replaced it with an appropriate SPDX-License-Identifier: entry. Since then, the Linux Kernel has adopted SPDX tags and they place it as the very first line in a file (except where shebangs are used, then it's second line) and with slightly different comment styles than us. In part due to community overlap, in part due to better tag visibility and in part for other minor reasons, switch over to that style. This commit changes all instances where we have a single declared license in the tag as both the before and after are identical in tag contents. There's also a few places where I found we did not have a tag and have introduced one. Signed-off-by: Tom Rini <trini@konsulko.com>
177 lines
4.4 KiB
C
177 lines
4.4 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* (C) Copyright 2016 Rockchip Electronics Co., Ltd
|
|
* (C) Copyright 2017 Theobroma Systems Design und Consulting GmbH
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <asm/arch/bootrom.h>
|
|
#include <asm/arch/clock.h>
|
|
#include <asm/arch/grf_rk3399.h>
|
|
#include <asm/arch/hardware.h>
|
|
#include <asm/arch/periph.h>
|
|
#include <asm/io.h>
|
|
#include <debug_uart.h>
|
|
#include <dm.h>
|
|
#include <dm/pinctrl.h>
|
|
#include <ram.h>
|
|
#include <spl.h>
|
|
#include <syscon.h>
|
|
|
|
void board_return_to_bootrom(void)
|
|
{
|
|
back_to_bootrom(BROM_BOOT_NEXTSTAGE);
|
|
}
|
|
|
|
static const char * const boot_devices[BROM_LAST_BOOTSOURCE + 1] = {
|
|
[BROM_BOOTSOURCE_EMMC] = "/sdhci@fe330000",
|
|
[BROM_BOOTSOURCE_SPINOR] = "/spi@ff1d0000",
|
|
[BROM_BOOTSOURCE_SD] = "/dwmmc@fe320000",
|
|
};
|
|
|
|
const char *board_spl_was_booted_from(void)
|
|
{
|
|
u32 bootdevice_brom_id = readl(RK3399_BROM_BOOTSOURCE_ID_ADDR);
|
|
const char *bootdevice_ofpath = NULL;
|
|
|
|
if (bootdevice_brom_id < ARRAY_SIZE(boot_devices))
|
|
bootdevice_ofpath = boot_devices[bootdevice_brom_id];
|
|
|
|
if (bootdevice_ofpath)
|
|
debug("%s: brom_bootdevice_id %x maps to '%s'\n",
|
|
__func__, bootdevice_brom_id, bootdevice_ofpath);
|
|
else
|
|
debug("%s: failed to resolve brom_bootdevice_id %x\n",
|
|
__func__, bootdevice_brom_id);
|
|
|
|
return bootdevice_ofpath;
|
|
}
|
|
|
|
u32 spl_boot_device(void)
|
|
{
|
|
u32 boot_device = BOOT_DEVICE_MMC1;
|
|
|
|
if (CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM))
|
|
return BOOT_DEVICE_BOOTROM;
|
|
|
|
return boot_device;
|
|
}
|
|
|
|
#define TIMER_CHN10_BASE 0xff8680a0
|
|
#define TIMER_END_COUNT_L 0x00
|
|
#define TIMER_END_COUNT_H 0x04
|
|
#define TIMER_INIT_COUNT_L 0x10
|
|
#define TIMER_INIT_COUNT_H 0x14
|
|
#define TIMER_CONTROL_REG 0x1c
|
|
|
|
#define TIMER_EN 0x1
|
|
#define TIMER_FMODE (0 << 1)
|
|
#define TIMER_RMODE (1 << 1)
|
|
|
|
void secure_timer_init(void)
|
|
{
|
|
writel(0xffffffff, TIMER_CHN10_BASE + TIMER_END_COUNT_L);
|
|
writel(0xffffffff, TIMER_CHN10_BASE + TIMER_END_COUNT_H);
|
|
writel(0, TIMER_CHN10_BASE + TIMER_INIT_COUNT_L);
|
|
writel(0, TIMER_CHN10_BASE + TIMER_INIT_COUNT_H);
|
|
writel(TIMER_EN | TIMER_FMODE, TIMER_CHN10_BASE + TIMER_CONTROL_REG);
|
|
}
|
|
|
|
void board_debug_uart_init(void)
|
|
{
|
|
#define GRF_BASE 0xff770000
|
|
struct rk3399_grf_regs * const grf = (void *)GRF_BASE;
|
|
|
|
#if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff180000)
|
|
/* Enable early UART0 on the RK3399 */
|
|
rk_clrsetreg(&grf->gpio2c_iomux,
|
|
GRF_GPIO2C0_SEL_MASK,
|
|
GRF_UART0BT_SIN << GRF_GPIO2C0_SEL_SHIFT);
|
|
rk_clrsetreg(&grf->gpio2c_iomux,
|
|
GRF_GPIO2C1_SEL_MASK,
|
|
GRF_UART0BT_SOUT << GRF_GPIO2C1_SEL_SHIFT);
|
|
#else
|
|
/* Enable early UART2 channel C on the RK3399 */
|
|
rk_clrsetreg(&grf->gpio4c_iomux,
|
|
GRF_GPIO4C3_SEL_MASK,
|
|
GRF_UART2DGBC_SIN << GRF_GPIO4C3_SEL_SHIFT);
|
|
rk_clrsetreg(&grf->gpio4c_iomux,
|
|
GRF_GPIO4C4_SEL_MASK,
|
|
GRF_UART2DBGC_SOUT << GRF_GPIO4C4_SEL_SHIFT);
|
|
/* Set channel C as UART2 input */
|
|
rk_clrsetreg(&grf->soc_con7,
|
|
GRF_UART_DBG_SEL_MASK,
|
|
GRF_UART_DBG_SEL_C << GRF_UART_DBG_SEL_SHIFT);
|
|
#endif
|
|
}
|
|
|
|
void board_init_f(ulong dummy)
|
|
{
|
|
struct udevice *pinctrl;
|
|
struct udevice *dev;
|
|
struct rk3399_pmusgrf_regs *sgrf;
|
|
struct rk3399_grf_regs *grf;
|
|
int ret;
|
|
|
|
#define EARLY_UART
|
|
#ifdef EARLY_UART
|
|
/*
|
|
* Debug UART can be used from here if required:
|
|
*
|
|
* debug_uart_init();
|
|
* printch('a');
|
|
* printhex8(0x1234);
|
|
* printascii("string");
|
|
*/
|
|
debug_uart_init();
|
|
printascii("U-Boot SPL board init");
|
|
#endif
|
|
|
|
ret = spl_early_init();
|
|
if (ret) {
|
|
debug("spl_early_init() failed: %d\n", ret);
|
|
hang();
|
|
}
|
|
|
|
/*
|
|
* Disable DDR and SRAM security regions.
|
|
*
|
|
* As we are entered from the BootROM, the region from
|
|
* 0x0 through 0xfffff (i.e. the first MB of memory) will
|
|
* be protected. This will cause issues with the DW_MMC
|
|
* driver, which tries to DMA from/to the stack (likely)
|
|
* located in this range.
|
|
*/
|
|
sgrf = syscon_get_first_range(ROCKCHIP_SYSCON_PMUSGRF);
|
|
rk_clrsetreg(&sgrf->ddr_rgn_con[16], 0x1ff, 0);
|
|
rk_clrreg(&sgrf->slv_secure_con4, 0x2000);
|
|
|
|
/* eMMC clock generator: disable the clock multipilier */
|
|
grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
|
|
rk_clrreg(&grf->emmccore_con[11], 0x0ff);
|
|
|
|
secure_timer_init();
|
|
|
|
ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
|
|
if (ret) {
|
|
debug("Pinctrl init failed: %d\n", ret);
|
|
return;
|
|
}
|
|
|
|
ret = uclass_get_device(UCLASS_RAM, 0, &dev);
|
|
if (ret) {
|
|
debug("DRAM init failed: %d\n", ret);
|
|
return;
|
|
}
|
|
}
|
|
|
|
#ifdef CONFIG_SPL_LOAD_FIT
|
|
int board_fit_config_name_match(const char *name)
|
|
{
|
|
/* Just empty function now - can't decide what to choose */
|
|
debug("%s: %s\n", __func__, name);
|
|
|
|
return 0;
|
|
}
|
|
#endif
|