xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientRkFs_common.c (revision df538e29bdfa27e8607f1bf29d6d641bd85ef124)
1d079c1a5SHisping Lin /*
2d079c1a5SHisping Lin  * Copyright 2020, Rockchip Electronics Co., Ltd
3d079c1a5SHisping Lin  * hisping lin, <hisping.lin@rock-chips.com>
4d079c1a5SHisping Lin  *
5d079c1a5SHisping Lin  * SPDX-License-Identifier:	GPL-2.0+
6d079c1a5SHisping Lin  */
7d079c1a5SHisping Lin 
8d079c1a5SHisping Lin #include <common.h>
9d079c1a5SHisping Lin #include <stdlib.h>
10d079c1a5SHisping Lin #include <command.h>
11d079c1a5SHisping Lin #include <boot_rkimg.h>
12d079c1a5SHisping Lin #include <part.h>
13*df538e29SHisping Lin #ifdef CONFIG_OPTEE_V1
14d079c1a5SHisping Lin #include <optee_include/OpteeClientRkFs.h>
15*df538e29SHisping Lin #endif
16*df538e29SHisping Lin #ifdef CONFIG_OPTEE_V2
17*df538e29SHisping Lin #include <optee_include/OpteeClientRkNewFs.h>
18*df538e29SHisping Lin #endif
19d079c1a5SHisping Lin 
20d079c1a5SHisping Lin static int rkss_version;
21d079c1a5SHisping Lin static int get_rkss_version(void)
22d079c1a5SHisping Lin {
23d079c1a5SHisping Lin 	struct blk_desc *dev_desc = NULL;
24d079c1a5SHisping Lin 	disk_partition_t part_info;
25d079c1a5SHisping Lin 	uint8_t *read_buff;
26d079c1a5SHisping Lin 	unsigned long ret = 0;
27d079c1a5SHisping Lin 	uint32_t *version;
28d079c1a5SHisping Lin 	uint32_t *checkstr;
29d079c1a5SHisping Lin 
30d079c1a5SHisping Lin 	if (rkss_version != 0)
31d079c1a5SHisping Lin 		return rkss_version;
32d079c1a5SHisping Lin 
33d079c1a5SHisping Lin 	dev_desc = rockchip_get_bootdev();
34d079c1a5SHisping Lin 	if (!dev_desc) {
35d079c1a5SHisping Lin 		printf("TEEC: %s: Could not find device\n", __func__);
36d079c1a5SHisping Lin 		return -1;
37d079c1a5SHisping Lin 	}
38d079c1a5SHisping Lin 
39d079c1a5SHisping Lin 	if (part_get_info_by_name(dev_desc,
40d079c1a5SHisping Lin 				  "security", &part_info) < 0) {
41d079c1a5SHisping Lin 		printf("TEEC: Waring: Could not find security partition\n");
42d079c1a5SHisping Lin 		rkss_version = RKSS_VERSION_ERR;
43d079c1a5SHisping Lin 		return rkss_version;
44d079c1a5SHisping Lin 	}
45d079c1a5SHisping Lin 
46d079c1a5SHisping Lin 	read_buff = (uint8_t *)malloc(512);
47d079c1a5SHisping Lin 	if (!read_buff) {
48d079c1a5SHisping Lin 		printf("TEEC: Malloc failed!\n");
49d079c1a5SHisping Lin 		return -1;
50d079c1a5SHisping Lin 	}
51d079c1a5SHisping Lin 
52d079c1a5SHisping Lin 	ret = blk_dread(dev_desc, part_info.start, 1, read_buff);
53d079c1a5SHisping Lin 	if (ret != 1) {
54d079c1a5SHisping Lin 		printf("TEEC: blk_dread fail\n");
55d079c1a5SHisping Lin 		free(read_buff);
56d079c1a5SHisping Lin 		return -1;
57d079c1a5SHisping Lin 	}
58d079c1a5SHisping Lin 
59d079c1a5SHisping Lin 	version = (uint32_t *)(read_buff + 512 - 8);
60d079c1a5SHisping Lin 	checkstr = (uint32_t *)(read_buff + 512 - 4);
61d079c1a5SHisping Lin 
62d079c1a5SHisping Lin 	if (*version == 1 && *checkstr == 0x12345678)
63d079c1a5SHisping Lin 		rkss_version = RKSS_VERSION_V1;
64d079c1a5SHisping Lin 	else
65d079c1a5SHisping Lin 		rkss_version = RKSS_VERSION_V2;
66d079c1a5SHisping Lin 
67d079c1a5SHisping Lin 	free(read_buff);
68d079c1a5SHisping Lin 	return rkss_version;
69d079c1a5SHisping Lin }
70d079c1a5SHisping Lin 
71d079c1a5SHisping Lin int OpteeClientRkFsInit(void)
72d079c1a5SHisping Lin {
73d079c1a5SHisping Lin 	int version;
74d079c1a5SHisping Lin 
75d079c1a5SHisping Lin 	version = get_rkss_version();
76d079c1a5SHisping Lin 	debug("TEEC: OpteeClientRkFsInit version=%d\n", version);
77d079c1a5SHisping Lin 	if (version == RKSS_VERSION_V1)
78d079c1a5SHisping Lin 		return tee_supp_rk_fs_init_v1();
79d079c1a5SHisping Lin 	else if (version == RKSS_VERSION_V2)
80d079c1a5SHisping Lin 		return tee_supp_rk_fs_init_v2();
81d079c1a5SHisping Lin 	else if (version == RKSS_VERSION_ERR)
82d079c1a5SHisping Lin 		return 0;
83d079c1a5SHisping Lin 	else
84d079c1a5SHisping Lin 		return -1;
85d079c1a5SHisping Lin }
86d079c1a5SHisping Lin 
87*df538e29SHisping Lin #ifdef CONFIG_OPTEE_V1
88d079c1a5SHisping Lin int OpteeClientRkFsProcess(void *cmd, size_t cmd_size)
89d079c1a5SHisping Lin {
90d079c1a5SHisping Lin 	int version;
91d079c1a5SHisping Lin 
92d079c1a5SHisping Lin 	version = get_rkss_version();
93d079c1a5SHisping Lin 	debug("TEEC: OpteeClientRkFsProcess version=%d\n", version);
94d079c1a5SHisping Lin 	if (version == RKSS_VERSION_V1)
95d079c1a5SHisping Lin 		return tee_supp_rk_fs_process_v1(cmd, cmd_size);
96d079c1a5SHisping Lin 	else if (version == RKSS_VERSION_V2)
97d079c1a5SHisping Lin 		return tee_supp_rk_fs_process_v2(cmd, cmd_size);
98d079c1a5SHisping Lin 	else
99d079c1a5SHisping Lin 		return -1;
100d079c1a5SHisping Lin }
101*df538e29SHisping Lin #endif
102*df538e29SHisping Lin 
103*df538e29SHisping Lin #ifdef CONFIG_OPTEE_V2
104*df538e29SHisping Lin int OpteeClientRkFsProcess(size_t num_params,
105*df538e29SHisping Lin 			struct tee_ioctl_param *params)
106*df538e29SHisping Lin {
107*df538e29SHisping Lin 	int version;
108*df538e29SHisping Lin 
109*df538e29SHisping Lin 	version = get_rkss_version();
110*df538e29SHisping Lin 	debug("TEEC: OpteeClientRkFsProcess version=%d\n", version);
111*df538e29SHisping Lin 	if (version == RKSS_VERSION_V1)
112*df538e29SHisping Lin 		return tee_supp_rk_fs_process_v1(num_params, params);
113*df538e29SHisping Lin 	else if (version == RKSS_VERSION_V2)
114*df538e29SHisping Lin 		return tee_supp_rk_fs_process_v2(num_params, params);
115*df538e29SHisping Lin 	else
116*df538e29SHisping Lin 		return -1;
117*df538e29SHisping Lin }
118*df538e29SHisping Lin #endif
119