xref: /rk3399_rockchip-uboot/cmd/boot_android.c (revision 180cc7c60133d7a54b43ddb99014424402d0339e)
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