1 /* 2 * (C) Copyright 2018 Rockchip Electronics Co., Ltd 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <version.h> 9 #include <boot_rkimg.h> 10 #include <debug_uart.h> 11 #include <dm.h> 12 #include <key.h> 13 #include <led.h> 14 #include <misc.h> 15 #include <ram.h> 16 #include <spl.h> 17 #include <optee_include/OpteeClientInterface.h> 18 #include <power/fuel_gauge.h> 19 #include <asm/arch/bootrom.h> 20 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS 21 #include <asm/arch/rk_atags.h> 22 #endif 23 #include <asm/arch/pcie_ep_boot.h> 24 #include <asm/arch/sdram.h> 25 #include <asm/arch/boot_mode.h> 26 #include <asm/arch-rockchip/sys_proto.h> 27 #include <asm/io.h> 28 #include <asm/arch/param.h> 29 #include <asm/arch/rk_hwid.h> 30 31 DECLARE_GLOBAL_DATA_PTR; 32 33 void board_return_to_bootrom(void) 34 { 35 back_to_bootrom(BROM_BOOT_NEXTSTAGE); 36 } 37 38 __weak const char * const boot_devices[BROM_LAST_BOOTSOURCE + 1] = { 39 }; 40 41 const char *board_spl_was_booted_from(void) 42 { 43 u32 bootdevice_brom_id = readl(BROM_BOOTSOURCE_ID_ADDR); 44 const char *bootdevice_ofpath = NULL; 45 46 if ((bootdevice_brom_id & BROM_DOWNLOAD_MASK) == BROM_DOWNLOAD_MASK) 47 bootdevice_brom_id = BROM_BOOTSOURCE_USB; 48 49 bootdevice_brom_id = bootdevice_brom_id & BROM_BOOTSOURCE_MASK; 50 if (bootdevice_brom_id < ARRAY_SIZE(boot_devices)) 51 bootdevice_ofpath = boot_devices[bootdevice_brom_id]; 52 53 if (bootdevice_ofpath) 54 debug("%s: brom_bootdevice_id %x maps to '%s'\n", 55 __func__, bootdevice_brom_id, bootdevice_ofpath); 56 else 57 debug("%s: failed to resolve brom_bootdevice_id %x\n", 58 __func__, bootdevice_brom_id); 59 60 return bootdevice_ofpath; 61 } 62 63 u32 spl_boot_device(void) 64 { 65 u32 boot_device = BOOT_DEVICE_MMC1; 66 67 #if defined(CONFIG_TARGET_CHROMEBOOK_JERRY) || \ 68 defined(CONFIG_TARGET_CHROMEBIT_MICKEY) || \ 69 defined(CONFIG_TARGET_CHROMEBOOK_MINNIE) 70 return BOOT_DEVICE_SPI; 71 #endif 72 if (CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM)) 73 return BOOT_DEVICE_BOOTROM; 74 75 return boot_device; 76 } 77 78 u32 spl_boot_mode(const u32 boot_device) 79 { 80 return MMCSD_MODE_RAW; 81 } 82 83 __weak void rockchip_stimer_init(void) 84 { 85 /* If Timer already enabled, don't re-init it */ 86 u32 reg = readl(CONFIG_ROCKCHIP_STIMER_BASE + 0x10); 87 if ( reg & 0x1 ) 88 return; 89 #ifndef CONFIG_ARM64 90 asm volatile("mcr p15, 0, %0, c14, c0, 0" 91 : : "r"(COUNTER_FREQUENCY)); 92 #endif 93 writel(0, CONFIG_ROCKCHIP_STIMER_BASE + 0x10); 94 writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE); 95 writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE + 4); 96 writel(1, CONFIG_ROCKCHIP_STIMER_BASE + 0x10); 97 } 98 99 __weak int arch_cpu_init(void) 100 { 101 return 0; 102 } 103 104 __weak int rk_board_init_f(void) 105 { 106 return 0; 107 } 108 109 #ifndef CONFIG_SPL_LIBGENERIC_SUPPORT 110 void udelay(unsigned long usec) 111 { 112 __udelay(usec); 113 } 114 115 void hang(void) 116 { 117 bootstage_error(BOOTSTAGE_ID_NEED_RESET); 118 for (;;) 119 ; 120 } 121 122 /** 123 * memset - Fill a region of memory with the given value 124 * @s: Pointer to the start of the area. 125 * @c: The byte to fill the area with 126 * @count: The size of the area. 127 * 128 * Do not use memset() to access IO space, use memset_io() instead. 129 */ 130 void *memset(void *s, int c, size_t count) 131 { 132 unsigned long *sl = (unsigned long *)s; 133 char *s8; 134 135 #if !CONFIG_IS_ENABLED(TINY_MEMSET) 136 unsigned long cl = 0; 137 int i; 138 139 /* do it one word at a time (32 bits or 64 bits) while possible */ 140 if (((ulong)s & (sizeof(*sl) - 1)) == 0) { 141 for (i = 0; i < sizeof(*sl); i++) { 142 cl <<= 8; 143 cl |= c & 0xff; 144 } 145 while (count >= sizeof(*sl)) { 146 *sl++ = cl; 147 count -= sizeof(*sl); 148 } 149 } 150 #endif /* fill 8 bits at a time */ 151 s8 = (char *)sl; 152 while (count--) 153 *s8++ = c; 154 155 return s; 156 } 157 #endif 158 159 #ifdef CONFIG_SPL_DM_RESET 160 static void brom_download(void) 161 { 162 if (gd->console_evt == 0x02) { 163 printf("ctrl+b: Bootrom download!\n"); 164 writel(BOOT_BROM_DOWNLOAD, CONFIG_ROCKCHIP_BOOT_MODE_REG); 165 do_reset(NULL, 0, 0, NULL); 166 } 167 } 168 #endif 169 170 static void spl_hotkey_init(void) 171 { 172 /* If disable console, skip getting uart reg */ 173 if (!gd || gd->flags & GD_FLG_DISABLE_CONSOLE) 174 return; 175 if (!gd->have_console) 176 return; 177 178 /* serial uclass only exists when enable CONFIG_SPL_FRAMEWORK */ 179 #ifdef CONFIG_SPL_FRAMEWORK 180 if (serial_tstc()) { 181 gd->console_evt = serial_getc(); 182 #else 183 if (debug_uart_tstc()) { 184 gd->console_evt = debug_uart_getc(); 185 #endif 186 if (gd->console_evt <= 0x1a) /* 'z' */ 187 printf("SPL Hotkey: ctrl+%c\n", 188 gd->console_evt + 'a' - 1); 189 } 190 191 return; 192 } 193 194 void board_init_f(ulong dummy) 195 { 196 #ifdef CONFIG_SPL_FRAMEWORK 197 int ret; 198 #if !defined(CONFIG_SUPPORT_TPL) 199 struct udevice *dev; 200 #endif 201 #endif 202 gd->flags = dummy; 203 rockchip_stimer_init(); 204 #define EARLY_UART 205 #if defined(EARLY_UART) && defined(CONFIG_DEBUG_UART) 206 /* 207 * Debug UART can be used from here if required: 208 * 209 * debug_uart_init(); 210 * printch('a'); 211 * printhex8(0x1234); 212 * printascii("string"); 213 */ 214 if (!gd->serial.using_pre_serial && 215 !(gd->flags & GD_FLG_DISABLE_CONSOLE)) 216 debug_uart_init(); 217 printascii("U-Boot SPL board init"); 218 #endif 219 gd->sys_start_tick = get_ticks(); 220 #ifdef CONFIG_SPL_PCIE_EP_SUPPORT 221 rockchip_pcie_ep_init(); 222 #endif 223 #ifdef CONFIG_SPL_FRAMEWORK 224 ret = spl_early_init(); 225 if (ret) { 226 printf("spl_early_init() failed: %d\n", ret); 227 hang(); 228 } 229 #if !defined(CONFIG_SUPPORT_TPL) 230 debug("\nspl:init dram\n"); 231 ret = uclass_get_device(UCLASS_RAM, 0, &dev); 232 if (ret) { 233 printf("DRAM init failed: %d\n", ret); 234 return; 235 } 236 #endif 237 preloader_console_init(); 238 #else 239 /* Some SoCs like rk3036 does not use any frame work */ 240 sdram_init(); 241 #endif 242 /* Get hotkey and store in gd */ 243 spl_hotkey_init(); 244 #ifdef CONFIG_SPL_DM_RESET 245 brom_download(); 246 #endif 247 arch_cpu_init(); 248 rk_board_init_f(); 249 #if defined(CONFIG_SPL_RAM_DEVICE) && defined(CONFIG_SPL_PCIE_EP_SUPPORT) 250 rockchip_pcie_ep_get_firmware(); 251 #endif 252 #if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_SPL_BOARD_INIT) 253 back_to_bootrom(BROM_BOOT_NEXTSTAGE); 254 #endif 255 256 } 257 258 #ifdef CONFIG_SPL_LOAD_FIT 259 int board_fit_config_name_match(const char *name) 260 { 261 /* Just empty function now - can't decide what to choose */ 262 debug("%s: %s\n", __func__, name); 263 264 return 0; 265 } 266 #endif 267 268 int board_init_f_boot_flags(void) 269 { 270 int boot_flags = 0; 271 272 #if CONFIG_IS_ENABLED(FPGA_ROCKCHIP) 273 arch_fpga_init(); 274 #endif 275 #ifdef CONFIG_PSTORE 276 param_parse_pstore(); 277 #endif 278 /* pre-loader serial */ 279 #if defined(CONFIG_ROCKCHIP_PRELOADER_SERIAL) && \ 280 defined(CONFIG_ROCKCHIP_PRELOADER_ATAGS) 281 struct tag *t; 282 283 t = atags_get_tag(ATAG_SERIAL); 284 if (t) { 285 gd->serial.using_pre_serial = 1; 286 gd->serial.enable = t->u.serial.enable; 287 gd->serial.baudrate = t->u.serial.baudrate; 288 gd->serial.addr = t->u.serial.addr; 289 gd->serial.id = t->u.serial.id; 290 gd->baudrate = t->u.serial.baudrate; 291 if (!t->u.serial.enable) 292 boot_flags |= GD_FLG_DISABLE_CONSOLE; 293 debug("preloader: enable=%d, addr=0x%x, baudrate=%d, id=%d\n", 294 t->u.serial.enable, (u32)t->u.serial.addr, 295 t->u.serial.baudrate, t->u.serial.id); 296 } else 297 #endif 298 { 299 gd->baudrate = CONFIG_BAUDRATE; 300 gd->serial.baudrate = CONFIG_BAUDRATE; 301 gd->serial.addr = CONFIG_DEBUG_UART_BASE; 302 } 303 304 /* The highest priority to turn off (override) console */ 305 #if defined(CONFIG_DISABLE_CONSOLE) 306 boot_flags |= GD_FLG_DISABLE_CONSOLE; 307 #endif 308 309 return boot_flags; 310 } 311 312 #ifdef CONFIG_SPL_BOARD_INIT 313 __weak int rk_spl_board_init(void) 314 { 315 return 0; 316 } 317 318 static int setup_led(void) 319 { 320 #ifdef CONFIG_SPL_LED 321 struct udevice *dev; 322 char *led_name; 323 int ret; 324 325 led_name = fdtdec_get_config_string(gd->fdt_blob, "u-boot,boot-led"); 326 if (!led_name) 327 return 0; 328 ret = led_get_by_label(led_name, &dev); 329 if (ret) { 330 debug("%s: get=%d\n", __func__, ret); 331 return ret; 332 } 333 ret = led_set_state(dev, LEDST_ON); 334 if (ret) 335 return ret; 336 #endif 337 338 return 0; 339 } 340 341 void spl_board_init(void) 342 { 343 int ret; 344 345 ret = setup_led(); 346 347 if (ret) { 348 debug("LED ret=%d\n", ret); 349 hang(); 350 } 351 352 rk_spl_board_init(); 353 #if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM) 354 back_to_bootrom(BROM_BOOT_NEXTSTAGE); 355 #endif 356 return; 357 } 358 #endif 359 360 #ifdef CONFIG_SPL_KERNEL_BOOT 361 static int spl_rockchip_dnl_key_pressed(void) 362 { 363 #if defined(CONFIG_SPL_INPUT) 364 return key_read(KEY_VOLUMEUP); 365 #else 366 return 0; 367 #endif 368 } 369 370 #ifdef CONFIG_SPL_DM_FUEL_GAUGE 371 bool spl_is_low_power(void) 372 { 373 struct udevice *dev; 374 int ret, voltage; 375 376 ret = uclass_get_device(UCLASS_FG, 0, &dev); 377 if (ret) { 378 debug("Get charge display failed, ret=%d\n", ret); 379 return false; 380 } 381 382 voltage = fuel_gauge_get_voltage(dev); 383 if (voltage >= CONFIG_SPL_POWER_LOW_VOLTAGE_THRESHOLD) 384 return false; 385 386 return true; 387 } 388 #endif 389 390 void spl_next_stage(struct spl_image_info *spl) 391 { 392 const char *reason[] = { "Recovery key", "Ctrl+c", "LowPwr", "Other" }; 393 uint32_t reg_boot_mode; 394 int i = 0; 395 396 if (spl_rockchip_dnl_key_pressed()) { 397 i = 0; 398 spl->next_stage = SPL_NEXT_STAGE_UBOOT; 399 goto out; 400 } 401 402 if (gd->console_evt == 0x03) { 403 i = 1; 404 spl->next_stage = SPL_NEXT_STAGE_UBOOT; 405 goto out; 406 } 407 408 #ifdef CONFIG_SPL_DM_FUEL_GAUGE 409 if (spl_is_low_power()) { 410 i = 2; 411 spl->next_stage = SPL_NEXT_STAGE_UBOOT; 412 goto out; 413 } 414 #endif 415 416 reg_boot_mode = readl((void *)CONFIG_ROCKCHIP_BOOT_MODE_REG); 417 switch (reg_boot_mode) { 418 case BOOT_LOADER: 419 case BOOT_FASTBOOT: 420 case BOOT_CHARGING: 421 case BOOT_UMS: 422 case BOOT_DFU: 423 i = 3; 424 spl->next_stage = SPL_NEXT_STAGE_UBOOT; 425 break; 426 default: 427 spl->next_stage = SPL_NEXT_STAGE_KERNEL; 428 } 429 430 out: 431 if (spl->next_stage == SPL_NEXT_STAGE_UBOOT) 432 printf("Enter uboot reason: %s\n", reason[i]); 433 434 return; 435 } 436 437 const char *spl_kernel_partition(struct spl_image_info *spl, 438 struct spl_load_info *info) 439 { 440 struct bootloader_message *bmsg = NULL; 441 u32 boot_mode; 442 int ret, cnt; 443 u32 sector = 0; 444 445 #ifdef CONFIG_SPL_LIBDISK_SUPPORT 446 disk_partition_t part_info; 447 448 ret = part_get_info_by_name(info->dev, PART_MISC, &part_info); 449 if (ret >= 0) 450 sector = part_info.start; 451 #else 452 sector = CONFIG_SPL_MISC_SECTOR; 453 #endif 454 if (sector) { 455 cnt = DIV_ROUND_UP(sizeof(*bmsg), info->bl_len); 456 bmsg = memalign(ARCH_DMA_MINALIGN, cnt * info->bl_len); 457 ret = info->read(info, sector + BCB_MESSAGE_BLK_OFFSET, 458 cnt, bmsg); 459 if (ret == cnt && !strcmp(bmsg->command, "boot-recovery")) { 460 free(bmsg); 461 return PART_RECOVERY; 462 } else { 463 free(bmsg); 464 } 465 } 466 467 boot_mode = readl((void *)CONFIG_ROCKCHIP_BOOT_MODE_REG); 468 469 return (boot_mode == BOOT_RECOVERY) ? PART_RECOVERY : PART_BOOT; 470 } 471 472 static void spl_fdt_fixup_memory(struct spl_image_info *spl_image) 473 { 474 void *blob = spl_image->fdt_addr; 475 struct tag *t; 476 u64 start[CONFIG_NR_DRAM_BANKS]; 477 u64 size[CONFIG_NR_DRAM_BANKS]; 478 int i, count, err; 479 480 err = fdt_check_header(blob); 481 if (err < 0) { 482 printf("Invalid dtb\n"); 483 return; 484 } 485 486 /* Fixup memory node based on ddr_mem atags */ 487 t = atags_get_tag(ATAG_DDR_MEM); 488 if (t && t->u.ddr_mem.count) { 489 count = t->u.ddr_mem.count; 490 for (i = 0; i < count; i++) { 491 start[i] = t->u.ddr_mem.bank[i]; 492 size[i] = t->u.ddr_mem.bank[i + count]; 493 if (size[i] == 0) 494 continue; 495 debug("Adding bank: 0x%08llx - 0x%08llx (size: 0x%08llx)\n", 496 start[i], start[i] + size[i], size[i]); 497 } 498 499 fdt_increase_size(blob, 512); 500 501 err = fdt_fixup_memory_banks(blob, start, size, count); 502 if (err < 0) { 503 printf("Fixup kernel dtb memory node failed: %s\n", fdt_strerror(err)); 504 return; 505 } 506 } 507 508 return; 509 } 510 511 #if defined(CONFIG_SPL_ROCKCHIP_HWID_DTB) 512 int spl_find_hwid_dtb(const char *fdt_name) 513 { 514 hwid_init_data(); 515 516 return hwid_dtb_is_available(fdt_name); 517 } 518 #endif 519 #endif 520 521 void spl_perform_fixups(struct spl_image_info *spl_image) 522 { 523 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS 524 atags_set_bootdev_by_spl_bootdevice(spl_image->boot_device); 525 #ifdef BUILD_SPL_TAG 526 atags_set_shared_fwver(FW_SPL, "spl-"BUILD_SPL_TAG); 527 #endif 528 #endif 529 #if defined(CONFIG_SPL_KERNEL_BOOT) 530 if (spl_image->next_stage == SPL_NEXT_STAGE_KERNEL) 531 spl_fdt_fixup_memory(spl_image); 532 #endif 533 return; 534 } 535 536 void spl_hang_reset(void) 537 { 538 printf("# Reset the board to bootrom #\n"); 539 #if defined(CONFIG_SPL_SYSRESET) && defined(CONFIG_SPL_DRIVERS_MISC_SUPPORT) 540 /* reset is available after dm setup */ 541 if (gd->flags & GD_FLG_SPL_EARLY_INIT) { 542 writel(BOOT_BROM_DOWNLOAD, CONFIG_ROCKCHIP_BOOT_MODE_REG); 543 do_reset(NULL, 0, 0, NULL); 544 } 545 #endif 546 } 547 548 #ifdef CONFIG_SPL_FIT_ROLLBACK_PROTECT 549 int fit_read_otp_rollback_index(uint32_t fit_index, uint32_t *otp_index) 550 { 551 int ret = 0; 552 553 *otp_index = 0; 554 #if defined(CONFIG_SPL_ROCKCHIP_SECURE_OTP) 555 struct udevice *dev; 556 u32 index, i, otp_version; 557 u32 bit_count; 558 559 dev = misc_otp_get_device(OTP_S); 560 if (!dev) 561 return -ENODEV; 562 563 otp_version = 0; 564 for (i = 0; i < OTP_UBOOT_ROLLBACK_WORDS; i++) { 565 if (misc_otp_read(dev, OTP_UBOOT_ROLLBACK_OFFSET + i * 4, 566 &index, 567 4)) { 568 printf("Can't read rollback index\n"); 569 return -EIO; 570 } 571 572 bit_count = fls(index); 573 otp_version += bit_count; 574 } 575 *otp_index = otp_version; 576 #endif 577 578 return ret; 579 } 580 581 static int fit_write_otp_rollback_index(u32 fit_index) 582 { 583 #if defined(CONFIG_SPL_ROCKCHIP_SECURE_OTP) 584 struct udevice *dev; 585 u32 index, i, otp_index; 586 587 if (!fit_index) 588 return 0; 589 590 if (fit_index > OTP_UBOOT_ROLLBACK_WORDS * 32) 591 return -EINVAL; 592 593 dev = misc_otp_get_device(OTP_S); 594 if (!dev) 595 return -ENODEV; 596 597 if (fit_read_otp_rollback_index(fit_index, &otp_index)) 598 return -EIO; 599 600 if (otp_index < fit_index) { 601 /* Write new SW version to otp */ 602 for (i = 0; i < OTP_UBOOT_ROLLBACK_WORDS; i++) { 603 /* 604 * If fit_index is equal to 0, then execute 0xffffffff >> 32. 605 * But the operand can only be 0 - 31. The "0xffffffff >> 32" is 606 * actually be "0xffffffff >> 0". 607 */ 608 if (!fit_index) 609 break; 610 /* convert to base-1 representation */ 611 index = 0xffffffff >> (OTP_ALL_ONES_NUM_BITS - 612 min(fit_index, (u32)OTP_ALL_ONES_NUM_BITS)); 613 fit_index -= min(fit_index, 614 (u32)OTP_ALL_ONES_NUM_BITS); 615 if (index) { 616 if (misc_otp_write(dev, OTP_UBOOT_ROLLBACK_OFFSET + i * 4, 617 &index, 618 4)) { 619 printf("Can't write rollback index\n"); 620 return -EIO; 621 } 622 } 623 } 624 } 625 #endif 626 627 return 0; 628 } 629 #endif 630 631 int spl_board_prepare_for_jump(struct spl_image_info *spl_image) 632 { 633 #ifdef CONFIG_SPL_FIT_ROLLBACK_PROTECT 634 int ret; 635 636 ret = fit_write_otp_rollback_index(gd->rollback_index); 637 if (ret) { 638 panic("Failed to write fit rollback index %d, ret=%d", 639 gd->rollback_index, ret); 640 } 641 #endif 642 643 #ifdef CONFIG_SPL_ROCKCHIP_HW_DECOMPRESS 644 misc_decompress_cleanup(); 645 #endif 646 return 0; 647 } 648