xref: /rk3399_rockchip-uboot/cmd/bootrkp.c (revision c2ba77d93f696c0ccb8f2b653571104e7b4afb4e)
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>
12*c2ba77d9SJian Qiu #include <keymaster.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();
276651d4c0SJason Zhu 	if (!dev_desc) {
286651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
296651d4c0SJason Zhu 		return -ENODEV;
306651d4c0SJason Zhu 	}
3191c73fb4Sqiujian 
32*c2ba77d9SJian Qiu #ifdef CONFIG_ANDROID_KEYMASTER_CA
3391c73fb4Sqiujian 	disk_partition_t misc_part_info;
3491c73fb4Sqiujian 
3591c73fb4Sqiujian 	/* load attestation key from misc partition. */
3691c73fb4Sqiujian 	ret = part_get_info_by_name(dev_desc, "misc",
3791c73fb4Sqiujian 				    &misc_part_info);
3891c73fb4Sqiujian 	if (ret < 0)
3991c73fb4Sqiujian 		printf("%s Could not find misc partition\n", __func__);
4091c73fb4Sqiujian 	else
4191c73fb4Sqiujian 		load_attestation_key(dev_desc, &misc_part_info);
4291c73fb4Sqiujian #endif
4391c73fb4Sqiujian 
4465413a00SJian Qiu #ifdef CONFIG_FASTBOOT_OEM_UNLOCK
459e68721bSqiujian 	/* read oem unlock status and attach to bootargs */
469e68721bSqiujian 	uint8_t unlock = 0;
479e68721bSqiujian 	TEEC_Result result;
489e68721bSqiujian 	char oem_unlock[OEM_UNLOCK_ARG_SIZE] = {0};
499e68721bSqiujian 	result = trusty_read_oem_unlock(&unlock);
509e68721bSqiujian 	if (result) {
519e68721bSqiujian 		printf("read oem unlock status with error : 0x%x\n", result);
529e68721bSqiujian 	} else {
539e68721bSqiujian 		snprintf(oem_unlock, OEM_UNLOCK_ARG_SIZE, "androidboot.oem_unlocked=%d", unlock);
549e68721bSqiujian 		env_update("bootargs", oem_unlock);
559e68721bSqiujian 	}
569e68721bSqiujian #endif
579e68721bSqiujian 
58a0e58cf2SKever Yang 	mode = rockchip_get_boot_mode();
597ad0afacSKever Yang 	if (mode == BOOT_MODE_RECOVERY) {
60a0e58cf2SKever Yang 		boot_partname = PART_RECOVERY;
617ad0afacSKever Yang 		printf("%s boot from Recovery partition!\n", __func__);
627ad0afacSKever Yang 	}
63f61a997eSqiujian 
64f61a997eSqiujian 	for (i = 0; i < argc; i++) {
65f61a997eSqiujian 		if (!strcmp(argv[i], "boot-recovery")) {
66f61a997eSqiujian 			boot_partname = PART_RECOVERY;
67f61a997eSqiujian 			printf("%s argv%d:%s boot from Recovery partition!\n",
68f61a997eSqiujian 				__func__, i, argv[i]);
69f61a997eSqiujian 		}
70f61a997eSqiujian 	}
71f61a997eSqiujian 
72a0e58cf2SKever Yang 	ret = part_get_info_by_name(dev_desc, boot_partname, &part_info);
73a0e58cf2SKever Yang 
74a0e58cf2SKever Yang 	if(boot_rockchip_image(dev_desc, &part_info))
75a0e58cf2SKever Yang 		ret = CMD_RET_FAILURE;
76a0e58cf2SKever Yang 
77a0e58cf2SKever Yang 	return ret;
78a0e58cf2SKever Yang }
79a0e58cf2SKever Yang 
80a0e58cf2SKever Yang U_BOOT_CMD(
8132af749aSKever Yang 	bootrkp,  CONFIG_SYS_MAXARGS,     1,      do_boot_rockchip,
8232af749aSKever Yang 	"Boot Linux Image from rockchip image type",
8332af749aSKever Yang 	"kernel.img: zImage/Image\n"
8432af749aSKever Yang 	"boot.img: ramdisk\n"
8532af749aSKever Yang 	"resource.img: dtb, u-boot logo, kernel logo"
86a0e58cf2SKever Yang );
876caa0333SKever Yang 
886caa0333SKever Yang static int do_rkimg_test(cmd_tbl_t *cmdtp, int flag, int argc,
896caa0333SKever Yang 		      char * const argv[])
906caa0333SKever Yang {
916caa0333SKever Yang 	struct blk_desc *dev_desc;
926caa0333SKever Yang 	u32* buffer;
936caa0333SKever Yang 	int ret = 0;
946caa0333SKever Yang 
956caa0333SKever Yang 	dev_desc = blk_get_dev(argv[1], simple_strtoul(argv[2], NULL, 16));
966caa0333SKever Yang 
976caa0333SKever Yang 	buffer = memalign(ARCH_DMA_MINALIGN, 1024);
986caa0333SKever Yang 	/* Read one block from begining of IDB data */
996caa0333SKever Yang 	ret = blk_dread(dev_desc, 64, 2, buffer);
1003671d252SJason Zhu 	if (ret != 2) {
1016caa0333SKever Yang 		printf("%s fail to read data from IDB\n", __func__);
1026caa0333SKever Yang 		free(buffer);
1036caa0333SKever Yang 		return CMD_RET_FAILURE;
1046caa0333SKever Yang 	}
1056caa0333SKever Yang 
1066caa0333SKever Yang 	if (buffer[0] == 0xFCDC8C3B){
1076caa0333SKever Yang 		printf("%s found IDB in SDcard\n", __func__);
1086caa0333SKever Yang 		ret = CMD_RET_SUCCESS;
1096caa0333SKever Yang 		if (0 == buffer[128 + 104 / 4]) /* TAG in IDB */
1106caa0333SKever Yang 			env_update("bootargs", "sdfwupdate");
1116caa0333SKever Yang 	}
1126caa0333SKever Yang 
1136caa0333SKever Yang 	free(buffer);
1146caa0333SKever Yang 
1156caa0333SKever Yang 	return ret;
1166caa0333SKever Yang }
1176caa0333SKever Yang 
1186caa0333SKever Yang U_BOOT_CMD(
1196caa0333SKever Yang 	rkimgtest, 3, 0,    do_rkimg_test,
1206caa0333SKever Yang 	"Test if storage media have rockchip image",
1216caa0333SKever Yang 	""
1226caa0333SKever Yang );
123