arm: mvebu: Add runtime detection of UART (xmodem) boot-mode
authorStefan Roese <sr@denx.de>
Thu, 7 Jan 2016 13:12:04 +0000 (14:12 +0100)
committerStefan Roese <sr@denx.de>
Thu, 14 Jan 2016 13:08:59 +0000 (14:08 +0100)
This patch adds runtime detection of the Marvell UART boot-mode (xmodem
protocol). If this boot-mode is detected, SPL will return to the
BootROM to continue the UART booting.

With this patch its now possible, to generate a U-Boot image that
can be booted either from the strapped boot-device (e.g. SPI NOR, MMC,
etc) or via the xmodem protocol from the UART. In the UART case,
the kwboot tool will dynamically insert the UART boot-device type
into the image. And also patch the load address in the header, so
that the mkimage header will be skipped (as its not expected by the
Marvell BootROM).

This simplifies the development for Armada XP / 38x based boards.
As no special images need to be generated by selecting the
MVEBU_BOOTROM_UARTBOOT Kconfig option.

Since the Kconfig option MVEBU_BOOTROM_UARTBOOT is not needed any
more, its now completely removed.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Luka Perkov <luka.perkov@sartura.hr>
Cc: Dirk Eibach <dirk.eibach@gdsys.cc>
Cc: Phil Sutter <phil@nwl.cc>
Cc: Kevin Smith <kevin.smith@elecsyscorp.com>
Makefile
arch/arm/mach-mvebu/Kconfig
arch/arm/mach-mvebu/include/mach/soc.h
arch/arm/mach-mvebu/lowlevel_spl.S
arch/arm/mach-mvebu/spl.c
tools/kwboot.c

index 100de92eab59fc7e6a96e96005ac2fca9f67be0d..5882c30771ab980c702c6185eff745e0c42d2529 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -915,18 +915,8 @@ MKIMAGEFLAGS_u-boot.pbl = -n $(srctree)/$(CONFIG_SYS_FSL_PBL_RCW:"%"=%) \
 u-boot.img u-boot.kwb u-boot.pbl: u-boot.bin FORCE
        $(call if_changed,mkimage)
 
-# If the kwboot xmodem protocol is used, to boot U-Boot on the MVEBU
-# SoC's, the SPL U-Boot returns to the BootROM after it completes
-# the SDRAM setup. The BootROM expects no U-Boot header in the main
-# U-Boot image. So we need to combine SPL and u-boot.bin instead of
-# u-boot.img in this case.
-ifdef CONFIG_MVEBU_BOOTROM_UARTBOOT
-u-boot-spl.kwb: u-boot-dtb.bin spl/u-boot-spl.bin FORCE
-       $(call if_changed,mkimage)
-else
 u-boot-spl.kwb: u-boot-dtb.img spl/u-boot-spl.bin FORCE
        $(call if_changed,mkimage)
-endif
 
 MKIMAGEFLAGS_u-boot-dtb.img = $(MKIMAGEFLAGS_u-boot.img)
 
index d96b2ae540af591adf199715e2f108ef354316ca..a15c4b7669b262cb75a2cb53ec6f645450c6267b 100644 (file)
@@ -48,14 +48,4 @@ config SYS_VENDOR
 config SYS_SOC
        default "mvebu"
 
-config MVEBU_BOOTROM_UARTBOOT
-       bool "Use kwboot to boot via BootROM xmodem protocol"
-       help
-         This option provides support for booting via the Marvell
-         xmodem protocol, used by the kwboot tool.
-
-         Please don't forget to configure the boot device in
-         the board specific kwbimage.cfg file this way:
-             BOOT_FROM uart
-
 endif
index e27a36db1c688915df3434b0c2e10c983c68c452..c696fc6cec6817a666fb59bcc93ec67015960fd0 100644 (file)
 #define MVCPU_WIN_ENABLE       CPU_WIN_ENABLE
 #define MVCPU_WIN_DISABLE      CPU_WIN_DISABLE
 
+/* BootROM error register (also includes some status infos) */
+#define CONFIG_BOOTROM_ERR_REG (MVEBU_REGISTER(0x182d0))
+#define BOOTROM_ERR_MODE_OFFS  28
+#define BOOTROM_ERR_MODE_MASK  (0xf << BOOTROM_ERR_MODE_OFFS)
+#define BOOTROM_ERR_MODE_UART  0x6
+
 #if defined(CONFIG_ARMADA_38X)
 /* SAR values for Armada 38x */
 #define CONFIG_SAR_REG         (MVEBU_REGISTER(0x18600))
 #define SAR_BOOT_DEVICE_MASK   (0x1f << SAR_BOOT_DEVICE_OFFS)
 
 #define BOOT_DEV_SEL_OFFS      4
-#define BOOT_DEV_SEL_MASK      (0x1f << BOOT_DEV_SEL_OFFS)
+#define BOOT_DEV_SEL_MASK      (0x3f << BOOT_DEV_SEL_OFFS)
 
 #define BOOT_FROM_UART         0x28
 #define BOOT_FROM_SPI          0x32
index 2e2181ecea5ebc2ad656772ff6056b9f43b42a6b..49e0b906d583f52ad89fe48b98bd639ec1480241 100644 (file)
@@ -5,7 +5,6 @@
 #include <config.h>
 #include <linux/linkage.h>
 
-#ifdef CONFIG_MVEBU_BOOTROM_UARTBOOT
 ENTRY(save_boot_params)
        stmfd   sp!, {r0 - r12, lr}     /* @ save registers on stack */
        ldr     r12, =CONFIG_SPL_BOOTROM_SAVE
@@ -19,11 +18,6 @@ ENTRY(return_to_bootrom)
        mov     r0, #0x0                /* @ return value: 0x0 NO_ERR */
        ldmfd   sp!, {r0 - r12, pc}     /* @ restore regs and return */
 ENDPROC(return_to_bootrom)
-#else
-ENTRY(save_boot_params)
-       b       save_boot_params_ret
-ENDPROC(save_boot_params)
-#endif
 
 /*
  * cache_inv - invalidate Cache line
index 778996eff54b78e3f2d85325a7a91246b46e0649..0879873b9725828c2fd5e4b20437de0f2d102b8a 100644 (file)
@@ -20,8 +20,23 @@ static u32 get_boot_device(void)
        u32 val;
        u32 boot_device;
 
+       /*
+        * First check, if UART boot-mode is active. This can only
+        * be done, via the bootrom error register. Here the
+        * MSB marks if the UART mode is active.
+        */
+       val = readl(CONFIG_BOOTROM_ERR_REG);
+       boot_device = (val & BOOTROM_ERR_MODE_MASK) >> BOOTROM_ERR_MODE_OFFS;
+       debug("BOOTROM_REG=0x%08x boot_device=0x%x\n", val, boot_device);
+       if (boot_device == BOOTROM_ERR_MODE_UART)
+               return BOOT_DEVICE_UART;
+
+       /*
+        * Now check the SAR register for the strapped boot-device
+        */
        val = readl(CONFIG_SAR_REG);    /* SAR - Sample At Reset */
        boot_device = (val & BOOT_DEV_SEL_MASK) >> BOOT_DEV_SEL_OFFS;
+       debug("SAR_REG=0x%08x boot_device=0x%x\n", val, boot_device);
        switch (boot_device) {
 #ifdef CONFIG_SPL_MMC_SUPPORT
        case BOOT_FROM_MMC:
@@ -90,7 +105,6 @@ void board_init_f(ulong dummy)
        /* 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.
@@ -102,6 +116,6 @@ void board_init_f(ulong dummy)
         * need to return to the BootROM to enable this xmodem
         * UART download.
         */
-       return_to_bootrom();
-#endif
+       if (get_boot_device() == BOOT_DEVICE_UART)
+               return_to_bootrom();
 }
index c5f4492b5f7ab3d4a3b1a609740316cebcb7dae5..905ade3b01236d11e4727e32a354c9d866ca618a 100644 (file)
@@ -9,10 +9,14 @@
  *   2008. Chapter 24.2 "BootROM Firmware".
  */
 
+#include "kwbimage.h"
+#include "mkimage.h"
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdarg.h>
+#include <image.h>
 #include <libgen.h>
 #include <fcntl.h>
 #include <errno.h>
@@ -22,8 +26,6 @@
 #include <sys/mman.h>
 #include <sys/stat.h>
 
-#include "kwbimage.h"
-
 #ifdef __GNUC__
 #define PACKED __attribute((packed))
 #else
@@ -652,6 +654,14 @@ kwboot_img_patch_hdr(void *img, size_t size)
 
        hdr->blockid = IBR_HDR_UART_ID;
 
+       /*
+        * Subtract mkimage header size from destination address
+        * as this header is not expected by the Marvell BootROM.
+        * This way, the execution address is identical to the
+        * one the image is compiled for (TEXT_BASE).
+        */
+       hdr->destaddr = hdr->destaddr - sizeof(struct image_header);
+
        if (image_ver == 0) {
                struct main_hdr_v0 *hdr_v0 = img;