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> 129e68721bSqiujian #include <optee_include/OpteeClientInterface.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(); 2791c73fb4Sqiujian 2891c73fb4Sqiujian #ifdef CONFIG_OPTEE_CLIENT 2991c73fb4Sqiujian disk_partition_t misc_part_info; 3091c73fb4Sqiujian 3191c73fb4Sqiujian /* load attestation key from misc partition. */ 3291c73fb4Sqiujian ret = part_get_info_by_name(dev_desc, "misc", 3391c73fb4Sqiujian &misc_part_info); 3491c73fb4Sqiujian if (ret < 0) 3591c73fb4Sqiujian printf("%s Could not find misc partition\n", __func__); 3691c73fb4Sqiujian else 3791c73fb4Sqiujian load_attestation_key(dev_desc, &misc_part_info); 3891c73fb4Sqiujian #endif 3991c73fb4Sqiujian 409e68721bSqiujian #ifdef CONFIG_OPTEE_CLIENT 419e68721bSqiujian /* read oem unlock status and attach to bootargs */ 429e68721bSqiujian uint8_t unlock = 0; 439e68721bSqiujian TEEC_Result result; 449e68721bSqiujian char oem_unlock[OEM_UNLOCK_ARG_SIZE] = {0}; 459e68721bSqiujian result = trusty_read_oem_unlock(&unlock); 469e68721bSqiujian if (result) { 479e68721bSqiujian printf("read oem unlock status with error : 0x%x\n", result); 489e68721bSqiujian } else { 499e68721bSqiujian snprintf(oem_unlock, OEM_UNLOCK_ARG_SIZE, "androidboot.oem_unlocked=%d", unlock); 509e68721bSqiujian env_update("bootargs", oem_unlock); 519e68721bSqiujian } 529e68721bSqiujian #endif 539e68721bSqiujian 54a0e58cf2SKever Yang mode = rockchip_get_boot_mode(); 557ad0afacSKever Yang if (mode == BOOT_MODE_RECOVERY) { 56a0e58cf2SKever Yang boot_partname = PART_RECOVERY; 577ad0afacSKever Yang printf("%s boot from Recovery partition!\n", __func__); 587ad0afacSKever Yang } 59f61a997eSqiujian 60f61a997eSqiujian for (i = 0; i < argc; i++) { 61f61a997eSqiujian if (!strcmp(argv[i], "boot-recovery")) { 62f61a997eSqiujian boot_partname = PART_RECOVERY; 63f61a997eSqiujian printf("%s argv%d:%s boot from Recovery partition!\n", 64f61a997eSqiujian __func__, i, argv[i]); 65f61a997eSqiujian } 66f61a997eSqiujian } 67f61a997eSqiujian 68a0e58cf2SKever Yang ret = part_get_info_by_name(dev_desc, boot_partname, &part_info); 69a0e58cf2SKever Yang 70a0e58cf2SKever Yang if(boot_rockchip_image(dev_desc, &part_info)) 71a0e58cf2SKever Yang ret = CMD_RET_FAILURE; 72a0e58cf2SKever Yang 73a0e58cf2SKever Yang return ret; 74a0e58cf2SKever Yang } 75a0e58cf2SKever Yang 76a0e58cf2SKever Yang U_BOOT_CMD( 7732af749aSKever Yang bootrkp, CONFIG_SYS_MAXARGS, 1, do_boot_rockchip, 7832af749aSKever Yang "Boot Linux Image from rockchip image type", 7932af749aSKever Yang "kernel.img: zImage/Image\n" 8032af749aSKever Yang "boot.img: ramdisk\n" 8132af749aSKever Yang "resource.img: dtb, u-boot logo, kernel logo" 82a0e58cf2SKever Yang ); 836caa0333SKever Yang 846caa0333SKever Yang static int do_rkimg_test(cmd_tbl_t *cmdtp, int flag, int argc, 856caa0333SKever Yang char * const argv[]) 866caa0333SKever Yang { 876caa0333SKever Yang struct blk_desc *dev_desc; 886caa0333SKever Yang u32* buffer; 896caa0333SKever Yang int ret = 0; 906caa0333SKever Yang 916caa0333SKever Yang dev_desc = blk_get_dev(argv[1], simple_strtoul(argv[2], NULL, 16)); 926caa0333SKever Yang 936caa0333SKever Yang buffer = memalign(ARCH_DMA_MINALIGN, 1024); 946caa0333SKever Yang /* Read one block from begining of IDB data */ 956caa0333SKever Yang ret = blk_dread(dev_desc, 64, 2, buffer); 96*3671d252SJason Zhu if (ret != 2) { 976caa0333SKever Yang printf("%s fail to read data from IDB\n", __func__); 986caa0333SKever Yang free(buffer); 996caa0333SKever Yang return CMD_RET_FAILURE; 1006caa0333SKever Yang } 1016caa0333SKever Yang 1026caa0333SKever Yang if (buffer[0] == 0xFCDC8C3B){ 1036caa0333SKever Yang printf("%s found IDB in SDcard\n", __func__); 1046caa0333SKever Yang ret = CMD_RET_SUCCESS; 1056caa0333SKever Yang if (0 == buffer[128 + 104 / 4]) /* TAG in IDB */ 1066caa0333SKever Yang env_update("bootargs", "sdfwupdate"); 1076caa0333SKever Yang } 1086caa0333SKever Yang 1096caa0333SKever Yang free(buffer); 1106caa0333SKever Yang 1116caa0333SKever Yang return ret; 1126caa0333SKever Yang } 1136caa0333SKever Yang 1146caa0333SKever Yang U_BOOT_CMD( 1156caa0333SKever Yang rkimgtest, 3, 0, do_rkimg_test, 1166caa0333SKever Yang "Test if storage media have rockchip image", 1176caa0333SKever Yang "" 1186caa0333SKever Yang ); 119