X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=arch%2Farm%2Fmach-mvebu%2Fspl.c;h=0879873b9725828c2fd5e4b20437de0f2d102b8a;hb=af0135928eea060422c61519f3bd5eec27fd0e56;hp=e65f6ca03ed6a4c2de85edebe5b283ce29fe3b75;hpb=413978d118bb7d7b0a8488d97d802f2899cd81ce;p=u-boot diff --git a/arch/arm/mach-mvebu/spl.c b/arch/arm/mach-mvebu/spl.c index e65f6ca03e..0879873b97 100644 --- a/arch/arm/mach-mvebu/spl.c +++ b/arch/arm/mach-mvebu/spl.c @@ -1,10 +1,13 @@ /* - * Copyright (C) 2014 Stefan Roese + * Copyright (C) 2014-2016 Stefan Roese * * SPDX-License-Identifier: GPL-2.0+ */ #include +#include +#include +#include #include #include #include @@ -12,19 +15,57 @@ DECLARE_GLOBAL_DATA_PTR; +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: + case BOOT_FROM_MMC_ALT: + return BOOT_DEVICE_MMC1; +#endif + case BOOT_FROM_UART: + return BOOT_DEVICE_UART; + case BOOT_FROM_SPI: + default: + return BOOT_DEVICE_SPI; + }; +} + u32 spl_boot_device(void) { - /* Right now only booting via SPI NOR flash is supported */ - return BOOT_DEVICE_SPI; + return get_boot_device(); } -void board_init_f(ulong dummy) +#ifdef CONFIG_SPL_MMC_SUPPORT +u32 spl_boot_mode(void) { - /* Set global data pointer */ - gd = &gdata; + return MMCSD_MODE_RAW; +} +#endif - /* Linux expects the internal registers to be at 0xf1000000 */ - arch_cpu_init(); +void board_init_f(ulong dummy) +{ + int ret; /* * Pin muxing needs to be done before UART output, since @@ -33,6 +74,27 @@ void board_init_f(ulong dummy) */ board_early_init_f(); + /* Example code showing how to enable the debug UART on MVEBU */ +#ifdef EARLY_UART + /* + * Debug UART can be used from here if required: + * + * debug_uart_init(); + * printch('a'); + * printhex8(0x1234); + * printascii("string"); + */ +#endif + + ret = spl_init(); + if (ret) { + debug("spl_init() failed: %d\n", ret); + hang(); + } + + /* Use special translation offset for SPL */ + dm_set_translation_offset(0xd0000000 - 0xf1000000); + preloader_console_init(); timer_init(); @@ -43,5 +105,17 @@ void board_init_f(ulong dummy) /* Setup DDR */ ddr3_init(); - board_init_r(NULL, 0); + /* + * 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. + */ + if (get_boot_device() == BOOT_DEVICE_UART) + return_to_bootrom(); }