Skip to content

Commit e3cd135

Browse files
committed
[dm][tee] support Trusted Execution Environment (TEE)
Signed-off-by: GuEe-GUI <2991707448@qq.com>
1 parent 9ed6154 commit e3cd135

14 files changed

Lines changed: 2899 additions & 0 deletions

File tree

components/drivers/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ rsource "block/Kconfig"
3333
rsource "scsi/Kconfig"
3434
rsource "ufs/Kconfig"
3535
rsource "firmware/Kconfig"
36+
rsource "tee/Kconfig"
3637
rsource "hwcache/Kconfig"
3738
rsource "regulator/Kconfig"
3839
rsource "reset/Kconfig"
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
/*
2+
* Copyright (c) 2006-2023, RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2023-04-23 GuEe-GUI first version
9+
*/
10+
11+
#ifndef __TEE_H__
12+
#define __TEE_H__
13+
14+
#include <rtthread.h>
15+
#include <drivers/misc.h>
16+
17+
#define RT_TEE_SUCCESS 0x00000000
18+
#define RT_TEE_ERROR_STORAGE_NOT_AVAILABLE 0xf0100003
19+
#define RT_TEE_ERROR_GENERIC 0xffff0000
20+
#define RT_TEE_ERROR_EXCESS_DATA 0xffff0004
21+
#define RT_TEE_ERROR_BAD_PARAMETERS 0xffff0006
22+
#define RT_TEE_ERROR_ITEM_NOT_FOUND 0xffff0008
23+
#define RT_TEE_ERROR_NOT_IMPLEMENTED 0xffff0009
24+
#define RT_TEE_ERROR_NOT_SUPPORTED 0xffff000a
25+
#define RT_TEE_ERROR_COMMUNICATION 0xffff000e
26+
#define RT_TEE_ERROR_SECURITY 0xffff000f
27+
#define RT_TEE_ERROR_SHORT_BUFFER 0xffff0010
28+
#define RT_TEE_ERROR_OUT_OF_MEMORY 0xffff000c
29+
#define RT_TEE_ERROR_OVERFLOW 0xffff300f
30+
#define RT_TEE_ERROR_TARGET_DEAD 0xffff3024
31+
#define RT_TEE_ERROR_STORAGE_NO_SPACE 0xffff3041
32+
33+
#define RT_TEE_ORIGIN_COMMS 0x00000002
34+
#define RT_TEE_ORIGIN_TEE 0x00000003
35+
#define RT_TEE_ORIGIN_TRUSTED_APP 0x00000004
36+
37+
struct rt_tee_ops;
38+
39+
struct rt_tee_device
40+
{
41+
struct rt_device parent;
42+
43+
rt_list_t shm_nodes;
44+
45+
const struct rt_tee_ops *ops;
46+
struct rt_mutex mutex;
47+
};
48+
#define rt_device_to_tee_device(dev) rt_container_of(dev, struct rt_tee_device, parent)
49+
50+
struct rt_tee_version
51+
{
52+
#define TEE_IMPL_ID_OPTEE 1
53+
#define TEE_IMPL_ID_AMDTEE 2
54+
/* TEE implementation id */
55+
rt_uint32_t impl_id;
56+
#define TEE_OPTEE_CAP_TZ RT_BIT(0)
57+
/* Implementation specific capabilities */
58+
rt_uint32_t impl_caps;
59+
#define TEE_GEN_CAP_GP RT_BIT(0) /* GlobalPlatform compliant TEE */
60+
#define TEE_GEN_CAP_PRIVILEGED RT_BIT(1) /* Privileged device (for supplicant) */
61+
#define TEE_GEN_CAP_REG_MEM RT_BIT(2) /* Supports registering shared memory */
62+
#define TEE_GEN_CAP_MEMREF_NULL RT_BIT(3) /* NULL MemRef support */
63+
/* Generic capabilities */
64+
rt_uint32_t gen_caps;
65+
};
66+
67+
struct rt_tee_shm
68+
{
69+
rt_list_t list;
70+
struct rt_tee_device *tdev;
71+
72+
void *vaddr;
73+
rt_ubase_t paddr;
74+
rt_size_t size;
75+
rt_size_t align;
76+
#define TEE_SHM_DRV RT_BIT(0) /* Memory allocated from pool */
77+
#define TEE_SHM_SYS RT_BIT(1) /* Memory allocated from system */
78+
#define TEE_SHM_USER RT_BIT(2) /* Memory from user */
79+
rt_uint32_t flags;
80+
};
81+
82+
struct rt_tee_param_memref
83+
{
84+
rt_off_t shm_offs;
85+
rt_size_t size;
86+
struct rt_tee_shm *shm;
87+
};
88+
89+
struct rt_tee_param_value
90+
{
91+
rt_uint64_t a;
92+
rt_uint64_t b;
93+
rt_uint64_t c;
94+
};
95+
96+
struct rt_tee_param
97+
{
98+
#define TEE_PARAM_ATTR_TYPE_NONE 0
99+
#define TEE_PARAM_ATTR_TYPE_VALUE_IN 1
100+
#define TEE_PARAM_ATTR_TYPE_VALUE_OUT 2
101+
#define TEE_PARAM_ATTR_TYPE_VALUE_IN_OUT 3
102+
#define TEE_PARAM_ATTR_TYPE_MEMREF_IN 5
103+
#define TEE_PARAM_ATTR_TYPE_MEMREF_OUT 6
104+
#define TEE_PARAM_ATTR_TYPE_MEMREF_IN_OUT 7
105+
rt_uint64_t attr;
106+
107+
union
108+
{
109+
struct rt_tee_param_memref memref;
110+
struct rt_tee_param_value value;
111+
};
112+
};
113+
114+
rt_packed(struct rt_tee_uuid
115+
{
116+
rt_uint32_t time_low;
117+
rt_uint16_t time_mid;
118+
rt_uint16_t time_hi_and_version;
119+
rt_uint8_t clock_seq_and_node[8];
120+
});
121+
122+
struct rt_tee_open_session_arg
123+
{
124+
rt_uint8_t uuid[16];
125+
rt_uint8_t clnt_uuid[16];
126+
rt_uint32_t clnt_login;
127+
rt_uint32_t cancel_id;
128+
rt_uint32_t session;
129+
rt_uint32_t ret;
130+
rt_uint32_t ret_origin;
131+
132+
rt_uint32_t params_nr;
133+
struct rt_tee_param params[];
134+
};
135+
136+
struct rt_tee_invoke_arg
137+
{
138+
rt_uint32_t func;
139+
rt_uint32_t session;
140+
rt_uint32_t cancel_id;
141+
rt_uint32_t ret;
142+
rt_uint32_t ret_origin;
143+
144+
rt_uint32_t params_nr;
145+
struct rt_tee_param params[];
146+
};
147+
148+
struct rt_tee_ops
149+
{
150+
rt_err_t (*get_version)(struct rt_tee_device *tdev,
151+
struct rt_tee_version *out_version);
152+
153+
rt_err_t (*open_session)(struct rt_tee_device *tdev,
154+
struct rt_tee_open_session_arg *arg);
155+
rt_err_t (*close_session)(struct rt_tee_device *tdev, rt_uint32_t session);
156+
157+
rt_err_t (*invoke)(struct rt_tee_device *tdev,
158+
struct rt_tee_invoke_arg *arg);
159+
rt_err_t (*cancel)(struct rt_tee_device *tdev,
160+
rt_uint32_t session, rt_uint32_t cancel_id);
161+
162+
rt_err_t (*shm_register)(struct rt_tee_device *tdev, struct rt_tee_shm *shm);
163+
rt_err_t (*shm_unregister)(struct rt_tee_device *tdev, struct rt_tee_shm *shm);
164+
};
165+
166+
rt_err_t rt_tee_device_register(struct rt_tee_device *tdev);
167+
rt_err_t rt_tee_device_unregister(struct rt_tee_device *tdev);
168+
169+
rt_err_t rt_tee_get_version(struct rt_tee_device *tdev,
170+
struct rt_tee_version *out_version);
171+
172+
rt_err_t rt_tee_open_session(struct rt_tee_device *tdev,
173+
struct rt_tee_open_session_arg *arg);
174+
rt_err_t rt_tee_close_session(struct rt_tee_device *tdev, rt_uint32_t session);
175+
176+
rt_err_t rt_tee_invoke(struct rt_tee_device *tdev,
177+
struct rt_tee_invoke_arg *arg);
178+
179+
rt_err_t rt_tee_cancel(struct rt_tee_device *tdev,
180+
rt_uint32_t session, rt_uint32_t cancel_id);
181+
182+
rt_err_t rt_tee_shm_alloc_helper(struct rt_tee_shm *shm);
183+
rt_err_t rt_tee_shm_free_helper(struct rt_tee_shm *shm);
184+
rt_err_t rt_tee_shm_register(struct rt_tee_device *tdev, struct rt_tee_shm *shm);
185+
rt_err_t rt_tee_shm_unregister(struct rt_tee_device *tdev, struct rt_tee_shm *shm);
186+
187+
#endif /* __TEE_H__ */

components/drivers/include/rtdevice.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ extern "C" {
149149
#endif /* RT_FIRMWARE_ARM_SCMI */
150150
#endif /* RT_USING_FIRMWARE */
151151

152+
#ifdef RT_USING_TEE
153+
#include "drivers/tee.h"
154+
#endif /* RT_USING_TEE */
155+
152156
#ifdef RT_USING_HWCACHE
153157
#include "drivers/hwcache.h"
154158
#endif /* RT_USING_HWCACHE */

components/drivers/tee/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
menuconfig RT_USING_TEE
2+
bool "Using Trusted Execution Environment (TEE) support"
3+
depends on RT_USING_DM
4+
default n
5+
6+
if RT_USING_TEE
7+
rsource "optee/Kconfig"
8+
osource "$(SOC_DM_TEE_DIR)/Kconfig"
9+
endif

components/drivers/tee/SConscript

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from building import *
2+
3+
group = []
4+
5+
if not GetDepend(['RT_USING_TEE']):
6+
Return('group')
7+
8+
cwd = GetCurrentDir()
9+
list = os.listdir(cwd)
10+
CPPPATH = [cwd + '/../include']
11+
12+
src = ['tee.c']
13+
14+
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
15+
16+
for d in list:
17+
path = os.path.join(cwd, d)
18+
if os.path.isfile(os.path.join(path, 'SConscript')):
19+
group = group + SConscript(os.path.join(d, 'SConscript'))
20+
21+
Return('group')
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
menuconfig RT_TEE_OPTEE
2+
bool "OP-TEE"
3+
depends on ARCH_ARM_CORTEX_A || ARCH_ARMV8
4+
default n
5+
6+
config RT_TEE_OPTEE_EXAMPLES
7+
bool "Examples"
8+
depends on RT_TEE_OPTEE
9+
depends on RT_USING_CONSOLE
10+
depends on RT_USING_FINSH
11+
default y
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from building import *
2+
3+
group = []
4+
5+
if not GetDepend(['RT_TEE_OPTEE']):
6+
Return('group')
7+
8+
cwd = GetCurrentDir()
9+
CPPPATH = [cwd + '/../../include']
10+
11+
src = ['optee.c']
12+
13+
if GetDepend(['RT_TEE_OPTEE_EXAMPLES']):
14+
src += ['optee_examples.c']
15+
16+
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
17+
18+
Return('group')

0 commit comments

Comments
 (0)