xref: /OK3568_Linux_fs/u-boot/include/optee_include/teesmc_optee.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2017, Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  * hisping lin, <hisping.lin@rock-chips.com>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #ifndef TEESMC_OPTEE_H
8*4882a593Smuzhiyun #define TEESMC_OPTEE_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <optee_include/tee_base_types.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define TEESMC_OPTEE_RETURN_NOTAVAIL	0x5700
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun  * Get Shared Memory Config
16*4882a593Smuzhiyun  *
17*4882a593Smuzhiyun  * Returns the Secure/Non-secure shared memory config.
18*4882a593Smuzhiyun  *
19*4882a593Smuzhiyun  * Call register usage:
20*4882a593Smuzhiyun  * r0	SMC Function ID, TEESMC32_OPTEE_FASTCALL_GET_SHM_CONFIG
21*4882a593Smuzhiyun  * r1-6	Not used
22*4882a593Smuzhiyun  * r7	Hypervisor Client ID register
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  * Have config return register usage:
25*4882a593Smuzhiyun  * r0	TEESMC_RETURN_OK
26*4882a593Smuzhiyun  * r1	Physical address of start of SHM
27*4882a593Smuzhiyun  * r2	Size of of SHM
28*4882a593Smuzhiyun  * r3	1 if SHM is cached, 0 if uncached.
29*4882a593Smuzhiyun  * r4-7	Preserved
30*4882a593Smuzhiyun  *
31*4882a593Smuzhiyun  * Not available register usage:
32*4882a593Smuzhiyun  * r0	TEESMC_OPTEE_RETURN_NOTAVAIL
33*4882a593Smuzhiyun  * r1-3 Not used
34*4882a593Smuzhiyun  * r4-7	Preserved
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun #define TEESMC_OPTEE_FUNCID_GET_SHM_CONFIG	0x5700
37*4882a593Smuzhiyun #define TEESMC32_OPTEE_FASTCALL_GET_SHM_CONFIG \
38*4882a593Smuzhiyun 	TEESMC_CALL_VAL(TEESMC_32, TEESMC_FAST_CALL, TEESMC_OWNER_TRUSTED_OS, \
39*4882a593Smuzhiyun 			TEESMC_OPTEE_FUNCID_GET_SHM_CONFIG)
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /*
42*4882a593Smuzhiyun  * Configures L2CC mutex
43*4882a593Smuzhiyun  *
44*4882a593Smuzhiyun  * Disables, enables usage of L2CC mutex. Returns or sets physical address
45*4882a593Smuzhiyun  * of L2CC mutex.
46*4882a593Smuzhiyun  *
47*4882a593Smuzhiyun  * Call register usage:
48*4882a593Smuzhiyun  * r0	SMC Function ID, TEESMC32_OPTEE_FASTCALL_L2CC_MUTEX
49*4882a593Smuzhiyun  * r1	TEESMC_OPTEE_L2CC_MUTEX_GET_ADDR Get physical address of mutex
50*4882a593Smuzhiyun  *	TEESMC_OPTEE_L2CC_MUTEX_SET_ADDR Set physical address of mutex
51*4882a593Smuzhiyun  *	TEESMC_OPTEE_L2CC_MUTEX_ENABLE	 Enable usage of mutex
52*4882a593Smuzhiyun  *	TEESMC_OPTEE_L2CC_MUTEX_DISABLE	 Disable usage of mutex
53*4882a593Smuzhiyun  * r2	if r1 == TEESMC_OPTEE_L2CC_MUTEX_SET_ADDR, physical address of mutex
54*4882a593Smuzhiyun  * r3-6	Not used
55*4882a593Smuzhiyun  * r7	Hypervisor Client ID register
56*4882a593Smuzhiyun  *
57*4882a593Smuzhiyun  * Have config return register usage:
58*4882a593Smuzhiyun  * r0	TEESMC_RETURN_OK
59*4882a593Smuzhiyun  * r1	Preserved
60*4882a593Smuzhiyun  * r2	if r1 == 0, physical address of L2CC mutex
61*4882a593Smuzhiyun  * r3-7	Preserved
62*4882a593Smuzhiyun  *
63*4882a593Smuzhiyun  * Error return register usage:
64*4882a593Smuzhiyun  * r0	TEESMC_OPTEE_RETURN_NOTAVAIL	Physical address not available
65*4882a593Smuzhiyun  *	TEESMC_RETURN_EBADADDR		Bad supplied physical address
66*4882a593Smuzhiyun  *	TEESMC_RETURN_EBADCMD		Unsupported value in r1
67*4882a593Smuzhiyun  * r1-7	Preserved
68*4882a593Smuzhiyun  */
69*4882a593Smuzhiyun #define TEESMC_OPTEE_L2CC_MUTEX_GET_ADDR	0
70*4882a593Smuzhiyun #define TEESMC_OPTEE_L2CC_MUTEX_SET_ADDR	1
71*4882a593Smuzhiyun #define TEESMC_OPTEE_L2CC_MUTEX_ENABLE	2
72*4882a593Smuzhiyun #define TEESMC_OPTEE_L2CC_MUTEX_DISABLE	3
73*4882a593Smuzhiyun #define TEESMC_OPTEE_FUNCID_L2CC_MUTEX	0x5701
74*4882a593Smuzhiyun #define TEESMC32_OPTEE_FASTCALL_L2CC_MUTEX \
75*4882a593Smuzhiyun 	TEESMC_CALL_VAL(TEESMC_32, TEESMC_FAST_CALL, TEESMC_OWNER_TRUSTED_OS, \
76*4882a593Smuzhiyun 			TEESMC_OPTEE_FUNCID_L2CC_MUTEX)
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /*
79*4882a593Smuzhiyun  * Allocate payload memory for RPC parameter passing.
80*4882a593Smuzhiyun  *
81*4882a593Smuzhiyun  * "Call" register usage:
82*4882a593Smuzhiyun  * r0/x0	This value, TEESMC_RETURN_OPTEE_RPC_ALLOC_PAYLOAD
83*4882a593Smuzhiyun  * r1/x1	Size in bytes of required payload memory
84*4882a593Smuzhiyun  * r2/x2	Not used
85*4882a593Smuzhiyun  * r3-7/x3-7	Resume information, must be preserved
86*4882a593Smuzhiyun  *
87*4882a593Smuzhiyun  * "Return" register usage:
88*4882a593Smuzhiyun  * r0/x0	SMC Function ID, TEESMC32_CALL_RETURN_FROM_RPC if it was an
89*4882a593Smuzhiyun  *		AArch32 SMC return or TEESMC64_CALL_RETURN_FROM_RPC for
90*4882a593Smuzhiyun  *		AArch64 SMC return
91*4882a593Smuzhiyun  * r1/x1	Physical pointer to allocated payload memory, 0 if size
92*4882a593Smuzhiyun  *		was 0 or if memory can't be allocated
93*4882a593Smuzhiyun  * r2/x2	Shared memory cookie used when freeing the memory
94*4882a593Smuzhiyun  * r3-7/x3-7	Preserved
95*4882a593Smuzhiyun  */
96*4882a593Smuzhiyun #define TEESMC_OPTEE_RPC_FUNC_ALLOC_PAYLOAD	0x5700
97*4882a593Smuzhiyun #define TEESMC_RETURN_OPTEE_RPC_ALLOC_PAYLOAD	\
98*4882a593Smuzhiyun 		TEESMC_RPC_VAL(TEESMC_OPTEE_RPC_FUNC_ALLOC_PAYLOAD)
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun /*
102*4882a593Smuzhiyun  * Free memory previously allocated by TEESMC_RETURN_OPTEE_RPC_ALLOC_PAYLOAD
103*4882a593Smuzhiyun  *
104*4882a593Smuzhiyun  * "Call" register usage:
105*4882a593Smuzhiyun  * r0/x0	This value, TEESMC_RETURN_OPTEE_RPC_FREE_PAYLOAD
106*4882a593Smuzhiyun  * r1/x1	Shared memory cookie belonging to this payload memory
107*4882a593Smuzhiyun  * r2-7/x2-7	Resume information, must be preserved
108*4882a593Smuzhiyun  *
109*4882a593Smuzhiyun  * "Return" register usage:
110*4882a593Smuzhiyun  * r0/x0	SMC Function ID, TEESMC32_CALL_RETURN_FROM_RPC if it was an
111*4882a593Smuzhiyun  *		AArch32 SMC return or TEESMC64_CALL_RETURN_FROM_RPC for
112*4882a593Smuzhiyun  *		AArch64 SMC return
113*4882a593Smuzhiyun  * r2-7/x2-7	Preserved
114*4882a593Smuzhiyun  */
115*4882a593Smuzhiyun #define TEESMC_OPTEE_RPC_FUNC_FREE_PAYLOAD		0x5701
116*4882a593Smuzhiyun #define TEESMC_RETURN_OPTEE_RPC_FREE_PAYLOAD	\
117*4882a593Smuzhiyun 		TEESMC_RPC_VAL(TEESMC_OPTEE_RPC_FUNC_FREE_PAYLOAD)
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun /*
120*4882a593Smuzhiyun  * Overriding default UID of the API since the it has OP-TEE extensions
121*4882a593Smuzhiyun  * 384fb3e0-e7f8-11e3-af63-0002a5d5c51b : Only 32 bit calls are supported
122*4882a593Smuzhiyun  * 384fb3e0-e7f8-11e3-af63-0002a5d5c51c : Both 32 and 64 bit calls are supported
123*4882a593Smuzhiyun  */
124*4882a593Smuzhiyun #define TEESMC_OPTEE_UID_R0		0x384fb3e0
125*4882a593Smuzhiyun #define TEESMC_OPTEE_UID_R1		0xe7f811e3
126*4882a593Smuzhiyun #define TEESMC_OPTEE_UID_R2		0xaf630002
127*4882a593Smuzhiyun #define TEESMC_OPTEE_UID32_R3		0xa5d5c51b
128*4882a593Smuzhiyun #define TEESMC_OPTEE_UID64_R3		0xa5d5c51c
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #define TEESMC_OPTEE_REVISION_MAJOR	1
131*4882a593Smuzhiyun #define TEESMC_OPTEE_REVISION_MINOR	0
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun /*
134*4882a593Smuzhiyun  * UUID for OP-TEE
135*4882a593Smuzhiyun  * 486178e0-e7f8-11e3-bc5e-0002a5d5c51b
136*4882a593Smuzhiyun  */
137*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_UUID_R0		0x486178e0
138*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_UUID_R1		0xe7f811e3
139*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_UUID_R2		0xbc5e0002
140*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_UUID_R3		0xa5d5c51b
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_REVISION_MAJOR	1
143*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_REVISION_MINOR	0
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun #endif /*TEESMC_OPTEE_H*/
146