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