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