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