xref: /rk3399_rockchip-uboot/arch/arm/mach-zynqmp/spl.c (revision 1a4f6af8bfd44c8ae6e87a81ff125eed47042cc5)
1*09b32b41SAndrew F. Davis // SPDX-License-Identifier: GPL-2.0+
2*09b32b41SAndrew F. Davis /*
3*09b32b41SAndrew F. Davis  * Copyright 2015 - 2016 Xilinx, Inc.
4*09b32b41SAndrew F. Davis  *
5*09b32b41SAndrew F. Davis  * Michal Simek <michal.simek@xilinx.com>
6*09b32b41SAndrew F. Davis  */
7*09b32b41SAndrew F. Davis 
8*09b32b41SAndrew F. Davis #include <common.h>
9*09b32b41SAndrew F. Davis #include <debug_uart.h>
10*09b32b41SAndrew F. Davis #include <spl.h>
11*09b32b41SAndrew F. Davis 
12*09b32b41SAndrew F. Davis #include <asm/io.h>
13*09b32b41SAndrew F. Davis #include <asm/spl.h>
14*09b32b41SAndrew F. Davis #include <asm/arch/hardware.h>
15*09b32b41SAndrew F. Davis #include <asm/arch/sys_proto.h>
16*09b32b41SAndrew F. Davis 
board_init_f(ulong dummy)17*09b32b41SAndrew F. Davis void board_init_f(ulong dummy)
18*09b32b41SAndrew F. Davis {
19*09b32b41SAndrew F. Davis 	board_early_init_f();
20*09b32b41SAndrew F. Davis 	board_early_init_r();
21*09b32b41SAndrew F. Davis 
22*09b32b41SAndrew F. Davis #ifdef CONFIG_DEBUG_UART
23*09b32b41SAndrew F. Davis 	/* Uart debug for sure */
24*09b32b41SAndrew F. Davis 	debug_uart_init();
25*09b32b41SAndrew F. Davis 	puts("Debug uart enabled\n"); /* or printch() */
26*09b32b41SAndrew F. Davis #endif
27*09b32b41SAndrew F. Davis 	/* Delay is required for clocks to be propagated */
28*09b32b41SAndrew F. Davis 	udelay(1000000);
29*09b32b41SAndrew F. Davis 
30*09b32b41SAndrew F. Davis 	/* Clear the BSS */
31*09b32b41SAndrew F. Davis 	memset(__bss_start, 0, __bss_end - __bss_start);
32*09b32b41SAndrew F. Davis 
33*09b32b41SAndrew F. Davis 	/* No need to call timer init - it is empty for ZynqMP */
34*09b32b41SAndrew F. Davis 	board_init_r(NULL, 0);
35*09b32b41SAndrew F. Davis }
36*09b32b41SAndrew F. Davis 
ps_mode_reset(ulong mode)37*09b32b41SAndrew F. Davis static void ps_mode_reset(ulong mode)
38*09b32b41SAndrew F. Davis {
39*09b32b41SAndrew F. Davis 	writel(mode << ZYNQMP_CRL_APB_BOOT_PIN_CTRL_OUT_EN_SHIFT,
40*09b32b41SAndrew F. Davis 	       &crlapb_base->boot_pin_ctrl);
41*09b32b41SAndrew F. Davis 	udelay(5);
42*09b32b41SAndrew F. Davis 	writel(mode << ZYNQMP_CRL_APB_BOOT_PIN_CTRL_OUT_VAL_SHIFT |
43*09b32b41SAndrew F. Davis 	       mode << ZYNQMP_CRL_APB_BOOT_PIN_CTRL_OUT_EN_SHIFT,
44*09b32b41SAndrew F. Davis 	       &crlapb_base->boot_pin_ctrl);
45*09b32b41SAndrew F. Davis }
46*09b32b41SAndrew F. Davis 
47*09b32b41SAndrew F. Davis /*
48*09b32b41SAndrew F. Davis  * Set default PS_MODE1 which is used for USB ULPI phy reset
49*09b32b41SAndrew F. Davis  * Also other resets can be connected to this certain pin
50*09b32b41SAndrew F. Davis  */
51*09b32b41SAndrew F. Davis #ifndef MODE_RESET
52*09b32b41SAndrew F. Davis # define MODE_RESET	PS_MODE1
53*09b32b41SAndrew F. Davis #endif
54*09b32b41SAndrew F. Davis 
55*09b32b41SAndrew F. Davis #ifdef CONFIG_SPL_BOARD_INIT
spl_board_init(void)56*09b32b41SAndrew F. Davis void spl_board_init(void)
57*09b32b41SAndrew F. Davis {
58*09b32b41SAndrew F. Davis 	preloader_console_init();
59*09b32b41SAndrew F. Davis 	ps_mode_reset(MODE_RESET);
60*09b32b41SAndrew F. Davis 	board_init();
61*09b32b41SAndrew F. Davis }
62*09b32b41SAndrew F. Davis #endif
63*09b32b41SAndrew F. Davis 
spl_boot_device(void)64*09b32b41SAndrew F. Davis u32 spl_boot_device(void)
65*09b32b41SAndrew F. Davis {
66*09b32b41SAndrew F. Davis 	u32 reg = 0;
67*09b32b41SAndrew F. Davis 	u8 bootmode;
68*09b32b41SAndrew F. Davis 
69*09b32b41SAndrew F. Davis #if defined(CONFIG_SPL_ZYNQMP_ALT_BOOTMODE_ENABLED)
70*09b32b41SAndrew F. Davis 	/* Change default boot mode at run-time */
71*09b32b41SAndrew F. Davis 	writel(CONFIG_SPL_ZYNQMP_ALT_BOOTMODE << BOOT_MODE_ALT_SHIFT,
72*09b32b41SAndrew F. Davis 	       &crlapb_base->boot_mode);
73*09b32b41SAndrew F. Davis #endif
74*09b32b41SAndrew F. Davis 
75*09b32b41SAndrew F. Davis 	reg = readl(&crlapb_base->boot_mode);
76*09b32b41SAndrew F. Davis 	if (reg >> BOOT_MODE_ALT_SHIFT)
77*09b32b41SAndrew F. Davis 		reg >>= BOOT_MODE_ALT_SHIFT;
78*09b32b41SAndrew F. Davis 
79*09b32b41SAndrew F. Davis 	bootmode = reg & BOOT_MODES_MASK;
80*09b32b41SAndrew F. Davis 
81*09b32b41SAndrew F. Davis 	switch (bootmode) {
82*09b32b41SAndrew F. Davis 	case JTAG_MODE:
83*09b32b41SAndrew F. Davis 		return BOOT_DEVICE_RAM;
84*09b32b41SAndrew F. Davis #ifdef CONFIG_SPL_MMC_SUPPORT
85*09b32b41SAndrew F. Davis 	case SD_MODE1:
86*09b32b41SAndrew F. Davis 	case SD1_LSHFT_MODE: /* not working on silicon v1 */
87*09b32b41SAndrew F. Davis /* if both controllers enabled, then these two are the second controller */
88*09b32b41SAndrew F. Davis #if defined(CONFIG_ZYNQ_SDHCI0) && defined(CONFIG_ZYNQ_SDHCI1)
89*09b32b41SAndrew F. Davis 		return BOOT_DEVICE_MMC2;
90*09b32b41SAndrew F. Davis /* else, fall through, the one SDHCI controller that is enabled is number 1 */
91*09b32b41SAndrew F. Davis #endif
92*09b32b41SAndrew F. Davis 	case SD_MODE:
93*09b32b41SAndrew F. Davis 	case EMMC_MODE:
94*09b32b41SAndrew F. Davis 		return BOOT_DEVICE_MMC1;
95*09b32b41SAndrew F. Davis #endif
96*09b32b41SAndrew F. Davis #ifdef CONFIG_SPL_DFU
97*09b32b41SAndrew F. Davis 	case USB_MODE:
98*09b32b41SAndrew F. Davis 		return BOOT_DEVICE_DFU;
99*09b32b41SAndrew F. Davis #endif
100*09b32b41SAndrew F. Davis #ifdef CONFIG_SPL_SATA_SUPPORT
101*09b32b41SAndrew F. Davis 	case SW_SATA_MODE:
102*09b32b41SAndrew F. Davis 		return BOOT_DEVICE_SATA;
103*09b32b41SAndrew F. Davis #endif
104*09b32b41SAndrew F. Davis #ifdef CONFIG_SPL_SPI_SUPPORT
105*09b32b41SAndrew F. Davis 	case QSPI_MODE_24BIT:
106*09b32b41SAndrew F. Davis 	case QSPI_MODE_32BIT:
107*09b32b41SAndrew F. Davis 		return BOOT_DEVICE_SPI;
108*09b32b41SAndrew F. Davis #endif
109*09b32b41SAndrew F. Davis 	default:
110*09b32b41SAndrew F. Davis 		printf("Invalid Boot Mode:0x%x\n", bootmode);
111*09b32b41SAndrew F. Davis 		break;
112*09b32b41SAndrew F. Davis 	}
113*09b32b41SAndrew F. Davis 
114*09b32b41SAndrew F. Davis 	return 0;
115*09b32b41SAndrew F. Davis }
116*09b32b41SAndrew F. Davis 
117*09b32b41SAndrew F. Davis #ifdef CONFIG_SPL_OS_BOOT
spl_start_uboot(void)118*09b32b41SAndrew F. Davis int spl_start_uboot(void)
119*09b32b41SAndrew F. Davis {
120*09b32b41SAndrew F. Davis 	handoff_setup();
121*09b32b41SAndrew F. Davis 
122*09b32b41SAndrew F. Davis 	return 0;
123*09b32b41SAndrew F. Davis }
124*09b32b41SAndrew F. Davis #endif
125*09b32b41SAndrew F. Davis 
126*09b32b41SAndrew F. Davis #ifdef CONFIG_SPL_LOAD_FIT
board_fit_config_name_match(const char * name)127*09b32b41SAndrew F. Davis int board_fit_config_name_match(const char *name)
128*09b32b41SAndrew F. Davis {
129*09b32b41SAndrew F. Davis 	/* Just empty function now - can't decide what to choose */
130*09b32b41SAndrew F. Davis 	debug("%s: %s\n", __func__, name);
131*09b32b41SAndrew F. Davis 
132*09b32b41SAndrew F. Davis 	return 0;
133*09b32b41SAndrew F. Davis }
134*09b32b41SAndrew F. Davis #endif
135