xref: /openbmc/u-boot/arch/arm/mach-mvebu/spl.c (revision 72b7af5a04afc22913e943decc1733a25b8eefcf)
1  /*
2   * Copyright (C) 2014-2016 Stefan Roese <sr@denx.de>
3   *
4   * SPDX-License-Identifier:	GPL-2.0+
5   */
6  
7  #include <common.h>
8  #include <dm.h>
9  #include <debug_uart.h>
10  #include <fdtdec.h>
11  #include <spl.h>
12  #include <asm/io.h>
13  #include <asm/arch/cpu.h>
14  #include <asm/arch/soc.h>
15  
16  static u32 get_boot_device(void)
17  {
18  	u32 val;
19  	u32 boot_device;
20  
21  	/*
22  	 * First check, if UART boot-mode is active. This can only
23  	 * be done, via the bootrom error register. Here the
24  	 * MSB marks if the UART mode is active.
25  	 */
26  	val = readl(CONFIG_BOOTROM_ERR_REG);
27  	boot_device = (val & BOOTROM_ERR_MODE_MASK) >> BOOTROM_ERR_MODE_OFFS;
28  	debug("BOOTROM_REG=0x%08x boot_device=0x%x\n", val, boot_device);
29  #if defined(CONFIG_ARMADA_38X)
30  	/*
31  	 * If the bootrom error register contains any else than zeros
32  	 * in the first 8 bits it's an error condition. And in that case
33  	 * try to boot from UART.
34  	 */
35  	if (boot_device)
36  #else
37  	if (boot_device == BOOTROM_ERR_MODE_UART)
38  #endif
39  		return BOOT_DEVICE_UART;
40  
41  	/*
42  	 * Now check the SAR register for the strapped boot-device
43  	 */
44  	val = readl(CONFIG_SAR_REG);	/* SAR - Sample At Reset */
45  	boot_device = (val & BOOT_DEV_SEL_MASK) >> BOOT_DEV_SEL_OFFS;
46  	debug("SAR_REG=0x%08x boot_device=0x%x\n", val, boot_device);
47  	switch (boot_device) {
48  #if defined(CONFIG_ARMADA_38X)
49  	case BOOT_FROM_NAND:
50  		return BOOT_DEVICE_NAND;
51  #endif
52  #ifdef CONFIG_SPL_MMC_SUPPORT
53  	case BOOT_FROM_MMC:
54  	case BOOT_FROM_MMC_ALT:
55  		return BOOT_DEVICE_MMC1;
56  #endif
57  	case BOOT_FROM_UART:
58  #ifdef BOOT_FROM_UART_ALT
59  	case BOOT_FROM_UART_ALT:
60  #endif
61  		return BOOT_DEVICE_UART;
62  	case BOOT_FROM_SPI:
63  	default:
64  		return BOOT_DEVICE_SPI;
65  	};
66  }
67  
68  u32 spl_boot_device(void)
69  {
70  	return get_boot_device();
71  }
72  
73  #ifdef CONFIG_SPL_MMC_SUPPORT
74  u32 spl_boot_mode(const u32 boot_device)
75  {
76  	return MMCSD_MODE_RAW;
77  }
78  #endif
79  
80  void board_init_f(ulong dummy)
81  {
82  	int ret;
83  
84  	/*
85  	 * Pin muxing needs to be done before UART output, since
86  	 * on A38x the UART pins need some re-muxing for output
87  	 * to work.
88  	 */
89  	board_early_init_f();
90  
91  	/* Example code showing how to enable the debug UART on MVEBU */
92  #ifdef EARLY_UART
93  	/*
94  	 * Debug UART can be used from here if required:
95  	 *
96  	 * debug_uart_init();
97  	 * printch('a');
98  	 * printhex8(0x1234);
99  	 * printascii("string");
100  	 */
101  #endif
102  
103  	ret = spl_init();
104  	if (ret) {
105  		debug("spl_init() failed: %d\n", ret);
106  		hang();
107  	}
108  
109  	/* Use special translation offset for SPL */
110  	dm_set_translation_offset(0xd0000000 - 0xf1000000);
111  
112  	preloader_console_init();
113  
114  	timer_init();
115  
116  	/* Armada 375 does not support SerDes and DDR3 init yet */
117  #if !defined(CONFIG_ARMADA_375)
118  	/* First init the serdes PHY's */
119  	serdes_phy_config();
120  
121  	/* Setup DDR */
122  	ddr3_init();
123  #endif
124  
125  	/*
126  	 * Return to the BootROM to continue the Marvell xmodem
127  	 * UART boot protocol. As initiated by the kwboot tool.
128  	 *
129  	 * This can only be done by the BootROM and not by the
130  	 * U-Boot SPL infrastructure, since the beginning of the
131  	 * image is already read and interpreted by the BootROM.
132  	 * SPL has no chance to receive this information. So we
133  	 * need to return to the BootROM to enable this xmodem
134  	 * UART download.
135  	 *
136  	 * If booting from NAND lets let the BootROM load the
137  	 * rest of the bootloader.
138  	 */
139  	switch (get_boot_device()) {
140  		case BOOT_DEVICE_UART:
141  #if defined(CONFIG_ARMADA_38X)
142  		case BOOT_DEVICE_NAND:
143  #endif
144  			return_to_bootrom();
145  	}
146  }
147