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