1 /*
2  * (C) Copyright ASPEED Technology Inc.
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 #include <common.h>
7 #include <debug_uart.h>
8 #include <spl.h>
9 
10 #include <asm/io.h>
11 #include <asm/spl.h>
12 #include <asm/arch/aspeed_verify.h>
13 
14 DECLARE_GLOBAL_DATA_PTR;
15 
16 #define AST_BOOTMODE_SPI	0
17 #define AST_BOOTMODE_EMMC	1
18 #define AST_BOOTMODE_UART	2
19 
20 u32 aspeed_bootmode(void);
21 void aspeed_mmc_init(void);
22 
23 void board_init_f(ulong dummy)
24 {
25 #ifndef CONFIG_SPL_TINY
26 	spl_early_init();
27 	timer_init();
28 	preloader_console_init();
29 	dram_init();
30 	aspeed_mmc_init();
31 #endif
32 }
33 
34 u32 spl_boot_device(void)
35 {
36 	switch(aspeed_bootmode()) {
37 		case AST_BOOTMODE_EMMC:
38 			return BOOT_DEVICE_MMC1;
39 		case AST_BOOTMODE_SPI:
40 			return BOOT_DEVICE_RAM;
41 		case AST_BOOTMODE_UART:
42 			return BOOT_DEVICE_UART;
43 		default:
44 			break;
45 	}
46 	return BOOT_DEVICE_NONE;
47 }
48 
49 struct image_header *spl_get_load_buffer(ssize_t offset, size_t size)
50 {
51 #ifdef CONFIG_SECURE_BOOT
52 	void *dst = (void*)CONFIG_SYS_UBOOT_START;
53 	void *src = (void*)CONFIG_SYS_TEXT_BASE;
54 	u32 count = CONFIG_SYS_MONITOR_LEN;
55 	memmove(dst, src, count);
56 #endif
57     return (struct image_header *)(CONFIG_SYS_LOAD_ADDR);
58 }
59 
60 #ifdef CONFIG_SECURE_BOOT
61 void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
62 {
63 	typedef void __noreturn (*image_entry_noargs_t)(void);
64 
65 	image_entry_noargs_t image_entry =
66 		(image_entry_noargs_t)spl_image->entry_point;
67 	if (aspeed_bl2_verify((void*)spl_image->entry_point, CONFIG_SPL_TEXT_BASE) != 0)
68 		hang();
69 	image_entry();
70 }
71 #endif
72 
73 #ifdef CONFIG_SPL_MMC_SUPPORT
74 u32 spl_boot_mode(const u32 boot_device)
75 {
76 	return MMCSD_MODE_RAW;
77 }
78 #endif
79 
80 #ifdef CONFIG_SPL_OS_BOOT
81 int spl_start_uboot(void)
82 {
83 	/* boot linux */
84 	return 0;
85 }
86 #endif
87 
88 #ifdef CONFIG_SPL_LOAD_FIT
89 int board_fit_config_name_match(const char *name)
90 {
91 	/* we always use the default configuration */
92 	debug("%s: %s\n", __func__, name);
93 	return 0;
94 }
95 #endif
96