1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2014 Xilinx, Inc. Michal Simek 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #include <common.h> 7*4882a593Smuzhiyun #include <debug_uart.h> 8*4882a593Smuzhiyun #include <spl.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <asm/io.h> 11*4882a593Smuzhiyun #include <asm/spl.h> 12*4882a593Smuzhiyun #include <asm/arch/hardware.h> 13*4882a593Smuzhiyun #include <asm/arch/sys_proto.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR; 16*4882a593Smuzhiyun board_init_f(ulong dummy)17*4882a593Smuzhiyunvoid board_init_f(ulong dummy) 18*4882a593Smuzhiyun { 19*4882a593Smuzhiyun ps7_init(); 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun arch_cpu_init(); 22*4882a593Smuzhiyun /* 23*4882a593Smuzhiyun * The debug UART can be used from this point: 24*4882a593Smuzhiyun * debug_uart_init(); 25*4882a593Smuzhiyun * printch('x'); 26*4882a593Smuzhiyun */ 27*4882a593Smuzhiyun } 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #ifdef CONFIG_SPL_BOARD_INIT spl_board_init(void)30*4882a593Smuzhiyunvoid spl_board_init(void) 31*4882a593Smuzhiyun { 32*4882a593Smuzhiyun preloader_console_init(); 33*4882a593Smuzhiyun board_init(); 34*4882a593Smuzhiyun } 35*4882a593Smuzhiyun #endif 36*4882a593Smuzhiyun spl_boot_device(void)37*4882a593Smuzhiyunu32 spl_boot_device(void) 38*4882a593Smuzhiyun { 39*4882a593Smuzhiyun u32 mode; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun switch ((zynq_slcr_get_boot_mode()) & ZYNQ_BM_MASK) { 42*4882a593Smuzhiyun #ifdef CONFIG_SPL_SPI_SUPPORT 43*4882a593Smuzhiyun case ZYNQ_BM_QSPI: 44*4882a593Smuzhiyun puts("qspi boot\n"); 45*4882a593Smuzhiyun mode = BOOT_DEVICE_SPI; 46*4882a593Smuzhiyun break; 47*4882a593Smuzhiyun #endif 48*4882a593Smuzhiyun case ZYNQ_BM_NAND: 49*4882a593Smuzhiyun mode = BOOT_DEVICE_NAND; 50*4882a593Smuzhiyun break; 51*4882a593Smuzhiyun case ZYNQ_BM_NOR: 52*4882a593Smuzhiyun mode = BOOT_DEVICE_NOR; 53*4882a593Smuzhiyun break; 54*4882a593Smuzhiyun #ifdef CONFIG_SPL_MMC_SUPPORT 55*4882a593Smuzhiyun case ZYNQ_BM_SD: 56*4882a593Smuzhiyun puts("mmc boot\n"); 57*4882a593Smuzhiyun mode = BOOT_DEVICE_MMC1; 58*4882a593Smuzhiyun break; 59*4882a593Smuzhiyun #endif 60*4882a593Smuzhiyun case ZYNQ_BM_JTAG: 61*4882a593Smuzhiyun mode = BOOT_DEVICE_RAM; 62*4882a593Smuzhiyun break; 63*4882a593Smuzhiyun default: 64*4882a593Smuzhiyun puts("Unsupported boot mode selected\n"); 65*4882a593Smuzhiyun hang(); 66*4882a593Smuzhiyun } 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun return mode; 69*4882a593Smuzhiyun } 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #ifdef CONFIG_SPL_MMC_SUPPORT spl_boot_mode(const u32 boot_device)72*4882a593Smuzhiyunu32 spl_boot_mode(const u32 boot_device) 73*4882a593Smuzhiyun { 74*4882a593Smuzhiyun return MMCSD_MODE_FS; 75*4882a593Smuzhiyun } 76*4882a593Smuzhiyun #endif 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #ifdef CONFIG_SPL_OS_BOOT spl_start_uboot(void)79*4882a593Smuzhiyunint spl_start_uboot(void) 80*4882a593Smuzhiyun { 81*4882a593Smuzhiyun /* boot linux */ 82*4882a593Smuzhiyun return 0; 83*4882a593Smuzhiyun } 84*4882a593Smuzhiyun #endif 85*4882a593Smuzhiyun ps7_init(void)86*4882a593Smuzhiyun__weak void ps7_init(void) 87*4882a593Smuzhiyun { 88*4882a593Smuzhiyun /* 89*4882a593Smuzhiyun * This function is overridden by the one in 90*4882a593Smuzhiyun * board/xilinx/zynq/(platform)/ps7_init_gpl.c, if it exists. 91*4882a593Smuzhiyun */ 92*4882a593Smuzhiyun } 93*4882a593Smuzhiyun ps7_post_config(void)94*4882a593Smuzhiyun__weak int ps7_post_config(void) 95*4882a593Smuzhiyun { 96*4882a593Smuzhiyun /* 97*4882a593Smuzhiyun * This function is overridden by the one in 98*4882a593Smuzhiyun * board/xilinx/zynq/(platform)/ps7_init_gpl.c, if it exists. 99*4882a593Smuzhiyun */ 100*4882a593Smuzhiyun return 0; 101*4882a593Smuzhiyun } 102*4882a593Smuzhiyun spl_board_prepare_for_boot(void)103*4882a593Smuzhiyunvoid spl_board_prepare_for_boot(void) 104*4882a593Smuzhiyun { 105*4882a593Smuzhiyun ps7_post_config(); 106*4882a593Smuzhiyun debug("SPL bye\n"); 107*4882a593Smuzhiyun } 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun #ifdef CONFIG_SPL_LOAD_FIT board_fit_config_name_match(const char * name)110*4882a593Smuzhiyunint board_fit_config_name_match(const char *name) 111*4882a593Smuzhiyun { 112*4882a593Smuzhiyun /* Just empty function now - can't decide what to choose */ 113*4882a593Smuzhiyun debug("%s: %s\n", __func__, name); 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun return 0; 116*4882a593Smuzhiyun } 117*4882a593Smuzhiyun #endif 118