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 <dm.h> 13 #include <spl.h> 14 #include <asm/u-boot.h> 15 #include <nand.h> 16 #include <fat.h> 17 #include <version.h> 18 #include <image.h> 19 #include <malloc.h> 20 #include <dm/root.h> 21 #include <linux/compiler.h> 22 #include <fdt_support.h> 23 #include <bootcount.h> 24 25 DECLARE_GLOBAL_DATA_PTR; 26 27 #ifndef CONFIG_SYS_UBOOT_START 28 #define CONFIG_SYS_UBOOT_START CONFIG_SYS_TEXT_BASE 29 #endif 30 #ifndef CONFIG_SYS_MONITOR_LEN 31 /* Unknown U-Boot size, let's assume it will not be more than 200 KB */ 32 #define CONFIG_SYS_MONITOR_LEN (200 * 1024) 33 #endif 34 35 u32 *boot_params_ptr = NULL; 36 37 /* See spl.h for information about this */ 38 binman_sym_declare(ulong, u_boot_any, image_pos); 39 40 /* Define board data structure */ 41 static bd_t bdata __attribute__ ((section(".data"))); 42 43 /* 44 * Board-specific Platform code can reimplement show_boot_progress () if needed 45 */ 46 __weak void show_boot_progress(int val) {} 47 48 /* 49 * Default function to determine if u-boot or the OS should 50 * be started. This implementation always returns 1. 51 * 52 * Please implement your own board specific funcion to do this. 53 * 54 * RETURN 55 * 0 to not start u-boot 56 * positive if u-boot should start 57 */ 58 #ifdef CONFIG_SPL_OS_BOOT 59 __weak int spl_start_uboot(void) 60 { 61 puts("SPL: Please implement spl_start_uboot() for your board\n"); 62 puts("SPL: Direct Linux boot not active!\n"); 63 return 1; 64 } 65 66 /* weak default platform specific function to initialize 67 * dram banks 68 */ 69 __weak int dram_init_banksize(void) 70 { 71 return 0; 72 } 73 74 /* 75 * Weak default function for arch specific zImage check. Return zero 76 * and fill start and end address if image is recognized. 77 */ 78 int __weak bootz_setup(ulong image, ulong *start, ulong *end) 79 { 80 return 1; 81 } 82 #endif 83 84 /* Weak default function for arch/board-specific fixups to the spl_image_info */ 85 void __weak spl_perform_fixups(struct spl_image_info *spl_image) 86 { 87 } 88 89 void spl_fixup_fdt(void) 90 { 91 #if defined(CONFIG_SPL_OF_LIBFDT) && defined(CONFIG_SYS_SPL_ARGS_ADDR) 92 void *fdt_blob = (void *)CONFIG_SYS_SPL_ARGS_ADDR; 93 int err; 94 95 err = fdt_check_header(fdt_blob); 96 if (err < 0) { 97 printf("fdt_root: %s\n", fdt_strerror(err)); 98 return; 99 } 100 101 /* fixup the memory dt node */ 102 err = fdt_shrink_to_minimum(fdt_blob, 0); 103 if (err == 0) { 104 printf("spl: fdt_shrink_to_minimum err - %d\n", err); 105 return; 106 } 107 108 err = arch_fixup_fdt(fdt_blob); 109 if (err) { 110 printf("spl: arch_fixup_fdt err - %d\n", err); 111 return; 112 } 113 #endif 114 } 115 116 /* 117 * Weak default function for board specific cleanup/preparation before 118 * Linux boot. Some boards/platforms might not need it, so just provide 119 * an empty stub here. 120 */ 121 __weak void spl_board_prepare_for_linux(void) 122 { 123 /* Nothing to do! */ 124 } 125 126 __weak void spl_board_prepare_for_boot(void) 127 { 128 /* Nothing to do! */ 129 } 130 131 __weak struct image_header *spl_get_load_buffer(ssize_t offset, size_t size) 132 { 133 return (struct image_header *)(CONFIG_SYS_TEXT_BASE + offset); 134 } 135 136 void spl_set_header_raw_uboot(struct spl_image_info *spl_image) 137 { 138 ulong u_boot_pos = binman_sym(ulong, u_boot_any, image_pos); 139 140 spl_image->size = CONFIG_SYS_MONITOR_LEN; 141 142 /* 143 * Binman error cases: address of the end of the previous region or the 144 * start of the image's entry area (usually 0) if there is no previous 145 * region. 146 */ 147 if (u_boot_pos && u_boot_pos != BINMAN_SYM_MISSING) { 148 /* Binman does not support separated entry addresses */ 149 spl_image->entry_point = u_boot_pos; 150 spl_image->load_addr = u_boot_pos; 151 } else { 152 spl_image->entry_point = CONFIG_SYS_UBOOT_START; 153 spl_image->load_addr = CONFIG_SYS_TEXT_BASE; 154 } 155 spl_image->os = IH_OS_U_BOOT; 156 spl_image->name = "U-Boot"; 157 } 158 159 #ifdef CONFIG_SPL_LOAD_FIT_FULL 160 /* Parse and load full fitImage in SPL */ 161 static int spl_load_fit_image(struct spl_image_info *spl_image, 162 const struct image_header *header) 163 { 164 bootm_headers_t images; 165 const char *fit_uname_config = NULL; 166 const char *fit_uname_fdt = FIT_FDT_PROP; 167 const char *uname; 168 ulong fw_data = 0, dt_data = 0, img_data = 0; 169 ulong fw_len = 0, dt_len = 0, img_len = 0; 170 int idx, conf_noffset; 171 int ret; 172 173 #ifdef CONFIG_SPL_FIT_SIGNATURE 174 images.verify = 1; 175 #endif 176 ret = fit_image_load(&images, (ulong)header, 177 NULL, &fit_uname_config, 178 IH_ARCH_DEFAULT, IH_TYPE_STANDALONE, -1, 179 FIT_LOAD_REQUIRED, &fw_data, &fw_len); 180 if (ret < 0) 181 return ret; 182 183 spl_image->size = fw_len; 184 spl_image->entry_point = fw_data; 185 spl_image->load_addr = fw_data; 186 spl_image->os = IH_OS_U_BOOT; 187 spl_image->name = "U-Boot"; 188 189 debug("spl: payload image: %32s load addr: 0x%lx size: %d\n", 190 spl_image->name, spl_image->load_addr, spl_image->size); 191 192 #ifdef CONFIG_SPL_FIT_SIGNATURE 193 images.verify = 1; 194 #endif 195 fit_image_load(&images, (ulong)header, 196 &fit_uname_fdt, &fit_uname_config, 197 IH_ARCH_DEFAULT, IH_TYPE_FLATDT, -1, 198 FIT_LOAD_OPTIONAL, &dt_data, &dt_len); 199 200 conf_noffset = fit_conf_get_node((const void *)header, 201 fit_uname_config); 202 if (conf_noffset <= 0) 203 return 0; 204 205 for (idx = 0; 206 uname = fdt_stringlist_get((const void *)header, conf_noffset, 207 FIT_LOADABLE_PROP, idx, 208 NULL), uname; 209 idx++) 210 { 211 #ifdef CONFIG_SPL_FIT_SIGNATURE 212 images.verify = 1; 213 #endif 214 ret = fit_image_load(&images, (ulong)header, 215 &uname, &fit_uname_config, 216 IH_ARCH_DEFAULT, IH_TYPE_LOADABLE, -1, 217 FIT_LOAD_OPTIONAL_NON_ZERO, 218 &img_data, &img_len); 219 if (ret < 0) 220 return ret; 221 } 222 223 return 0; 224 } 225 #endif 226 227 int spl_parse_image_header(struct spl_image_info *spl_image, 228 const struct image_header *header) 229 { 230 #ifdef CONFIG_SPL_LOAD_FIT_FULL 231 int ret = spl_load_fit_image(spl_image, header); 232 233 if (!ret) 234 return ret; 235 #endif 236 if (image_get_magic(header) == IH_MAGIC) { 237 #ifdef CONFIG_SPL_LEGACY_IMAGE_SUPPORT 238 u32 header_size = sizeof(struct image_header); 239 240 if (spl_image->flags & SPL_COPY_PAYLOAD_ONLY) { 241 /* 242 * On some system (e.g. powerpc), the load-address and 243 * entry-point is located at address 0. We can't load 244 * to 0-0x40. So skip header in this case. 245 */ 246 spl_image->load_addr = image_get_load(header); 247 spl_image->entry_point = image_get_ep(header); 248 spl_image->size = image_get_data_size(header); 249 } else { 250 spl_image->entry_point = image_get_load(header); 251 /* Load including the header */ 252 spl_image->load_addr = spl_image->entry_point - 253 header_size; 254 spl_image->size = image_get_data_size(header) + 255 header_size; 256 } 257 spl_image->os = image_get_os(header); 258 spl_image->name = image_get_name(header); 259 debug("spl: payload image: %32s load addr: 0x%lx size: %d\n", 260 spl_image->name, spl_image->load_addr, spl_image->size); 261 #else 262 /* LEGACY image not supported */ 263 debug("Legacy boot image support not enabled, proceeding to other boot methods\n"); 264 return -EINVAL; 265 #endif 266 } else { 267 #ifdef CONFIG_SPL_PANIC_ON_RAW_IMAGE 268 /* 269 * CONFIG_SPL_PANIC_ON_RAW_IMAGE is defined when the 270 * code which loads images in SPL cannot guarantee that 271 * absolutely all read errors will be reported. 272 * An example is the LPC32XX MLC NAND driver, which 273 * will consider that a completely unreadable NAND block 274 * is bad, and thus should be skipped silently. 275 */ 276 panic("** no mkimage signature but raw image not supported"); 277 #endif 278 279 #ifdef CONFIG_SPL_OS_BOOT 280 ulong start, end; 281 282 if (!bootz_setup((ulong)header, &start, &end)) { 283 spl_image->name = "Linux"; 284 spl_image->os = IH_OS_LINUX; 285 spl_image->load_addr = CONFIG_SYS_LOAD_ADDR; 286 spl_image->entry_point = CONFIG_SYS_LOAD_ADDR; 287 spl_image->size = end - start; 288 debug("spl: payload zImage, load addr: 0x%lx size: %d\n", 289 spl_image->load_addr, spl_image->size); 290 return 0; 291 } 292 #endif 293 294 #ifdef CONFIG_SPL_RAW_IMAGE_SUPPORT 295 /* Signature not found - assume u-boot.bin */ 296 debug("mkimage signature not found - ih_magic = %x\n", 297 header->ih_magic); 298 spl_set_header_raw_uboot(spl_image); 299 #else 300 /* RAW image not supported, proceed to other boot methods. */ 301 debug("Raw boot image support not enabled, proceeding to other boot methods\n"); 302 return -EINVAL; 303 #endif 304 } 305 306 return 0; 307 } 308 309 __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) 310 { 311 typedef void __noreturn (*image_entry_noargs_t)(void); 312 313 image_entry_noargs_t image_entry = 314 (image_entry_noargs_t)spl_image->entry_point; 315 316 debug("image entry point: 0x%lx\n", spl_image->entry_point); 317 image_entry(); 318 } 319 320 static int spl_common_init(bool setup_malloc) 321 { 322 int ret; 323 324 #if CONFIG_VAL(SYS_MALLOC_F_LEN) 325 if (setup_malloc) { 326 #ifdef CONFIG_MALLOC_F_ADDR 327 gd->malloc_base = CONFIG_MALLOC_F_ADDR; 328 #endif 329 gd->malloc_limit = CONFIG_VAL(SYS_MALLOC_F_LEN); 330 gd->malloc_ptr = 0; 331 } 332 #endif 333 ret = bootstage_init(true); 334 if (ret) { 335 debug("%s: Failed to set up bootstage: ret=%d\n", __func__, 336 ret); 337 return ret; 338 } 339 bootstage_mark_name(BOOTSTAGE_ID_START_SPL, "spl"); 340 #if CONFIG_IS_ENABLED(LOG) 341 ret = log_init(); 342 if (ret) { 343 debug("%s: Failed to set up logging\n", __func__); 344 return ret; 345 } 346 #endif 347 if (CONFIG_IS_ENABLED(BLOBLIST)) { 348 ret = bloblist_init(); 349 if (ret) { 350 debug("%s: Failed to set up bloblist: ret=%d\n", 351 __func__, ret); 352 return ret; 353 } 354 } 355 if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) { 356 ret = fdtdec_setup(); 357 if (ret) { 358 debug("fdtdec_setup() returned error %d\n", ret); 359 return ret; 360 } 361 } 362 if (CONFIG_IS_ENABLED(DM)) { 363 bootstage_start(BOOTSTATE_ID_ACCUM_DM_SPL, "dm_spl"); 364 /* With CONFIG_SPL_OF_PLATDATA, bring in all devices */ 365 ret = dm_init_and_scan(!CONFIG_IS_ENABLED(OF_PLATDATA)); 366 bootstage_accum(BOOTSTATE_ID_ACCUM_DM_SPL); 367 if (ret) { 368 debug("dm_init_and_scan() returned error %d\n", ret); 369 return ret; 370 } 371 } 372 373 return 0; 374 } 375 376 void spl_set_bd(void) 377 { 378 if (!gd->bd) 379 gd->bd = &bdata; 380 } 381 382 int spl_early_init(void) 383 { 384 int ret; 385 386 debug("%s\n", __func__); 387 388 ret = spl_common_init(true); 389 if (ret) 390 return ret; 391 gd->flags |= GD_FLG_SPL_EARLY_INIT; 392 393 return 0; 394 } 395 396 int spl_init(void) 397 { 398 int ret; 399 bool setup_malloc = !(IS_ENABLED(CONFIG_SPL_STACK_R) && 400 IS_ENABLED(CONFIG_SPL_SYS_MALLOC_SIMPLE)); 401 402 debug("%s\n", __func__); 403 404 if (!(gd->flags & GD_FLG_SPL_EARLY_INIT)) { 405 ret = spl_common_init(setup_malloc); 406 if (ret) 407 return ret; 408 } 409 gd->flags |= GD_FLG_SPL_INIT; 410 411 return 0; 412 } 413 414 #ifndef BOOT_DEVICE_NONE 415 #define BOOT_DEVICE_NONE 0xdeadbeef 416 #endif 417 418 __weak void board_boot_order(u32 *spl_boot_list) 419 { 420 spl_boot_list[0] = spl_boot_device(); 421 } 422 423 static struct spl_image_loader *spl_ll_find_loader(uint boot_device) 424 { 425 struct spl_image_loader *drv = 426 ll_entry_start(struct spl_image_loader, spl_image_loader); 427 const int n_ents = 428 ll_entry_count(struct spl_image_loader, spl_image_loader); 429 struct spl_image_loader *entry; 430 431 for (entry = drv; entry != drv + n_ents; entry++) { 432 if (boot_device == entry->boot_device) 433 return entry; 434 } 435 436 /* Not found */ 437 return NULL; 438 } 439 440 static int spl_load_image(struct spl_image_info *spl_image, 441 struct spl_image_loader *loader) 442 { 443 struct spl_boot_device bootdev; 444 445 bootdev.boot_device = loader->boot_device; 446 bootdev.boot_device_name = NULL; 447 448 return loader->load_image(spl_image, &bootdev); 449 } 450 451 /** 452 * boot_from_devices() - Try loading an booting U-Boot from a list of devices 453 * 454 * @spl_image: Place to put the image details if successful 455 * @spl_boot_list: List of boot devices to try 456 * @count: Number of elements in spl_boot_list 457 * @return 0 if OK, -ve on error 458 */ 459 static int boot_from_devices(struct spl_image_info *spl_image, 460 u32 spl_boot_list[], int count) 461 { 462 int i; 463 464 for (i = 0; i < count && spl_boot_list[i] != BOOT_DEVICE_NONE; i++) { 465 struct spl_image_loader *loader; 466 467 loader = spl_ll_find_loader(spl_boot_list[i]); 468 #if defined(CONFIG_SPL_SERIAL_SUPPORT) && defined(CONFIG_SPL_LIBCOMMON_SUPPORT) 469 if (loader) 470 printf("Trying to boot from %s\n", loader->name); 471 else 472 puts("SPL: Unsupported Boot Device!\n"); 473 #endif 474 if (loader && !spl_load_image(spl_image, loader)) { 475 spl_image->boot_device = spl_boot_list[i]; 476 return 0; 477 } 478 } 479 480 return -ENODEV; 481 } 482 483 void board_init_r(gd_t *dummy1, ulong dummy2) 484 { 485 u32 spl_boot_list[] = { 486 BOOT_DEVICE_NONE, 487 BOOT_DEVICE_NONE, 488 BOOT_DEVICE_NONE, 489 BOOT_DEVICE_NONE, 490 BOOT_DEVICE_NONE, 491 }; 492 struct spl_image_info spl_image; 493 int ret; 494 495 debug(">>spl:board_init_r()\n"); 496 497 spl_set_bd(); 498 499 #ifdef CONFIG_SPL_OS_BOOT 500 dram_init_banksize(); 501 #endif 502 503 #if defined(CONFIG_SYS_SPL_MALLOC_START) 504 mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START, 505 CONFIG_SYS_SPL_MALLOC_SIZE); 506 gd->flags |= GD_FLG_FULL_MALLOC_INIT; 507 #endif 508 if (!(gd->flags & GD_FLG_SPL_INIT)) { 509 if (spl_init()) 510 hang(); 511 } 512 #if !defined(CONFIG_PPC) && !defined(CONFIG_ARCH_MX6) 513 /* 514 * timer_init() does not exist on PPC systems. The timer is initialized 515 * and enabled (decrementer) in interrupt_init() here. 516 */ 517 timer_init(); 518 #endif 519 520 #if CONFIG_IS_ENABLED(BOARD_INIT) 521 spl_board_init(); 522 #endif 523 524 bootcount_inc(); 525 526 memset(&spl_image, '\0', sizeof(spl_image)); 527 #ifdef CONFIG_SYS_SPL_ARGS_ADDR 528 spl_image.arg = (void *)CONFIG_SYS_SPL_ARGS_ADDR; 529 #endif 530 spl_image.boot_device = BOOT_DEVICE_NONE; 531 board_boot_order(spl_boot_list); 532 533 if (boot_from_devices(&spl_image, spl_boot_list, 534 ARRAY_SIZE(spl_boot_list))) { 535 puts("SPL: failed to boot from all boot devices\n"); 536 hang(); 537 } 538 539 spl_perform_fixups(&spl_image); 540 if (CONFIG_IS_ENABLED(BLOBLIST)) { 541 ret = bloblist_finish(); 542 if (ret) 543 printf("Warning: Failed to finish bloblist (ret=%d)\n", 544 ret); 545 } 546 547 #ifdef CONFIG_CPU_V7M 548 spl_image.entry_point |= 0x1; 549 #endif 550 switch (spl_image.os) { 551 case IH_OS_U_BOOT: 552 debug("Jumping to U-Boot\n"); 553 break; 554 #if CONFIG_IS_ENABLED(ATF) 555 case IH_OS_ARM_TRUSTED_FIRMWARE: 556 debug("Jumping to U-Boot via ARM Trusted Firmware\n"); 557 spl_invoke_atf(&spl_image); 558 break; 559 #endif 560 #if CONFIG_IS_ENABLED(OPTEE) 561 case IH_OS_TEE: 562 debug("Jumping to U-Boot via OP-TEE\n"); 563 spl_optee_entry(NULL, NULL, spl_image.fdt_addr, 564 (void *)spl_image.entry_point); 565 break; 566 #endif 567 #ifdef CONFIG_SPL_OS_BOOT 568 case IH_OS_LINUX: 569 debug("Jumping to Linux\n"); 570 spl_fixup_fdt(); 571 spl_board_prepare_for_linux(); 572 jump_to_image_linux(&spl_image); 573 #endif 574 default: 575 debug("Unsupported OS image.. Jumping nevertheless..\n"); 576 } 577 #if CONFIG_VAL(SYS_MALLOC_F_LEN) && !defined(CONFIG_SYS_SPL_MALLOC_SIZE) 578 debug("SPL malloc() used 0x%lx bytes (%ld KB)\n", gd->malloc_ptr, 579 gd->malloc_ptr / 1024); 580 #endif 581 #ifdef CONFIG_BOOTSTAGE_STASH 582 bootstage_mark_name(BOOTSTAGE_ID_END_SPL, "end_spl"); 583 ret = bootstage_stash((void *)CONFIG_BOOTSTAGE_STASH_ADDR, 584 CONFIG_BOOTSTAGE_STASH_SIZE); 585 if (ret) 586 debug("Failed to stash bootstage: err=%d\n", ret); 587 #endif 588 589 debug("loaded - jumping to U-Boot...\n"); 590 spl_board_prepare_for_boot(); 591 jump_to_image_no_args(&spl_image); 592 } 593 594 #ifdef CONFIG_SPL_SERIAL_SUPPORT 595 /* 596 * This requires UART clocks to be enabled. In order for this to work the 597 * caller must ensure that the gd pointer is valid. 598 */ 599 void preloader_console_init(void) 600 { 601 gd->baudrate = CONFIG_BAUDRATE; 602 603 serial_init(); /* serial communications setup */ 604 605 gd->have_console = 1; 606 607 #ifndef CONFIG_SPL_DISABLE_BANNER_PRINT 608 puts("\nU-Boot SPL " PLAIN_VERSION " (" U_BOOT_DATE " - " \ 609 U_BOOT_TIME " " U_BOOT_TZ ")\n"); 610 #endif 611 #ifdef CONFIG_SPL_DISPLAY_PRINT 612 spl_display_print(); 613 #endif 614 } 615 #endif 616 617 /** 618 * spl_relocate_stack_gd() - Relocate stack ready for board_init_r() execution 619 * 620 * Sometimes board_init_f() runs with a stack in SRAM but we want to use SDRAM 621 * for the main board_init_r() execution. This is typically because we need 622 * more stack space for things like the MMC sub-system. 623 * 624 * This function calculates the stack position, copies the global_data into 625 * place, sets the new gd (except for ARM, for which setting GD within a C 626 * function may not always work) and returns the new stack position. The 627 * caller is responsible for setting up the sp register and, in the case 628 * of ARM, setting up gd. 629 * 630 * All of this is done using the same layout and alignments as done in 631 * board_init_f_init_reserve() / board_init_f_alloc_reserve(). 632 * 633 * @return new stack location, or 0 to use the same stack 634 */ 635 ulong spl_relocate_stack_gd(void) 636 { 637 #ifdef CONFIG_SPL_STACK_R 638 gd_t *new_gd; 639 ulong ptr = CONFIG_SPL_STACK_R_ADDR; 640 641 #if defined(CONFIG_SPL_SYS_MALLOC_SIMPLE) && CONFIG_VAL(SYS_MALLOC_F_LEN) 642 if (CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) { 643 ptr -= CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN; 644 gd->malloc_base = ptr; 645 gd->malloc_limit = CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN; 646 gd->malloc_ptr = 0; 647 } 648 #endif 649 /* Get stack position: use 8-byte alignment for ABI compliance */ 650 ptr = CONFIG_SPL_STACK_R_ADDR - roundup(sizeof(gd_t),16); 651 new_gd = (gd_t *)ptr; 652 memcpy(new_gd, (void *)gd, sizeof(gd_t)); 653 #if CONFIG_IS_ENABLED(DM) 654 dm_fixup_for_gd_move(new_gd); 655 #endif 656 #if !defined(CONFIG_ARM) 657 gd = new_gd; 658 #endif 659 return ptr; 660 #else 661 return 0; 662 #endif 663 } 664