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