mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-21 04:14:34 +00:00

if (reg >> BOOT_MODE_ALT_SHIFT) condition rules out alternative jtag boot mode which is 0. When 0 was used origin(HW) boot mode was used instead. That's why directly fill reg variable with requested boot mode and don't let code to read value back. "else" part of code remain unchanged. Reviewed-by: Sean Anderson <sean.anderson@linux.dev> Signed-off-by: Michal Simek <michal.simek@amd.com> Link: https://lore.kernel.org/r/ed51a9d51948ab939a53e0b9dc6c2d2546f97a4f.1710933505.git.michal.simek@amd.com
142 lines
2.8 KiB
C
142 lines
2.8 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Copyright 2015 - 2016 Xilinx, Inc.
|
|
*
|
|
* Michal Simek <michal.simek@amd.com>
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <image.h>
|
|
#include <init.h>
|
|
#include <log.h>
|
|
#include <semihosting.h>
|
|
#include <spl.h>
|
|
#include <linux/delay.h>
|
|
|
|
#include <asm/io.h>
|
|
#include <asm/spl.h>
|
|
#include <asm/arch/hardware.h>
|
|
#include <asm/arch/ecc_spl_init.h>
|
|
#include <asm/arch/psu_init_gpl.h>
|
|
#include <asm/arch/sys_proto.h>
|
|
|
|
#if defined(CONFIG_DEBUG_UART_BOARD_INIT)
|
|
void board_debug_uart_init(void)
|
|
{
|
|
psu_uboot_init();
|
|
}
|
|
#endif
|
|
|
|
void board_init_f(ulong dummy)
|
|
{
|
|
#if !defined(CONFIG_DEBUG_UART_BOARD_INIT)
|
|
psu_uboot_init();
|
|
#endif
|
|
|
|
board_early_init_r();
|
|
#ifdef CONFIG_SPL_ZYNQMP_DRAM_ECC_INIT
|
|
zynqmp_ecc_init();
|
|
#endif
|
|
}
|
|
|
|
static void ps_mode_reset(ulong mode)
|
|
{
|
|
writel(mode << ZYNQMP_CRL_APB_BOOT_PIN_CTRL_OUT_EN_SHIFT,
|
|
&crlapb_base->boot_pin_ctrl);
|
|
udelay(5);
|
|
writel(mode << ZYNQMP_CRL_APB_BOOT_PIN_CTRL_OUT_VAL_SHIFT |
|
|
mode << ZYNQMP_CRL_APB_BOOT_PIN_CTRL_OUT_EN_SHIFT,
|
|
&crlapb_base->boot_pin_ctrl);
|
|
}
|
|
|
|
/*
|
|
* Set default PS_MODE1 which is used for USB ULPI phy reset
|
|
* Also other resets can be connected to this certain pin
|
|
*/
|
|
#ifndef MODE_RESET
|
|
# define MODE_RESET PS_MODE1
|
|
#endif
|
|
|
|
#ifdef CONFIG_SPL_BOARD_INIT
|
|
void spl_board_init(void)
|
|
{
|
|
preloader_console_init();
|
|
ps_mode_reset(MODE_RESET);
|
|
board_init();
|
|
psu_post_config_data();
|
|
}
|
|
#endif
|
|
|
|
static u32 jtag_boot_device(void)
|
|
{
|
|
return semihosting_enabled() ? BOOT_DEVICE_SMH : BOOT_DEVICE_RAM;
|
|
}
|
|
|
|
void board_boot_order(u32 *spl_boot_list)
|
|
{
|
|
spl_boot_list[0] = spl_boot_device();
|
|
|
|
if (spl_boot_list[0] == BOOT_DEVICE_MMC1)
|
|
spl_boot_list[1] = BOOT_DEVICE_MMC2;
|
|
if (spl_boot_list[0] == BOOT_DEVICE_MMC2)
|
|
spl_boot_list[1] = BOOT_DEVICE_MMC1;
|
|
|
|
spl_boot_list[2] = jtag_boot_device();
|
|
}
|
|
|
|
u32 spl_boot_device(void)
|
|
{
|
|
u32 reg = 0;
|
|
u8 bootmode;
|
|
|
|
#if defined(CONFIG_SPL_ZYNQMP_ALT_BOOTMODE_ENABLED)
|
|
/* Change default boot mode at run-time */
|
|
reg = CONFIG_SPL_ZYNQMP_ALT_BOOTMODE;
|
|
writel(CONFIG_SPL_ZYNQMP_ALT_BOOTMODE << BOOT_MODE_ALT_SHIFT,
|
|
&crlapb_base->boot_mode);
|
|
#else
|
|
reg = readl(&crlapb_base->boot_mode);
|
|
if (reg >> BOOT_MODE_ALT_SHIFT)
|
|
reg >>= BOOT_MODE_ALT_SHIFT;
|
|
#endif
|
|
|
|
bootmode = reg & BOOT_MODES_MASK;
|
|
|
|
switch (bootmode) {
|
|
case JTAG_MODE:
|
|
return jtag_boot_device();
|
|
#ifdef CONFIG_SPL_MMC
|
|
case SD_MODE1:
|
|
case SD1_LSHFT_MODE: /* not working on silicon v1 */
|
|
return BOOT_DEVICE_MMC2;
|
|
case SD_MODE:
|
|
case EMMC_MODE:
|
|
return BOOT_DEVICE_MMC1;
|
|
#endif
|
|
#ifdef CONFIG_SPL_DFU
|
|
case USB_MODE:
|
|
return BOOT_DEVICE_DFU;
|
|
#endif
|
|
#ifdef CONFIG_SPL_SATA
|
|
case SW_SATA_MODE:
|
|
return BOOT_DEVICE_SATA;
|
|
#endif
|
|
#ifdef CONFIG_SPL_SPI
|
|
case QSPI_MODE_24BIT:
|
|
case QSPI_MODE_32BIT:
|
|
return BOOT_DEVICE_SPI;
|
|
#endif
|
|
default:
|
|
printf("Invalid Boot Mode:0x%x\n", bootmode);
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef CONFIG_SPL_OS_BOOT
|
|
int spl_start_uboot(void)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|