444907432c1cd1d66cdc06adb3923e5319354f99
[platform/kernel/u-boot.git] / common / spl / spl.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2010
4  * Texas Instruments, <www.ti.com>
5  *
6  * Aneesh V <aneesh@ti.com>
7  */
8
9 #include <common.h>
10 #include <bloblist.h>
11 #include <binman_sym.h>
12 #include <bootstage.h>
13 #include <dm.h>
14 #include <handoff.h>
15 #include <hang.h>
16 #include <init.h>
17 #include <irq_func.h>
18 #include <log.h>
19 #include <mapmem.h>
20 #include <serial.h>
21 #include <spl.h>
22 #include <asm/global_data.h>
23 #include <asm/u-boot.h>
24 #include <nand.h>
25 #include <fat.h>
26 #include <u-boot/crc.h>
27 #if CONFIG_IS_ENABLED(BANNER_PRINT)
28 #include <timestamp.h>
29 #endif
30 #include <version.h>
31 #include <image.h>
32 #include <malloc.h>
33 #include <mapmem.h>
34 #include <dm/root.h>
35 #include <linux/compiler.h>
36 #include <fdt_support.h>
37 #include <bootcount.h>
38 #include <wdt.h>
39
40 DECLARE_GLOBAL_DATA_PTR;
41
42 #ifndef CONFIG_SYS_UBOOT_START
43 #define CONFIG_SYS_UBOOT_START  CONFIG_SYS_TEXT_BASE
44 #endif
45 #ifndef CONFIG_SYS_MONITOR_LEN
46 /* Unknown U-Boot size, let's assume it will not be more than 200 KB */
47 #define CONFIG_SYS_MONITOR_LEN  (200 * 1024)
48 #endif
49
50 u32 *boot_params_ptr = NULL;
51
52 /* See spl.h for information about this */
53 binman_sym_declare(ulong, u_boot_any, image_pos);
54 binman_sym_declare(ulong, u_boot_any, size);
55
56 #ifdef CONFIG_TPL
57 binman_sym_declare(ulong, u_boot_spl, image_pos);
58 binman_sym_declare(ulong, u_boot_spl, size);
59 #endif
60
61 /* Define board data structure */
62 static struct bd_info bdata __attribute__ ((section(".data")));
63
64 #if CONFIG_IS_ENABLED(SHOW_BOOT_PROGRESS)
65 /*
66  * Board-specific Platform code can reimplement show_boot_progress () if needed
67  */
68 __weak void show_boot_progress(int val) {}
69 #endif
70
71 #if defined(CONFIG_SPL_OS_BOOT) || CONFIG_IS_ENABLED(HANDOFF) || \
72         defined(CONFIG_SPL_ATF)
73 /* weak, default platform-specific function to initialize dram banks */
74 __weak int dram_init_banksize(void)
75 {
76         return 0;
77 }
78 #endif
79
80 /*
81  * Default function to determine if u-boot or the OS should
82  * be started. This implementation always returns 1.
83  *
84  * Please implement your own board specific funcion to do this.
85  *
86  * RETURN
87  * 0 to not start u-boot
88  * positive if u-boot should start
89  */
90 #if CONFIG_IS_ENABLED(OS_BOOT)
91 __weak int spl_start_uboot(void)
92 {
93         puts(SPL_TPL_PROMPT
94              "Please implement spl_start_uboot() for your board\n");
95         puts(SPL_TPL_PROMPT "Direct Linux boot not active!\n");
96         return 1;
97 }
98
99 /*
100  * Weak default function for arch specific zImage check. Return zero
101  * and fill start and end address if image is recognized.
102  */
103 int __weak bootz_setup(ulong image, ulong *start, ulong *end)
104 {
105          return 1;
106 }
107 #endif
108
109 /* Weak default function for arch/board-specific fixups to the spl_image_info */
110 void __weak spl_perform_fixups(struct spl_image_info *spl_image)
111 {
112 }
113
114 void spl_fixup_fdt(void *fdt_blob)
115 {
116 #if defined(CONFIG_SPL_OF_LIBFDT)
117         int err;
118
119         if (!fdt_blob)
120                 return;
121
122         err = fdt_check_header(fdt_blob);
123         if (err < 0) {
124                 printf("fdt_root: %s\n", fdt_strerror(err));
125                 return;
126         }
127
128         /* fixup the memory dt node */
129         err = fdt_shrink_to_minimum(fdt_blob, 0);
130         if (err == 0) {
131                 printf(SPL_TPL_PROMPT "fdt_shrink_to_minimum err - %d\n", err);
132                 return;
133         }
134
135         err = arch_fixup_fdt(fdt_blob);
136         if (err) {
137                 printf(SPL_TPL_PROMPT "arch_fixup_fdt err - %d\n", err);
138                 return;
139         }
140 #endif
141 }
142
143 ulong spl_get_image_pos(void)
144 {
145         return spl_phase() == PHASE_TPL ?
146                 binman_sym(ulong, u_boot_spl, image_pos) :
147                 binman_sym(ulong, u_boot_any, image_pos);
148 }
149
150 ulong spl_get_image_size(void)
151 {
152         return spl_phase() == PHASE_TPL ?
153                 binman_sym(ulong, u_boot_spl, size) :
154                 binman_sym(ulong, u_boot_any, size);
155 }
156
157 ulong spl_get_image_text_base(void)
158 {
159         return spl_phase() == PHASE_TPL ? CONFIG_SPL_TEXT_BASE :
160                 CONFIG_SYS_TEXT_BASE;
161 }
162
163 /*
164  * Weak default function for board specific cleanup/preparation before
165  * Linux boot. Some boards/platforms might not need it, so just provide
166  * an empty stub here.
167  */
168 __weak void spl_board_prepare_for_linux(void)
169 {
170         /* Nothing to do! */
171 }
172
173 __weak void spl_board_prepare_for_optee(void *fdt)
174 {
175 }
176
177 __weak const char *spl_board_loader_name(u32 boot_device)
178 {
179         return NULL;
180 }
181
182 #if CONFIG_IS_ENABLED(OPTEE_IMAGE)
183 __weak void __noreturn jump_to_image_optee(struct spl_image_info *spl_image)
184 {
185         spl_optee_entry(NULL, NULL, spl_image->fdt_addr,
186                         (void *)spl_image->entry_point);
187 }
188 #endif
189
190 __weak void spl_board_prepare_for_boot(void)
191 {
192         /* Nothing to do! */
193 }
194
195 __weak struct image_header *spl_get_load_buffer(ssize_t offset, size_t size)
196 {
197         return map_sysmem(CONFIG_SYS_TEXT_BASE + offset, 0);
198 }
199
200 void spl_set_header_raw_uboot(struct spl_image_info *spl_image)
201 {
202         ulong u_boot_pos = binman_sym(ulong, u_boot_any, image_pos);
203
204         spl_image->size = CONFIG_SYS_MONITOR_LEN;
205
206         /*
207          * Binman error cases: address of the end of the previous region or the
208          * start of the image's entry area (usually 0) if there is no previous
209          * region.
210          */
211         if (u_boot_pos && u_boot_pos != BINMAN_SYM_MISSING) {
212                 /* Binman does not support separated entry addresses */
213                 spl_image->entry_point = u_boot_pos;
214                 spl_image->load_addr = u_boot_pos;
215         } else {
216                 spl_image->entry_point = CONFIG_SYS_UBOOT_START;
217                 spl_image->load_addr = CONFIG_SYS_TEXT_BASE;
218         }
219         spl_image->os = IH_OS_U_BOOT;
220         spl_image->name = "U-Boot";
221 }
222
223 #if CONFIG_IS_ENABLED(LOAD_FIT_FULL)
224 /* Parse and load full fitImage in SPL */
225 static int spl_load_fit_image(struct spl_image_info *spl_image,
226                               const struct image_header *header)
227 {
228         bootm_headers_t images;
229         const char *fit_uname_config = NULL;
230         uintptr_t fdt_hack;
231         const char *uname;
232         ulong fw_data = 0, dt_data = 0, img_data = 0;
233         ulong fw_len = 0, dt_len = 0, img_len = 0;
234         int idx, conf_noffset;
235         int ret;
236
237 #ifdef CONFIG_SPL_FIT_SIGNATURE
238         images.verify = 1;
239 #endif
240         ret = fit_image_load(&images, (ulong)header,
241                              NULL, &fit_uname_config,
242                              IH_ARCH_DEFAULT, IH_TYPE_STANDALONE, -1,
243                              FIT_LOAD_OPTIONAL, &fw_data, &fw_len);
244         if (ret >= 0) {
245                 printf("DEPRECATED: 'standalone = ' property.");
246                 printf("Please use either 'firmware =' or 'kernel ='\n");
247         } else {
248                 ret = fit_image_load(&images, (ulong)header, NULL,
249                                      &fit_uname_config, IH_ARCH_DEFAULT,
250                                      IH_TYPE_FIRMWARE, -1, FIT_LOAD_OPTIONAL,
251                                      &fw_data, &fw_len);
252         }
253
254         if (ret < 0) {
255                 ret = fit_image_load(&images, (ulong)header, NULL,
256                                      &fit_uname_config, IH_ARCH_DEFAULT,
257                                      IH_TYPE_KERNEL, -1, FIT_LOAD_OPTIONAL,
258                                      &fw_data, &fw_len);
259         }
260
261         if (ret < 0)
262                 return ret;
263
264         spl_image->size = fw_len;
265         spl_image->entry_point = fw_data;
266         spl_image->load_addr = fw_data;
267         if (fit_image_get_os(header, ret, &spl_image->os))
268                 spl_image->os = IH_OS_INVALID;
269         spl_image->name = genimg_get_os_name(spl_image->os);
270
271         debug(SPL_TPL_PROMPT "payload image: %32s load addr: 0x%lx size: %d\n",
272               spl_image->name, spl_image->load_addr, spl_image->size);
273
274 #ifdef CONFIG_SPL_FIT_SIGNATURE
275         images.verify = 1;
276 #endif
277         ret = fit_image_load(&images, (ulong)header, NULL, &fit_uname_config,
278                        IH_ARCH_DEFAULT, IH_TYPE_FLATDT, -1,
279                        FIT_LOAD_OPTIONAL, &dt_data, &dt_len);
280         if (ret >= 0) {
281                 spl_image->fdt_addr = (void *)dt_data;
282
283                 if (spl_image->os == IH_OS_U_BOOT) {
284                         /* HACK: U-boot expects FDT at a specific address */
285                         fdt_hack = spl_image->load_addr + spl_image->size;
286                         fdt_hack = (fdt_hack + 3) & ~3;
287                         debug("Relocating FDT to %p\n", spl_image->fdt_addr);
288                         memcpy((void *)fdt_hack, spl_image->fdt_addr, dt_len);
289                 }
290         }
291
292         conf_noffset = fit_conf_get_node((const void *)header,
293                                          fit_uname_config);
294         if (conf_noffset <= 0)
295                 return 0;
296
297         for (idx = 0;
298              uname = fdt_stringlist_get((const void *)header, conf_noffset,
299                                         FIT_LOADABLE_PROP, idx,
300                                 NULL), uname;
301              idx++)
302         {
303 #ifdef CONFIG_SPL_FIT_SIGNATURE
304                 images.verify = 1;
305 #endif
306                 ret = fit_image_load(&images, (ulong)header,
307                                      &uname, &fit_uname_config,
308                                      IH_ARCH_DEFAULT, IH_TYPE_LOADABLE, -1,
309                                      FIT_LOAD_OPTIONAL_NON_ZERO,
310                                      &img_data, &img_len);
311                 if (ret < 0)
312                         return ret;
313         }
314
315         return 0;
316 }
317 #endif
318
319 __weak int spl_parse_board_header(struct spl_image_info *spl_image,
320                                   const struct spl_boot_device *bootdev,
321                                   const void *image_header, size_t size)
322 {
323         return -EINVAL;
324 }
325
326 __weak int spl_parse_legacy_header(struct spl_image_info *spl_image,
327                                    const struct image_header *header)
328 {
329         /* LEGACY image not supported */
330         debug("Legacy boot image support not enabled, proceeding to other boot methods\n");
331         return -EINVAL;
332 }
333
334 int spl_parse_image_header(struct spl_image_info *spl_image,
335                            const struct spl_boot_device *bootdev,
336                            const struct image_header *header)
337 {
338 #if CONFIG_IS_ENABLED(LOAD_FIT_FULL)
339         int ret = spl_load_fit_image(spl_image, header);
340
341         if (!ret)
342                 return ret;
343 #endif
344         if (image_get_magic(header) == IH_MAGIC) {
345                 int ret;
346
347                 ret = spl_parse_legacy_header(spl_image, header);
348                 if (ret)
349                         return ret;
350         } else {
351 #ifdef CONFIG_SPL_PANIC_ON_RAW_IMAGE
352                 /*
353                  * CONFIG_SPL_PANIC_ON_RAW_IMAGE is defined when the
354                  * code which loads images in SPL cannot guarantee that
355                  * absolutely all read errors will be reported.
356                  * An example is the LPC32XX MLC NAND driver, which
357                  * will consider that a completely unreadable NAND block
358                  * is bad, and thus should be skipped silently.
359                  */
360                 panic("** no mkimage signature but raw image not supported");
361 #endif
362
363 #if CONFIG_IS_ENABLED(OS_BOOT)
364                 ulong start, end;
365
366                 if (!bootz_setup((ulong)header, &start, &end)) {
367                         spl_image->name = "Linux";
368                         spl_image->os = IH_OS_LINUX;
369                         spl_image->load_addr = CONFIG_SYS_LOAD_ADDR;
370                         spl_image->entry_point = CONFIG_SYS_LOAD_ADDR;
371                         spl_image->size = end - start;
372                         debug(SPL_TPL_PROMPT
373                               "payload zImage, load addr: 0x%lx size: %d\n",
374                               spl_image->load_addr, spl_image->size);
375                         return 0;
376                 }
377 #endif
378
379                 if (!spl_parse_board_header(spl_image, bootdev, (const void *)header, sizeof(*header)))
380                         return 0;
381
382 #ifdef CONFIG_SPL_RAW_IMAGE_SUPPORT
383                 /* Signature not found - assume u-boot.bin */
384                 debug("mkimage signature not found - ih_magic = %x\n",
385                         header->ih_magic);
386                 spl_set_header_raw_uboot(spl_image);
387 #else
388                 /* RAW image not supported, proceed to other boot methods. */
389                 debug("Raw boot image support not enabled, proceeding to other boot methods\n");
390                 return -EINVAL;
391 #endif
392         }
393
394         return 0;
395 }
396
397 __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
398 {
399         typedef void __noreturn (*image_entry_noargs_t)(void);
400
401         image_entry_noargs_t image_entry =
402                 (image_entry_noargs_t)spl_image->entry_point;
403
404         debug("image entry point: 0x%lx\n", spl_image->entry_point);
405         image_entry();
406 }
407
408 #if CONFIG_IS_ENABLED(HANDOFF)
409 /**
410  * Set up the SPL hand-off information
411  *
412  * This is initially empty (zero) but can be written by
413  */
414 static int setup_spl_handoff(void)
415 {
416         struct spl_handoff *ho;
417
418         ho = bloblist_ensure(BLOBLISTT_U_BOOT_SPL_HANDOFF, sizeof(struct spl_handoff));
419         if (!ho)
420                 return -ENOENT;
421
422         return 0;
423 }
424
425 __weak int handoff_arch_save(struct spl_handoff *ho)
426 {
427         return 0;
428 }
429
430 static int write_spl_handoff(void)
431 {
432         struct spl_handoff *ho;
433         int ret;
434
435         ho = bloblist_find(BLOBLISTT_U_BOOT_SPL_HANDOFF, sizeof(struct spl_handoff));
436         if (!ho)
437                 return -ENOENT;
438         handoff_save_dram(ho);
439         ret = handoff_arch_save(ho);
440         if (ret)
441                 return ret;
442         debug(SPL_TPL_PROMPT "Wrote SPL handoff\n");
443
444         return 0;
445 }
446 #else
447 static inline int setup_spl_handoff(void) { return 0; }
448 static inline int write_spl_handoff(void) { return 0; }
449
450 #endif /* HANDOFF */
451
452 /**
453  * get_bootstage_id() - Get the bootstage ID to emit
454  *
455  * @start: true if this is for starting SPL, false for ending it
456  * Return: bootstage ID to use
457  */
458 static enum bootstage_id get_bootstage_id(bool start)
459 {
460         enum u_boot_phase phase = spl_phase();
461
462         if (IS_ENABLED(CONFIG_TPL_BUILD) && phase == PHASE_TPL)
463                 return start ? BOOTSTAGE_ID_START_TPL : BOOTSTAGE_ID_END_TPL;
464         else
465                 return start ? BOOTSTAGE_ID_START_SPL : BOOTSTAGE_ID_END_SPL;
466 }
467
468 static int spl_common_init(bool setup_malloc)
469 {
470         int ret;
471
472 #if CONFIG_VAL(SYS_MALLOC_F_LEN)
473         if (setup_malloc) {
474 #ifdef CONFIG_MALLOC_F_ADDR
475                 gd->malloc_base = CONFIG_MALLOC_F_ADDR;
476 #endif
477                 gd->malloc_limit = CONFIG_VAL(SYS_MALLOC_F_LEN);
478                 gd->malloc_ptr = 0;
479         }
480 #endif
481         ret = bootstage_init(u_boot_first_phase());
482         if (ret) {
483                 debug("%s: Failed to set up bootstage: ret=%d\n", __func__,
484                       ret);
485                 return ret;
486         }
487 #ifdef CONFIG_BOOTSTAGE_STASH
488         if (!u_boot_first_phase()) {
489                 const void *stash = map_sysmem(CONFIG_BOOTSTAGE_STASH_ADDR,
490                                                CONFIG_BOOTSTAGE_STASH_SIZE);
491
492                 ret = bootstage_unstash(stash, CONFIG_BOOTSTAGE_STASH_SIZE);
493                 if (ret)
494                         debug("%s: Failed to unstash bootstage: ret=%d\n",
495                               __func__, ret);
496         }
497 #endif /* CONFIG_BOOTSTAGE_STASH */
498         bootstage_mark_name(get_bootstage_id(true),
499                             spl_phase_name(spl_phase()));
500 #if CONFIG_IS_ENABLED(LOG)
501         ret = log_init();
502         if (ret) {
503                 debug("%s: Failed to set up logging\n", __func__);
504                 return ret;
505         }
506 #endif
507         if (CONFIG_IS_ENABLED(OF_REAL)) {
508                 ret = fdtdec_setup();
509                 if (ret) {
510                         debug("fdtdec_setup() returned error %d\n", ret);
511                         return ret;
512                 }
513         }
514         if (CONFIG_IS_ENABLED(DM)) {
515                 bootstage_start(BOOTSTAGE_ID_ACCUM_DM_SPL,
516                                 spl_phase() == PHASE_TPL ? "dm tpl" : "dm_spl");
517                 /* With CONFIG_SPL_OF_PLATDATA, bring in all devices */
518                 ret = dm_init_and_scan(!CONFIG_IS_ENABLED(OF_PLATDATA));
519                 bootstage_accum(BOOTSTAGE_ID_ACCUM_DM_SPL);
520                 if (ret) {
521                         debug("dm_init_and_scan() returned error %d\n", ret);
522                         return ret;
523                 }
524         }
525
526         return 0;
527 }
528
529 void spl_set_bd(void)
530 {
531         /*
532          * NOTE: On some platforms (e.g. x86) bdata may be in flash and not
533          * writeable.
534          */
535         if (!gd->bd)
536                 gd->bd = &bdata;
537 }
538
539 int spl_early_init(void)
540 {
541         int ret;
542
543         debug("%s\n", __func__);
544
545         ret = spl_common_init(true);
546         if (ret)
547                 return ret;
548         gd->flags |= GD_FLG_SPL_EARLY_INIT;
549
550         return 0;
551 }
552
553 int spl_init(void)
554 {
555         int ret;
556         bool setup_malloc = !(IS_ENABLED(CONFIG_SPL_STACK_R) &&
557                         IS_ENABLED(CONFIG_SPL_SYS_MALLOC_SIMPLE));
558
559         debug("%s\n", __func__);
560
561         if (!(gd->flags & GD_FLG_SPL_EARLY_INIT)) {
562                 ret = spl_common_init(setup_malloc);
563                 if (ret)
564                         return ret;
565         }
566         gd->flags |= GD_FLG_SPL_INIT;
567
568         return 0;
569 }
570
571 #ifndef BOOT_DEVICE_NONE
572 #define BOOT_DEVICE_NONE 0xdeadbeef
573 #endif
574
575 __weak void board_boot_order(u32 *spl_boot_list)
576 {
577         spl_boot_list[0] = spl_boot_device();
578 }
579
580 static struct spl_image_loader *spl_ll_find_loader(uint boot_device)
581 {
582         struct spl_image_loader *drv =
583                 ll_entry_start(struct spl_image_loader, spl_image_loader);
584         const int n_ents =
585                 ll_entry_count(struct spl_image_loader, spl_image_loader);
586         struct spl_image_loader *entry;
587
588         for (entry = drv; entry != drv + n_ents; entry++) {
589                 if (boot_device == entry->boot_device)
590                         return entry;
591         }
592
593         /* Not found */
594         return NULL;
595 }
596
597 __weak int spl_check_board_image(struct spl_image_info *spl_image,
598                                  const struct spl_boot_device *bootdev)
599 {
600         return 0;
601 }
602
603 static int spl_load_image(struct spl_image_info *spl_image,
604                           struct spl_image_loader *loader)
605 {
606         int ret;
607         struct spl_boot_device bootdev;
608
609         bootdev.boot_device = loader->boot_device;
610         bootdev.boot_device_name = NULL;
611
612         ret = loader->load_image(spl_image, &bootdev);
613 #ifdef CONFIG_SPL_LEGACY_IMAGE_CRC_CHECK
614         if (!ret && spl_image->dcrc_length) {
615                 /* check data crc */
616                 ulong dcrc = crc32_wd(0, (unsigned char *)spl_image->dcrc_data,
617                                       spl_image->dcrc_length, CHUNKSZ_CRC32);
618                 if (dcrc != spl_image->dcrc) {
619                         puts("SPL: Image data CRC check failed!\n");
620                         ret = -EINVAL;
621                 }
622         }
623 #endif
624         if (!ret)
625                 ret = spl_check_board_image(spl_image, &bootdev);
626
627         return ret;
628 }
629
630 /**
631  * boot_from_devices() - Try loading a booting U-Boot from a list of devices
632  *
633  * @spl_image: Place to put the image details if successful
634  * @spl_boot_list: List of boot devices to try
635  * @count: Number of elements in spl_boot_list
636  * Return: 0 if OK, -ENODEV if there were no boot devices
637  *      if CONFIG_SHOW_ERRORS is enabled, returns -ENXIO if there were
638  *      devices but none worked
639  */
640 static int boot_from_devices(struct spl_image_info *spl_image,
641                              u32 spl_boot_list[], int count)
642 {
643         int ret = -ENODEV;
644         int i;
645
646         for (i = 0; i < count && spl_boot_list[i] != BOOT_DEVICE_NONE; i++) {
647                 struct spl_image_loader *loader;
648                 int bootdev = spl_boot_list[i];
649
650                 if (CONFIG_IS_ENABLED(SHOW_ERRORS))
651                         ret = -ENXIO;
652                 loader = spl_ll_find_loader(bootdev);
653                 if (CONFIG_IS_ENABLED(SERIAL) &&
654                     CONFIG_IS_ENABLED(LIBCOMMON_SUPPORT) &&
655                     !IS_ENABLED(CONFIG_SILENT_CONSOLE)) {
656                         if (loader)
657                                 printf("Trying to boot from %s\n",
658                                        spl_loader_name(loader));
659                         else if (CONFIG_IS_ENABLED(SHOW_ERRORS))
660                                 printf(SPL_TPL_PROMPT
661                                        "Unsupported Boot Device %d\n", bootdev);
662                         else
663                                 puts(SPL_TPL_PROMPT "Unsupported Boot Device!\n");
664                 }
665                 if (loader && !spl_load_image(spl_image, loader)) {
666                         spl_image->boot_device = bootdev;
667                         return 0;
668                 }
669         }
670
671         return ret;
672 }
673
674 #if defined(CONFIG_SPL_FRAMEWORK_BOARD_INIT_F)
675 void board_init_f(ulong dummy)
676 {
677         if (CONFIG_IS_ENABLED(OF_CONTROL)) {
678                 int ret;
679
680                 ret = spl_early_init();
681                 if (ret) {
682                         debug("spl_early_init() failed: %d\n", ret);
683                         hang();
684                 }
685         }
686
687         preloader_console_init();
688 }
689 #endif
690
691 void board_init_r(gd_t *dummy1, ulong dummy2)
692 {
693         u32 spl_boot_list[] = {
694                 BOOT_DEVICE_NONE,
695                 BOOT_DEVICE_NONE,
696                 BOOT_DEVICE_NONE,
697                 BOOT_DEVICE_NONE,
698                 BOOT_DEVICE_NONE,
699         };
700         struct spl_image_info spl_image;
701         int ret;
702
703         debug(">>" SPL_TPL_PROMPT "board_init_r()\n");
704
705         spl_set_bd();
706
707 #if defined(CONFIG_SYS_SPL_MALLOC_START)
708         mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
709                         CONFIG_SYS_SPL_MALLOC_SIZE);
710         gd->flags |= GD_FLG_FULL_MALLOC_INIT;
711 #endif
712         if (!(gd->flags & GD_FLG_SPL_INIT)) {
713                 if (spl_init())
714                         hang();
715         }
716 #if !defined(CONFIG_PPC) && !defined(CONFIG_ARCH_MX6)
717         /*
718          * timer_init() does not exist on PPC systems. The timer is initialized
719          * and enabled (decrementer) in interrupt_init() here.
720          */
721         timer_init();
722 #endif
723         if (CONFIG_IS_ENABLED(BLOBLIST)) {
724                 ret = bloblist_init();
725                 if (ret) {
726                         debug("%s: Failed to set up bloblist: ret=%d\n",
727                               __func__, ret);
728                         puts(SPL_TPL_PROMPT "Cannot set up bloblist\n");
729                         hang();
730                 }
731         }
732         if (CONFIG_IS_ENABLED(HANDOFF)) {
733                 int ret;
734
735                 ret = setup_spl_handoff();
736                 if (ret) {
737                         puts(SPL_TPL_PROMPT "Cannot set up SPL handoff\n");
738                         hang();
739                 }
740         }
741
742 #if CONFIG_IS_ENABLED(BOARD_INIT)
743         spl_board_init();
744 #endif
745
746 #if defined(CONFIG_SPL_WATCHDOG) && CONFIG_IS_ENABLED(WDT)
747         initr_watchdog();
748 #endif
749
750         if (IS_ENABLED(CONFIG_SPL_OS_BOOT) || CONFIG_IS_ENABLED(HANDOFF) ||
751             IS_ENABLED(CONFIG_SPL_ATF))
752                 dram_init_banksize();
753
754         bootcount_inc();
755
756         memset(&spl_image, '\0', sizeof(spl_image));
757 #ifdef CONFIG_SYS_SPL_ARGS_ADDR
758         spl_image.arg = (void *)CONFIG_SYS_SPL_ARGS_ADDR;
759 #endif
760         spl_image.boot_device = BOOT_DEVICE_NONE;
761         board_boot_order(spl_boot_list);
762
763         ret = boot_from_devices(&spl_image, spl_boot_list,
764                                 ARRAY_SIZE(spl_boot_list));
765         if (ret) {
766                 if (CONFIG_IS_ENABLED(SHOW_ERRORS) &&
767                     CONFIG_IS_ENABLED(LIBCOMMON_SUPPORT))
768                         printf(SPL_TPL_PROMPT "failed to boot from all boot devices (err=%d)\n",
769                                ret);
770                 else
771                         puts(SPL_TPL_PROMPT "failed to boot from all boot devices\n");
772                 hang();
773         }
774
775         spl_perform_fixups(&spl_image);
776         if (CONFIG_IS_ENABLED(HANDOFF)) {
777                 ret = write_spl_handoff();
778                 if (ret)
779                         printf(SPL_TPL_PROMPT
780                                "SPL hand-off write failed (err=%d)\n", ret);
781         }
782         if (CONFIG_IS_ENABLED(BLOBLIST)) {
783                 ret = bloblist_finish();
784                 if (ret)
785                         printf("Warning: Failed to finish bloblist (ret=%d)\n",
786                                ret);
787         }
788
789         switch (spl_image.os) {
790         case IH_OS_U_BOOT:
791                 debug("Jumping to %s...\n", spl_phase_name(spl_next_phase()));
792                 break;
793 #if CONFIG_IS_ENABLED(ATF)
794         case IH_OS_ARM_TRUSTED_FIRMWARE:
795                 debug("Jumping to U-Boot via ARM Trusted Firmware\n");
796                 spl_fixup_fdt(spl_image.fdt_addr);
797                 spl_invoke_atf(&spl_image);
798                 break;
799 #endif
800 #if CONFIG_IS_ENABLED(OPTEE_IMAGE)
801         case IH_OS_TEE:
802                 debug("Jumping to U-Boot via OP-TEE\n");
803                 spl_board_prepare_for_optee(spl_image.fdt_addr);
804                 jump_to_image_optee(&spl_image);
805                 break;
806 #endif
807 #if CONFIG_IS_ENABLED(OPENSBI)
808         case IH_OS_OPENSBI:
809                 debug("Jumping to U-Boot via RISC-V OpenSBI\n");
810                 spl_invoke_opensbi(&spl_image);
811                 break;
812 #endif
813 #if CONFIG_IS_ENABLED(OS_BOOT)
814         case IH_OS_LINUX:
815                 debug("Jumping to Linux\n");
816 #if defined(CONFIG_SYS_SPL_ARGS_ADDR)
817                 spl_fixup_fdt((void *)CONFIG_SYS_SPL_ARGS_ADDR);
818 #endif
819                 spl_board_prepare_for_linux();
820                 jump_to_image_linux(&spl_image);
821 #endif
822         default:
823                 debug("Unsupported OS image.. Jumping nevertheless..\n");
824         }
825 #if CONFIG_VAL(SYS_MALLOC_F_LEN) && !defined(CONFIG_SYS_SPL_MALLOC_SIZE)
826         debug("SPL malloc() used 0x%lx bytes (%ld KB)\n", gd->malloc_ptr,
827               gd->malloc_ptr / 1024);
828 #endif
829         bootstage_mark_name(get_bootstage_id(false), "end phase");
830 #ifdef CONFIG_BOOTSTAGE_STASH
831         ret = bootstage_stash((void *)CONFIG_BOOTSTAGE_STASH_ADDR,
832                               CONFIG_BOOTSTAGE_STASH_SIZE);
833         if (ret)
834                 debug("Failed to stash bootstage: err=%d\n", ret);
835 #endif
836
837         spl_board_prepare_for_boot();
838         jump_to_image_no_args(&spl_image);
839 }
840
841 /*
842  * This requires UART clocks to be enabled.  In order for this to work the
843  * caller must ensure that the gd pointer is valid.
844  */
845 void preloader_console_init(void)
846 {
847 #ifdef CONFIG_SPL_SERIAL
848         gd->baudrate = CONFIG_BAUDRATE;
849
850         serial_init();          /* serial communications setup */
851
852         gd->have_console = 1;
853
854 #if CONFIG_IS_ENABLED(BANNER_PRINT)
855         puts("\nU-Boot " SPL_TPL_NAME " " PLAIN_VERSION " (" U_BOOT_DATE " - "
856              U_BOOT_TIME " " U_BOOT_TZ ")\n");
857 #endif
858 #ifdef CONFIG_SPL_DISPLAY_PRINT
859         spl_display_print();
860 #endif
861 #endif
862 }
863
864 /**
865  * This function is called before the stack is changed from initial stack to
866  * relocated stack. It tries to dump the stack size used
867  */
868 __weak void spl_relocate_stack_check(void)
869 {
870 #if CONFIG_IS_ENABLED(SYS_REPORT_STACK_F_USAGE)
871         ulong init_sp = gd->start_addr_sp;
872         ulong stack_bottom = init_sp - CONFIG_VAL(SIZE_LIMIT_PROVIDE_STACK);
873         u8 *ptr = (u8 *)stack_bottom;
874         ulong i;
875
876         for (i = 0; i < CONFIG_VAL(SIZE_LIMIT_PROVIDE_STACK); i++) {
877                 if (*ptr != CONFIG_VAL(SYS_STACK_F_CHECK_BYTE))
878                         break;
879                 ptr++;
880         }
881         printf("SPL initial stack usage: %lu bytes\n",
882                CONFIG_VAL(SIZE_LIMIT_PROVIDE_STACK) - i);
883 #endif
884 }
885
886 /**
887  * spl_relocate_stack_gd() - Relocate stack ready for board_init_r() execution
888  *
889  * Sometimes board_init_f() runs with a stack in SRAM but we want to use SDRAM
890  * for the main board_init_r() execution. This is typically because we need
891  * more stack space for things like the MMC sub-system.
892  *
893  * This function calculates the stack position, copies the global_data into
894  * place, sets the new gd (except for ARM, for which setting GD within a C
895  * function may not always work) and returns the new stack position. The
896  * caller is responsible for setting up the sp register and, in the case
897  * of ARM, setting up gd.
898  *
899  * All of this is done using the same layout and alignments as done in
900  * board_init_f_init_reserve() / board_init_f_alloc_reserve().
901  *
902  * Return: new stack location, or 0 to use the same stack
903  */
904 ulong spl_relocate_stack_gd(void)
905 {
906 #ifdef CONFIG_SPL_STACK_R
907         gd_t *new_gd;
908         ulong ptr = CONFIG_SPL_STACK_R_ADDR;
909
910         if (CONFIG_IS_ENABLED(SYS_REPORT_STACK_F_USAGE))
911                 spl_relocate_stack_check();
912
913 #if defined(CONFIG_SPL_SYS_MALLOC_SIMPLE) && CONFIG_VAL(SYS_MALLOC_F_LEN)
914         if (CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) {
915                 debug("SPL malloc() before relocation used 0x%lx bytes (%ld KB)\n",
916                       gd->malloc_ptr, gd->malloc_ptr / 1024);
917                 ptr -= CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
918                 gd->malloc_base = ptr;
919                 gd->malloc_limit = CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
920                 gd->malloc_ptr = 0;
921         }
922 #endif
923         /* Get stack position: use 8-byte alignment for ABI compliance */
924         ptr = CONFIG_SPL_STACK_R_ADDR - roundup(sizeof(gd_t),16);
925         new_gd = (gd_t *)ptr;
926         memcpy(new_gd, (void *)gd, sizeof(gd_t));
927 #if CONFIG_IS_ENABLED(DM)
928         dm_fixup_for_gd_move(new_gd);
929 #endif
930 #if !defined(CONFIG_ARM) && !defined(CONFIG_RISCV)
931         gd = new_gd;
932 #endif
933         return ptr;
934 #else
935         return 0;
936 #endif
937 }
938
939 #if defined(CONFIG_BOOTCOUNT_LIMIT) && \
940         ((!defined(CONFIG_TPL_BUILD) && !defined(CONFIG_SPL_BOOTCOUNT_LIMIT)) || \
941          (defined(CONFIG_TPL_BUILD) && !defined(CONFIG_TPL_BOOTCOUNT_LIMIT)))
942 void bootcount_store(ulong a)
943 {
944 }
945
946 ulong bootcount_load(void)
947 {
948         return 0;
949 }
950 #endif