xref: /rk3399_rockchip-uboot/cmd/bootrkp.c (revision 9e68721b270b4ce4e71f19e283e4363e8b1a15ff)
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