1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright 2015 - 2016 Xilinx, Inc. 4 * 5 * Michal Simek <michal.simek@xilinx.com> 6 */ 7 8#include <common.h> 9#include <image.h> 10#include <init.h> 11#include <log.h> 12#include <spl.h> 13#include <linux/delay.h> 14 15#include <asm/io.h> 16#include <asm/spl.h> 17#include <asm/arch/hardware.h> 18#include <asm/arch/psu_init_gpl.h> 19#include <asm/arch/sys_proto.h> 20 21void board_init_f(ulong dummy) 22{ 23 board_early_init_f(); 24 board_early_init_r(); 25} 26 27static void ps_mode_reset(ulong mode) 28{ 29 writel(mode << ZYNQMP_CRL_APB_BOOT_PIN_CTRL_OUT_EN_SHIFT, 30 &crlapb_base->boot_pin_ctrl); 31 udelay(5); 32 writel(mode << ZYNQMP_CRL_APB_BOOT_PIN_CTRL_OUT_VAL_SHIFT | 33 mode << ZYNQMP_CRL_APB_BOOT_PIN_CTRL_OUT_EN_SHIFT, 34 &crlapb_base->boot_pin_ctrl); 35} 36 37/* 38 * Set default PS_MODE1 which is used for USB ULPI phy reset 39 * Also other resets can be connected to this certain pin 40 */ 41#ifndef MODE_RESET 42# define MODE_RESET PS_MODE1 43#endif 44 45#ifdef CONFIG_SPL_BOARD_INIT 46void spl_board_init(void) 47{ 48 preloader_console_init(); 49 ps_mode_reset(MODE_RESET); 50 board_init(); 51 psu_post_config_data(); 52} 53#endif 54 55void board_boot_order(u32 *spl_boot_list) 56{ 57 spl_boot_list[0] = spl_boot_device(); 58 59 if (spl_boot_list[0] == BOOT_DEVICE_MMC1) 60 spl_boot_list[1] = BOOT_DEVICE_MMC2; 61 if (spl_boot_list[0] == BOOT_DEVICE_MMC2) 62 spl_boot_list[1] = BOOT_DEVICE_MMC1; 63 64 spl_boot_list[2] = BOOT_DEVICE_RAM; 65} 66 67u32 spl_boot_device(void) 68{ 69 u32 reg = 0; 70 u8 bootmode; 71 72#if defined(CONFIG_SPL_ZYNQMP_ALT_BOOTMODE_ENABLED) 73 /* Change default boot mode at run-time */ 74 writel(CONFIG_SPL_ZYNQMP_ALT_BOOTMODE << BOOT_MODE_ALT_SHIFT, 75 &crlapb_base->boot_mode); 76#endif 77 78 reg = readl(&crlapb_base->boot_mode); 79 if (reg >> BOOT_MODE_ALT_SHIFT) 80 reg >>= BOOT_MODE_ALT_SHIFT; 81 82 bootmode = reg & BOOT_MODES_MASK; 83 84 switch (bootmode) { 85 case JTAG_MODE: 86 return BOOT_DEVICE_RAM; 87#ifdef CONFIG_SPL_MMC_SUPPORT 88 case SD_MODE1: 89 case SD1_LSHFT_MODE: /* not working on silicon v1 */ 90 return BOOT_DEVICE_MMC2; 91 case SD_MODE: 92 case EMMC_MODE: 93 return BOOT_DEVICE_MMC1; 94#endif 95#ifdef CONFIG_SPL_DFU 96 case USB_MODE: 97 return BOOT_DEVICE_DFU; 98#endif 99#ifdef CONFIG_SPL_SATA_SUPPORT 100 case SW_SATA_MODE: 101 return BOOT_DEVICE_SATA; 102#endif 103#ifdef CONFIG_SPL_SPI_SUPPORT 104 case QSPI_MODE_24BIT: 105 case QSPI_MODE_32BIT: 106 return BOOT_DEVICE_SPI; 107#endif 108 default: 109 printf("Invalid Boot Mode:0x%x\n", bootmode); 110 break; 111 } 112 113 return 0; 114} 115 116#ifdef CONFIG_SPL_OS_BOOT 117int spl_start_uboot(void) 118{ 119 return 0; 120} 121#endif 122 123#ifdef CONFIG_SPL_LOAD_FIT 124int board_fit_config_name_match(const char *name) 125{ 126 /* Just empty function now - can't decide what to choose */ 127 debug("%s: %s\n", __func__, name); 128 129 return -1; 130} 131#endif 132