arm: mvebu: Add option to use UART xmodem protocol via kwboot

This patch enables the use of the kwboot tool, to boot mainline U-Boot
on the Marvell Armada XP/38x SoC's. This is done by returning to the
SoC's BootROM after SPL has initialized the SDRAM. We need to make sure
to not reconfigure the internal register space and MBARs. Otherwise
the BootROM will not be able to continue after SPL jumps back to it.

To use this feature, please don't forget to change the BOOT_FROM line
in your board specfic kwbimage.cfg file this way:

    BOOT_FROM uart

Tested on these Marvell eval boards:
DB-MV784MP-GP - Armada XP
DB-88F6820-GP - Armada 38x

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Dirk Eibach <eibach@gdsys.de>
Cc: Kevin Smith <kevin.smith@elecsyscorp.com>
Cc: Luka Perkov <luka.perkov@sartura.hr>
diff --git a/arch/arm/mach-mvebu/spl.c b/arch/arm/mach-mvebu/spl.c
index af61ded..26ff1a2 100644
--- a/arch/arm/mach-mvebu/spl.c
+++ b/arch/arm/mach-mvebu/spl.c
@@ -34,8 +34,18 @@
 	/* 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 +64,20 @@
 	/* Setup DDR */
 	ddr3_init();
 
+#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
+
 	board_init_r(NULL, 0);
 }