1*eae0a6b1SJoseph Chen /* 2*eae0a6b1SJoseph Chen * (C) Copyright 2019 Rockchip Electronics Co., Ltd 3*eae0a6b1SJoseph Chen * 4*eae0a6b1SJoseph Chen * SPDX-License-Identifier: GPL-2.0+ 5*eae0a6b1SJoseph Chen */ 6*eae0a6b1SJoseph Chen 7*eae0a6b1SJoseph Chen #include <common.h> 8*eae0a6b1SJoseph Chen #include <android_image.h> 9*eae0a6b1SJoseph Chen #include <blk.h> 10*eae0a6b1SJoseph Chen #include <boot_rkimg.h> 11*eae0a6b1SJoseph Chen #include <command.h> 12*eae0a6b1SJoseph Chen #include <malloc.h> 13*eae0a6b1SJoseph Chen 14*eae0a6b1SJoseph Chen static int do_android_print_hdr(cmd_tbl_t *cmdtp, int flag, 15*eae0a6b1SJoseph Chen int argc, char * const argv[]) 16*eae0a6b1SJoseph Chen { 17*eae0a6b1SJoseph Chen struct blk_desc *dev_desc; 18*eae0a6b1SJoseph Chen struct andr_img_hdr *hdr; 19*eae0a6b1SJoseph Chen disk_partition_t part_info; 20*eae0a6b1SJoseph Chen const char *part_name; 21*eae0a6b1SJoseph Chen int blkcnt, ret; 22*eae0a6b1SJoseph Chen 23*eae0a6b1SJoseph Chen if (argc != 2) 24*eae0a6b1SJoseph Chen return CMD_RET_USAGE; 25*eae0a6b1SJoseph Chen 26*eae0a6b1SJoseph Chen part_name = argv[1]; 27*eae0a6b1SJoseph Chen 28*eae0a6b1SJoseph Chen dev_desc = rockchip_get_bootdev(); 29*eae0a6b1SJoseph Chen if (!dev_desc) { 30*eae0a6b1SJoseph Chen printf("dev_desc is NULL!\n"); 31*eae0a6b1SJoseph Chen return -ENODEV; 32*eae0a6b1SJoseph Chen } 33*eae0a6b1SJoseph Chen 34*eae0a6b1SJoseph Chen ret = part_get_info_by_name(dev_desc, part_name, &part_info); 35*eae0a6b1SJoseph Chen if (ret < 0) { 36*eae0a6b1SJoseph Chen printf("Failed to get \"%s\" part, ret=%d\n", part_name, ret); 37*eae0a6b1SJoseph Chen return -ENODEV; 38*eae0a6b1SJoseph Chen } 39*eae0a6b1SJoseph Chen 40*eae0a6b1SJoseph Chen hdr = memalign(ARCH_DMA_MINALIGN, sizeof(*hdr)); 41*eae0a6b1SJoseph Chen if (!hdr) { 42*eae0a6b1SJoseph Chen printf("%s: out of memory!\n", __func__); 43*eae0a6b1SJoseph Chen return -ENOMEM; 44*eae0a6b1SJoseph Chen } 45*eae0a6b1SJoseph Chen 46*eae0a6b1SJoseph Chen blkcnt = sizeof(*hdr) / dev_desc->blksz; 47*eae0a6b1SJoseph Chen ret = blk_dread(dev_desc, part_info.start, blkcnt, hdr); 48*eae0a6b1SJoseph Chen if (ret != blkcnt) { 49*eae0a6b1SJoseph Chen printf("Failed to read %s sector, ret=%d\n", part_info.name, ret); 50*eae0a6b1SJoseph Chen free(hdr); 51*eae0a6b1SJoseph Chen return -EIO; 52*eae0a6b1SJoseph Chen } 53*eae0a6b1SJoseph Chen 54*eae0a6b1SJoseph Chen if (!android_image_check_header(hdr)) { 55*eae0a6b1SJoseph Chen printf("Partition \"%s\"\n", part_info.name); 56*eae0a6b1SJoseph Chen android_print_contents(hdr); 57*eae0a6b1SJoseph Chen } else { 58*eae0a6b1SJoseph Chen printf("Not an android image\n"); 59*eae0a6b1SJoseph Chen } 60*eae0a6b1SJoseph Chen 61*eae0a6b1SJoseph Chen free(hdr); 62*eae0a6b1SJoseph Chen 63*eae0a6b1SJoseph Chen return 0; 64*eae0a6b1SJoseph Chen } 65*eae0a6b1SJoseph Chen 66*eae0a6b1SJoseph Chen U_BOOT_CMD( 67*eae0a6b1SJoseph Chen android_print_hdr, 2, 1, do_android_print_hdr, 68*eae0a6b1SJoseph Chen "print android image header", "<partition name>" 69*eae0a6b1SJoseph Chen ); 70