xref: /rk3399_rockchip-uboot/cmd/load_android.c (revision 965eda410b8d28439dc1ba4f76061880d72978fd)
1 /*
2   * Copyright (C) 2008 The Android Open Source Project
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  */
6 
7 #include <common.h>
8 #include <command.h>
9 #include <mapmem.h>
10 
11 static int do_load_android(cmd_tbl_t *cmdtp, int flag, int argc,
12 			   char * const argv[])
13 {
14 	int boot_partition;
15 	unsigned long load_address, blk_cnt, blk_read;
16 	int ret = CMD_RET_SUCCESS;
17 	char *addr_arg_endp, *addr_str;
18 	void *buf;
19 	struct blk_desc *dev_desc;
20 	disk_partition_t part_info;
21 
22 	if (argc < 2)
23 		return CMD_RET_USAGE;
24 	if (argc > 4)
25 		return CMD_RET_USAGE;
26 
27 	if (argc >= 4) {
28 		load_address = simple_strtoul(argv[3], &addr_arg_endp, 16);
29 		if (addr_arg_endp == argv[3] || *addr_arg_endp != '\0')
30 			return CMD_RET_USAGE;
31 	} else {
32 		addr_str = env_get("loadaddr");
33 		if (addr_str != NULL)
34 			load_address = simple_strtoul(addr_str, NULL, 16);
35 		else
36 			load_address = CONFIG_SYS_LOAD_ADDR;
37 	}
38 
39 	boot_partition = blk_get_device_part_str(argv[1],
40 	                                         (argc >= 3) ? argv[2] : NULL,
41 	                                         &dev_desc, &part_info, 1);
42 	if (boot_partition < 0)
43 		return CMD_RET_FAILURE;
44 
45 	/* We don't know the size of the Android image before reading the header
46 	 * so we don't limit the size of the mapped memory. */
47 	buf = map_sysmem(load_address, 0 /* size */);
48 
49 	/* Read the Android header first and then read the rest. */
50 	if (blk_dread(dev_desc, part_info.start, 1, buf) != 1) {
51 		ret = CMD_RET_FAILURE;
52 	}
53 
54 	if (ret == CMD_RET_SUCCESS && android_image_check_header(buf) != 0) {
55 		printf("\n** Invalid Android Image header on %s %d:%d **\n",
56 		       argv[1], dev_desc->devnum, boot_partition);
57 		ret = CMD_RET_FAILURE;
58 	}
59 	if (ret == CMD_RET_SUCCESS) {
60 		blk_cnt = (android_image_get_end(buf) - (ulong)buf +
61 		           part_info.blksz - 1) / part_info.blksz;
62 		printf("\nLoading Android Image (%lu blocks) to 0x%lx... ",
63 		       blk_cnt, load_address);
64 		blk_read = blk_dread(dev_desc, part_info.start, blk_cnt, buf);
65 	}
66 
67 	unmap_sysmem(buf);
68 	if (ret != CMD_RET_SUCCESS)
69 		return ret;
70 
71 	printf("%lu blocks read: %s\n",
72 	       blk_read, (blk_read == blk_cnt) ? "OK" : "ERROR");
73 	return (blk_read == blk_cnt) ? CMD_RET_SUCCESS : CMD_RET_FAILURE;
74 }
75 
76 
77 #if defined(CONFIG_CMD_LOAD_ANDROID)
78 U_BOOT_CMD(
79 	load_android, 4, 0, do_load_android,
80 	"load Android Boot image from storage.",
81 	"<interface> [<dev[:part]> [<addr>]]\n"
82 	"    - Load a binary Android Boot image from the partition 'part' on\n"
83 	"      device type 'interface' instance 'dev' to address 'addr'."
84 );
85 #endif	/* CONFIG_CMD_LOAD_ANDROID */
86