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> 8*14768307SJoseph Chen #include <boot_rkimg.h> 9*14768307SJoseph Chen #include <keymaster.h> 106caa0333SKever Yang #include <malloc.h> 11a0e58cf2SKever Yang #include <android_bootloader.h> 1291c73fb4Sqiujian #include <attestation_key.h> 13a0e58cf2SKever Yang 14a0e58cf2SKever Yang static int do_boot_rockchip(cmd_tbl_t *cmdtp, int flag, int argc, 15a0e58cf2SKever Yang char *const argv[]) 16a0e58cf2SKever Yang { 17*14768307SJoseph Chen char *boot_partname = PART_BOOT; 18a0e58cf2SKever Yang disk_partition_t part_info; 19a0e58cf2SKever Yang struct blk_desc *dev_desc; 20*14768307SJoseph Chen int i, ret; 21*14768307SJoseph Chen int mode; 22a0e58cf2SKever Yang 23a0e58cf2SKever Yang dev_desc = rockchip_get_bootdev(); 246651d4c0SJason Zhu if (!dev_desc) { 256651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 264701d790SAndy Yan return CMD_RET_FAILURE; 276651d4c0SJason Zhu } 2891c73fb4Sqiujian 29c2ba77d9SJian Qiu #ifdef CONFIG_ANDROID_KEYMASTER_CA 3091c73fb4Sqiujian /* load attestation key from misc partition. */ 31*14768307SJoseph Chen ret = part_get_info_by_name(dev_desc, PART_MISC, &part_info); 3291c73fb4Sqiujian if (ret < 0) 33*14768307SJoseph Chen printf("%s: Could not find misc partition\n", __func__); 3491c73fb4Sqiujian else 35*14768307SJoseph Chen load_attestation_key(dev_desc, &part_info); 3691c73fb4Sqiujian #endif 3791c73fb4Sqiujian 3865413a00SJian Qiu #ifdef CONFIG_FASTBOOT_OEM_UNLOCK 399e68721bSqiujian /* read oem unlock status and attach to bootargs */ 40*14768307SJoseph Chen char oem_unlock[30] = {0}; 419e68721bSqiujian TEEC_Result result; 42*14768307SJoseph Chen uint8_t unlock = 0; 43*14768307SJoseph Chen 449e68721bSqiujian result = trusty_read_oem_unlock(&unlock); 459e68721bSqiujian if (result) { 46*14768307SJoseph Chen printf("%s: Read oem unlock status failed: %d\n", 47*14768307SJoseph Chen __func__, result); 489e68721bSqiujian } else { 49*14768307SJoseph Chen snprintf(oem_unlock, sizeof(oem_unlock), 50*14768307SJoseph Chen "androidboot.oem_unlocked=%d", unlock); 519e68721bSqiujian env_update("bootargs", oem_unlock); 529e68721bSqiujian } 539e68721bSqiujian #endif 549e68721bSqiujian 55a0e58cf2SKever Yang mode = rockchip_get_boot_mode(); 56*14768307SJoseph Chen if (mode == BOOT_MODE_RECOVERY) 57a0e58cf2SKever Yang boot_partname = PART_RECOVERY; 58f61a997eSqiujian 59f61a997eSqiujian for (i = 0; i < argc; i++) { 60f61a997eSqiujian if (!strcmp(argv[i], "boot-recovery")) { 61f61a997eSqiujian boot_partname = PART_RECOVERY; 62*14768307SJoseph Chen printf("Boot from Recovery partition\n"); 63f61a997eSqiujian } 64f61a997eSqiujian } 65f61a997eSqiujian 66a0e58cf2SKever Yang ret = part_get_info_by_name(dev_desc, boot_partname, &part_info); 67*14768307SJoseph Chen if (ret < 0) { 68*14768307SJoseph Chen printf("%s: Could not find %s part\n", __func__, part_info.name); 69*14768307SJoseph Chen return CMD_RET_FAILURE; 70*14768307SJoseph Chen } 71a0e58cf2SKever Yang 72*14768307SJoseph Chen return boot_rockchip_image(dev_desc, &part_info) ? CMD_RET_FAILURE : 0; 73a0e58cf2SKever Yang } 74a0e58cf2SKever Yang 75a0e58cf2SKever Yang U_BOOT_CMD( 7632af749aSKever Yang bootrkp, CONFIG_SYS_MAXARGS, 1, do_boot_rockchip, 7732af749aSKever Yang "Boot Linux Image from rockchip image type", 7832af749aSKever Yang "kernel.img: zImage/Image\n" 7932af749aSKever Yang "boot.img: ramdisk\n" 8032af749aSKever Yang "resource.img: dtb, u-boot logo, kernel logo" 81a0e58cf2SKever Yang ); 826caa0333SKever Yang 836caa0333SKever Yang static int do_rkimg_test(cmd_tbl_t *cmdtp, int flag, int argc, 846caa0333SKever Yang char *const argv[]) 856caa0333SKever Yang { 866caa0333SKever Yang struct blk_desc *dev_desc; 876caa0333SKever Yang u32 *buffer; 88*14768307SJoseph Chen int ret; 896caa0333SKever Yang 906caa0333SKever Yang dev_desc = blk_get_dev(argv[1], simple_strtoul(argv[2], NULL, 16)); 91*14768307SJoseph Chen if (!dev_desc) { 92*14768307SJoseph Chen printf("%s: dev_desc is NULL!\n", __func__); 93*14768307SJoseph Chen return CMD_RET_FAILURE; 94*14768307SJoseph Chen } 956caa0333SKever Yang 96*14768307SJoseph Chen /* Read one block from beginning of IDB data */ 976caa0333SKever Yang buffer = memalign(ARCH_DMA_MINALIGN, 1024); 986caa0333SKever Yang ret = blk_dread(dev_desc, 64, 2, buffer); 993671d252SJason Zhu if (ret != 2) { 100*14768307SJoseph Chen printf("%s: Fail to read data from IDB\n", __func__); 1016caa0333SKever Yang free(buffer); 1026caa0333SKever Yang return CMD_RET_FAILURE; 1036caa0333SKever Yang } 1046caa0333SKever Yang 1056caa0333SKever Yang if (buffer[0] == 0xFCDC8C3B) { 106*14768307SJoseph Chen printf("Found IDB in SDcard\n"); 1076caa0333SKever Yang if (0 == buffer[128 + 104 / 4]) /* TAG in IDB */ 1086caa0333SKever Yang env_update("bootargs", "sdfwupdate"); 1096caa0333SKever Yang } 1106caa0333SKever Yang 1116caa0333SKever Yang free(buffer); 1126caa0333SKever Yang 113*14768307SJoseph Chen return CMD_RET_SUCCESS; 1146caa0333SKever Yang } 1156caa0333SKever Yang 1166caa0333SKever Yang U_BOOT_CMD( 1176caa0333SKever Yang rkimgtest, 3, 0, do_rkimg_test, 1186caa0333SKever Yang "Test if storage media have rockchip image", 1196caa0333SKever Yang "" 1206caa0333SKever Yang ); 121