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