xref: /rk3399_rockchip-uboot/arch/arm/mach-zynq/spl.c (revision 2b1cdafa9fdd0c88eb1bc96e9330e252c9795689)
10107f240SMasahiro Yamada /*
20107f240SMasahiro Yamada  * (C) Copyright 2014 Xilinx, Inc. Michal Simek
30107f240SMasahiro Yamada  *
40107f240SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
50107f240SMasahiro Yamada  */
60107f240SMasahiro Yamada #include <common.h>
7c54c0a4cSSimon Glass #include <debug_uart.h>
80107f240SMasahiro Yamada #include <spl.h>
90107f240SMasahiro Yamada 
100107f240SMasahiro Yamada #include <asm/io.h>
110107f240SMasahiro Yamada #include <asm/spl.h>
12bd44758aSSimon Glass #include <asm/arch/hardware.h>
130107f240SMasahiro Yamada #include <asm/arch/sys_proto.h>
140107f240SMasahiro Yamada 
150107f240SMasahiro Yamada DECLARE_GLOBAL_DATA_PTR;
160107f240SMasahiro Yamada 
board_init_f(ulong dummy)170107f240SMasahiro Yamada void board_init_f(ulong dummy)
180107f240SMasahiro Yamada {
190107f240SMasahiro Yamada 	ps7_init();
200107f240SMasahiro Yamada 
210107f240SMasahiro Yamada 	arch_cpu_init();
22c54c0a4cSSimon Glass 	/*
23c54c0a4cSSimon Glass 	 * The debug UART can be used from this point:
24c54c0a4cSSimon Glass 	 * debug_uart_init();
25c54c0a4cSSimon Glass 	 * printch('x');
26c54c0a4cSSimon Glass 	 */
270107f240SMasahiro Yamada }
280107f240SMasahiro Yamada 
290107f240SMasahiro Yamada #ifdef CONFIG_SPL_BOARD_INIT
spl_board_init(void)300107f240SMasahiro Yamada void spl_board_init(void)
310107f240SMasahiro Yamada {
325fa030b9SSimon Glass 	preloader_console_init();
330107f240SMasahiro Yamada 	board_init();
340107f240SMasahiro Yamada }
350107f240SMasahiro Yamada #endif
360107f240SMasahiro Yamada 
spl_boot_device(void)370107f240SMasahiro Yamada u32 spl_boot_device(void)
380107f240SMasahiro Yamada {
390107f240SMasahiro Yamada 	u32 mode;
400107f240SMasahiro Yamada 
410107f240SMasahiro Yamada 	switch ((zynq_slcr_get_boot_mode()) & ZYNQ_BM_MASK) {
420107f240SMasahiro Yamada #ifdef CONFIG_SPL_SPI_SUPPORT
430107f240SMasahiro Yamada 	case ZYNQ_BM_QSPI:
440107f240SMasahiro Yamada 		puts("qspi boot\n");
450107f240SMasahiro Yamada 		mode = BOOT_DEVICE_SPI;
460107f240SMasahiro Yamada 		break;
470107f240SMasahiro Yamada #endif
480107f240SMasahiro Yamada 	case ZYNQ_BM_NAND:
490107f240SMasahiro Yamada 		mode = BOOT_DEVICE_NAND;
500107f240SMasahiro Yamada 		break;
510107f240SMasahiro Yamada 	case ZYNQ_BM_NOR:
520107f240SMasahiro Yamada 		mode = BOOT_DEVICE_NOR;
530107f240SMasahiro Yamada 		break;
540107f240SMasahiro Yamada #ifdef CONFIG_SPL_MMC_SUPPORT
550107f240SMasahiro Yamada 	case ZYNQ_BM_SD:
560107f240SMasahiro Yamada 		puts("mmc boot\n");
570107f240SMasahiro Yamada 		mode = BOOT_DEVICE_MMC1;
580107f240SMasahiro Yamada 		break;
590107f240SMasahiro Yamada #endif
600107f240SMasahiro Yamada 	case ZYNQ_BM_JTAG:
610107f240SMasahiro Yamada 		mode = BOOT_DEVICE_RAM;
620107f240SMasahiro Yamada 		break;
630107f240SMasahiro Yamada 	default:
640107f240SMasahiro Yamada 		puts("Unsupported boot mode selected\n");
650107f240SMasahiro Yamada 		hang();
660107f240SMasahiro Yamada 	}
670107f240SMasahiro Yamada 
680107f240SMasahiro Yamada 	return mode;
690107f240SMasahiro Yamada }
700107f240SMasahiro Yamada 
710107f240SMasahiro Yamada #ifdef CONFIG_SPL_MMC_SUPPORT
spl_boot_mode(const u32 boot_device)72*2b1cdafaSMarek Vasut u32 spl_boot_mode(const u32 boot_device)
730107f240SMasahiro Yamada {
740107f240SMasahiro Yamada 	return MMCSD_MODE_FS;
750107f240SMasahiro Yamada }
760107f240SMasahiro Yamada #endif
770107f240SMasahiro Yamada 
780107f240SMasahiro Yamada #ifdef CONFIG_SPL_OS_BOOT
spl_start_uboot(void)790107f240SMasahiro Yamada int spl_start_uboot(void)
800107f240SMasahiro Yamada {
810107f240SMasahiro Yamada 	/* boot linux */
820107f240SMasahiro Yamada 	return 0;
830107f240SMasahiro Yamada }
840107f240SMasahiro Yamada #endif
850107f240SMasahiro Yamada 
ps7_init(void)860107f240SMasahiro Yamada __weak void ps7_init(void)
870107f240SMasahiro Yamada {
880107f240SMasahiro Yamada 	/*
890107f240SMasahiro Yamada 	 * This function is overridden by the one in
9095b237ecSMasahiro Yamada 	 * board/xilinx/zynq/(platform)/ps7_init_gpl.c, if it exists.
910107f240SMasahiro Yamada 	 */
920107f240SMasahiro Yamada }
939a23f458SMichal Simek 
ps7_post_config(void)94f44e603fSMichal Simek __weak int ps7_post_config(void)
95f44e603fSMichal Simek {
96f44e603fSMichal Simek 	/*
97f44e603fSMichal Simek 	 * This function is overridden by the one in
98f44e603fSMichal Simek 	 * board/xilinx/zynq/(platform)/ps7_init_gpl.c, if it exists.
99f44e603fSMichal Simek 	 */
100f44e603fSMichal Simek 	return 0;
101f44e603fSMichal Simek }
102f44e603fSMichal Simek 
spl_board_prepare_for_boot(void)103f44e603fSMichal Simek void spl_board_prepare_for_boot(void)
104f44e603fSMichal Simek {
105f44e603fSMichal Simek 	ps7_post_config();
106f44e603fSMichal Simek 	debug("SPL bye\n");
107f44e603fSMichal Simek }
108f44e603fSMichal Simek 
1099a23f458SMichal Simek #ifdef CONFIG_SPL_LOAD_FIT
board_fit_config_name_match(const char * name)1109a23f458SMichal Simek int board_fit_config_name_match(const char *name)
1119a23f458SMichal Simek {
1129a23f458SMichal Simek 	/* Just empty function now - can't decide what to choose */
1139a23f458SMichal Simek 	debug("%s: %s\n", __func__, name);
1149a23f458SMichal Simek 
1159a23f458SMichal Simek 	return 0;
1169a23f458SMichal Simek }
1179a23f458SMichal Simek #endif
118