106f4a874SAlex Deymo /* 206f4a874SAlex Deymo * Copyright (C) 2016 The Android Open Source Project 306f4a874SAlex Deymo * 406f4a874SAlex Deymo * SPDX-License-Identifier: BSD-2-Clause 506f4a874SAlex Deymo */ 606f4a874SAlex Deymo 706f4a874SAlex Deymo #include <android_bootloader.h> 8*180cc7c6SAlex Deymo #include <android_cmds.h> 906f4a874SAlex Deymo #include <common.h> 1006f4a874SAlex Deymo #include <command.h> 1106f4a874SAlex Deymo 1206f4a874SAlex Deymo static int do_boot_android(cmd_tbl_t *cmdtp, int flag, int argc, 1306f4a874SAlex Deymo char * const argv[]) 1406f4a874SAlex Deymo { 1506f4a874SAlex Deymo unsigned long load_address; 1606f4a874SAlex Deymo int ret = CMD_RET_SUCCESS; 1706f4a874SAlex Deymo char *addr_arg_endp, *addr_str; 1806f4a874SAlex Deymo struct blk_desc *dev_desc; 1906f4a874SAlex Deymo disk_partition_t part_info; 2006f4a874SAlex Deymo 2180622240SAlex Deymo if (argc < 4) 2206f4a874SAlex Deymo return CMD_RET_USAGE; 2380622240SAlex Deymo if (argc > 5) 2406f4a874SAlex Deymo return CMD_RET_USAGE; 2506f4a874SAlex Deymo 2680622240SAlex Deymo if (argc >= 5) { 2780622240SAlex Deymo load_address = simple_strtoul(argv[4], &addr_arg_endp, 16); 2880622240SAlex Deymo if (addr_arg_endp == argv[4] || *addr_arg_endp != '\0') 2906f4a874SAlex Deymo return CMD_RET_USAGE; 3006f4a874SAlex Deymo } else { 3106f4a874SAlex Deymo addr_str = env_get("loadaddr"); 3206f4a874SAlex Deymo if (addr_str) 3306f4a874SAlex Deymo load_address = simple_strtoul(addr_str, NULL, 16); 3406f4a874SAlex Deymo else 3506f4a874SAlex Deymo load_address = CONFIG_SYS_LOAD_ADDR; 3606f4a874SAlex Deymo } 3706f4a874SAlex Deymo 38*180cc7c6SAlex Deymo if (part_get_info_by_dev_and_name_or_num(argv[1], argv[2], 3906f4a874SAlex Deymo &dev_desc, &part_info) < 0) { 4006f4a874SAlex Deymo return CMD_RET_FAILURE; 4106f4a874SAlex Deymo } 4206f4a874SAlex Deymo 4380622240SAlex Deymo ret = android_bootloader_boot_flow(dev_desc, &part_info, argv[3], 4480622240SAlex Deymo load_address); 4506f4a874SAlex Deymo if (ret < 0) { 4606f4a874SAlex Deymo printf("Android boot failed, error %d.\n", ret); 4706f4a874SAlex Deymo return CMD_RET_FAILURE; 4806f4a874SAlex Deymo } 4906f4a874SAlex Deymo return CMD_RET_SUCCESS; 5006f4a874SAlex Deymo } 5106f4a874SAlex Deymo 5206f4a874SAlex Deymo U_BOOT_CMD( 5380622240SAlex Deymo boot_android, 5, 0, do_boot_android, 5406f4a874SAlex Deymo "Execute the Android Bootloader flow.", 55df7cce43SAlex Deymo "<interface> <dev[:part|;part_name]> <slot> [<kernel_addr>]\n" 5606f4a874SAlex Deymo " - Load the Boot Control Block (BCB) from the partition 'part' on\n" 5706f4a874SAlex Deymo " device type 'interface' instance 'dev' to determine the boot\n" 5806f4a874SAlex Deymo " mode, and load and execute the appropriate kernel.\n" 5906f4a874SAlex Deymo " In normal and recovery mode, the kernel will be loaded from\n" 6006f4a874SAlex Deymo " the corresponding \"boot\" partition. In bootloader mode, the\n" 6106f4a874SAlex Deymo " command defined in the \"fastbootcmd\" variable will be\n" 6206f4a874SAlex Deymo " executed.\n" 6380622240SAlex Deymo " On Android devices with multiple slots, the pass 'slot' is\n" 6480622240SAlex Deymo " used to load the appropriate kernel. The standard slot names\n" 6580622240SAlex Deymo " are 'a' and 'b'.\n" 6606f4a874SAlex Deymo " - If 'part_name' is passed, preceded with a ; instead of :, the\n" 6706f4a874SAlex Deymo " partition name whose label is 'part_name' will be looked up in\n" 6806f4a874SAlex Deymo " the partition table. This is commonly the \"misc\" partition.\n" 6906f4a874SAlex Deymo ); 70