1a0e58cf2SKever Yang /* 2a0e58cf2SKever Yang * (C) Copyright 2017 Rockchip Electronics Co., Ltd 3a0e58cf2SKever Yang * 4a0e58cf2SKever Yang * SPDX-License-Identifier: GPL-2.0+ 5a0e58cf2SKever Yang */ 6a0e58cf2SKever Yang 7a0e58cf2SKever Yang #include <common.h> 86caa0333SKever Yang #include <malloc.h> 9a0e58cf2SKever Yang #include <android_bootloader.h> 1091c73fb4Sqiujian #include <attestation_key.h> 11a0e58cf2SKever Yang #include <boot_rkimg.h> 12*c2ba77d9SJian Qiu #include <keymaster.h> 139e68721bSqiujian 149e68721bSqiujian #define OEM_UNLOCK_ARG_SIZE 30 15a0e58cf2SKever Yang 16a0e58cf2SKever Yang static int do_boot_rockchip(cmd_tbl_t *cmdtp, int flag, int argc, 17a0e58cf2SKever Yang char * const argv[]) 18a0e58cf2SKever Yang { 19a0e58cf2SKever Yang disk_partition_t part_info; 20a0e58cf2SKever Yang struct blk_desc *dev_desc; 21a0e58cf2SKever Yang int mode = 0; 22a0e58cf2SKever Yang char *boot_partname = PART_BOOT; 23a0e58cf2SKever Yang int ret = 0; 24f61a997eSqiujian int i = 0; 25a0e58cf2SKever Yang 26a0e58cf2SKever Yang dev_desc = rockchip_get_bootdev(); 276651d4c0SJason Zhu if (!dev_desc) { 286651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 296651d4c0SJason Zhu return -ENODEV; 306651d4c0SJason Zhu } 3191c73fb4Sqiujian 32*c2ba77d9SJian Qiu #ifdef CONFIG_ANDROID_KEYMASTER_CA 3391c73fb4Sqiujian disk_partition_t misc_part_info; 3491c73fb4Sqiujian 3591c73fb4Sqiujian /* load attestation key from misc partition. */ 3691c73fb4Sqiujian ret = part_get_info_by_name(dev_desc, "misc", 3791c73fb4Sqiujian &misc_part_info); 3891c73fb4Sqiujian if (ret < 0) 3991c73fb4Sqiujian printf("%s Could not find misc partition\n", __func__); 4091c73fb4Sqiujian else 4191c73fb4Sqiujian load_attestation_key(dev_desc, &misc_part_info); 4291c73fb4Sqiujian #endif 4391c73fb4Sqiujian 4465413a00SJian Qiu #ifdef CONFIG_FASTBOOT_OEM_UNLOCK 459e68721bSqiujian /* read oem unlock status and attach to bootargs */ 469e68721bSqiujian uint8_t unlock = 0; 479e68721bSqiujian TEEC_Result result; 489e68721bSqiujian char oem_unlock[OEM_UNLOCK_ARG_SIZE] = {0}; 499e68721bSqiujian result = trusty_read_oem_unlock(&unlock); 509e68721bSqiujian if (result) { 519e68721bSqiujian printf("read oem unlock status with error : 0x%x\n", result); 529e68721bSqiujian } else { 539e68721bSqiujian snprintf(oem_unlock, OEM_UNLOCK_ARG_SIZE, "androidboot.oem_unlocked=%d", unlock); 549e68721bSqiujian env_update("bootargs", oem_unlock); 559e68721bSqiujian } 569e68721bSqiujian #endif 579e68721bSqiujian 58a0e58cf2SKever Yang mode = rockchip_get_boot_mode(); 597ad0afacSKever Yang if (mode == BOOT_MODE_RECOVERY) { 60a0e58cf2SKever Yang boot_partname = PART_RECOVERY; 617ad0afacSKever Yang printf("%s boot from Recovery partition!\n", __func__); 627ad0afacSKever Yang } 63f61a997eSqiujian 64f61a997eSqiujian for (i = 0; i < argc; i++) { 65f61a997eSqiujian if (!strcmp(argv[i], "boot-recovery")) { 66f61a997eSqiujian boot_partname = PART_RECOVERY; 67f61a997eSqiujian printf("%s argv%d:%s boot from Recovery partition!\n", 68f61a997eSqiujian __func__, i, argv[i]); 69f61a997eSqiujian } 70f61a997eSqiujian } 71f61a997eSqiujian 72a0e58cf2SKever Yang ret = part_get_info_by_name(dev_desc, boot_partname, &part_info); 73a0e58cf2SKever Yang 74a0e58cf2SKever Yang if(boot_rockchip_image(dev_desc, &part_info)) 75a0e58cf2SKever Yang ret = CMD_RET_FAILURE; 76a0e58cf2SKever Yang 77a0e58cf2SKever Yang return ret; 78a0e58cf2SKever Yang } 79a0e58cf2SKever Yang 80a0e58cf2SKever Yang U_BOOT_CMD( 8132af749aSKever Yang bootrkp, CONFIG_SYS_MAXARGS, 1, do_boot_rockchip, 8232af749aSKever Yang "Boot Linux Image from rockchip image type", 8332af749aSKever Yang "kernel.img: zImage/Image\n" 8432af749aSKever Yang "boot.img: ramdisk\n" 8532af749aSKever Yang "resource.img: dtb, u-boot logo, kernel logo" 86a0e58cf2SKever Yang ); 876caa0333SKever Yang 886caa0333SKever Yang static int do_rkimg_test(cmd_tbl_t *cmdtp, int flag, int argc, 896caa0333SKever Yang char * const argv[]) 906caa0333SKever Yang { 916caa0333SKever Yang struct blk_desc *dev_desc; 926caa0333SKever Yang u32* buffer; 936caa0333SKever Yang int ret = 0; 946caa0333SKever Yang 956caa0333SKever Yang dev_desc = blk_get_dev(argv[1], simple_strtoul(argv[2], NULL, 16)); 966caa0333SKever Yang 976caa0333SKever Yang buffer = memalign(ARCH_DMA_MINALIGN, 1024); 986caa0333SKever Yang /* Read one block from begining of IDB data */ 996caa0333SKever Yang ret = blk_dread(dev_desc, 64, 2, buffer); 1003671d252SJason Zhu if (ret != 2) { 1016caa0333SKever Yang printf("%s fail to read data from IDB\n", __func__); 1026caa0333SKever Yang free(buffer); 1036caa0333SKever Yang return CMD_RET_FAILURE; 1046caa0333SKever Yang } 1056caa0333SKever Yang 1066caa0333SKever Yang if (buffer[0] == 0xFCDC8C3B){ 1076caa0333SKever Yang printf("%s found IDB in SDcard\n", __func__); 1086caa0333SKever Yang ret = CMD_RET_SUCCESS; 1096caa0333SKever Yang if (0 == buffer[128 + 104 / 4]) /* TAG in IDB */ 1106caa0333SKever Yang env_update("bootargs", "sdfwupdate"); 1116caa0333SKever Yang } 1126caa0333SKever Yang 1136caa0333SKever Yang free(buffer); 1146caa0333SKever Yang 1156caa0333SKever Yang return ret; 1166caa0333SKever Yang } 1176caa0333SKever Yang 1186caa0333SKever Yang U_BOOT_CMD( 1196caa0333SKever Yang rkimgtest, 3, 0, do_rkimg_test, 1206caa0333SKever Yang "Test if storage media have rockchip image", 1216caa0333SKever Yang "" 1226caa0333SKever Yang ); 123