xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 3251364c8e16e8346c2edf3a3454739af0dc03aa)
1ae8ec5e1SHisping Lin /*
2ae8ec5e1SHisping Lin  * Copyright 2017, Rockchip Electronics Co., Ltd
3ae8ec5e1SHisping Lin  * hisping lin, <hisping.lin@rock-chips.com>
4ae8ec5e1SHisping Lin  *
5ae8ec5e1SHisping Lin  * SPDX-License-Identifier:	GPL-2.0+
6ae8ec5e1SHisping Lin  */
7ae8ec5e1SHisping Lin 
8ae8ec5e1SHisping Lin #include <common.h>
9ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h>
10ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h>
11*3251364cSHisping Lin #include <boot_rkimg.h>
12ae8ec5e1SHisping Lin 
13ae8ec5e1SHisping Lin void test_optee(void)
14ae8ec5e1SHisping Lin {
15ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
16ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
17ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
18ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
19ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
20ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
21ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
22ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
23*3251364cSHisping Lin 	struct blk_desc *dev_desc;
24*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
25ae8ec5e1SHisping Lin 
26ae8ec5e1SHisping Lin 	debug("testmm start\n");
27ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
28ae8ec5e1SHisping Lin 
29ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
30ae8ec5e1SHisping Lin 
31*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
32*3251364cSHisping Lin 						TEEC_NONE,
33*3251364cSHisping Lin 						TEEC_NONE,
34*3251364cSHisping Lin 						TEEC_NONE);
35*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
36*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
37*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
38*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
39*3251364cSHisping Lin #endif
40*3251364cSHisping Lin 
41ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
42ae8ec5e1SHisping Lin 				&TeecSession,
43ae8ec5e1SHisping Lin 				TeecUuid,
44ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
45ae8ec5e1SHisping Lin 				NULL,
46*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
47ae8ec5e1SHisping Lin 				NULL,
48*3251364cSHisping Lin #endif
49*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
50*3251364cSHisping Lin 				&TeecOperation,
51*3251364cSHisping Lin #endif
52ae8ec5e1SHisping Lin 				&ErrorOrigin);
53ae8ec5e1SHisping Lin 
54ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
55ae8ec5e1SHisping Lin 
56ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
57ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
58ae8ec5e1SHisping Lin 
59ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
60ae8ec5e1SHisping Lin 
61ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
62ae8ec5e1SHisping Lin 
63ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
64ae8ec5e1SHisping Lin 
65ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
66ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
67ae8ec5e1SHisping Lin 
68ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
69ae8ec5e1SHisping Lin 
70ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
71ae8ec5e1SHisping Lin 
72ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
73ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
74ae8ec5e1SHisping Lin 
75ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
76ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
77ae8ec5e1SHisping Lin 
78ae8ec5e1SHisping Lin 
79ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
80ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
81ae8ec5e1SHisping Lin 						TEEC_NONE,
82ae8ec5e1SHisping Lin 						TEEC_NONE);
83ae8ec5e1SHisping Lin 
84ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
85ae8ec5e1SHisping Lin 					1,
86ae8ec5e1SHisping Lin 					&TeecOperation,
87ae8ec5e1SHisping Lin 					&ErrorOrigin);
88ae8ec5e1SHisping Lin 
89ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
90ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
91ae8ec5e1SHisping Lin 
92ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
93ae8ec5e1SHisping Lin 
9446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
95ae8ec5e1SHisping Lin 
96ae8ec5e1SHisping Lin 	debug("testmm end\n");
97ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
98ae8ec5e1SHisping Lin }
99ae8ec5e1SHisping Lin 
100ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
101ae8ec5e1SHisping Lin {
102ae8ec5e1SHisping Lin 	if (in > 9)
103ae8ec5e1SHisping Lin 		return in + 55;
104ae8ec5e1SHisping Lin 	else
105ae8ec5e1SHisping Lin 		return in + 48;
106ae8ec5e1SHisping Lin }
107ae8ec5e1SHisping Lin 
108ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
109ae8ec5e1SHisping Lin {
110ae8ec5e1SHisping Lin 	uint32_t i = 0;
111ae8ec5e1SHisping Lin 
112ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
113ae8ec5e1SHisping Lin 		return 0;
114ae8ec5e1SHisping Lin 
115ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
116ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
117ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
118ae8ec5e1SHisping Lin 	}
119ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
120ae8ec5e1SHisping Lin 
121ae8ec5e1SHisping Lin 	return blen * 2;
122ae8ec5e1SHisping Lin }
123ae8ec5e1SHisping Lin 
124ae8ec5e1SHisping Lin 
125ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
126ae8ec5e1SHisping Lin {
127ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
128ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
129ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
130ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
131ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
132ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
133ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
134ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
135ae8ec5e1SHisping Lin 	uint8_t hs[9];
136ae8ec5e1SHisping Lin 
137*3251364cSHisping Lin 	struct blk_desc *dev_desc;
138*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
139*3251364cSHisping Lin 
140ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
141ae8ec5e1SHisping Lin 	debug("testmm start\n");
142ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
143ae8ec5e1SHisping Lin 
144ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
145ae8ec5e1SHisping Lin 
146*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
147*3251364cSHisping Lin 						TEEC_NONE,
148*3251364cSHisping Lin 						TEEC_NONE,
149*3251364cSHisping Lin 						TEEC_NONE);
150*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
151*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
152*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
153*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
154*3251364cSHisping Lin #endif
155*3251364cSHisping Lin 
156ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
157ae8ec5e1SHisping Lin 				&TeecSession,
158ae8ec5e1SHisping Lin 				TeecUuid,
159ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
160ae8ec5e1SHisping Lin 				NULL,
161*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
162ae8ec5e1SHisping Lin 				NULL,
163*3251364cSHisping Lin #endif
164*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
165*3251364cSHisping Lin 				&TeecOperation,
166*3251364cSHisping Lin #endif
167ae8ec5e1SHisping Lin 				&ErrorOrigin);
168ae8ec5e1SHisping Lin 
169ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
170ae8ec5e1SHisping Lin 
171ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
172ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
173ae8ec5e1SHisping Lin 
174ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
175ae8ec5e1SHisping Lin 
176ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
177ae8ec5e1SHisping Lin 
178ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
179ae8ec5e1SHisping Lin 
180ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
181ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
182ae8ec5e1SHisping Lin 
183ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
184ae8ec5e1SHisping Lin 
185ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
186ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
187ae8ec5e1SHisping Lin 
188ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
189ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
190ae8ec5e1SHisping Lin 
191ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
192ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
193ae8ec5e1SHisping Lin 						TEEC_NONE,
194ae8ec5e1SHisping Lin 						TEEC_NONE);
195ae8ec5e1SHisping Lin 
196ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
197ae8ec5e1SHisping Lin 					0,
198ae8ec5e1SHisping Lin 					&TeecOperation,
199ae8ec5e1SHisping Lin 					&ErrorOrigin);
20046b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
201ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
202ae8ec5e1SHisping Lin 
203ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
204ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
205ae8ec5e1SHisping Lin 
206ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
207ae8ec5e1SHisping Lin 
20846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
209ae8ec5e1SHisping Lin 
210ae8ec5e1SHisping Lin 	debug("testmm end\n");
211ae8ec5e1SHisping Lin 	return TeecResult;
212ae8ec5e1SHisping Lin }
213ae8ec5e1SHisping Lin 
214ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
215ae8ec5e1SHisping Lin {
216ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
217ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
218ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
219ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
220ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
221ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
222ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
223ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
224ae8ec5e1SHisping Lin 	uint8_t hs[9];
225*3251364cSHisping Lin 	struct blk_desc *dev_desc;
226*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
227*3251364cSHisping Lin 
228ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
229ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
230ae8ec5e1SHisping Lin 
231ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
232ae8ec5e1SHisping Lin 
233*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
234*3251364cSHisping Lin 						TEEC_NONE,
235*3251364cSHisping Lin 						TEEC_NONE,
236*3251364cSHisping Lin 						TEEC_NONE);
237*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
238*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
239*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
240*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
241*3251364cSHisping Lin #endif
242*3251364cSHisping Lin 
243ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
244ae8ec5e1SHisping Lin 				&TeecSession,
245ae8ec5e1SHisping Lin 				TeecUuid,
246ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
247ae8ec5e1SHisping Lin 				NULL,
248*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
249ae8ec5e1SHisping Lin 				NULL,
250*3251364cSHisping Lin #endif
251*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
252*3251364cSHisping Lin 				&TeecOperation,
253*3251364cSHisping Lin #endif
254ae8ec5e1SHisping Lin 				&ErrorOrigin);
255ae8ec5e1SHisping Lin 
256ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
257ae8ec5e1SHisping Lin 
258ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
259ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
260ae8ec5e1SHisping Lin 
261ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
262ae8ec5e1SHisping Lin 
263ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
264ae8ec5e1SHisping Lin 
265ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
266ae8ec5e1SHisping Lin 
267ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
268ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
269ae8ec5e1SHisping Lin 
270ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
271ae8ec5e1SHisping Lin 
272ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
273ae8ec5e1SHisping Lin 
274ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
275ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
276ae8ec5e1SHisping Lin 
277ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
278ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
279ae8ec5e1SHisping Lin 
280ae8ec5e1SHisping Lin 
281ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
282ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
283ae8ec5e1SHisping Lin 						TEEC_NONE,
284ae8ec5e1SHisping Lin 						TEEC_NONE);
285ae8ec5e1SHisping Lin 
286ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
287ae8ec5e1SHisping Lin 					1,
288ae8ec5e1SHisping Lin 					&TeecOperation,
289ae8ec5e1SHisping Lin 					&ErrorOrigin);
290ae8ec5e1SHisping Lin 
291ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
292ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
293ae8ec5e1SHisping Lin 
294ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
295ae8ec5e1SHisping Lin 
29646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
297ae8ec5e1SHisping Lin 
298ae8ec5e1SHisping Lin 	debug("testmm end\n");
299ae8ec5e1SHisping Lin 
300ae8ec5e1SHisping Lin 	return TeecResult;
301ae8ec5e1SHisping Lin }
302ae8ec5e1SHisping Lin 
303ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
304ae8ec5e1SHisping Lin {
305ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
306ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
307ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
308ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
30946b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
31046b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
311ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
312ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
313*3251364cSHisping Lin 	struct blk_desc *dev_desc;
314*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
315ae8ec5e1SHisping Lin 
316ae8ec5e1SHisping Lin 	debug("testmm start\n");
317ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
318ae8ec5e1SHisping Lin 
319ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
320ae8ec5e1SHisping Lin 
321*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
322*3251364cSHisping Lin 						TEEC_NONE,
323*3251364cSHisping Lin 						TEEC_NONE,
324*3251364cSHisping Lin 						TEEC_NONE);
325*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
326*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
327*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
328*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
329*3251364cSHisping Lin #endif
330*3251364cSHisping Lin 
331ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
332ae8ec5e1SHisping Lin 				&TeecSession,
333ae8ec5e1SHisping Lin 				TeecUuid,
334ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
335ae8ec5e1SHisping Lin 				NULL,
336*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
337ae8ec5e1SHisping Lin 				NULL,
338*3251364cSHisping Lin #endif
339*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
340*3251364cSHisping Lin 				&TeecOperation,
341*3251364cSHisping Lin #endif
342ae8ec5e1SHisping Lin 				&ErrorOrigin);
343ae8ec5e1SHisping Lin 
344ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
345ae8ec5e1SHisping Lin 
346ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
347ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
348ae8ec5e1SHisping Lin 
349ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
350ae8ec5e1SHisping Lin 
351ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
352ae8ec5e1SHisping Lin 
353ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
354ae8ec5e1SHisping Lin 
355ae8ec5e1SHisping Lin 	SharedMem1.size = size;
356ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
357ae8ec5e1SHisping Lin 
358ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
359ae8ec5e1SHisping Lin 
360ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
361ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
362ae8ec5e1SHisping Lin 
363ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
364ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
365ae8ec5e1SHisping Lin 
366ae8ec5e1SHisping Lin 
367ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
368ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
369ae8ec5e1SHisping Lin 						TEEC_NONE,
370ae8ec5e1SHisping Lin 						TEEC_NONE);
371ae8ec5e1SHisping Lin 
372ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
37346b2a054SHisping Lin 					142,
374ae8ec5e1SHisping Lin 					&TeecOperation,
375ae8ec5e1SHisping Lin 					&ErrorOrigin);
37646b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
377ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
378ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
379ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
380ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
38146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
382ae8ec5e1SHisping Lin 	debug("testmm end\n");
383ae8ec5e1SHisping Lin 
384ae8ec5e1SHisping Lin 	return TeecResult;
385ae8ec5e1SHisping Lin }
386ae8ec5e1SHisping Lin 
387ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
388ae8ec5e1SHisping Lin {
389ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
390ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
391ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
392ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
39346b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
39446b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
395ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
396ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
397*3251364cSHisping Lin 	struct blk_desc *dev_desc;
398*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
399ae8ec5e1SHisping Lin 
400ae8ec5e1SHisping Lin 	debug("testmm start\n");
401ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
402ae8ec5e1SHisping Lin 
403ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
404ae8ec5e1SHisping Lin 
405*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
406*3251364cSHisping Lin 						TEEC_NONE,
407*3251364cSHisping Lin 						TEEC_NONE,
408*3251364cSHisping Lin 						TEEC_NONE);
409*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
410*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
411*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
412*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
413*3251364cSHisping Lin #endif
414*3251364cSHisping Lin 
415ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
416ae8ec5e1SHisping Lin 				&TeecSession,
417ae8ec5e1SHisping Lin 				TeecUuid,
418ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
419ae8ec5e1SHisping Lin 				NULL,
420*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
421ae8ec5e1SHisping Lin 				NULL,
422*3251364cSHisping Lin #endif
423*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
424*3251364cSHisping Lin 				&TeecOperation,
425*3251364cSHisping Lin #endif
426ae8ec5e1SHisping Lin 				&ErrorOrigin);
427ae8ec5e1SHisping Lin 
428ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
429ae8ec5e1SHisping Lin 
430ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
431ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
432ae8ec5e1SHisping Lin 
433ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
434ae8ec5e1SHisping Lin 
435ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
436ae8ec5e1SHisping Lin 
437ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
438ae8ec5e1SHisping Lin 
439ae8ec5e1SHisping Lin 	SharedMem1.size = size;
440ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
441ae8ec5e1SHisping Lin 
442ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
443ae8ec5e1SHisping Lin 
444ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
445ae8ec5e1SHisping Lin 
446ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
447ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
448ae8ec5e1SHisping Lin 
449ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
450ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
451ae8ec5e1SHisping Lin 
452ae8ec5e1SHisping Lin 
453ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
454ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
455ae8ec5e1SHisping Lin 						TEEC_NONE,
456ae8ec5e1SHisping Lin 						TEEC_NONE);
457ae8ec5e1SHisping Lin 
458ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
45946b2a054SHisping Lin 					141,
460ae8ec5e1SHisping Lin 					&TeecOperation,
461ae8ec5e1SHisping Lin 					&ErrorOrigin);
462ae8ec5e1SHisping Lin 
463ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
464ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
465ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
46646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
467ae8ec5e1SHisping Lin 	debug("testmm end\n");
468ae8ec5e1SHisping Lin 
469ae8ec5e1SHisping Lin 	return TeecResult;
470ae8ec5e1SHisping Lin }
471ae8ec5e1SHisping Lin 
472ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
473ae8ec5e1SHisping Lin {
474ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
475ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
476ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
477ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
478ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
479ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
480ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
481ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
482*3251364cSHisping Lin 	struct blk_desc *dev_desc;
483*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
484ae8ec5e1SHisping Lin 
485ae8ec5e1SHisping Lin 	debug("testmm start\n");
486ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
487ae8ec5e1SHisping Lin 
488ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
489ae8ec5e1SHisping Lin 
490*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
491*3251364cSHisping Lin 						TEEC_NONE,
492*3251364cSHisping Lin 						TEEC_NONE,
493*3251364cSHisping Lin 						TEEC_NONE);
494*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
495*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
496*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
497*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
498*3251364cSHisping Lin #endif
499ae8ec5e1SHisping Lin 
500ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
501ae8ec5e1SHisping Lin 				&TeecSession,
502ae8ec5e1SHisping Lin 				TeecUuid,
503ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
504ae8ec5e1SHisping Lin 				NULL,
505*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
506ae8ec5e1SHisping Lin 				NULL,
507*3251364cSHisping Lin #endif
508*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
509*3251364cSHisping Lin 				&TeecOperation,
510*3251364cSHisping Lin #endif
511ae8ec5e1SHisping Lin 				&ErrorOrigin);
512ae8ec5e1SHisping Lin 
513ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
514ae8ec5e1SHisping Lin 
515ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
516ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
517ae8ec5e1SHisping Lin 
518ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
519ae8ec5e1SHisping Lin 
520ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
521ae8ec5e1SHisping Lin 
522ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
523ae8ec5e1SHisping Lin 
524ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
525ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
526ae8ec5e1SHisping Lin 
527ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
528ae8ec5e1SHisping Lin 
529ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
530ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
531ae8ec5e1SHisping Lin 
532ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
533ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
534ae8ec5e1SHisping Lin 
535ae8ec5e1SHisping Lin 
536ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
537ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
538ae8ec5e1SHisping Lin 						TEEC_NONE,
539ae8ec5e1SHisping Lin 						TEEC_NONE);
540ae8ec5e1SHisping Lin 
541ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
542ae8ec5e1SHisping Lin 					0,
543ae8ec5e1SHisping Lin 					&TeecOperation,
544ae8ec5e1SHisping Lin 					&ErrorOrigin);
54546b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
546ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
547ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
548ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
549ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
55046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
551ae8ec5e1SHisping Lin 	debug("testmm end\n");
552ae8ec5e1SHisping Lin 
553ae8ec5e1SHisping Lin 	return TeecResult;
554ae8ec5e1SHisping Lin }
555ae8ec5e1SHisping Lin 
556ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
557ae8ec5e1SHisping Lin {
558ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
559ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
560ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
561ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
562ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
563ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
564ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
565ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
566*3251364cSHisping Lin 	struct blk_desc *dev_desc;
567*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
568ae8ec5e1SHisping Lin 
569ae8ec5e1SHisping Lin 	debug("testmm start\n");
570ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
571ae8ec5e1SHisping Lin 
572ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
573ae8ec5e1SHisping Lin 
574*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
575*3251364cSHisping Lin 						TEEC_NONE,
576*3251364cSHisping Lin 						TEEC_NONE,
577*3251364cSHisping Lin 						TEEC_NONE);
578*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
579*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
580*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
581*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
582*3251364cSHisping Lin #endif
583*3251364cSHisping Lin 
584ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
585ae8ec5e1SHisping Lin 				&TeecSession,
586ae8ec5e1SHisping Lin 				TeecUuid,
587ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
588ae8ec5e1SHisping Lin 				NULL,
589*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
590ae8ec5e1SHisping Lin 				NULL,
591*3251364cSHisping Lin #endif
592*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
593*3251364cSHisping Lin 				&TeecOperation,
594*3251364cSHisping Lin #endif
595ae8ec5e1SHisping Lin 				&ErrorOrigin);
596ae8ec5e1SHisping Lin 
597ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
598ae8ec5e1SHisping Lin 
599ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
600ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
601ae8ec5e1SHisping Lin 
602ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
603ae8ec5e1SHisping Lin 
604ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
605ae8ec5e1SHisping Lin 
606ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
607ae8ec5e1SHisping Lin 
608ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
609ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
610ae8ec5e1SHisping Lin 
611ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
612ae8ec5e1SHisping Lin 
613ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
614ae8ec5e1SHisping Lin 
615ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
616ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
617ae8ec5e1SHisping Lin 
618ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
619ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
620ae8ec5e1SHisping Lin 
621ae8ec5e1SHisping Lin 
622ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
623ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
624ae8ec5e1SHisping Lin 						TEEC_NONE,
625ae8ec5e1SHisping Lin 						TEEC_NONE);
626ae8ec5e1SHisping Lin 
627ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
628ae8ec5e1SHisping Lin 					1,
629ae8ec5e1SHisping Lin 					&TeecOperation,
630ae8ec5e1SHisping Lin 					&ErrorOrigin);
631ae8ec5e1SHisping Lin 
632ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
633ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
634ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
63546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
636ae8ec5e1SHisping Lin 	debug("testmm end\n");
637ae8ec5e1SHisping Lin 
638ae8ec5e1SHisping Lin 	return TeecResult;
639ae8ec5e1SHisping Lin }
640ae8ec5e1SHisping Lin 
641ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
642ae8ec5e1SHisping Lin {
643ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
644ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
645ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
646ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
647ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
648ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
649ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
650ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
651*3251364cSHisping Lin 	struct blk_desc *dev_desc;
652*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
653ae8ec5e1SHisping Lin 
654ae8ec5e1SHisping Lin 	debug("testmm start\n");
655ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
656ae8ec5e1SHisping Lin 
657ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
658ae8ec5e1SHisping Lin 
659*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
660*3251364cSHisping Lin 						TEEC_NONE,
661*3251364cSHisping Lin 						TEEC_NONE,
662*3251364cSHisping Lin 						TEEC_NONE);
663*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
664*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
665*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
666*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
667*3251364cSHisping Lin #endif
668ae8ec5e1SHisping Lin 
669ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
670ae8ec5e1SHisping Lin 				&TeecSession,
671ae8ec5e1SHisping Lin 				TeecUuid,
672ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
673ae8ec5e1SHisping Lin 				NULL,
674*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
675ae8ec5e1SHisping Lin 				NULL,
676*3251364cSHisping Lin #endif
677*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
678*3251364cSHisping Lin 				&TeecOperation,
679*3251364cSHisping Lin #endif
680ae8ec5e1SHisping Lin 				&ErrorOrigin);
681ae8ec5e1SHisping Lin 
682ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
683ae8ec5e1SHisping Lin 
684ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
685ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
686ae8ec5e1SHisping Lin 
687ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
688ae8ec5e1SHisping Lin 
689ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
690ae8ec5e1SHisping Lin 
691ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
692ae8ec5e1SHisping Lin 
693ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
694ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
695ae8ec5e1SHisping Lin 
696ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
697ae8ec5e1SHisping Lin 
698ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
699ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
700ae8ec5e1SHisping Lin 
701ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
702ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
703ae8ec5e1SHisping Lin 
704ae8ec5e1SHisping Lin 
705ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
706ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
707ae8ec5e1SHisping Lin 						TEEC_NONE,
708ae8ec5e1SHisping Lin 						TEEC_NONE);
709ae8ec5e1SHisping Lin 
710ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
711ae8ec5e1SHisping Lin 					0,
712ae8ec5e1SHisping Lin 					&TeecOperation,
713ae8ec5e1SHisping Lin 					&ErrorOrigin);
71446b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
715ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
716ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
717ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
718ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
71946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
720ae8ec5e1SHisping Lin 	debug("testmm end\n");
721ae8ec5e1SHisping Lin 
722ae8ec5e1SHisping Lin 	return TeecResult;
723ae8ec5e1SHisping Lin }
724ae8ec5e1SHisping Lin 
725ae8ec5e1SHisping Lin 
726ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
727ae8ec5e1SHisping Lin {
728ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
729ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
730ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
731ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
732ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
733ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
734ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
735ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
736*3251364cSHisping Lin 	struct blk_desc *dev_desc;
737*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
738ae8ec5e1SHisping Lin 
739ae8ec5e1SHisping Lin 	debug("testmm start\n");
740ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
741ae8ec5e1SHisping Lin 
742ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
743ae8ec5e1SHisping Lin 
744*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
745*3251364cSHisping Lin 						TEEC_NONE,
746*3251364cSHisping Lin 						TEEC_NONE,
747*3251364cSHisping Lin 						TEEC_NONE);
748*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
749*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
750*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
751*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
752*3251364cSHisping Lin #endif
753*3251364cSHisping Lin 
754ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
755ae8ec5e1SHisping Lin 				&TeecSession,
756ae8ec5e1SHisping Lin 				TeecUuid,
757ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
758ae8ec5e1SHisping Lin 				NULL,
759*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
760ae8ec5e1SHisping Lin 				NULL,
761*3251364cSHisping Lin #endif
762*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
763*3251364cSHisping Lin 				&TeecOperation,
764*3251364cSHisping Lin #endif
765ae8ec5e1SHisping Lin 				&ErrorOrigin);
766ae8ec5e1SHisping Lin 
767ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
768ae8ec5e1SHisping Lin 
769ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
770ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
771ae8ec5e1SHisping Lin 
772ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
773ae8ec5e1SHisping Lin 
774ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
775ae8ec5e1SHisping Lin 
776ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
777ae8ec5e1SHisping Lin 
778ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
779ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
780ae8ec5e1SHisping Lin 
781ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
782ae8ec5e1SHisping Lin 
783ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
784ae8ec5e1SHisping Lin 
785ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
786ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
787ae8ec5e1SHisping Lin 
788ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
789ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
790ae8ec5e1SHisping Lin 
791ae8ec5e1SHisping Lin 
792ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
793ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
794ae8ec5e1SHisping Lin 						TEEC_NONE,
795ae8ec5e1SHisping Lin 						TEEC_NONE);
796ae8ec5e1SHisping Lin 
797ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
798ae8ec5e1SHisping Lin 					1,
799ae8ec5e1SHisping Lin 					&TeecOperation,
800ae8ec5e1SHisping Lin 					&ErrorOrigin);
801ae8ec5e1SHisping Lin 
802ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
803ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
804ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
80546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
806ae8ec5e1SHisping Lin 	debug("testmm end\n");
807ae8ec5e1SHisping Lin 
808ae8ec5e1SHisping Lin 	return TeecResult;
809ae8ec5e1SHisping Lin }
810ae8ec5e1SHisping Lin 
811ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
812ae8ec5e1SHisping Lin 		uint32_t filename_size,
813ae8ec5e1SHisping Lin 		uint8_t *data,
814ae8ec5e1SHisping Lin 		uint32_t data_size)
815ae8ec5e1SHisping Lin {
816ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
817ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
818ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
819ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
820ae8ec5e1SHisping Lin 
821ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
822ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
823ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
824ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
825*3251364cSHisping Lin 	struct blk_desc *dev_desc;
826*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
827ae8ec5e1SHisping Lin 
828ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
829ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
830ae8ec5e1SHisping Lin 
831ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
832ae8ec5e1SHisping Lin 
833*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
834*3251364cSHisping Lin 						TEEC_NONE,
835*3251364cSHisping Lin 						TEEC_NONE,
836*3251364cSHisping Lin 						TEEC_NONE);
837*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
838*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
839*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
840*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
841*3251364cSHisping Lin #endif
842*3251364cSHisping Lin 
843ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
844ae8ec5e1SHisping Lin 				&TeecSession,
845ae8ec5e1SHisping Lin 				TeecUuid,
846ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
847ae8ec5e1SHisping Lin 				NULL,
848*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
849ae8ec5e1SHisping Lin 				NULL,
850*3251364cSHisping Lin #endif
851*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
852*3251364cSHisping Lin 				&TeecOperation,
853*3251364cSHisping Lin #endif
854ae8ec5e1SHisping Lin 				&ErrorOrigin);
855ae8ec5e1SHisping Lin 
856ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
857ae8ec5e1SHisping Lin 
858ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
859ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
860ae8ec5e1SHisping Lin 
861ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
862ae8ec5e1SHisping Lin 
863ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
864ae8ec5e1SHisping Lin 
865ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
866ae8ec5e1SHisping Lin 
867ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
868ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
869ae8ec5e1SHisping Lin 
870ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
871ae8ec5e1SHisping Lin 
872ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
873ae8ec5e1SHisping Lin 
874ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
875ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
876ae8ec5e1SHisping Lin 
877ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
878ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
879ae8ec5e1SHisping Lin 
880ae8ec5e1SHisping Lin 
881ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
882ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
883ae8ec5e1SHisping Lin 						TEEC_NONE,
884ae8ec5e1SHisping Lin 						TEEC_NONE);
885ae8ec5e1SHisping Lin 
886ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8871f25ada2SHisping Lin 					141,
888ae8ec5e1SHisping Lin 					&TeecOperation,
889ae8ec5e1SHisping Lin 					&ErrorOrigin);
890ae8ec5e1SHisping Lin 
891ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
892ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
893ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
89446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
895ae8ec5e1SHisping Lin 	debug("testmm end\n");
896ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
897ae8ec5e1SHisping Lin 
898ae8ec5e1SHisping Lin 	return TeecResult;
899ae8ec5e1SHisping Lin }
9006ef445a4SHisping Lin 
9016ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
9026ef445a4SHisping Lin {
9036ef445a4SHisping Lin 	TEEC_Result TeecResult;
9046ef445a4SHisping Lin 	TEEC_Context TeecContext;
9056ef445a4SHisping Lin 	TEEC_Session TeecSession;
9066ef445a4SHisping Lin 	uint32_t ErrorOrigin;
9076ef445a4SHisping Lin 
9086ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
9096ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9106ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9116ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
9126ef445a4SHisping Lin 
9136ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
9146ef445a4SHisping Lin 
9156ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9166ef445a4SHisping Lin 
9176ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9186ef445a4SHisping Lin 				&TeecSession,
9196ef445a4SHisping Lin 				TeecUuid,
9206ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
9216ef445a4SHisping Lin 				NULL,
9226ef445a4SHisping Lin 				NULL,
9236ef445a4SHisping Lin 				&ErrorOrigin);
9246ef445a4SHisping Lin 
9256ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
9266ef445a4SHisping Lin 
9276ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
9286ef445a4SHisping Lin 	SharedMem0.flags = 0;
9296ef445a4SHisping Lin 
9306ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
9316ef445a4SHisping Lin 
9326ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9336ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9346ef445a4SHisping Lin 
9356ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
9366ef445a4SHisping Lin 						TEEC_NONE,
9376ef445a4SHisping Lin 						TEEC_NONE,
9386ef445a4SHisping Lin 						TEEC_NONE);
9396ef445a4SHisping Lin 
9406ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9416ef445a4SHisping Lin 					0,
9426ef445a4SHisping Lin 					&TeecOperation,
9436ef445a4SHisping Lin 					&ErrorOrigin);
9446ef445a4SHisping Lin 
9456ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
9466ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
9476ef445a4SHisping Lin 
9486ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
9496ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
9506ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9516ef445a4SHisping Lin 
9526ef445a4SHisping Lin 	return TeecResult;
9536ef445a4SHisping Lin }
9546ef445a4SHisping Lin 
9556ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
9566ef445a4SHisping Lin {
9576ef445a4SHisping Lin 	TEEC_Result TeecResult;
9586ef445a4SHisping Lin 	TEEC_Context TeecContext;
9596ef445a4SHisping Lin 	TEEC_Session TeecSession;
9606ef445a4SHisping Lin 	uint32_t ErrorOrigin;
9616ef445a4SHisping Lin 
9626ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
9636ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9646ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9656ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
9666ef445a4SHisping Lin 
9676ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
9686ef445a4SHisping Lin 
9696ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9706ef445a4SHisping Lin 
9716ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9726ef445a4SHisping Lin 				&TeecSession,
9736ef445a4SHisping Lin 				TeecUuid,
9746ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
9756ef445a4SHisping Lin 				NULL,
9766ef445a4SHisping Lin 				NULL,
9776ef445a4SHisping Lin 				&ErrorOrigin);
9786ef445a4SHisping Lin 
9796ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
9806ef445a4SHisping Lin 
9816ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
9826ef445a4SHisping Lin 	SharedMem0.flags = 0;
9836ef445a4SHisping Lin 
9846ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
9856ef445a4SHisping Lin 
9866ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
9876ef445a4SHisping Lin 
9886ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9896ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9906ef445a4SHisping Lin 
9916ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
9926ef445a4SHisping Lin 						TEEC_NONE,
9936ef445a4SHisping Lin 						TEEC_NONE,
9946ef445a4SHisping Lin 						TEEC_NONE);
9956ef445a4SHisping Lin 
9966ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9976ef445a4SHisping Lin 					1,
9986ef445a4SHisping Lin 					&TeecOperation,
9996ef445a4SHisping Lin 					&ErrorOrigin);
10006ef445a4SHisping Lin 
10016ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
10026ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
10036ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10046ef445a4SHisping Lin 
10056ef445a4SHisping Lin 	return TeecResult;
10066ef445a4SHisping Lin }
100716539616SHisping Lin 
100816539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
100916539616SHisping Lin {
101016539616SHisping Lin 	TEEC_Result TeecResult;
101116539616SHisping Lin 	TEEC_Context TeecContext;
101216539616SHisping Lin 	TEEC_Session TeecSession;
101316539616SHisping Lin 	uint32_t ErrorOrigin;
101416539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
101516539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
101616539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
101716539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
101816539616SHisping Lin 
101916539616SHisping Lin 	OpteeClientApiLibInitialize();
102016539616SHisping Lin 
102116539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
102216539616SHisping Lin 
102316539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
102416539616SHisping Lin 				&TeecSession,
102516539616SHisping Lin 				TeecUuid,
102616539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
102716539616SHisping Lin 				NULL,
102816539616SHisping Lin 				NULL,
102916539616SHisping Lin 				&ErrorOrigin);
103016539616SHisping Lin 
103116539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
103216539616SHisping Lin 						TEEC_NONE,
103316539616SHisping Lin 						TEEC_NONE,
103416539616SHisping Lin 						TEEC_NONE);
103516539616SHisping Lin 
103616539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
103716539616SHisping Lin 					2,
103816539616SHisping Lin 					&TeecOperation,
103916539616SHisping Lin 					&ErrorOrigin);
104016539616SHisping Lin 
104116539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
104216539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
104316539616SHisping Lin 
104416539616SHisping Lin 	return TeecResult;
104516539616SHisping Lin }
104616539616SHisping Lin 
104716539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
104816539616SHisping Lin {
104916539616SHisping Lin 	TEEC_Result TeecResult;
105016539616SHisping Lin 	TEEC_Context TeecContext;
105116539616SHisping Lin 	TEEC_Session TeecSession;
105216539616SHisping Lin 	uint32_t ErrorOrigin;
105316539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
105416539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
105516539616SHisping Lin 
105616539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
105716539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
105816539616SHisping Lin 
105916539616SHisping Lin 	OpteeClientApiLibInitialize();
106016539616SHisping Lin 
106116539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
106216539616SHisping Lin 
106316539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
106416539616SHisping Lin 				&TeecSession,
106516539616SHisping Lin 				TeecUuid,
106616539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
106716539616SHisping Lin 				NULL,
106816539616SHisping Lin 				NULL,
106916539616SHisping Lin 				&ErrorOrigin);
107016539616SHisping Lin 
107116539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
107216539616SHisping Lin 						TEEC_NONE,
107316539616SHisping Lin 						TEEC_NONE,
107416539616SHisping Lin 						TEEC_NONE);
107516539616SHisping Lin 
107616539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
107716539616SHisping Lin 					2,
107816539616SHisping Lin 					&TeecOperation,
107916539616SHisping Lin 					&ErrorOrigin);
108016539616SHisping Lin 
108116539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
108216539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
108316539616SHisping Lin 
108416539616SHisping Lin 	return TeecResult;
108516539616SHisping Lin }
108616539616SHisping Lin 
108716539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
108816539616SHisping Lin {
108916539616SHisping Lin 	TEEC_Result res;
109016539616SHisping Lin 	res = notify_optee_rpmb_ta();
109116539616SHisping Lin 	res |= notify_optee_efuse_ta();
109216539616SHisping Lin 	return res;
109316539616SHisping Lin }
10942cd27853SHisping Lin 
10952cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
10962cd27853SHisping Lin {
10972cd27853SHisping Lin 	TEEC_Result TeecResult;
10982cd27853SHisping Lin 	TEEC_Context TeecContext;
10992cd27853SHisping Lin 	TEEC_Session TeecSession;
11002cd27853SHisping Lin 	uint32_t ErrorOrigin;
11012cd27853SHisping Lin 
11022cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11032cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11042cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11052cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
11062cd27853SHisping Lin 
11072cd27853SHisping Lin 	OpteeClientApiLibInitialize();
11082cd27853SHisping Lin 
11092cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
11102cd27853SHisping Lin 
11112cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11122cd27853SHisping Lin 				&TeecSession,
11132cd27853SHisping Lin 				TeecUuid,
11142cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
11152cd27853SHisping Lin 				NULL,
11162cd27853SHisping Lin 				NULL,
11172cd27853SHisping Lin 				&ErrorOrigin);
11182cd27853SHisping Lin 
11192cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11202cd27853SHisping Lin 
11212cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
11222cd27853SHisping Lin 	SharedMem0.flags = 0;
11232cd27853SHisping Lin 
11242cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
11252cd27853SHisping Lin 
11262cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11272cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11282cd27853SHisping Lin 
11292cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
11302cd27853SHisping Lin 						TEEC_NONE,
11312cd27853SHisping Lin 						TEEC_NONE,
11322cd27853SHisping Lin 						TEEC_NONE);
11332cd27853SHisping Lin 
11342cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11352cd27853SHisping Lin 					3,
11362cd27853SHisping Lin 					&TeecOperation,
11372cd27853SHisping Lin 					&ErrorOrigin);
11382cd27853SHisping Lin 
11392cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
11402cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
11412cd27853SHisping Lin 
11422cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
11432cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
11442cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11452cd27853SHisping Lin 
11462cd27853SHisping Lin 	return TeecResult;
11472cd27853SHisping Lin }
11482cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
11492cd27853SHisping Lin {
11502cd27853SHisping Lin 	TEEC_Result TeecResult;
11512cd27853SHisping Lin 	TEEC_Context TeecContext;
11522cd27853SHisping Lin 	TEEC_Session TeecSession;
11532cd27853SHisping Lin 	uint32_t ErrorOrigin;
11542cd27853SHisping Lin 
11552cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11562cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11572cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11582cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
11592cd27853SHisping Lin 
11602cd27853SHisping Lin 	OpteeClientApiLibInitialize();
11612cd27853SHisping Lin 
11622cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
11632cd27853SHisping Lin 
11642cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11652cd27853SHisping Lin 				&TeecSession,
11662cd27853SHisping Lin 				TeecUuid,
11672cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
11682cd27853SHisping Lin 				NULL,
11692cd27853SHisping Lin 				NULL,
11702cd27853SHisping Lin 				&ErrorOrigin);
11712cd27853SHisping Lin 
11722cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11732cd27853SHisping Lin 
11742cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
11752cd27853SHisping Lin 	SharedMem0.flags = 0;
11762cd27853SHisping Lin 
11772cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
11782cd27853SHisping Lin 
11792cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
11802cd27853SHisping Lin 
11812cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11822cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11832cd27853SHisping Lin 
11842cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
11852cd27853SHisping Lin 						TEEC_NONE,
11862cd27853SHisping Lin 						TEEC_NONE,
11872cd27853SHisping Lin 						TEEC_NONE);
11882cd27853SHisping Lin 
11892cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11902cd27853SHisping Lin 					4,
11912cd27853SHisping Lin 					&TeecOperation,
11922cd27853SHisping Lin 					&ErrorOrigin);
11932cd27853SHisping Lin 
11942cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
11952cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
11962cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11972cd27853SHisping Lin 
11982cd27853SHisping Lin 	return TeecResult;
11992cd27853SHisping Lin }
1200095e2a82SHisping Lin 
1201468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1202468df3b2SHisping Lin {
1203468df3b2SHisping Lin 	TEEC_Result TeecResult;
1204468df3b2SHisping Lin 	TEEC_Context TeecContext;
1205468df3b2SHisping Lin 	TEEC_Session TeecSession;
1206468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1207468df3b2SHisping Lin 	uint32_t bootflag;
1208468df3b2SHisping Lin 
1209468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1210468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1211468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1212468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1213468df3b2SHisping Lin 
1214468df3b2SHisping Lin 	OpteeClientApiLibInitialize();
1215468df3b2SHisping Lin 
1216468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1217468df3b2SHisping Lin 
1218468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1219468df3b2SHisping Lin 				&TeecSession,
1220468df3b2SHisping Lin 				TeecUuid,
1221468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1222468df3b2SHisping Lin 				NULL,
1223468df3b2SHisping Lin 				NULL,
1224468df3b2SHisping Lin 				&ErrorOrigin);
1225468df3b2SHisping Lin 
1226468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1227468df3b2SHisping Lin 
1228468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1229468df3b2SHisping Lin 	SharedMem0.flags = 0;
1230468df3b2SHisping Lin 
1231468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1232468df3b2SHisping Lin 
1233468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1234468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1235468df3b2SHisping Lin 
1236468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1237468df3b2SHisping Lin 						TEEC_NONE,
1238468df3b2SHisping Lin 						TEEC_NONE,
1239468df3b2SHisping Lin 						TEEC_NONE);
1240468df3b2SHisping Lin 
1241468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1242468df3b2SHisping Lin 					5,
1243468df3b2SHisping Lin 					&TeecOperation,
1244468df3b2SHisping Lin 					&ErrorOrigin);
1245468df3b2SHisping Lin 
1246468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1247468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
1248468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1249468df3b2SHisping Lin 			*flag = 1;
1250468df3b2SHisping Lin 	}
1251468df3b2SHisping Lin 
1252468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1253468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1254468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1255468df3b2SHisping Lin 
1256468df3b2SHisping Lin 	return TeecResult;
1257468df3b2SHisping Lin }
1258468df3b2SHisping Lin 
1259095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1260095e2a82SHisping Lin {
1261095e2a82SHisping Lin 	TEEC_Result TeecResult;
1262095e2a82SHisping Lin 	TEEC_Context TeecContext;
1263095e2a82SHisping Lin 	TEEC_Session TeecSession;
1264095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1265095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1266095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1267095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1268095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
1269*3251364cSHisping Lin 	struct blk_desc *dev_desc;
1270*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1271095e2a82SHisping Lin 
1272095e2a82SHisping Lin 	debug("testmm start\n");
1273095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1274095e2a82SHisping Lin 
1275095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1276095e2a82SHisping Lin 
1277*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1278*3251364cSHisping Lin 						TEEC_NONE,
1279*3251364cSHisping Lin 						TEEC_NONE,
1280*3251364cSHisping Lin 						TEEC_NONE);
1281*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1282*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1283*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1284*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1285*3251364cSHisping Lin #endif
1286*3251364cSHisping Lin 
1287095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1288095e2a82SHisping Lin 				&TeecSession,
1289095e2a82SHisping Lin 				TeecUuid,
1290095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1291095e2a82SHisping Lin 				NULL,
1292*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
1293095e2a82SHisping Lin 				NULL,
1294*3251364cSHisping Lin #endif
1295*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
1296*3251364cSHisping Lin 				&TeecOperation,
1297*3251364cSHisping Lin #endif
1298095e2a82SHisping Lin 				&ErrorOrigin);
1299095e2a82SHisping Lin 
1300095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1301095e2a82SHisping Lin 
1302095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1303095e2a82SHisping Lin 	SharedMem0.flags = 0;
1304095e2a82SHisping Lin 
1305095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1306095e2a82SHisping Lin 
1307095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1308095e2a82SHisping Lin 
1309095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1310095e2a82SHisping Lin 
1311095e2a82SHisping Lin 	SharedMem1.size = 1;
1312095e2a82SHisping Lin 	SharedMem1.flags = 0;
1313095e2a82SHisping Lin 
1314095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1315095e2a82SHisping Lin 
1316095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1317095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1318095e2a82SHisping Lin 
1319095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1320095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1321095e2a82SHisping Lin 
1322095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1323095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1324095e2a82SHisping Lin 						TEEC_NONE,
1325095e2a82SHisping Lin 						TEEC_NONE);
1326095e2a82SHisping Lin 
1327095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1328095e2a82SHisping Lin 					142,
1329095e2a82SHisping Lin 					&TeecOperation,
1330095e2a82SHisping Lin 					&ErrorOrigin);
1331095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1332095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1333095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1334095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1335095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1336095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1337095e2a82SHisping Lin 	debug("testmm end\n");
1338095e2a82SHisping Lin 
1339095e2a82SHisping Lin 	return TeecResult;
1340095e2a82SHisping Lin }
1341095e2a82SHisping Lin 
1342095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1343095e2a82SHisping Lin {
1344095e2a82SHisping Lin 	TEEC_Result TeecResult;
1345095e2a82SHisping Lin 	TEEC_Context TeecContext;
1346095e2a82SHisping Lin 	TEEC_Session TeecSession;
1347095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1348095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1349095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1350095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1351095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
1352*3251364cSHisping Lin 	struct blk_desc *dev_desc;
1353*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1354095e2a82SHisping Lin 
1355095e2a82SHisping Lin 	debug("testmm start\n");
1356095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1357095e2a82SHisping Lin 
1358095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1359095e2a82SHisping Lin 
1360*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1361*3251364cSHisping Lin 						TEEC_NONE,
1362*3251364cSHisping Lin 						TEEC_NONE,
1363*3251364cSHisping Lin 						TEEC_NONE);
1364*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1365*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1366*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1367*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1368*3251364cSHisping Lin #endif
1369*3251364cSHisping Lin 
1370095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1371095e2a82SHisping Lin 				&TeecSession,
1372095e2a82SHisping Lin 				TeecUuid,
1373095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1374095e2a82SHisping Lin 				NULL,
1375*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
1376095e2a82SHisping Lin 				NULL,
1377*3251364cSHisping Lin #endif
1378*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
1379*3251364cSHisping Lin 				&TeecOperation,
1380*3251364cSHisping Lin #endif
1381095e2a82SHisping Lin 				&ErrorOrigin);
1382095e2a82SHisping Lin 
1383095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1384095e2a82SHisping Lin 
1385095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1386095e2a82SHisping Lin 	SharedMem0.flags = 0;
1387095e2a82SHisping Lin 
1388095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1389095e2a82SHisping Lin 
1390095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1391095e2a82SHisping Lin 
1392095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1393095e2a82SHisping Lin 
1394095e2a82SHisping Lin 	SharedMem1.size = 1;
1395095e2a82SHisping Lin 	SharedMem1.flags = 0;
1396095e2a82SHisping Lin 
1397095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1398095e2a82SHisping Lin 
1399095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1400095e2a82SHisping Lin 
1401095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1402095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1403095e2a82SHisping Lin 
1404095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1405095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1406095e2a82SHisping Lin 
1407095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1408095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1409095e2a82SHisping Lin 						TEEC_NONE,
1410095e2a82SHisping Lin 						TEEC_NONE);
1411095e2a82SHisping Lin 
1412095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1413095e2a82SHisping Lin 					141,
1414095e2a82SHisping Lin 					&TeecOperation,
1415095e2a82SHisping Lin 					&ErrorOrigin);
1416095e2a82SHisping Lin 
1417095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1418095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1419095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1420095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1421095e2a82SHisping Lin 	debug("testmm end\n");
1422095e2a82SHisping Lin 
1423095e2a82SHisping Lin 	return TeecResult;
1424095e2a82SHisping Lin }
14254aa61755SAndy Ye 
14264aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
14274aa61755SAndy Ye {
14284aa61755SAndy Ye 	TEEC_Result TeecResult;
14294aa61755SAndy Ye 	TEEC_Context TeecContext;
14304aa61755SAndy Ye 	TEEC_Session TeecSession;
14314aa61755SAndy Ye 	uint32_t ErrorOrigin;
14324aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
14334aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
14344aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
14354aa61755SAndy Ye 				}
14364aa61755SAndy Ye 			     };
14374aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
14384aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
1439*3251364cSHisping Lin 	struct blk_desc *dev_desc;
1440*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
14414aa61755SAndy Ye 
14424aa61755SAndy Ye 	OpteeClientApiLibInitialize();
14434aa61755SAndy Ye 
14444aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
14454aa61755SAndy Ye 
1446*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1447*3251364cSHisping Lin 						TEEC_NONE,
1448*3251364cSHisping Lin 						TEEC_NONE,
1449*3251364cSHisping Lin 						TEEC_NONE);
1450*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1451*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1452*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1453*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1454*3251364cSHisping Lin #endif
1455*3251364cSHisping Lin 
14564aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
14574aa61755SAndy Ye 				      &TeecSession,
14584aa61755SAndy Ye 				      TeecUuid,
14594aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
14604aa61755SAndy Ye 				      NULL,
1461*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
14624aa61755SAndy Ye 					NULL,
1463*3251364cSHisping Lin #endif
1464*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
1465*3251364cSHisping Lin 					&TeecOperation,
1466*3251364cSHisping Lin #endif
14674aa61755SAndy Ye 				      &ErrorOrigin);
14684aa61755SAndy Ye 
14694aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
14704aa61755SAndy Ye 
14714aa61755SAndy Ye 	SharedMem0.size = *dh_size;
14724aa61755SAndy Ye 	SharedMem0.flags = 0;
14734aa61755SAndy Ye 
14744aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
14754aa61755SAndy Ye 
14764aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
14774aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
14784aa61755SAndy Ye 
14794aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
14804aa61755SAndy Ye 						    TEEC_NONE,
14814aa61755SAndy Ye 						    TEEC_NONE,
14824aa61755SAndy Ye 						    TEEC_NONE);
14834aa61755SAndy Ye 
14844aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14854aa61755SAndy Ye 					143,
14864aa61755SAndy Ye 					&TeecOperation,
14874aa61755SAndy Ye 					&ErrorOrigin);
14884aa61755SAndy Ye 
14894aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
14904aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
14914aa61755SAndy Ye 
14924aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
14934aa61755SAndy Ye 
14944aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
14954aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
14964aa61755SAndy Ye 
14974aa61755SAndy Ye 	return TeecResult;
14984aa61755SAndy Ye }
14994aa61755SAndy Ye 
15004aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
15014aa61755SAndy Ye {
15024aa61755SAndy Ye 	TEEC_Result TeecResult;
15034aa61755SAndy Ye 	TEEC_Context TeecContext;
15044aa61755SAndy Ye 	TEEC_Session TeecSession;
15054aa61755SAndy Ye 	uint32_t ErrorOrigin;
15064aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15074aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15084aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15094aa61755SAndy Ye 				}
15104aa61755SAndy Ye 			     };
15114aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15124aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
1513*3251364cSHisping Lin 	struct blk_desc *dev_desc;
1514*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15154aa61755SAndy Ye 
15164aa61755SAndy Ye 	OpteeClientApiLibInitialize();
15174aa61755SAndy Ye 
15184aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
15194aa61755SAndy Ye 
1520*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1521*3251364cSHisping Lin 						TEEC_NONE,
1522*3251364cSHisping Lin 						TEEC_NONE,
1523*3251364cSHisping Lin 						TEEC_NONE);
1524*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1525*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1526*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1527*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1528*3251364cSHisping Lin #endif
1529*3251364cSHisping Lin 
15304aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15314aa61755SAndy Ye 				      &TeecSession,
15324aa61755SAndy Ye 				      TeecUuid,
15334aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15344aa61755SAndy Ye 				      NULL,
1535*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
15364aa61755SAndy Ye 					NULL,
1537*3251364cSHisping Lin #endif
1538*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
1539*3251364cSHisping Lin 					&TeecOperation,
1540*3251364cSHisping Lin #endif
15414aa61755SAndy Ye 				      &ErrorOrigin);
15424aa61755SAndy Ye 
15434aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
15444aa61755SAndy Ye 
15454aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
15464aa61755SAndy Ye 	SharedMem0.flags = 0;
15474aa61755SAndy Ye 
15484aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
15494aa61755SAndy Ye 
15504aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
15514aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
15524aa61755SAndy Ye 
15534aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
15544aa61755SAndy Ye 						    TEEC_NONE,
15554aa61755SAndy Ye 						    TEEC_NONE,
15564aa61755SAndy Ye 						    TEEC_NONE);
15574aa61755SAndy Ye 
15584aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
15594aa61755SAndy Ye 					144,
15604aa61755SAndy Ye 					&TeecOperation,
15614aa61755SAndy Ye 					&ErrorOrigin);
15624aa61755SAndy Ye 
15634aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
15644aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
15654aa61755SAndy Ye 
15664aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
15674aa61755SAndy Ye 
15684aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
15694aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
15704aa61755SAndy Ye 
15714aa61755SAndy Ye 	return TeecResult;
15724aa61755SAndy Ye }
15734aa61755SAndy Ye 
15744aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
15754aa61755SAndy Ye 			      uint32_t *operation_size,
15764aa61755SAndy Ye 			      uint8_t *out,
15774aa61755SAndy Ye 			      uint32_t *out_len)
15784aa61755SAndy Ye {
15794aa61755SAndy Ye 	TEEC_Result TeecResult;
15804aa61755SAndy Ye 	TEEC_Context TeecContext;
15814aa61755SAndy Ye 	TEEC_Session TeecSession;
15824aa61755SAndy Ye 	uint32_t ErrorOrigin;
15834aa61755SAndy Ye 
15844aa61755SAndy Ye 	OpteeClientApiLibInitialize();
15854aa61755SAndy Ye 
15864aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15874aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15884aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15894aa61755SAndy Ye 				}
15904aa61755SAndy Ye 			     };
15914aa61755SAndy Ye 
15924aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15934aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
1594*3251364cSHisping Lin 	struct blk_desc *dev_desc;
1595*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15964aa61755SAndy Ye 
15974aa61755SAndy Ye 	OpteeClientApiLibInitialize();
15984aa61755SAndy Ye 
15994aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16004aa61755SAndy Ye 
1601*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1602*3251364cSHisping Lin 						TEEC_NONE,
1603*3251364cSHisping Lin 						TEEC_NONE,
1604*3251364cSHisping Lin 						TEEC_NONE);
1605*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1606*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1607*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1608*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1609*3251364cSHisping Lin #endif
1610*3251364cSHisping Lin 
16114aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16124aa61755SAndy Ye 				      &TeecSession,
16134aa61755SAndy Ye 				      TeecUuid,
16144aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16154aa61755SAndy Ye 				      NULL,
1616*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
16174aa61755SAndy Ye 					NULL,
1618*3251364cSHisping Lin #endif
1619*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
1620*3251364cSHisping Lin 					&TeecOperation,
1621*3251364cSHisping Lin #endif
16224aa61755SAndy Ye 				      &ErrorOrigin);
16234aa61755SAndy Ye 
16244aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16254aa61755SAndy Ye 
16264aa61755SAndy Ye 	SharedMem0.size = *operation_size;
16274aa61755SAndy Ye 	SharedMem0.flags = 0;
16284aa61755SAndy Ye 
16294aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
16304aa61755SAndy Ye 
16314aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
16324aa61755SAndy Ye 
16334aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
16344aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
16354aa61755SAndy Ye 
16364aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
16374aa61755SAndy Ye 
16384aa61755SAndy Ye 	SharedMem1.size = *out_len;
16394aa61755SAndy Ye 	SharedMem1.flags = 0;
16404aa61755SAndy Ye 
16414aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
16424aa61755SAndy Ye 
16434aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
16444aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
16454aa61755SAndy Ye 
16464aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
16474aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
16484aa61755SAndy Ye 						    TEEC_NONE,
16494aa61755SAndy Ye 						    TEEC_NONE);
16504aa61755SAndy Ye 
16514aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16524aa61755SAndy Ye 					145,
16534aa61755SAndy Ye 					&TeecOperation,
16544aa61755SAndy Ye 					&ErrorOrigin);
16554aa61755SAndy Ye 
16564aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
16574aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
16584aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
16594aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
16604aa61755SAndy Ye 
16614aa61755SAndy Ye 	return TeecResult;
16624aa61755SAndy Ye }
16634aa61755SAndy Ye 
16644aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
16654aa61755SAndy Ye {
16664aa61755SAndy Ye 	TEEC_Result TeecResult;
16674aa61755SAndy Ye 	TEEC_Context TeecContext;
16684aa61755SAndy Ye 	TEEC_Session TeecSession;
16694aa61755SAndy Ye 	uint32_t ErrorOrigin;
16704aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16714aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16724aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16734aa61755SAndy Ye 				}
16744aa61755SAndy Ye 			     };
16754aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16764aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
1677*3251364cSHisping Lin 	struct blk_desc *dev_desc;
1678*3251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16794aa61755SAndy Ye 
16804aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16814aa61755SAndy Ye 
1682*3251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1683*3251364cSHisping Lin 						TEEC_NONE,
1684*3251364cSHisping Lin 						TEEC_NONE,
1685*3251364cSHisping Lin 						TEEC_NONE);
1686*3251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1687*3251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1688*3251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1689*3251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1690*3251364cSHisping Lin #endif
1691*3251364cSHisping Lin 
16924aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16934aa61755SAndy Ye 					&TeecSession,
16944aa61755SAndy Ye 					TeecUuid,
16954aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
16964aa61755SAndy Ye 					NULL,
1697*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
16984aa61755SAndy Ye 					NULL,
1699*3251364cSHisping Lin #endif
1700*3251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
1701*3251364cSHisping Lin 					&TeecOperation,
1702*3251364cSHisping Lin #endif
17034aa61755SAndy Ye 					&ErrorOrigin);
17044aa61755SAndy Ye 
17054aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17064aa61755SAndy Ye 
17074aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
17084aa61755SAndy Ye 	SharedMem0.flags = 0;
17094aa61755SAndy Ye 
17104aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17114aa61755SAndy Ye 
17124aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
17134aa61755SAndy Ye 
17144aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17154aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17164aa61755SAndy Ye 
17174aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17184aa61755SAndy Ye 						    TEEC_NONE,
17194aa61755SAndy Ye 						    TEEC_NONE,
17204aa61755SAndy Ye 						    TEEC_NONE);
17214aa61755SAndy Ye 
17224aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17234aa61755SAndy Ye 					146,
17244aa61755SAndy Ye 					&TeecOperation,
17254aa61755SAndy Ye 					&ErrorOrigin);
17264aa61755SAndy Ye 
17274aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17284aa61755SAndy Ye 
17294aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
17304aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
17314aa61755SAndy Ye 
17324aa61755SAndy Ye 	return TeecResult;
17334aa61755SAndy Ye }
1734