xref: /rk3399_rockchip-uboot/common/spl/spl.c (revision 24eb39b575d5b077de92a8d7e7947a955adf5679)
1 /*
2  * (C) Copyright 2010
3  * Texas Instruments, <www.ti.com>
4  *
5  * Aneesh V <aneesh@ti.com>
6  *
7  * SPDX-License-Identifier:	GPL-2.0+
8  */
9 #include <common.h>
10 #include <dm.h>
11 #include <spl.h>
12 #include <asm/u-boot.h>
13 #include <nand.h>
14 #include <fat.h>
15 #include <version.h>
16 #include <image.h>
17 #include <malloc.h>
18 #include <dm/root.h>
19 #include <linux/compiler.h>
20 
21 DECLARE_GLOBAL_DATA_PTR;
22 
23 #ifndef CONFIG_SYS_UBOOT_START
24 #define CONFIG_SYS_UBOOT_START	CONFIG_SYS_TEXT_BASE
25 #endif
26 #ifndef CONFIG_SYS_MONITOR_LEN
27 /* Unknown U-Boot size, let's assume it will not be more than 200 KB */
28 #define CONFIG_SYS_MONITOR_LEN	(200 * 1024)
29 #endif
30 
31 u32 *boot_params_ptr = NULL;
32 
33 /* Define board data structure */
34 static bd_t bdata __attribute__ ((section(".data")));
35 
36 /*
37  * Board-specific Platform code can reimplement show_boot_progress () if needed
38  */
39 __weak void show_boot_progress(int val) {}
40 
41 /*
42  * Default function to determine if u-boot or the OS should
43  * be started. This implementation always returns 1.
44  *
45  * Please implement your own board specific funcion to do this.
46  *
47  * RETURN
48  * 0 to not start u-boot
49  * positive if u-boot should start
50  */
51 #ifdef CONFIG_SPL_OS_BOOT
52 __weak int spl_start_uboot(void)
53 {
54 	puts("SPL: Please implement spl_start_uboot() for your board\n");
55 	puts("SPL: Direct Linux boot not active!\n");
56 	return 1;
57 }
58 
59 /*
60  * Weak default function for arch specific zImage check. Return zero
61  * and fill start and end address if image is recognized.
62  */
63 int __weak bootz_setup(ulong image, ulong *start, ulong *end)
64 {
65 	 return 1;
66 }
67 #endif
68 
69 /*
70  * Weak default function for board specific cleanup/preparation before
71  * Linux boot. Some boards/platforms might not need it, so just provide
72  * an empty stub here.
73  */
74 __weak void spl_board_prepare_for_linux(void)
75 {
76 	/* Nothing to do! */
77 }
78 
79 __weak void spl_board_prepare_for_boot(void)
80 {
81 	/* Nothing to do! */
82 }
83 
84 void spl_set_header_raw_uboot(struct spl_image_info *spl_image)
85 {
86 	spl_image->size = CONFIG_SYS_MONITOR_LEN;
87 	spl_image->entry_point = CONFIG_SYS_UBOOT_START;
88 	spl_image->load_addr = CONFIG_SYS_TEXT_BASE;
89 	spl_image->os = IH_OS_U_BOOT;
90 	spl_image->name = "U-Boot";
91 }
92 
93 int spl_parse_image_header(struct spl_image_info *spl_image,
94 			   const struct image_header *header)
95 {
96 	u32 header_size = sizeof(struct image_header);
97 
98 	if (image_get_magic(header) == IH_MAGIC) {
99 		if (spl_image->flags & SPL_COPY_PAYLOAD_ONLY) {
100 			/*
101 			 * On some system (e.g. powerpc), the load-address and
102 			 * entry-point is located at address 0. We can't load
103 			 * to 0-0x40. So skip header in this case.
104 			 */
105 			spl_image->load_addr = image_get_load(header);
106 			spl_image->entry_point = image_get_ep(header);
107 			spl_image->size = image_get_data_size(header);
108 		} else {
109 			spl_image->entry_point = image_get_load(header);
110 			/* Load including the header */
111 			spl_image->load_addr = spl_image->entry_point -
112 				header_size;
113 			spl_image->size = image_get_data_size(header) +
114 				header_size;
115 		}
116 		spl_image->os = image_get_os(header);
117 		spl_image->name = image_get_name(header);
118 		debug("spl: payload image: %.*s load addr: 0x%lx size: %d\n",
119 			(int)sizeof(spl_image->name), spl_image->name,
120 			spl_image->load_addr, spl_image->size);
121 	} else {
122 #ifdef CONFIG_SPL_PANIC_ON_RAW_IMAGE
123 		/*
124 		 * CONFIG_SPL_PANIC_ON_RAW_IMAGE is defined when the
125 		 * code which loads images in SPL cannot guarantee that
126 		 * absolutely all read errors will be reported.
127 		 * An example is the LPC32XX MLC NAND driver, which
128 		 * will consider that a completely unreadable NAND block
129 		 * is bad, and thus should be skipped silently.
130 		 */
131 		panic("** no mkimage signature but raw image not supported");
132 #endif
133 
134 #ifdef CONFIG_SPL_OS_BOOT
135 		ulong start, end;
136 
137 		if (!bootz_setup((ulong)header, &start, &end)) {
138 			spl_image->name = "Linux";
139 			spl_image->os = IH_OS_LINUX;
140 			spl_image->load_addr = CONFIG_SYS_LOAD_ADDR;
141 			spl_image->entry_point = CONFIG_SYS_LOAD_ADDR;
142 			spl_image->size = end - start;
143 			debug("spl: payload zImage, load addr: 0x%lx size: %d\n",
144 			      spl_image->load_addr, spl_image->size);
145 			return 0;
146 		}
147 #endif
148 
149 #ifdef CONFIG_SPL_RAW_IMAGE_SUPPORT
150 		/* Signature not found - assume u-boot.bin */
151 		debug("mkimage signature not found - ih_magic = %x\n",
152 			header->ih_magic);
153 		spl_set_header_raw_uboot(spl_image);
154 #else
155 		/* RAW image not supported, proceed to other boot methods. */
156 		debug("Raw boot image support not enabled, proceeding to other boot methods");
157 		return -EINVAL;
158 #endif
159 	}
160 
161 	return 0;
162 }
163 
164 __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
165 {
166 	typedef void __noreturn (*image_entry_noargs_t)(void);
167 
168 	image_entry_noargs_t image_entry =
169 		(image_entry_noargs_t)spl_image->entry_point;
170 
171 	debug("image entry point: 0x%lX\n", spl_image->entry_point);
172 	image_entry();
173 }
174 
175 static int spl_common_init(bool setup_malloc)
176 {
177 	int ret;
178 
179 	debug("spl_early_init()\n");
180 
181 #if defined(CONFIG_SYS_MALLOC_F_LEN)
182 	if (setup_malloc) {
183 #ifdef CONFIG_MALLOC_F_ADDR
184 		gd->malloc_base = CONFIG_MALLOC_F_ADDR;
185 #endif
186 		gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN;
187 		gd->malloc_ptr = 0;
188 	}
189 #endif
190 	if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
191 		ret = fdtdec_setup();
192 		if (ret) {
193 			debug("fdtdec_setup() returned error %d\n", ret);
194 			return ret;
195 		}
196 	}
197 	if (IS_ENABLED(CONFIG_SPL_DM)) {
198 		/* With CONFIG_SPL_OF_PLATDATA, bring in all devices */
199 		ret = dm_init_and_scan(!CONFIG_IS_ENABLED(OF_PLATDATA));
200 		if (ret) {
201 			debug("dm_init_and_scan() returned error %d\n", ret);
202 			return ret;
203 		}
204 	}
205 
206 	return 0;
207 }
208 
209 int spl_early_init(void)
210 {
211 	int ret;
212 
213 	ret = spl_common_init(true);
214 	if (ret)
215 		return ret;
216 	gd->flags |= GD_FLG_SPL_EARLY_INIT;
217 
218 	return 0;
219 }
220 
221 int spl_init(void)
222 {
223 	int ret;
224 
225 	if (!(gd->flags & GD_FLG_SPL_EARLY_INIT)) {
226 		ret = spl_common_init(
227 			!IS_ENABLED(CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN));
228 		if (ret)
229 			return ret;
230 	}
231 	gd->flags |= GD_FLG_SPL_INIT;
232 
233 	return 0;
234 }
235 
236 #ifndef BOOT_DEVICE_NONE
237 #define BOOT_DEVICE_NONE 0xdeadbeef
238 #endif
239 
240 __weak void board_boot_order(u32 *spl_boot_list)
241 {
242 	spl_boot_list[0] = spl_boot_device();
243 }
244 
245 static struct spl_image_loader *spl_ll_find_loader(uint boot_device)
246 {
247 	struct spl_image_loader *drv =
248 		ll_entry_start(struct spl_image_loader, spl_image_loader);
249 	const int n_ents =
250 		ll_entry_count(struct spl_image_loader, spl_image_loader);
251 	struct spl_image_loader *entry;
252 
253 	for (entry = drv; entry != drv + n_ents; entry++) {
254 		if (boot_device == entry->boot_device)
255 			return entry;
256 	}
257 
258 	/* Not found */
259 	return NULL;
260 }
261 
262 static int spl_load_image(struct spl_image_info *spl_image,
263 			  struct spl_image_loader *loader)
264 {
265 	struct spl_boot_device bootdev;
266 
267 	bootdev.boot_device = loader->boot_device;
268 	bootdev.boot_device_name = NULL;
269 
270 	return loader->load_image(spl_image, &bootdev);
271 }
272 
273 /**
274  * boot_from_devices() - Try loading an booting U-Boot from a list of devices
275  *
276  * @spl_image: Place to put the image details if successful
277  * @spl_boot_list: List of boot devices to try
278  * @count: Number of elements in spl_boot_list
279  * @return 0 if OK, -ve on error
280  */
281 static int boot_from_devices(struct spl_image_info *spl_image,
282 			     u32 spl_boot_list[], int count)
283 {
284 	int i;
285 
286 	for (i = 0; i < count && spl_boot_list[i] != BOOT_DEVICE_NONE; i++) {
287 		struct spl_image_loader *loader;
288 
289 		loader = spl_ll_find_loader(spl_boot_list[i]);
290 #if defined(CONFIG_SPL_SERIAL_SUPPORT) && defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
291 		if (loader)
292 			printf("Trying to boot from %s\n", loader->name);
293 		else
294 			puts("SPL: Unsupported Boot Device!\n");
295 #endif
296 		if (loader && !spl_load_image(spl_image, loader))
297 			return 0;
298 	}
299 
300 	return -ENODEV;
301 }
302 
303 void board_init_r(gd_t *dummy1, ulong dummy2)
304 {
305 	u32 spl_boot_list[] = {
306 		BOOT_DEVICE_NONE,
307 		BOOT_DEVICE_NONE,
308 		BOOT_DEVICE_NONE,
309 		BOOT_DEVICE_NONE,
310 		BOOT_DEVICE_NONE,
311 	};
312 	struct spl_image_info spl_image;
313 
314 	debug(">>spl:board_init_r()\n");
315 
316 #if defined(CONFIG_SYS_SPL_MALLOC_START)
317 	mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
318 			CONFIG_SYS_SPL_MALLOC_SIZE);
319 	gd->flags |= GD_FLG_FULL_MALLOC_INIT;
320 #endif
321 	if (!(gd->flags & GD_FLG_SPL_INIT)) {
322 		if (spl_init())
323 			hang();
324 	}
325 #ifndef CONFIG_PPC
326 	/*
327 	 * timer_init() does not exist on PPC systems. The timer is initialized
328 	 * and enabled (decrementer) in interrupt_init() here.
329 	 */
330 	timer_init();
331 #endif
332 
333 #ifdef CONFIG_SPL_BOARD_INIT
334 	spl_board_init();
335 #endif
336 
337 	memset(&spl_image, '\0', sizeof(spl_image));
338 	board_boot_order(spl_boot_list);
339 
340 	if (boot_from_devices(&spl_image, spl_boot_list,
341 			      ARRAY_SIZE(spl_boot_list))) {
342 		puts("SPL: failed to boot from all boot devices\n");
343 		hang();
344 	}
345 
346 	switch (spl_image.os) {
347 	case IH_OS_U_BOOT:
348 		debug("Jumping to U-Boot\n");
349 		break;
350 #ifdef CONFIG_SPL_OS_BOOT
351 	case IH_OS_LINUX:
352 		debug("Jumping to Linux\n");
353 		spl_board_prepare_for_linux();
354 		jump_to_image_linux(&spl_image,
355 				    (void *)CONFIG_SYS_SPL_ARGS_ADDR);
356 #endif
357 	default:
358 		debug("Unsupported OS image.. Jumping nevertheless..\n");
359 	}
360 #if defined(CONFIG_SYS_MALLOC_F_LEN) && !defined(CONFIG_SYS_SPL_MALLOC_SIZE)
361 	debug("SPL malloc() used %#lx bytes (%ld KB)\n", gd->malloc_ptr,
362 	      gd->malloc_ptr / 1024);
363 #endif
364 
365 	debug("loaded - jumping to U-Boot...\n");
366 	spl_board_prepare_for_boot();
367 	jump_to_image_no_args(&spl_image);
368 }
369 
370 /*
371  * This requires UART clocks to be enabled.  In order for this to work the
372  * caller must ensure that the gd pointer is valid.
373  */
374 void preloader_console_init(void)
375 {
376 	gd->bd = &bdata;
377 	gd->baudrate = CONFIG_BAUDRATE;
378 
379 	serial_init();		/* serial communications setup */
380 
381 	gd->have_console = 1;
382 
383 	puts("\nU-Boot SPL " PLAIN_VERSION " (" U_BOOT_DATE " - " \
384 			U_BOOT_TIME ")\n");
385 #ifdef CONFIG_SPL_DISPLAY_PRINT
386 	spl_display_print();
387 #endif
388 }
389 
390 /**
391  * spl_relocate_stack_gd() - Relocate stack ready for board_init_r() execution
392  *
393  * Sometimes board_init_f() runs with a stack in SRAM but we want to use SDRAM
394  * for the main board_init_r() execution. This is typically because we need
395  * more stack space for things like the MMC sub-system.
396  *
397  * This function calculates the stack position, copies the global_data into
398  * place, sets the new gd (except for ARM, for which setting GD within a C
399  * function may not always work) and returns the new stack position. The
400  * caller is responsible for setting up the sp register and, in the case
401  * of ARM, setting up gd.
402  *
403  * All of this is done using the same layout and alignments as done in
404  * board_init_f_init_reserve() / board_init_f_alloc_reserve().
405  *
406  * @return new stack location, or 0 to use the same stack
407  */
408 ulong spl_relocate_stack_gd(void)
409 {
410 #ifdef CONFIG_SPL_STACK_R
411 	gd_t *new_gd;
412 	ulong ptr = CONFIG_SPL_STACK_R_ADDR;
413 
414 #ifdef CONFIG_SPL_SYS_MALLOC_SIMPLE
415 	if (CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) {
416 		ptr -= CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
417 		gd->malloc_base = ptr;
418 		gd->malloc_limit = CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
419 		gd->malloc_ptr = 0;
420 	}
421 #endif
422 	/* Get stack position: use 8-byte alignment for ABI compliance */
423 	ptr = CONFIG_SPL_STACK_R_ADDR - roundup(sizeof(gd_t),16);
424 	new_gd = (gd_t *)ptr;
425 	memcpy(new_gd, (void *)gd, sizeof(gd_t));
426 #if CONFIG_IS_ENABLED(DM)
427 	dm_fixup_for_gd_move(new_gd);
428 #endif
429 #if !defined(CONFIG_ARM)
430 	gd = new_gd;
431 #endif
432 	return ptr;
433 #else
434 	return 0;
435 #endif
436 }
437