1 /* 2 * (C) Copyright 2017 Rockchip Electronics Co., Ltd. 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <amp.h> 9 #include <android_ab.h> 10 #include <android_bootloader.h> 11 #include <android_image.h> 12 #include <bidram.h> 13 #include <boot_rkimg.h> 14 #include <cli.h> 15 #include <clk.h> 16 #include <console.h> 17 #include <debug_uart.h> 18 #include <dm.h> 19 #include <dvfs.h> 20 #include <io-domain.h> 21 #include <image.h> 22 #include <key.h> 23 #include <memblk.h> 24 #include <misc.h> 25 #include <of_live.h> 26 #include <mtd_blk.h> 27 #include <ram.h> 28 #include <rockchip_debugger.h> 29 #include <syscon.h> 30 #include <sysmem.h> 31 #include <video_rockchip.h> 32 #include <xbc.h> 33 #include <asm/io.h> 34 #include <asm/gpio.h> 35 #include <android_avb/rk_avb_ops_user.h> 36 #include <dm/uclass-internal.h> 37 #include <dm/root.h> 38 #include <power/charge_display.h> 39 #include <power/regulator.h> 40 #include <optee_include/OpteeClientInterface.h> 41 #include <optee_include/OpteeClientApiLib.h> 42 #include <optee_include/tee_api_defines.h> 43 #include <asm/arch/boot_mode.h> 44 #include <asm/arch/clock.h> 45 #include <asm/arch/cpu.h> 46 #include <asm/arch/hotkey.h> 47 #include <asm/arch/param.h> 48 #include <asm/arch/periph.h> 49 #include <asm/arch/resource_img.h> 50 #include <asm/arch/rk_atags.h> 51 #include <asm/arch/vendor.h> 52 #ifdef CONFIG_ROCKCHIP_EINK_DISPLAY 53 #include <rk_eink.h> 54 #endif 55 56 DECLARE_GLOBAL_DATA_PTR; 57 58 __weak int rk_board_late_init(void) 59 { 60 return 0; 61 } 62 63 __weak int rk_board_fdt_fixup(void *blob) 64 { 65 return 0; 66 } 67 68 __weak int soc_clk_dump(void) 69 { 70 return 0; 71 } 72 73 __weak int set_armclk_rate(void) 74 { 75 return 0; 76 } 77 78 __weak int rk_board_init(void) 79 { 80 return 0; 81 } 82 83 /* 84 * define serialno max length, the max length is 512 Bytes 85 * The remaining bytes are used to ensure that the first 512 bytes 86 * are valid when executing 'env_set("serial#", value)'. 87 */ 88 #define VENDOR_SN_MAX 513 89 #define CPUID_LEN 0x10 90 #define CPUID_OFF 0x07 91 92 #define MAX_ETHERNET 0x2 93 94 static int rockchip_set_ethaddr(void) 95 { 96 #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 97 char buf[ARP_HLEN_ASCII + 1], mac[16]; 98 u8 ethaddr[ARP_HLEN * MAX_ETHERNET] = {0}; 99 int ret, i; 100 bool need_write = false, randomed = false; 101 102 ret = vendor_storage_read(LAN_MAC_ID, ethaddr, sizeof(ethaddr)); 103 for (i = 0; i < MAX_ETHERNET; i++) { 104 if (ret <= 0 || !is_valid_ethaddr(ðaddr[i * ARP_HLEN])) { 105 if (!randomed) { 106 net_random_ethaddr(ðaddr[i * ARP_HLEN]); 107 randomed = true; 108 } else { 109 if (i > 0) { 110 memcpy(ðaddr[i * ARP_HLEN], 111 ðaddr[(i - 1) * ARP_HLEN], 112 ARP_HLEN); 113 ethaddr[i * ARP_HLEN] |= 0x02; 114 ethaddr[i * ARP_HLEN] += (i << 2); 115 } 116 } 117 118 need_write = true; 119 } 120 121 if (is_valid_ethaddr(ðaddr[i * ARP_HLEN])) { 122 sprintf(buf, "%pM", ðaddr[i * ARP_HLEN]); 123 if (i == 0) 124 memcpy(mac, "ethaddr", sizeof("ethaddr")); 125 else 126 sprintf(mac, "eth%daddr", i); 127 env_set(mac, buf); 128 } 129 } 130 131 if (need_write) { 132 ret = vendor_storage_write(LAN_MAC_ID, 133 ethaddr, sizeof(ethaddr)); 134 if (ret < 0) 135 printf("%s: vendor_storage_write failed %d\n", 136 __func__, ret); 137 } 138 #endif 139 140 return 0; 141 } 142 143 static int rockchip_set_serialno(void) 144 { 145 u8 low[CPUID_LEN / 2], high[CPUID_LEN / 2]; 146 u8 cpuid[CPUID_LEN] = {0}; 147 char serialno_str[VENDOR_SN_MAX]; 148 int ret = 0, i; 149 u64 serialno; 150 151 /* Read serial number from vendor storage part */ 152 memset(serialno_str, 0, VENDOR_SN_MAX); 153 154 #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 155 ret = vendor_storage_read(SN_ID, serialno_str, (VENDOR_SN_MAX-1)); 156 if (ret > 0) { 157 i = strlen(serialno_str); 158 for (; i > 0; i--) { 159 if ((serialno_str[i] >= 'a' && serialno_str[i] <= 'z') || 160 (serialno_str[i] >= 'A' && serialno_str[i] <= 'Z') || 161 (serialno_str[i] >= '0' && serialno_str[i] <= '9')) 162 break; 163 } 164 165 serialno_str[i + 1] = 0x0; 166 env_set("serial#", serialno_str); 167 } else { 168 #endif 169 #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 170 struct udevice *dev; 171 172 /* retrieve the device */ 173 if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 174 ret = uclass_get_device_by_driver(UCLASS_MISC, 175 DM_GET_DRIVER(rockchip_efuse), 176 &dev); 177 else 178 ret = uclass_get_device_by_driver(UCLASS_MISC, 179 DM_GET_DRIVER(rockchip_otp), 180 &dev); 181 182 if (ret) { 183 printf("%s: could not find efuse/otp device\n", __func__); 184 return ret; 185 } 186 187 /* read the cpu_id range from the efuses */ 188 ret = misc_read(dev, CPUID_OFF, &cpuid, sizeof(cpuid)); 189 if (ret) { 190 printf("%s: read cpuid from efuse/otp failed, ret=%d\n", 191 __func__, ret); 192 return ret; 193 } 194 #else 195 /* generate random cpuid */ 196 for (i = 0; i < CPUID_LEN; i++) 197 cpuid[i] = (u8)(rand()); 198 #endif 199 /* Generate the serial number based on CPU ID */ 200 for (i = 0; i < 8; i++) { 201 low[i] = cpuid[1 + (i << 1)]; 202 high[i] = cpuid[i << 1]; 203 } 204 205 serialno = crc32_no_comp(0, low, 8); 206 serialno |= (u64)crc32_no_comp(serialno, high, 8) << 32; 207 snprintf(serialno_str, sizeof(serialno_str), "%llx", serialno); 208 209 env_set("serial#", serialno_str); 210 #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 211 } 212 #endif 213 214 return ret; 215 } 216 217 #if defined(CONFIG_USB_FUNCTION_FASTBOOT) 218 int fb_set_reboot_flag(void) 219 { 220 printf("Setting reboot to fastboot flag ...\n"); 221 writel(BOOT_FASTBOOT, CONFIG_ROCKCHIP_BOOT_MODE_REG); 222 223 return 0; 224 } 225 #endif 226 227 #ifdef CONFIG_ROCKCHIP_USB_BOOT 228 static int boot_from_udisk(void) 229 { 230 struct blk_desc *desc; 231 char *devtype; 232 char *devnum; 233 234 devtype = env_get("devtype"); 235 devnum = env_get("devnum"); 236 237 /* Booting priority: mmc1 > udisk */ 238 if (!strcmp(devtype, "mmc") && !strcmp(devnum, "1")) 239 return 0; 240 241 if (!run_command("usb start", -1)) { 242 desc = blk_get_devnum_by_type(IF_TYPE_USB, 0); 243 if (!desc) { 244 printf("No usb device found\n"); 245 return -ENODEV; 246 } 247 248 if (!run_command("rkimgtest usb 0", -1)) { 249 rockchip_set_bootdev(desc); 250 env_set("devtype", "usb"); 251 env_set("devnum", "0"); 252 printf("Boot from usb 0\n"); 253 } else { 254 printf("No usb dev 0 found\n"); 255 return -ENODEV; 256 } 257 } 258 259 return 0; 260 } 261 #endif 262 263 static void env_fixup(void) 264 { 265 struct memblock mem; 266 ulong u_addr_r; 267 phys_size_t end; 268 char *addr_r; 269 270 #ifdef ENV_MEM_LAYOUT_SETTINGS1 271 const char *env_addr0[] = { 272 "scriptaddr", "pxefile_addr_r", 273 "fdt_addr_r", "kernel_addr_r", "ramdisk_addr_r", 274 }; 275 const char *env_addr1[] = { 276 "scriptaddr1", "pxefile_addr1_r", 277 "fdt_addr1_r", "kernel_addr1_r", "ramdisk_addr1_r", 278 }; 279 int i; 280 281 /* 128M is a typical ram size for most platform, so as default here */ 282 if (gd->ram_size <= SZ_128M) { 283 /* Replace orignal xxx_addr_r */ 284 for (i = 0; i < ARRAY_SIZE(env_addr1); i++) { 285 addr_r = env_get(env_addr1[i]); 286 if (addr_r) 287 env_set(env_addr0[i], addr_r); 288 } 289 } 290 #endif 291 /* No BL32 ? */ 292 if (!(gd->flags & GD_FLG_BL32_ENABLED)) { 293 /* 294 * [1] Move kernel to lower address if possible. 295 */ 296 addr_r = env_get("kernel_addr_no_low_bl32_r"); 297 if (addr_r) 298 env_set("kernel_addr_r", addr_r); 299 300 /* 301 * [2] Move ramdisk at BL32 position if need. 302 * 303 * 0x0a200000 and 0x08400000 are rockchip traditional address 304 * of BL32 and ramdisk: 305 * 306 * |------------|------------| 307 * | BL32 | ramdisk | 308 * |------------|------------| 309 * 310 * Move ramdisk to BL32 address to fix sysmem alloc failed 311 * issue on the board with critical memory(ie. 256MB). 312 */ 313 if (gd->ram_size > SZ_128M && gd->ram_size <= SZ_256M) { 314 u_addr_r = env_get_ulong("ramdisk_addr_r", 16, 0); 315 if (u_addr_r == 0x0a200000) 316 env_set("ramdisk_addr_r", "0x08400000"); 317 } 318 } else { 319 mem = param_parse_optee_mem(); 320 321 /* 322 * [1] Move kernel forward if possible. 323 */ 324 if (mem.base > SZ_128M) { 325 addr_r = env_get("kernel_addr_no_low_bl32_r"); 326 if (addr_r) 327 env_set("kernel_addr_r", addr_r); 328 } 329 330 /* 331 * [2] Move ramdisk backward if optee enlarge. 332 */ 333 end = mem.base + mem.size; 334 u_addr_r = env_get_ulong("ramdisk_addr_r", 16, 0); 335 if (u_addr_r >= mem.base && u_addr_r < end) 336 env_set_hex("ramdisk_addr_r", end); 337 } 338 } 339 340 static void cmdline_handle(void) 341 { 342 struct blk_desc *dev_desc; 343 344 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS 345 struct tag *t; 346 347 t = atags_get_tag(ATAG_PUB_KEY); 348 if (t) { 349 /* Pass if efuse/otp programmed */ 350 if (t->u.pub_key.flag == PUBKEY_FUSE_PROGRAMMED) 351 env_update("bootargs", "fuse.programmed=1"); 352 else 353 env_update("bootargs", "fuse.programmed=0"); 354 } 355 #endif 356 dev_desc = rockchip_get_bootdev(); 357 if (!dev_desc) 358 return; 359 360 /* 361 * From rk356x, the sd/udisk update flag was moved from 362 * IDB to Android BCB. 363 */ 364 if (get_bcb_recovery_msg() == BCB_MSG_RECOVERY_RK_FWUPDATE) { 365 if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 1) 366 env_update("bootargs", "sdfwupdate"); 367 else if (dev_desc->if_type == IF_TYPE_USB && dev_desc->devnum == 0) 368 env_update("bootargs", "usbfwupdate"); 369 } 370 } 371 372 int board_late_init(void) 373 { 374 rockchip_set_ethaddr(); 375 rockchip_set_serialno(); 376 setup_download_mode(); 377 #if (CONFIG_ROCKCHIP_BOOT_MODE_REG > 0) 378 setup_boot_mode(); 379 #endif 380 #ifdef CONFIG_ROCKCHIP_USB_BOOT 381 boot_from_udisk(); 382 #endif 383 #ifdef CONFIG_DM_CHARGE_DISPLAY 384 charge_display(); 385 #endif 386 #ifdef CONFIG_DRM_ROCKCHIP 387 rockchip_show_logo(); 388 #endif 389 #ifdef CONFIG_ROCKCHIP_EINK_DISPLAY 390 rockchip_eink_show_uboot_logo(); 391 #endif 392 env_fixup(); 393 soc_clk_dump(); 394 cmdline_handle(); 395 #ifdef CONFIG_AMP 396 amp_cpus_on(); 397 #endif 398 return rk_board_late_init(); 399 } 400 401 static void early_download(void) 402 { 403 #if defined(CONFIG_PWRKEY_DNL_TRIGGER_NUM) && \ 404 (CONFIG_PWRKEY_DNL_TRIGGER_NUM > 0) 405 if (pwrkey_download_init()) 406 printf("Pwrkey download init failed\n"); 407 #endif 408 409 #if (CONFIG_ROCKCHIP_BOOT_MODE_REG > 0) 410 if (is_hotkey(HK_BROM_DNL)) { 411 printf("Enter bootrom download..."); 412 flushc(); 413 writel(BOOT_BROM_DOWNLOAD, CONFIG_ROCKCHIP_BOOT_MODE_REG); 414 do_reset(NULL, 0, 0, NULL); 415 printf("failed!\n"); 416 } 417 #endif 418 } 419 420 static void board_debug_init(void) 421 { 422 if (!gd->serial.using_pre_serial && 423 !(gd->flags & GD_FLG_DISABLE_CONSOLE)) 424 debug_uart_init(); 425 426 if (tstc()) { 427 gd->console_evt = getc(); 428 if (gd->console_evt <= 0x1a) /* 'z' */ 429 printf("Hotkey: ctrl+%c\n", gd->console_evt + 'a' - 1); 430 } 431 432 if (IS_ENABLED(CONFIG_CONSOLE_DISABLE_CLI)) 433 printf("Cmd interface: disabled\n"); 434 } 435 436 #ifdef CONFIG_MTD_BLK 437 static void board_mtd_blk_map_partitions(void) 438 { 439 struct blk_desc *dev_desc; 440 441 dev_desc = rockchip_get_bootdev(); 442 if (dev_desc) 443 mtd_blk_map_partitions(dev_desc); 444 } 445 #endif 446 447 int board_init(void) 448 { 449 board_debug_init(); 450 451 #ifdef DEBUG 452 soc_clk_dump(); 453 #endif 454 455 #ifdef CONFIG_USING_KERNEL_DTB 456 #ifdef CONFIG_MTD_BLK 457 board_mtd_blk_map_partitions(); 458 #endif 459 init_kernel_dtb(); 460 #endif 461 early_download(); 462 463 /* 464 * pmucru isn't referenced on some platforms, so pmucru driver can't 465 * probe that the "assigned-clocks" is unused. 466 */ 467 clks_probe(); 468 #ifdef CONFIG_DM_REGULATOR 469 if (regulators_enable_boot_on(is_hotkey(HK_REGULATOR))) 470 debug("%s: Can't enable boot on regulator\n", __func__); 471 #endif 472 473 #ifdef CONFIG_ROCKCHIP_IO_DOMAIN 474 io_domain_init(); 475 #endif 476 477 set_armclk_rate(); 478 479 #ifdef CONFIG_DM_DVFS 480 dvfs_init(true); 481 #endif 482 483 #ifdef CONFIG_ANDROID_AB 484 if (ab_decrease_tries()) 485 printf("Decrease ab tries count fail!\n"); 486 #endif 487 488 return rk_board_init(); 489 } 490 491 int interrupt_debugger_init(void) 492 { 493 #ifdef CONFIG_ROCKCHIP_DEBUGGER 494 return rockchip_debugger_init(); 495 #else 496 return 0; 497 #endif 498 } 499 500 int board_fdt_fixup(void *blob) 501 { 502 /* Common fixup for DRM */ 503 #ifdef CONFIG_DRM_ROCKCHIP 504 rockchip_display_fixup(blob); 505 #endif 506 507 return rk_board_fdt_fixup(blob); 508 } 509 510 #if defined(CONFIG_ARM64_BOOT_AARCH32) || !defined(CONFIG_ARM64) 511 /* 512 * Common for OP-TEE: 513 * 64-bit & 32-bit mode: share memory dcache is always enabled; 514 * 515 * Common for U-Boot: 516 * 64-bit mode: MMU table is static defined in rkxxx.c file, all memory 517 * regions are mapped. That's good to match OP-TEE MMU policy. 518 * 519 * 32-bit mode: MMU table is setup according to gd->bd->bi_dram[..] where 520 * the OP-TEE region has been reserved, so it can not be 521 * mapped(i.e. dcache is disabled). That's *NOT* good to match 522 * OP-TEE MMU policy. 523 * 524 * For the data coherence when communication between U-Boot and OP-TEE, U-Boot 525 * should follow OP-TEE MMU policy. 526 * 527 * So 32-bit mode U-Boot should map OP-TEE share memory as dcache enabled. 528 */ 529 int board_initr_caches_fixup(void) 530 { 531 #ifdef CONFIG_OPTEE_CLIENT 532 struct memblock mem; 533 534 mem.base = 0; 535 mem.size = 0; 536 537 optee_get_shm_config(&mem.base, &mem.size); 538 if (mem.size) 539 mmu_set_region_dcache_behaviour(mem.base, mem.size, 540 DCACHE_WRITEBACK); 541 #endif 542 return 0; 543 } 544 #endif 545 546 void arch_preboot_os(uint32_t bootm_state) 547 { 548 if (bootm_state & BOOTM_STATE_OS_PREP) 549 hotkey_run(HK_CLI_OS_PRE); 550 } 551 552 void enable_caches(void) 553 { 554 icache_enable(); 555 dcache_enable(); 556 } 557 558 #ifdef CONFIG_LMB 559 /* 560 * Using last bi_dram[...] to initialize "bootm_low" and "bootm_mapsize". 561 * This makes lmb_alloc_base() always alloc from tail of sdram. 562 * If we don't assign it, bi_dram[0] is used by default and it may cause 563 * lmb_alloc_base() fail when bi_dram[0] range is small. 564 */ 565 void board_lmb_reserve(struct lmb *lmb) 566 { 567 char bootm_mapsize[32]; 568 char bootm_low[32]; 569 u64 start, size; 570 int i; 571 572 for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { 573 if (!gd->bd->bi_dram[i].size) 574 break; 575 } 576 577 start = gd->bd->bi_dram[i - 1].start; 578 size = gd->bd->bi_dram[i - 1].size; 579 580 /* 581 * 32-bit kernel: ramdisk/fdt shouldn't be loaded to highmem area(768MB+), 582 * otherwise "Unable to handle kernel paging request at virtual address ...". 583 * 584 * So that we hope limit highest address at 768M, but there comes the the 585 * problem: ramdisk is a compressed image and it expands after descompress, 586 * so it accesses 768MB+ and brings the above "Unable to handle kernel ...". 587 * 588 * We make a appointment that the highest memory address is 512MB, it 589 * makes lmb alloc safer. 590 */ 591 #ifndef CONFIG_ARM64 592 if (start >= ((u64)CONFIG_SYS_SDRAM_BASE + SZ_512M)) { 593 start = gd->bd->bi_dram[i - 2].start; 594 size = gd->bd->bi_dram[i - 2].size; 595 } 596 597 if ((start + size) > ((u64)CONFIG_SYS_SDRAM_BASE + SZ_512M)) 598 size = (u64)CONFIG_SYS_SDRAM_BASE + SZ_512M - start; 599 #endif 600 sprintf(bootm_low, "0x%llx", start); 601 sprintf(bootm_mapsize, "0x%llx", size); 602 env_set("bootm_low", bootm_low); 603 env_set("bootm_mapsize", bootm_mapsize); 604 } 605 #endif 606 607 #ifdef CONFIG_BIDRAM 608 int board_bidram_reserve(struct bidram *bidram) 609 { 610 struct memblock mem; 611 int ret; 612 613 /* ATF */ 614 mem = param_parse_atf_mem(); 615 ret = bidram_reserve(MEM_ATF, mem.base, mem.size); 616 if (ret) 617 return ret; 618 619 /* PSTORE/ATAGS/SHM */ 620 mem = param_parse_common_resv_mem(); 621 ret = bidram_reserve(MEM_SHM, mem.base, mem.size); 622 if (ret) 623 return ret; 624 625 /* OP-TEE */ 626 mem = param_parse_optee_mem(); 627 ret = bidram_reserve(MEM_OPTEE, mem.base, mem.size); 628 if (ret) 629 return ret; 630 631 return 0; 632 } 633 634 int board_sysmem_reserve(struct sysmem *sysmem) 635 { 636 #ifdef CONFIG_SKIP_RELOCATE_UBOOT 637 if (!sysmem_alloc_base_by_name("NO-RELOC-CODE", 638 CONFIG_SYS_TEXT_BASE, SZ_2M)) { 639 printf("Failed to reserve sysmem for U-Boot code\n"); 640 return -ENOMEM; 641 } 642 #endif 643 return 0; 644 } 645 646 parse_fn_t board_bidram_parse_fn(void) 647 { 648 return param_parse_ddr_mem; 649 } 650 #endif 651 652 int board_init_f_boot_flags(void) 653 { 654 int boot_flags = 0; 655 656 /* pre-loader serial */ 657 #if defined(CONFIG_ROCKCHIP_PRELOADER_SERIAL) && \ 658 defined(CONFIG_ROCKCHIP_PRELOADER_ATAGS) 659 struct tag *t; 660 661 t = atags_get_tag(ATAG_SERIAL); 662 if (t) { 663 gd->serial.using_pre_serial = 1; 664 gd->serial.enable = t->u.serial.enable; 665 gd->serial.baudrate = t->u.serial.baudrate; 666 gd->serial.addr = t->u.serial.addr; 667 gd->serial.id = t->u.serial.id; 668 gd->baudrate = CONFIG_BAUDRATE; 669 if (!t->u.serial.enable) 670 boot_flags |= GD_FLG_DISABLE_CONSOLE; 671 debug("preloader: enable=%d, addr=0x%lx, baudrate=%d, id=%d\n", 672 gd->serial.enable, gd->serial.addr, 673 gd->serial.baudrate, gd->serial.id); 674 } else 675 #endif 676 { 677 gd->baudrate = CONFIG_BAUDRATE; 678 gd->serial.baudrate = CONFIG_BAUDRATE; 679 gd->serial.addr = CONFIG_DEBUG_UART_BASE; 680 } 681 682 /* The highest priority to turn off (override) console */ 683 #if defined(CONFIG_DISABLE_CONSOLE) 684 boot_flags |= GD_FLG_DISABLE_CONSOLE; 685 #endif 686 687 return boot_flags; 688 } 689 690 #if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG) 691 #include <fdt_support.h> 692 #include <usb.h> 693 #include <usb/dwc2_udc.h> 694 695 static struct dwc2_plat_otg_data otg_data = { 696 .rx_fifo_sz = 512, 697 .np_tx_fifo_sz = 16, 698 .tx_fifo_sz = 128, 699 }; 700 701 int board_usb_init(int index, enum usb_init_type init) 702 { 703 const void *blob = gd->fdt_blob; 704 const fdt32_t *reg; 705 fdt_addr_t addr; 706 int node; 707 708 /* find the usb_otg node */ 709 node = fdt_node_offset_by_compatible(blob, -1, "snps,dwc2"); 710 711 retry: 712 if (node > 0) { 713 reg = fdt_getprop(blob, node, "reg", NULL); 714 if (!reg) 715 return -EINVAL; 716 717 addr = fdt_translate_address(blob, node, reg); 718 if (addr == OF_BAD_ADDR) { 719 pr_err("Not found usb_otg address\n"); 720 return -EINVAL; 721 } 722 723 #if defined(CONFIG_ROCKCHIP_RK3288) 724 if (addr != 0xff580000) { 725 node = fdt_node_offset_by_compatible(blob, node, 726 "snps,dwc2"); 727 goto retry; 728 } 729 #endif 730 } else { 731 /* 732 * With kernel dtb support, rk3288 dwc2 otg node 733 * use the rockchip legacy dwc2 driver "dwc_otg_310" 734 * with the compatible "rockchip,rk3288_usb20_otg", 735 * and rk3368 also use the "dwc_otg_310" driver with 736 * the compatible "rockchip,rk3368-usb". 737 */ 738 #if defined(CONFIG_ROCKCHIP_RK3288) 739 node = fdt_node_offset_by_compatible(blob, -1, 740 "rockchip,rk3288_usb20_otg"); 741 #elif defined(CONFIG_ROCKCHIP_RK3368) 742 node = fdt_node_offset_by_compatible(blob, -1, 743 "rockchip,rk3368-usb"); 744 #endif 745 if (node > 0) { 746 goto retry; 747 } else { 748 pr_err("Not found usb_otg device\n"); 749 return -ENODEV; 750 } 751 } 752 753 otg_data.regs_otg = (uintptr_t)addr; 754 755 return dwc2_udc_probe(&otg_data); 756 } 757 758 int board_usb_cleanup(int index, enum usb_init_type init) 759 { 760 return 0; 761 } 762 #endif 763 764 static void bootm_no_reloc(void) 765 { 766 char *ramdisk_high; 767 char *fdt_high; 768 769 if (!env_get_yesno("bootm-no-reloc")) 770 return; 771 772 ramdisk_high = env_get("initrd_high"); 773 fdt_high = env_get("fdt_high"); 774 775 if (!fdt_high) { 776 env_set_hex("fdt_high", -1UL); 777 printf("Fdt "); 778 } 779 780 if (!ramdisk_high) { 781 env_set_hex("initrd_high", -1UL); 782 printf("Ramdisk "); 783 } 784 785 if (!fdt_high || !ramdisk_high) 786 printf("skip relocation\n"); 787 } 788 789 int bootm_board_start(void) 790 { 791 /* 792 * print console record data 793 * 794 * On some rockchip platforms, uart debug and sdmmc pin are multiplex. 795 * If boot from sdmmc mode, the console data would be record in buffer, 796 * we switch to uart debug function in order to print it after loading 797 * images. 798 */ 799 #if defined(CONFIG_CONSOLE_RECORD) 800 if (!strcmp("mmc", env_get("devtype")) && 801 !strcmp("1", env_get("devnum"))) { 802 printf("IOMUX: sdmmc => uart debug"); 803 pinctrl_select_state(gd->cur_serial_dev, "default"); 804 console_record_print_purge(); 805 } 806 #endif 807 /* disable bootm relcation to save boot time */ 808 bootm_no_reloc(); 809 810 /* PCBA test needs more permission */ 811 if (get_bcb_recovery_msg() == BCB_MSG_RECOVERY_PCBA) 812 env_update("bootargs", "androidboot.selinux=permissive"); 813 814 /* sysmem */ 815 hotkey_run(HK_SYSMEM); 816 sysmem_overflow_check(); 817 818 return 0; 819 } 820 821 int bootm_image_populate_dtb(void *img) 822 { 823 if ((gd->flags & GD_FLG_KDTB_READY) && !gd->fdt_blob_kern) 824 sysmem_free((phys_addr_t)gd->fdt_blob); 825 else 826 gd->fdt_blob = (void *)env_get_ulong("fdt_addr_r", 16, 0); 827 828 return resource_populate_dtb(img, (void *)gd->fdt_blob); 829 } 830 831 /* 832 * Implement it to support CLI command: 833 * - Android: bootm [aosp addr] 834 * - FIT: bootm [fit addr] 835 * - uImage: bootm [uimage addr] 836 * 837 * Purpose: 838 * - The original bootm command args require fdt addr on AOSP, 839 * which is not flexible on rockchip boot/recovery.img. 840 * - Take Android/FIT/uImage image into sysmem management to avoid image 841 * memory overlap. 842 */ 843 #if defined(CONFIG_ANDROID_BOOTLOADER) || \ 844 defined(CONFIG_ROCKCHIP_FIT_IMAGE) || \ 845 defined(CONFIG_ROCKCHIP_UIMAGE) 846 int board_do_bootm(int argc, char * const argv[]) 847 { 848 int format; 849 void *img; 850 851 if (argc != 2) 852 return 0; 853 854 img = (void *)simple_strtoul(argv[1], NULL, 16); 855 format = (genimg_get_format(img)); 856 857 /* Android */ 858 #ifdef CONFIG_ANDROID_BOOT_IMAGE 859 if (format == IMAGE_FORMAT_ANDROID) { 860 struct andr_img_hdr *hdr; 861 ulong load_addr; 862 ulong size; 863 int ret; 864 865 hdr = (struct andr_img_hdr *)img; 866 printf("BOOTM: transferring to board Android\n"); 867 868 load_addr = env_get_ulong("kernel_addr_r", 16, 0); 869 load_addr -= hdr->page_size; 870 size = android_image_get_end(hdr) - (ulong)hdr; 871 872 if (!sysmem_alloc_base(MEM_ANDROID, (ulong)hdr, size)) 873 return -ENOMEM; 874 875 ret = bootm_image_populate_dtb(img); 876 if (ret) { 877 printf("bootm can't read dtb\n"); 878 return ret; 879 } 880 881 ret = android_image_memcpy_separate(hdr, &load_addr); 882 if (ret) { 883 printf("board do bootm failed, ret=%d\n", ret); 884 return ret; 885 } 886 887 return android_bootloader_boot_kernel(load_addr); 888 } 889 #endif 890 891 /* FIT */ 892 #if IMAGE_ENABLE_FIT 893 if (format == IMAGE_FORMAT_FIT) { 894 char boot_cmd[64]; 895 int ret; 896 897 printf("BOOTM: transferring to board FIT\n"); 898 899 ret = bootm_image_populate_dtb(img); 900 if (ret) { 901 printf("bootm can't read dtb\n"); 902 return ret; 903 } 904 snprintf(boot_cmd, sizeof(boot_cmd), "boot_fit %s", argv[1]); 905 return run_command(boot_cmd, 0); 906 } 907 #endif 908 909 /* uImage */ 910 #if 0 911 #if defined(CONFIG_IMAGE_FORMAT_LEGACY) 912 if (format == IMAGE_FORMAT_LEGACY && 913 image_get_type(img) == IH_TYPE_MULTI) { 914 char boot_cmd[64]; 915 916 printf("BOOTM: transferring to board uImage\n"); 917 snprintf(boot_cmd, sizeof(boot_cmd), "boot_uimage %s", argv[1]); 918 return run_command(boot_cmd, 0); 919 } 920 #endif 921 #endif 922 return 0; 923 } 924 #endif 925 926 void autoboot_command_fail_handle(void) 927 { 928 #ifdef CONFIG_ANDROID_AB 929 if (rk_avb_ab_have_bootable_slot() == true) 930 run_command("reset;", 0); 931 else 932 run_command("fastboot usb 0;", 0); 933 #endif 934 935 #ifdef CONFIG_AVB_VBMETA_PUBLIC_KEY_VALIDATE 936 run_command("rockusb 0 ${devtype} ${devnum}", 0); 937 run_command("fastboot usb 0;", 0); 938 #endif 939 940 } 941 942 #ifdef CONFIG_FIT_ROLLBACK_PROTECT 943 944 #define FIT_ROLLBACK_INDEX_LOCATION 0x66697472 /* "fitr" */ 945 946 int fit_read_otp_rollback_index(uint32_t fit_index, uint32_t *otp_index) 947 { 948 #ifdef CONFIG_OPTEE_CLIENT 949 u64 index; 950 int ret; 951 952 ret = trusty_read_rollback_index(FIT_ROLLBACK_INDEX_LOCATION, &index); 953 if (ret) { 954 if (ret != TEE_ERROR_ITEM_NOT_FOUND) 955 return ret; 956 957 index = 0; 958 printf("Initial otp index as %d\n", fit_index); 959 } 960 961 *otp_index = (uint32_t)index; 962 #else 963 *otp_index = 0; 964 #endif 965 966 return 0; 967 } 968 969 int fit_write_trusty_rollback_index(u32 trusty_index) 970 { 971 if (!trusty_index) 972 return 0; 973 974 return trusty_write_rollback_index(FIT_ROLLBACK_INDEX_LOCATION, 975 (u64)trusty_index); 976 } 977 #endif 978 979 void board_quiesce_devices(void *images) 980 { 981 hotkey_run(HK_CMDLINE); 982 hotkey_run(HK_CLI_OS_GO); 983 984 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS 985 /* Destroy atags makes next warm boot safer */ 986 atags_destroy(); 987 #endif 988 989 #ifdef CONFIG_ROCKCHIP_REBOOT_TEST 990 do_reset(NULL, 0, 0, NULL); 991 #endif 992 993 #ifdef CONFIG_FIT_ROLLBACK_PROTECT 994 int ret; 995 996 ret = fit_write_trusty_rollback_index(gd->rollback_index); 997 if (ret) { 998 panic("Failed to write fit rollback index %d, ret=%d", 999 gd->rollback_index, ret); 1000 } 1001 #endif 1002 1003 #ifdef CONFIG_ROCKCHIP_HW_DECOMPRESS 1004 misc_decompress_cleanup(); 1005 #endif 1006 } 1007 1008 char *board_fdt_chosen_bootargs(void *fdt) 1009 { 1010 /* bootargs_ext is used when dtbo is applied. */ 1011 const char *arr_bootargs[] = { "bootargs", "bootargs_ext" }; 1012 const char *bootargs; 1013 int nodeoffset; 1014 int i, dump; 1015 1016 /* debug */ 1017 hotkey_run(HK_INITCALL); 1018 dump = is_hotkey(HK_CMDLINE); 1019 if (dump) 1020 printf("## bootargs(u-boot): %s\n\n", env_get("bootargs")); 1021 1022 /* find or create "/chosen" node. */ 1023 nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen"); 1024 if (nodeoffset < 0) 1025 return NULL; 1026 1027 for (i = 0; i < ARRAY_SIZE(arr_bootargs); i++) { 1028 bootargs = fdt_getprop(fdt, nodeoffset, arr_bootargs[i], NULL); 1029 if (!bootargs) 1030 continue; 1031 if (dump) 1032 printf("## bootargs(kernel-%s): %s\n\n", 1033 arr_bootargs[i], bootargs); 1034 /* 1035 * Append kernel bootargs 1036 * If use AB system, delete default "root=" which route 1037 * to rootfs. Then the ab bootctl will choose the 1038 * high priority system to boot and add its UUID 1039 * to cmdline. The format is "roo=PARTUUID=xxxx...". 1040 */ 1041 #ifdef CONFIG_ANDROID_AB 1042 env_update_filter("bootargs", bootargs, "root="); 1043 #else 1044 env_update("bootargs", bootargs); 1045 #endif 1046 } 1047 1048 #ifdef CONFIG_MTD_BLK 1049 char *mtd_par_info = mtd_part_parse(NULL); 1050 1051 if (mtd_par_info) { 1052 if (memcmp(env_get("devtype"), "mtd", 3) == 0) 1053 env_update("bootargs", mtd_par_info); 1054 } 1055 #endif 1056 /* 1057 * Initrd fixup: remove unused "initrd=0x...,0x...", 1058 * this for compatible with legacy parameter.txt 1059 */ 1060 env_delete("bootargs", "initrd=", 0); 1061 1062 /* 1063 * If uart is required to be disabled during 1064 * power on, it would be not initialized by 1065 * any pre-loader and U-Boot. 1066 * 1067 * If we don't remove earlycon from commandline, 1068 * kernel hangs while using earlycon to putc/getc 1069 * which may dead loop for waiting uart status. 1070 * (It seems the root cause is baundrate is not 1071 * initilalized) 1072 * 1073 * So let's remove earlycon from commandline. 1074 */ 1075 if (gd->flags & GD_FLG_DISABLE_CONSOLE) 1076 env_delete("bootargs", "earlycon=", 0); 1077 1078 /* Android header v4+ need this handle */ 1079 #ifdef CONFIG_ANDROID_BOOT_IMAGE 1080 struct andr_img_hdr *hdr; 1081 1082 hdr = (void *)env_get_ulong("android_addr_r", 16, 0); 1083 if (hdr && !android_image_check_header(hdr) && hdr->header_version >= 4) { 1084 if (env_update_extract_subset("bootargs", "andr_bootargs", "androidboot.")) 1085 printf("extract androidboot.xxx error\n"); 1086 if (dump) 1087 printf("## bootargs(android): %s\n\n", env_get("andr_bootargs")); 1088 } 1089 #endif 1090 bootargs = env_get("bootargs"); 1091 if (dump) 1092 printf("## bootargs(merged): %s\n\n", bootargs); 1093 1094 return (char *)bootargs; 1095 } 1096 1097 int ft_verify_fdt(void *fdt) 1098 { 1099 /* for android header v4+, we load bootparams and fixup initrd */ 1100 #if defined(CONFIG_ANDROID_BOOT_IMAGE) && defined(CONFIG_XBC) 1101 struct andr_img_hdr *hdr; 1102 uint64_t initrd_start, initrd_end; 1103 char *bootargs, *p; 1104 int nodeoffset; 1105 int is_u64, err; 1106 u32 len; 1107 1108 hdr = (void *)env_get_ulong("android_addr_r", 16, 0); 1109 if (!hdr || android_image_check_header(hdr) || 1110 hdr->header_version < 4) 1111 return 1; 1112 1113 bootargs = env_get("andr_bootargs"); 1114 if (!bootargs) 1115 return 1; 1116 1117 /* trans character: space to new line */ 1118 p = bootargs; 1119 while (*p++) { 1120 if (*p == ' ') 1121 *p = '\n'; 1122 } 1123 1124 debug("## andr_bootargs: %s\n", bootargs); 1125 1126 /* 1127 * add boot params right after bootconfig 1128 * 1129 * because we can get final full bootargs in board_fdt_chosen_bootargs(), 1130 * android_image_get_ramdisk() is early than that. 1131 * 1132 * we have to add boot params by now. 1133 */ 1134 len = addBootConfigParameters((char *)bootargs, strlen(bootargs), 1135 (u64)hdr->ramdisk_addr + hdr->ramdisk_size + 1136 hdr->vendor_ramdisk_size, hdr->vendor_bootconfig_size); 1137 if (len < 0) { 1138 printf("error: addBootConfigParameters\n"); 1139 return 0; 1140 } 1141 1142 nodeoffset = fdt_subnode_offset(fdt, 0, "chosen"); 1143 if (nodeoffset < 0) { 1144 printf("error: No /chosen node\n"); 1145 return 0; 1146 } 1147 1148 /* fixup initrd with real value */ 1149 fdt_delprop(fdt, nodeoffset, "linux,initrd-start"); 1150 fdt_delprop(fdt, nodeoffset, "linux,initrd-end"); 1151 1152 is_u64 = (fdt_address_cells(fdt, 0) == 2); 1153 initrd_start = hdr->ramdisk_addr; 1154 initrd_end = initrd_start + hdr->ramdisk_size + 1155 hdr->vendor_ramdisk_size + 1156 hdr->vendor_bootconfig_size + len; 1157 err = fdt_setprop_uxx(fdt, nodeoffset, "linux,initrd-start", 1158 initrd_start, is_u64); 1159 if (err < 0) { 1160 printf("WARNING: could not set linux,initrd-start %s.\n", 1161 fdt_strerror(err)); 1162 return 0; 1163 } 1164 err = fdt_setprop_uxx(fdt, nodeoffset, "linux,initrd-end", 1165 initrd_end, is_u64); 1166 if (err < 0) { 1167 printf("WARNING: could not set linux,initrd-end %s.\n", 1168 fdt_strerror(err)); 1169 return 0; 1170 } 1171 #endif 1172 return 1; 1173 } 1174 1175