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