summaryrefslogtreecommitdiff
path: root/arch/arm/mach-mvebu/spl.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2015-10-20 21:59:40 -0400
committerTom Rini <trini@konsulko.com>2015-10-20 21:59:40 -0400
commite8d124fae0f3dff87348c989aa65ecf9b6eadc14 (patch)
treeff4f4709e54cde4d97349463c335d00f2d631e42 /arch/arm/mach-mvebu/spl.c
parentfd8133b725198978865ead730ff20d3991e05f20 (diff)
parent5b37212a3d78f546b5ef3f97a75155b3a0fd88cb (diff)
Merge git://git.denx.de/u-boot-marvell
Diffstat (limited to 'arch/arm/mach-mvebu/spl.c')
-rw-r--r--arch/arm/mach-mvebu/spl.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/arch/arm/mach-mvebu/spl.c b/arch/arm/mach-mvebu/spl.c
index af61ded42e..0ab729aa5d 100644
--- a/arch/arm/mach-mvebu/spl.c
+++ b/arch/arm/mach-mvebu/spl.c
@@ -31,11 +31,18 @@ u32 spl_boot_mode(void)
void board_init_f(ulong dummy)
{
- /* Set global data pointer */
- gd = &gdata;
+#ifndef CONFIG_MVEBU_BOOTROM_UARTBOOT
+ /*
+ * Only call arch_cpu_init() when not returning to the
+ * Marvell BootROM, which is done when booting via
+ * the xmodem protocol (kwboot tool). Otherwise the
+ * internal register will get remapped and the BootROM
+ * can't continue to run correctly.
+ */
/* Linux expects the internal registers to be at 0xf1000000 */
arch_cpu_init();
+#endif
/*
* Pin muxing needs to be done before UART output, since
@@ -54,5 +61,18 @@ void board_init_f(ulong dummy)
/* Setup DDR */
ddr3_init();
- board_init_r(NULL, 0);
+#ifdef CONFIG_MVEBU_BOOTROM_UARTBOOT
+ /*
+ * Return to the BootROM to continue the Marvell xmodem
+ * UART boot protocol. As initiated by the kwboot tool.
+ *
+ * This can only be done by the BootROM and not by the
+ * U-Boot SPL infrastructure, since the beginning of the
+ * image is already read and interpreted by the BootROM.
+ * SPL has no chance to receive this information. So we
+ * need to return to the BootROM to enable this xmodem
+ * UART download.
+ */
+ return_to_bootrom();
+#endif
}