xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientRkFs_common.c (revision 5385f6ef28f264b74e085a93a8dc9510eefb13f2)
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>
13df538e29SHisping Lin #ifdef CONFIG_OPTEE_V1
14d079c1a5SHisping Lin #include <optee_include/OpteeClientRkFs.h>
15df538e29SHisping Lin #endif
16df538e29SHisping Lin #ifdef CONFIG_OPTEE_V2
17df538e29SHisping Lin #include <optee_include/OpteeClientRkNewFs.h>
18df538e29SHisping Lin #endif
19d079c1a5SHisping Lin 
20d079c1a5SHisping Lin static int rkss_version;
get_rkss_version(void)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 
46*5385f6efSHisping Lin 	read_buff = (uint8_t *)memalign(CONFIG_SYS_CACHELINE_SIZE, 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 
OpteeClientRkFsInit(void)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 
87df538e29SHisping Lin #ifdef CONFIG_OPTEE_V1
OpteeClientRkFsProcess(void * cmd,size_t cmd_size)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 }
101df538e29SHisping Lin #endif
102df538e29SHisping Lin 
103df538e29SHisping Lin #ifdef CONFIG_OPTEE_V2
OpteeClientRkFsProcess(size_t num_params,struct tee_ioctl_param * params)104df538e29SHisping Lin int OpteeClientRkFsProcess(size_t num_params,
105df538e29SHisping Lin 			struct tee_ioctl_param *params)
106df538e29SHisping Lin {
107df538e29SHisping Lin 	int version;
108df538e29SHisping Lin 
109df538e29SHisping Lin 	version = get_rkss_version();
110df538e29SHisping Lin 	debug("TEEC: OpteeClientRkFsProcess version=%d\n", version);
111df538e29SHisping Lin 	if (version == RKSS_VERSION_V1)
112df538e29SHisping Lin 		return tee_supp_rk_fs_process_v1(num_params, params);
113df538e29SHisping Lin 	else if (version == RKSS_VERSION_V2)
114df538e29SHisping Lin 		return tee_supp_rk_fs_process_v2(num_params, params);
115df538e29SHisping Lin 	else
116df538e29SHisping Lin 		return -1;
117df538e29SHisping Lin }
118df538e29SHisping Lin #endif
119