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> 8a0e58cf2SKever Yang #include <android_bootloader.h> 991c73fb4Sqiujian #include <attestation_key.h> 10a0e58cf2SKever Yang #include <boot_rkimg.h> 11*9e68721bSqiujian #include <optee_include/OpteeClientInterface.h> 12*9e68721bSqiujian 13*9e68721bSqiujian #define OEM_UNLOCK_ARG_SIZE 30 14a0e58cf2SKever Yang 15a0e58cf2SKever Yang static int do_boot_rockchip(cmd_tbl_t *cmdtp, int flag, int argc, 16a0e58cf2SKever Yang char * const argv[]) 17a0e58cf2SKever Yang { 18a0e58cf2SKever Yang disk_partition_t part_info; 19a0e58cf2SKever Yang struct blk_desc *dev_desc; 20a0e58cf2SKever Yang int mode = 0; 21a0e58cf2SKever Yang char *boot_partname = PART_BOOT; 22a0e58cf2SKever Yang int ret = 0; 23f61a997eSqiujian int i = 0; 24a0e58cf2SKever Yang 25a0e58cf2SKever Yang dev_desc = rockchip_get_bootdev(); 2691c73fb4Sqiujian 2791c73fb4Sqiujian #ifdef CONFIG_OPTEE_CLIENT 2891c73fb4Sqiujian disk_partition_t misc_part_info; 2991c73fb4Sqiujian 3091c73fb4Sqiujian /* load attestation key from misc partition. */ 3191c73fb4Sqiujian ret = part_get_info_by_name(dev_desc, "misc", 3291c73fb4Sqiujian &misc_part_info); 3391c73fb4Sqiujian if (ret < 0) 3491c73fb4Sqiujian printf("%s Could not find misc partition\n", __func__); 3591c73fb4Sqiujian else 3691c73fb4Sqiujian load_attestation_key(dev_desc, &misc_part_info); 3791c73fb4Sqiujian #endif 3891c73fb4Sqiujian 39*9e68721bSqiujian #ifdef CONFIG_OPTEE_CLIENT 40*9e68721bSqiujian /* read oem unlock status and attach to bootargs */ 41*9e68721bSqiujian uint8_t unlock = 0; 42*9e68721bSqiujian TEEC_Result result; 43*9e68721bSqiujian char oem_unlock[OEM_UNLOCK_ARG_SIZE] = {0}; 44*9e68721bSqiujian result = trusty_read_oem_unlock(&unlock); 45*9e68721bSqiujian if (result) { 46*9e68721bSqiujian printf("read oem unlock status with error : 0x%x\n", result); 47*9e68721bSqiujian } else { 48*9e68721bSqiujian snprintf(oem_unlock, OEM_UNLOCK_ARG_SIZE, "androidboot.oem_unlocked=%d", unlock); 49*9e68721bSqiujian env_update("bootargs", oem_unlock); 50*9e68721bSqiujian } 51*9e68721bSqiujian #endif 52*9e68721bSqiujian 53a0e58cf2SKever Yang mode = rockchip_get_boot_mode(); 547ad0afacSKever Yang if (mode == BOOT_MODE_RECOVERY) { 55a0e58cf2SKever Yang boot_partname = PART_RECOVERY; 567ad0afacSKever Yang printf("%s boot from Recovery partition!\n", __func__); 577ad0afacSKever Yang } 58f61a997eSqiujian 59f61a997eSqiujian for (i = 0; i < argc; i++) { 60f61a997eSqiujian if (!strcmp(argv[i], "boot-recovery")) { 61f61a997eSqiujian boot_partname = PART_RECOVERY; 62f61a997eSqiujian printf("%s argv%d:%s boot from Recovery partition!\n", 63f61a997eSqiujian __func__, i, argv[i]); 64f61a997eSqiujian } 65f61a997eSqiujian } 66f61a997eSqiujian 67a0e58cf2SKever Yang ret = part_get_info_by_name(dev_desc, boot_partname, &part_info); 68a0e58cf2SKever Yang 69a0e58cf2SKever Yang if(boot_rockchip_image(dev_desc, &part_info)) 70a0e58cf2SKever Yang ret = CMD_RET_FAILURE; 71a0e58cf2SKever Yang 72a0e58cf2SKever Yang return ret; 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 ); 82