xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision f303baf0d8d327fa53781870689349fcd21098b8)
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>
1178ef5fbdSqiujian #include <optee_include/tee_api_defines.h>
123251364cSHisping Lin #include <boot_rkimg.h>
13ae8ec5e1SHisping Lin 
14ae8ec5e1SHisping Lin void test_optee(void)
15ae8ec5e1SHisping Lin {
16ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
17ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
18ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
19ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
20ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
21ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
22ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
23ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
243251364cSHisping Lin 	struct blk_desc *dev_desc;
253251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
26ae8ec5e1SHisping Lin 
27ae8ec5e1SHisping Lin 	debug("testmm start\n");
28ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
29ae8ec5e1SHisping Lin 
30ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
31ae8ec5e1SHisping Lin 
323251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
333251364cSHisping Lin 						TEEC_NONE,
343251364cSHisping Lin 						TEEC_NONE,
353251364cSHisping Lin 						TEEC_NONE);
363251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
373251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
383251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
393251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
403251364cSHisping Lin #endif
413251364cSHisping Lin 
42ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
43ae8ec5e1SHisping Lin 				&TeecSession,
44ae8ec5e1SHisping Lin 				TeecUuid,
45ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
46ae8ec5e1SHisping Lin 				NULL,
473251364cSHisping Lin 				&TeecOperation,
48ae8ec5e1SHisping Lin 				&ErrorOrigin);
49ae8ec5e1SHisping Lin 
50ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
51ae8ec5e1SHisping Lin 
52ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
53ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
54ae8ec5e1SHisping Lin 
55ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
56ae8ec5e1SHisping Lin 
57ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
58ae8ec5e1SHisping Lin 
59ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
60ae8ec5e1SHisping Lin 
61ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
62ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
63ae8ec5e1SHisping Lin 
64ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
65ae8ec5e1SHisping Lin 
66ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
67ae8ec5e1SHisping Lin 
68ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
69ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
70ae8ec5e1SHisping Lin 
71ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
72ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
73ae8ec5e1SHisping Lin 
74ae8ec5e1SHisping Lin 
75ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
76ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
77ae8ec5e1SHisping Lin 						TEEC_NONE,
78ae8ec5e1SHisping Lin 						TEEC_NONE);
79ae8ec5e1SHisping Lin 
80ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
81ae8ec5e1SHisping Lin 					1,
82ae8ec5e1SHisping Lin 					&TeecOperation,
83ae8ec5e1SHisping Lin 					&ErrorOrigin);
84ae8ec5e1SHisping Lin 
85ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
86ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
87ae8ec5e1SHisping Lin 
88ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
89ae8ec5e1SHisping Lin 
9046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
91ae8ec5e1SHisping Lin 
92ae8ec5e1SHisping Lin 	debug("testmm end\n");
93ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
94ae8ec5e1SHisping Lin }
95ae8ec5e1SHisping Lin 
96ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
97ae8ec5e1SHisping Lin {
98ae8ec5e1SHisping Lin 	if (in > 9)
99ae8ec5e1SHisping Lin 		return in + 55;
100ae8ec5e1SHisping Lin 	else
101ae8ec5e1SHisping Lin 		return in + 48;
102ae8ec5e1SHisping Lin }
103ae8ec5e1SHisping Lin 
104ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
105ae8ec5e1SHisping Lin {
106ae8ec5e1SHisping Lin 	uint32_t i = 0;
107ae8ec5e1SHisping Lin 
108ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
109ae8ec5e1SHisping Lin 		return 0;
110ae8ec5e1SHisping Lin 
111ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
112ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
113ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
114ae8ec5e1SHisping Lin 	}
115ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
116ae8ec5e1SHisping Lin 
117ae8ec5e1SHisping Lin 	return blen * 2;
118ae8ec5e1SHisping Lin }
119ae8ec5e1SHisping Lin 
120ae8ec5e1SHisping Lin 
121ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
122ae8ec5e1SHisping Lin {
123ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
124ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
125ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
126ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
127ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
128ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
129ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
130ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
131ae8ec5e1SHisping Lin 	uint8_t hs[9];
132ae8ec5e1SHisping Lin 
1333251364cSHisping Lin 	struct blk_desc *dev_desc;
1343251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1353251364cSHisping Lin 
136ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
137ae8ec5e1SHisping Lin 	debug("testmm start\n");
138ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
139ae8ec5e1SHisping Lin 
140ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
141ae8ec5e1SHisping Lin 
1423251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1433251364cSHisping Lin 						TEEC_NONE,
1443251364cSHisping Lin 						TEEC_NONE,
1453251364cSHisping Lin 						TEEC_NONE);
1463251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1473251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1483251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1493251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1503251364cSHisping Lin #endif
1513251364cSHisping Lin 
152ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
153ae8ec5e1SHisping Lin 				&TeecSession,
154ae8ec5e1SHisping Lin 				TeecUuid,
155ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
156ae8ec5e1SHisping Lin 				NULL,
1573251364cSHisping Lin 				&TeecOperation,
158*f303baf0SHisping Lin 
159ae8ec5e1SHisping Lin 				&ErrorOrigin);
160ae8ec5e1SHisping Lin 
161ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
162ae8ec5e1SHisping Lin 
163ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
164ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
165ae8ec5e1SHisping Lin 
166ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
167ae8ec5e1SHisping Lin 
168ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
169ae8ec5e1SHisping Lin 
170ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
171ae8ec5e1SHisping Lin 
172ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
173ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
174ae8ec5e1SHisping Lin 
175ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
176ae8ec5e1SHisping Lin 
177ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
178ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
179ae8ec5e1SHisping Lin 
180ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
181ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
182ae8ec5e1SHisping Lin 
183ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
184ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
185ae8ec5e1SHisping Lin 						TEEC_NONE,
186ae8ec5e1SHisping Lin 						TEEC_NONE);
187ae8ec5e1SHisping Lin 
188ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
189ae8ec5e1SHisping Lin 					0,
190ae8ec5e1SHisping Lin 					&TeecOperation,
191ae8ec5e1SHisping Lin 					&ErrorOrigin);
19246b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
193ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
194ae8ec5e1SHisping Lin 
195ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
196ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
197ae8ec5e1SHisping Lin 
198ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
199ae8ec5e1SHisping Lin 
20046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
201ae8ec5e1SHisping Lin 
202ae8ec5e1SHisping Lin 	debug("testmm end\n");
203ae8ec5e1SHisping Lin 	return TeecResult;
204ae8ec5e1SHisping Lin }
205ae8ec5e1SHisping Lin 
206ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
207ae8ec5e1SHisping Lin {
208ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
209ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
210ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
211ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
212ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
213ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
214ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
215ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
216ae8ec5e1SHisping Lin 	uint8_t hs[9];
2173251364cSHisping Lin 	struct blk_desc *dev_desc;
2183251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
2193251364cSHisping Lin 
220ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
221ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
222ae8ec5e1SHisping Lin 
223ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
224ae8ec5e1SHisping Lin 
2253251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2263251364cSHisping Lin 						TEEC_NONE,
2273251364cSHisping Lin 						TEEC_NONE,
2283251364cSHisping Lin 						TEEC_NONE);
2293251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2303251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
2313251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
2323251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
2333251364cSHisping Lin #endif
2343251364cSHisping Lin 
235ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
236ae8ec5e1SHisping Lin 				&TeecSession,
237ae8ec5e1SHisping Lin 				TeecUuid,
238ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
239ae8ec5e1SHisping Lin 				NULL,
2403251364cSHisping Lin 				&TeecOperation,
241ae8ec5e1SHisping Lin 				&ErrorOrigin);
242ae8ec5e1SHisping Lin 
243ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
244ae8ec5e1SHisping Lin 
245ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
246ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
247ae8ec5e1SHisping Lin 
248ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
249ae8ec5e1SHisping Lin 
250ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
251ae8ec5e1SHisping Lin 
252ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
253ae8ec5e1SHisping Lin 
254ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
255ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
256ae8ec5e1SHisping Lin 
257ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
258ae8ec5e1SHisping Lin 
259ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
260ae8ec5e1SHisping Lin 
261ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
262ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
263ae8ec5e1SHisping Lin 
264ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
265ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
266ae8ec5e1SHisping Lin 
267ae8ec5e1SHisping Lin 
268ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
269ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
270ae8ec5e1SHisping Lin 						TEEC_NONE,
271ae8ec5e1SHisping Lin 						TEEC_NONE);
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
274ae8ec5e1SHisping Lin 					1,
275ae8ec5e1SHisping Lin 					&TeecOperation,
276ae8ec5e1SHisping Lin 					&ErrorOrigin);
277ae8ec5e1SHisping Lin 
278ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
279ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
280ae8ec5e1SHisping Lin 
281ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
282ae8ec5e1SHisping Lin 
28346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
284ae8ec5e1SHisping Lin 
285ae8ec5e1SHisping Lin 	debug("testmm end\n");
286ae8ec5e1SHisping Lin 
287ae8ec5e1SHisping Lin 	return TeecResult;
288ae8ec5e1SHisping Lin }
289ae8ec5e1SHisping Lin 
290ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
291ae8ec5e1SHisping Lin {
292ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
293ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
294ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
295ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
29646b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
29746b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
298ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
299ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
3003251364cSHisping Lin 	struct blk_desc *dev_desc;
3013251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
302ae8ec5e1SHisping Lin 
303ae8ec5e1SHisping Lin 	debug("testmm start\n");
304ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
305ae8ec5e1SHisping Lin 
306ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
307ae8ec5e1SHisping Lin 
3083251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3093251364cSHisping Lin 						TEEC_NONE,
3103251364cSHisping Lin 						TEEC_NONE,
3113251364cSHisping Lin 						TEEC_NONE);
3123251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
3133251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
3143251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3153251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3163251364cSHisping Lin #endif
3173251364cSHisping Lin 
318ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
319ae8ec5e1SHisping Lin 				&TeecSession,
320ae8ec5e1SHisping Lin 				TeecUuid,
321ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
322ae8ec5e1SHisping Lin 				NULL,
3233251364cSHisping Lin 				&TeecOperation,
324ae8ec5e1SHisping Lin 				&ErrorOrigin);
325ae8ec5e1SHisping Lin 
326ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
327ae8ec5e1SHisping Lin 
328ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
329ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
330ae8ec5e1SHisping Lin 
331ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
332ae8ec5e1SHisping Lin 
333ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
334ae8ec5e1SHisping Lin 
335ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
336ae8ec5e1SHisping Lin 
337ae8ec5e1SHisping Lin 	SharedMem1.size = size;
338ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
339ae8ec5e1SHisping Lin 
340ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
341ae8ec5e1SHisping Lin 
342ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
343ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
344ae8ec5e1SHisping Lin 
345ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
346ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
347ae8ec5e1SHisping Lin 
348ae8ec5e1SHisping Lin 
349ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
350ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
351ae8ec5e1SHisping Lin 						TEEC_NONE,
352ae8ec5e1SHisping Lin 						TEEC_NONE);
353ae8ec5e1SHisping Lin 
354ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
35546b2a054SHisping Lin 					142,
356ae8ec5e1SHisping Lin 					&TeecOperation,
357ae8ec5e1SHisping Lin 					&ErrorOrigin);
35846b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
359ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
360ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
361ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
362ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
36346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
364ae8ec5e1SHisping Lin 	debug("testmm end\n");
365ae8ec5e1SHisping Lin 
366ae8ec5e1SHisping Lin 	return TeecResult;
367ae8ec5e1SHisping Lin }
368ae8ec5e1SHisping Lin 
369ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
370ae8ec5e1SHisping Lin {
371ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
372ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
373ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
374ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
37546b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
37646b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
377ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
378ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
3793251364cSHisping Lin 	struct blk_desc *dev_desc;
3803251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
381ae8ec5e1SHisping Lin 
382ae8ec5e1SHisping Lin 	debug("testmm start\n");
383ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
384ae8ec5e1SHisping Lin 
385ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
386ae8ec5e1SHisping Lin 
3873251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3883251364cSHisping Lin 						TEEC_NONE,
3893251364cSHisping Lin 						TEEC_NONE,
3903251364cSHisping Lin 						TEEC_NONE);
3913251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
3923251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
3933251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3943251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3953251364cSHisping Lin #endif
3963251364cSHisping Lin 
397ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
398ae8ec5e1SHisping Lin 				&TeecSession,
399ae8ec5e1SHisping Lin 				TeecUuid,
400ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
401ae8ec5e1SHisping Lin 				NULL,
4023251364cSHisping Lin 				&TeecOperation,
403ae8ec5e1SHisping Lin 				&ErrorOrigin);
404ae8ec5e1SHisping Lin 
405ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
406ae8ec5e1SHisping Lin 
407ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
408ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
409ae8ec5e1SHisping Lin 
410ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
411ae8ec5e1SHisping Lin 
412ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
413ae8ec5e1SHisping Lin 
414ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
415ae8ec5e1SHisping Lin 
416ae8ec5e1SHisping Lin 	SharedMem1.size = size;
417ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
418ae8ec5e1SHisping Lin 
419ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
420ae8ec5e1SHisping Lin 
421ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
422ae8ec5e1SHisping Lin 
423ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
424ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
425ae8ec5e1SHisping Lin 
426ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
427ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
428ae8ec5e1SHisping Lin 
429ae8ec5e1SHisping Lin 
430ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
431ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
432ae8ec5e1SHisping Lin 						TEEC_NONE,
433ae8ec5e1SHisping Lin 						TEEC_NONE);
434ae8ec5e1SHisping Lin 
435ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
43646b2a054SHisping Lin 					141,
437ae8ec5e1SHisping Lin 					&TeecOperation,
438ae8ec5e1SHisping Lin 					&ErrorOrigin);
439ae8ec5e1SHisping Lin 
440ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
441ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
442ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
44346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
444ae8ec5e1SHisping Lin 	debug("testmm end\n");
445ae8ec5e1SHisping Lin 
446ae8ec5e1SHisping Lin 	return TeecResult;
447ae8ec5e1SHisping Lin }
448ae8ec5e1SHisping Lin 
449ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
450ae8ec5e1SHisping Lin {
451ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
452ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
453ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
454ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
455ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
456ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
457ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
458ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
4593251364cSHisping Lin 	struct blk_desc *dev_desc;
4603251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
461ae8ec5e1SHisping Lin 
462ae8ec5e1SHisping Lin 	debug("testmm start\n");
463ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
464ae8ec5e1SHisping Lin 
465ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
466ae8ec5e1SHisping Lin 
4673251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4683251364cSHisping Lin 						TEEC_NONE,
4693251364cSHisping Lin 						TEEC_NONE,
4703251364cSHisping Lin 						TEEC_NONE);
4713251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
4723251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
4733251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4743251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4753251364cSHisping Lin #endif
476ae8ec5e1SHisping Lin 
477ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
478ae8ec5e1SHisping Lin 				&TeecSession,
479ae8ec5e1SHisping Lin 				TeecUuid,
480ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
481ae8ec5e1SHisping Lin 				NULL,
4823251364cSHisping Lin 				&TeecOperation,
483ae8ec5e1SHisping Lin 				&ErrorOrigin);
484ae8ec5e1SHisping Lin 
485ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
486ae8ec5e1SHisping Lin 
487ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
488ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
489ae8ec5e1SHisping Lin 
490ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
491ae8ec5e1SHisping Lin 
492ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
493ae8ec5e1SHisping Lin 
494ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
495ae8ec5e1SHisping Lin 
496ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
497ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
498ae8ec5e1SHisping Lin 
499ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
500ae8ec5e1SHisping Lin 
501ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
502ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
503ae8ec5e1SHisping Lin 
504ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
505ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
506ae8ec5e1SHisping Lin 
507ae8ec5e1SHisping Lin 
508ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
509ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
510ae8ec5e1SHisping Lin 						TEEC_NONE,
511ae8ec5e1SHisping Lin 						TEEC_NONE);
512ae8ec5e1SHisping Lin 
513ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
514ae8ec5e1SHisping Lin 					0,
515ae8ec5e1SHisping Lin 					&TeecOperation,
516ae8ec5e1SHisping Lin 					&ErrorOrigin);
51746b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
518ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
519ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
520ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
521ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
52246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
523ae8ec5e1SHisping Lin 	debug("testmm end\n");
524ae8ec5e1SHisping Lin 
525ae8ec5e1SHisping Lin 	return TeecResult;
526ae8ec5e1SHisping Lin }
527ae8ec5e1SHisping Lin 
528ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
529ae8ec5e1SHisping Lin {
530ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
531ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
532ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
533ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
534ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
535ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
536ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
537ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
5383251364cSHisping Lin 	struct blk_desc *dev_desc;
5393251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
540ae8ec5e1SHisping Lin 
541ae8ec5e1SHisping Lin 	debug("testmm start\n");
542ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
543ae8ec5e1SHisping Lin 
544ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
545ae8ec5e1SHisping Lin 
5463251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
5473251364cSHisping Lin 						TEEC_NONE,
5483251364cSHisping Lin 						TEEC_NONE,
5493251364cSHisping Lin 						TEEC_NONE);
5503251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
5513251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
5523251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
5533251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
5543251364cSHisping Lin #endif
5553251364cSHisping Lin 
556ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
557ae8ec5e1SHisping Lin 				&TeecSession,
558ae8ec5e1SHisping Lin 				TeecUuid,
559ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
560ae8ec5e1SHisping Lin 				NULL,
5613251364cSHisping Lin 				&TeecOperation,
562ae8ec5e1SHisping Lin 				&ErrorOrigin);
563ae8ec5e1SHisping Lin 
564ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
565ae8ec5e1SHisping Lin 
566ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
567ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
568ae8ec5e1SHisping Lin 
569ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
570ae8ec5e1SHisping Lin 
571ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
572ae8ec5e1SHisping Lin 
573ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
574ae8ec5e1SHisping Lin 
575ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
576ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
577ae8ec5e1SHisping Lin 
578ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
579ae8ec5e1SHisping Lin 
580ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
581ae8ec5e1SHisping Lin 
582ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
583ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
584ae8ec5e1SHisping Lin 
585ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
586ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
587ae8ec5e1SHisping Lin 
588ae8ec5e1SHisping Lin 
589ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
590ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
591ae8ec5e1SHisping Lin 						TEEC_NONE,
592ae8ec5e1SHisping Lin 						TEEC_NONE);
593ae8ec5e1SHisping Lin 
594ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
595ae8ec5e1SHisping Lin 					1,
596ae8ec5e1SHisping Lin 					&TeecOperation,
597ae8ec5e1SHisping Lin 					&ErrorOrigin);
598ae8ec5e1SHisping Lin 
599ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
600ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
601ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
60246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
603ae8ec5e1SHisping Lin 	debug("testmm end\n");
604ae8ec5e1SHisping Lin 
605ae8ec5e1SHisping Lin 	return TeecResult;
606ae8ec5e1SHisping Lin }
607ae8ec5e1SHisping Lin 
608ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
609ae8ec5e1SHisping Lin {
610ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
611ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
612ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
613ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
614ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
615ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
616ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
617ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
6183251364cSHisping Lin 	struct blk_desc *dev_desc;
6193251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
620ae8ec5e1SHisping Lin 
621ae8ec5e1SHisping Lin 	debug("testmm start\n");
622ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
623ae8ec5e1SHisping Lin 
624ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
625ae8ec5e1SHisping Lin 
6263251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6273251364cSHisping Lin 						TEEC_NONE,
6283251364cSHisping Lin 						TEEC_NONE,
6293251364cSHisping Lin 						TEEC_NONE);
6303251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
6313251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
6323251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6333251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6343251364cSHisping Lin #endif
635ae8ec5e1SHisping Lin 
636ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
637ae8ec5e1SHisping Lin 				&TeecSession,
638ae8ec5e1SHisping Lin 				TeecUuid,
639ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
640ae8ec5e1SHisping Lin 				NULL,
6413251364cSHisping Lin 				&TeecOperation,
642ae8ec5e1SHisping Lin 				&ErrorOrigin);
643ae8ec5e1SHisping Lin 
644ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
645ae8ec5e1SHisping Lin 
646ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
647ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
648ae8ec5e1SHisping Lin 
649ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
650ae8ec5e1SHisping Lin 
651ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
652ae8ec5e1SHisping Lin 
653ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
654ae8ec5e1SHisping Lin 
655ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
656ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
657ae8ec5e1SHisping Lin 
658ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
659ae8ec5e1SHisping Lin 
660ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
661ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
662ae8ec5e1SHisping Lin 
663ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
664ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
665ae8ec5e1SHisping Lin 
666ae8ec5e1SHisping Lin 
667ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
668ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
669ae8ec5e1SHisping Lin 						TEEC_NONE,
670ae8ec5e1SHisping Lin 						TEEC_NONE);
671ae8ec5e1SHisping Lin 
672ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
673ae8ec5e1SHisping Lin 					0,
674ae8ec5e1SHisping Lin 					&TeecOperation,
675ae8ec5e1SHisping Lin 					&ErrorOrigin);
67646b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
677ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
678ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
679ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
680ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
68146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
682ae8ec5e1SHisping Lin 	debug("testmm end\n");
683ae8ec5e1SHisping Lin 
684ae8ec5e1SHisping Lin 	return TeecResult;
685ae8ec5e1SHisping Lin }
686ae8ec5e1SHisping Lin 
687ae8ec5e1SHisping Lin 
688ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
689ae8ec5e1SHisping Lin {
690ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
691ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
692ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
693ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
694ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
695ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
696ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
697ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
6983251364cSHisping Lin 	struct blk_desc *dev_desc;
6993251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
700ae8ec5e1SHisping Lin 
701ae8ec5e1SHisping Lin 	debug("testmm start\n");
702ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
703ae8ec5e1SHisping Lin 
704ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
705ae8ec5e1SHisping Lin 
7063251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7073251364cSHisping Lin 						TEEC_NONE,
7083251364cSHisping Lin 						TEEC_NONE,
7093251364cSHisping Lin 						TEEC_NONE);
7103251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
7113251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
7123251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7133251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7143251364cSHisping Lin #endif
7153251364cSHisping Lin 
716ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
717ae8ec5e1SHisping Lin 				&TeecSession,
718ae8ec5e1SHisping Lin 				TeecUuid,
719ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
720ae8ec5e1SHisping Lin 				NULL,
7213251364cSHisping Lin 				&TeecOperation,
722ae8ec5e1SHisping Lin 				&ErrorOrigin);
723ae8ec5e1SHisping Lin 
724ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
725ae8ec5e1SHisping Lin 
726ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
727ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
728ae8ec5e1SHisping Lin 
729ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
730ae8ec5e1SHisping Lin 
731ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
732ae8ec5e1SHisping Lin 
733ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
734ae8ec5e1SHisping Lin 
735ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
736ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
737ae8ec5e1SHisping Lin 
738ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
739ae8ec5e1SHisping Lin 
740ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
741ae8ec5e1SHisping Lin 
742ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
743ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
744ae8ec5e1SHisping Lin 
745ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
746ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
747ae8ec5e1SHisping Lin 
748ae8ec5e1SHisping Lin 
749ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
750ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
751ae8ec5e1SHisping Lin 						TEEC_NONE,
752ae8ec5e1SHisping Lin 						TEEC_NONE);
753ae8ec5e1SHisping Lin 
754ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
755ae8ec5e1SHisping Lin 					1,
756ae8ec5e1SHisping Lin 					&TeecOperation,
757ae8ec5e1SHisping Lin 					&ErrorOrigin);
758ae8ec5e1SHisping Lin 
759ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
760ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
761ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
76246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
763ae8ec5e1SHisping Lin 	debug("testmm end\n");
764ae8ec5e1SHisping Lin 
765ae8ec5e1SHisping Lin 	return TeecResult;
766ae8ec5e1SHisping Lin }
767ae8ec5e1SHisping Lin 
76878ef5fbdSqiujian TEEC_Result read_from_keymaster(uint8_t *filename,
76978ef5fbdSqiujian 		uint32_t filename_size,
77078ef5fbdSqiujian 		uint8_t *data,
77178ef5fbdSqiujian 		uint32_t size)
77278ef5fbdSqiujian {
77378ef5fbdSqiujian 	TEEC_Result TeecResult;
77478ef5fbdSqiujian 	TEEC_Context TeecContext;
77578ef5fbdSqiujian 	TEEC_Session TeecSession;
77678ef5fbdSqiujian 	uint32_t ErrorOrigin;
77778ef5fbdSqiujian 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
77878ef5fbdSqiujian 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
77978ef5fbdSqiujian 	TEEC_UUID *TeecUuid = &tempuuid;
78078ef5fbdSqiujian 	TEEC_Operation TeecOperation = {0};
78178ef5fbdSqiujian 	struct blk_desc *dev_desc;
78278ef5fbdSqiujian 	dev_desc = rockchip_get_bootdev();
78378ef5fbdSqiujian 
78478ef5fbdSqiujian 	debug("read_from_keymaster start\n");
78578ef5fbdSqiujian 	OpteeClientApiLibInitialize();
78678ef5fbdSqiujian 
78778ef5fbdSqiujian 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
78878ef5fbdSqiujian 
78978ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
79078ef5fbdSqiujian 						TEEC_NONE,
79178ef5fbdSqiujian 						TEEC_NONE,
79278ef5fbdSqiujian 						TEEC_NONE);
79378ef5fbdSqiujian 	/*0 nand or emmc "security" partition , 1 rpmb*/
79478ef5fbdSqiujian 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
79578ef5fbdSqiujian #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
79678ef5fbdSqiujian 	TeecOperation.params[0].value.a = 0;
79778ef5fbdSqiujian #endif
79878ef5fbdSqiujian 
79978ef5fbdSqiujian 	TeecResult = TEEC_OpenSession(&TeecContext,
80078ef5fbdSqiujian 				&TeecSession,
80178ef5fbdSqiujian 				TeecUuid,
80278ef5fbdSqiujian 				TEEC_LOGIN_PUBLIC,
80378ef5fbdSqiujian 				NULL,
80478ef5fbdSqiujian 				&TeecOperation,
80578ef5fbdSqiujian 				&ErrorOrigin);
80678ef5fbdSqiujian 
80778ef5fbdSqiujian 	TEEC_SharedMemory SharedMem0 = {0};
80878ef5fbdSqiujian 
80978ef5fbdSqiujian 	SharedMem0.size = filename_size;
81078ef5fbdSqiujian 	SharedMem0.flags = 0;
81178ef5fbdSqiujian 
81278ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
81378ef5fbdSqiujian 
81478ef5fbdSqiujian 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
81578ef5fbdSqiujian 
81678ef5fbdSqiujian 	TEEC_SharedMemory SharedMem1 = {0};
81778ef5fbdSqiujian 
81878ef5fbdSqiujian 	SharedMem1.size = size;
81978ef5fbdSqiujian 	SharedMem1.flags = 0;
82078ef5fbdSqiujian 
82178ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
82278ef5fbdSqiujian 
82378ef5fbdSqiujian 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
82478ef5fbdSqiujian 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
82578ef5fbdSqiujian 
82678ef5fbdSqiujian 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
82778ef5fbdSqiujian 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
82878ef5fbdSqiujian 
82978ef5fbdSqiujian 
83078ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
83178ef5fbdSqiujian 						TEEC_MEMREF_TEMP_INOUT,
83278ef5fbdSqiujian 						TEEC_NONE,
83378ef5fbdSqiujian 						TEEC_NONE);
83478ef5fbdSqiujian 
83578ef5fbdSqiujian 	TeecResult = TEEC_InvokeCommand(&TeecSession,
83678ef5fbdSqiujian 					142,
83778ef5fbdSqiujian 					&TeecOperation,
83878ef5fbdSqiujian 					&ErrorOrigin);
83978ef5fbdSqiujian 	if (TeecResult == TEEC_SUCCESS)
84078ef5fbdSqiujian 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
84178ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem0);
84278ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem1);
84378ef5fbdSqiujian 	TEEC_CloseSession(&TeecSession);
84478ef5fbdSqiujian 	TEEC_FinalizeContext(&TeecContext);
84578ef5fbdSqiujian 	debug("read_from_keymaster end\n");
84678ef5fbdSqiujian 
84778ef5fbdSqiujian 	return TeecResult;
84878ef5fbdSqiujian }
84978ef5fbdSqiujian 
850ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
851ae8ec5e1SHisping Lin 		uint32_t filename_size,
852ae8ec5e1SHisping Lin 		uint8_t *data,
853ae8ec5e1SHisping Lin 		uint32_t data_size)
854ae8ec5e1SHisping Lin {
855ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
856ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
857ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
858ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
859ae8ec5e1SHisping Lin 
860ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
861ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
862ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
863ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
8643251364cSHisping Lin 	struct blk_desc *dev_desc;
8653251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
866ae8ec5e1SHisping Lin 
867ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
868ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
869ae8ec5e1SHisping Lin 
870ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
871ae8ec5e1SHisping Lin 
8723251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8733251364cSHisping Lin 						TEEC_NONE,
8743251364cSHisping Lin 						TEEC_NONE,
8753251364cSHisping Lin 						TEEC_NONE);
8763251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
8773251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
8783251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8793251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8803251364cSHisping Lin #endif
8813251364cSHisping Lin 
882ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
883ae8ec5e1SHisping Lin 				&TeecSession,
884ae8ec5e1SHisping Lin 				TeecUuid,
885ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
886ae8ec5e1SHisping Lin 				NULL,
8873251364cSHisping Lin 				&TeecOperation,
888ae8ec5e1SHisping Lin 				&ErrorOrigin);
889ae8ec5e1SHisping Lin 
890ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
891ae8ec5e1SHisping Lin 
892ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
893ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
894ae8ec5e1SHisping Lin 
895ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
896ae8ec5e1SHisping Lin 
897ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
898ae8ec5e1SHisping Lin 
899ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
900ae8ec5e1SHisping Lin 
901ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
902ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
903ae8ec5e1SHisping Lin 
904ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
905ae8ec5e1SHisping Lin 
906ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
907ae8ec5e1SHisping Lin 
908ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
909ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
910ae8ec5e1SHisping Lin 
911ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
912ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
913ae8ec5e1SHisping Lin 
914ae8ec5e1SHisping Lin 
915ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
916ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
917ae8ec5e1SHisping Lin 						TEEC_NONE,
918ae8ec5e1SHisping Lin 						TEEC_NONE);
919ae8ec5e1SHisping Lin 
920ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9211f25ada2SHisping Lin 					141,
922ae8ec5e1SHisping Lin 					&TeecOperation,
923ae8ec5e1SHisping Lin 					&ErrorOrigin);
924ae8ec5e1SHisping Lin 
925ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
926ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
927ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
92846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
92978ef5fbdSqiujian 	debug("write_to_keymaster end\n");
930ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
931ae8ec5e1SHisping Lin 
932ae8ec5e1SHisping Lin 	return TeecResult;
933ae8ec5e1SHisping Lin }
9346ef445a4SHisping Lin 
9356ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
9366ef445a4SHisping Lin {
9376ef445a4SHisping Lin 	TEEC_Result TeecResult;
9386ef445a4SHisping Lin 	TEEC_Context TeecContext;
9396ef445a4SHisping Lin 	TEEC_Session TeecSession;
9406ef445a4SHisping Lin 	uint32_t ErrorOrigin;
9416ef445a4SHisping Lin 
9426ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
9436ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9446ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9456ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
9466ef445a4SHisping Lin 
9476ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
9486ef445a4SHisping Lin 
9496ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9506ef445a4SHisping Lin 
9516ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9526ef445a4SHisping Lin 				&TeecSession,
9536ef445a4SHisping Lin 				TeecUuid,
9546ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
9556ef445a4SHisping Lin 				NULL,
9566ef445a4SHisping Lin 				NULL,
9576ef445a4SHisping Lin 				&ErrorOrigin);
9586ef445a4SHisping Lin 
9596ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
9606ef445a4SHisping Lin 
9616ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
9626ef445a4SHisping Lin 	SharedMem0.flags = 0;
9636ef445a4SHisping Lin 
9646ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
9656ef445a4SHisping Lin 
9666ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9676ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9686ef445a4SHisping Lin 
9696ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
9706ef445a4SHisping Lin 						TEEC_NONE,
9716ef445a4SHisping Lin 						TEEC_NONE,
9726ef445a4SHisping Lin 						TEEC_NONE);
9736ef445a4SHisping Lin 
9746ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9756ef445a4SHisping Lin 					0,
9766ef445a4SHisping Lin 					&TeecOperation,
9776ef445a4SHisping Lin 					&ErrorOrigin);
9786ef445a4SHisping Lin 
9796ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
9806ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
9816ef445a4SHisping Lin 
9826ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
9836ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
9846ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9856ef445a4SHisping Lin 
9866ef445a4SHisping Lin 	return TeecResult;
9876ef445a4SHisping Lin }
9886ef445a4SHisping Lin 
9896ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
9906ef445a4SHisping Lin {
9916ef445a4SHisping Lin 	TEEC_Result TeecResult;
9926ef445a4SHisping Lin 	TEEC_Context TeecContext;
9936ef445a4SHisping Lin 	TEEC_Session TeecSession;
9946ef445a4SHisping Lin 	uint32_t ErrorOrigin;
9956ef445a4SHisping Lin 
9966ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
9976ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9986ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9996ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
10006ef445a4SHisping Lin 
10016ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
10026ef445a4SHisping Lin 
10036ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
10046ef445a4SHisping Lin 
10056ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
10066ef445a4SHisping Lin 				&TeecSession,
10076ef445a4SHisping Lin 				TeecUuid,
10086ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
10096ef445a4SHisping Lin 				NULL,
10106ef445a4SHisping Lin 				NULL,
10116ef445a4SHisping Lin 				&ErrorOrigin);
10126ef445a4SHisping Lin 
10136ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
10146ef445a4SHisping Lin 
10156ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
10166ef445a4SHisping Lin 	SharedMem0.flags = 0;
10176ef445a4SHisping Lin 
10186ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
10196ef445a4SHisping Lin 
10206ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
10216ef445a4SHisping Lin 
10226ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10236ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10246ef445a4SHisping Lin 
10256ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
10266ef445a4SHisping Lin 						TEEC_NONE,
10276ef445a4SHisping Lin 						TEEC_NONE,
10286ef445a4SHisping Lin 						TEEC_NONE);
10296ef445a4SHisping Lin 
10306ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10316ef445a4SHisping Lin 					1,
10326ef445a4SHisping Lin 					&TeecOperation,
10336ef445a4SHisping Lin 					&ErrorOrigin);
10346ef445a4SHisping Lin 
10356ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
10366ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
10376ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10386ef445a4SHisping Lin 
10396ef445a4SHisping Lin 	return TeecResult;
10406ef445a4SHisping Lin }
104116539616SHisping Lin 
104216539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
104316539616SHisping Lin {
104416539616SHisping Lin 	TEEC_Result TeecResult;
104516539616SHisping Lin 	TEEC_Context TeecContext;
104616539616SHisping Lin 	TEEC_Session TeecSession;
104716539616SHisping Lin 	uint32_t ErrorOrigin;
104816539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
104916539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
105016539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
105116539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
105216539616SHisping Lin 
105316539616SHisping Lin 	OpteeClientApiLibInitialize();
105416539616SHisping Lin 
105516539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
105616539616SHisping Lin 
105716539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
105816539616SHisping Lin 				&TeecSession,
105916539616SHisping Lin 				TeecUuid,
106016539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
106116539616SHisping Lin 				NULL,
106216539616SHisping Lin 				NULL,
106316539616SHisping Lin 				&ErrorOrigin);
106416539616SHisping Lin 
106516539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
106616539616SHisping Lin 						TEEC_NONE,
106716539616SHisping Lin 						TEEC_NONE,
106816539616SHisping Lin 						TEEC_NONE);
106916539616SHisping Lin 
107016539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
107116539616SHisping Lin 					2,
107216539616SHisping Lin 					&TeecOperation,
107316539616SHisping Lin 					&ErrorOrigin);
107416539616SHisping Lin 
107516539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
107616539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
107716539616SHisping Lin 
107816539616SHisping Lin 	return TeecResult;
107916539616SHisping Lin }
108016539616SHisping Lin 
108116539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
108216539616SHisping Lin {
108316539616SHisping Lin 	TEEC_Result TeecResult;
108416539616SHisping Lin 	TEEC_Context TeecContext;
108516539616SHisping Lin 	TEEC_Session TeecSession;
108616539616SHisping Lin 	uint32_t ErrorOrigin;
108716539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
108816539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
108916539616SHisping Lin 
109016539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
109116539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
109216539616SHisping Lin 
109316539616SHisping Lin 	OpteeClientApiLibInitialize();
109416539616SHisping Lin 
109516539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
109616539616SHisping Lin 
109716539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
109816539616SHisping Lin 				&TeecSession,
109916539616SHisping Lin 				TeecUuid,
110016539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
110116539616SHisping Lin 				NULL,
110216539616SHisping Lin 				NULL,
110316539616SHisping Lin 				&ErrorOrigin);
110416539616SHisping Lin 
110516539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
110616539616SHisping Lin 						TEEC_NONE,
110716539616SHisping Lin 						TEEC_NONE,
110816539616SHisping Lin 						TEEC_NONE);
110916539616SHisping Lin 
111016539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
111116539616SHisping Lin 					2,
111216539616SHisping Lin 					&TeecOperation,
111316539616SHisping Lin 					&ErrorOrigin);
111416539616SHisping Lin 
111516539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
111616539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
111716539616SHisping Lin 
111816539616SHisping Lin 	return TeecResult;
111916539616SHisping Lin }
112016539616SHisping Lin 
112116539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
112216539616SHisping Lin {
112316539616SHisping Lin 	TEEC_Result res;
112416539616SHisping Lin 	res = notify_optee_rpmb_ta();
112516539616SHisping Lin 	res |= notify_optee_efuse_ta();
112616539616SHisping Lin 	return res;
112716539616SHisping Lin }
11282cd27853SHisping Lin 
11292cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
11302cd27853SHisping Lin {
11312cd27853SHisping Lin 	TEEC_Result TeecResult;
11322cd27853SHisping Lin 	TEEC_Context TeecContext;
11332cd27853SHisping Lin 	TEEC_Session TeecSession;
11342cd27853SHisping Lin 	uint32_t ErrorOrigin;
11352cd27853SHisping Lin 
11362cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11372cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11382cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11392cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
11402cd27853SHisping Lin 
11412cd27853SHisping Lin 	OpteeClientApiLibInitialize();
11422cd27853SHisping Lin 
11432cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
11442cd27853SHisping Lin 
11452cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11462cd27853SHisping Lin 				&TeecSession,
11472cd27853SHisping Lin 				TeecUuid,
11482cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
11492cd27853SHisping Lin 				NULL,
11502cd27853SHisping Lin 				NULL,
11512cd27853SHisping Lin 				&ErrorOrigin);
11522cd27853SHisping Lin 
11532cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11542cd27853SHisping Lin 
11552cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
11562cd27853SHisping Lin 	SharedMem0.flags = 0;
11572cd27853SHisping Lin 
11582cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
11592cd27853SHisping Lin 
11602cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11612cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11622cd27853SHisping Lin 
11632cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
11642cd27853SHisping Lin 						TEEC_NONE,
11652cd27853SHisping Lin 						TEEC_NONE,
11662cd27853SHisping Lin 						TEEC_NONE);
11672cd27853SHisping Lin 
11682cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11692cd27853SHisping Lin 					3,
11702cd27853SHisping Lin 					&TeecOperation,
11712cd27853SHisping Lin 					&ErrorOrigin);
11722cd27853SHisping Lin 
11732cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
11742cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
11752cd27853SHisping Lin 
11762cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
11772cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
11782cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11792cd27853SHisping Lin 
11802cd27853SHisping Lin 	return TeecResult;
11812cd27853SHisping Lin }
11822cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
11832cd27853SHisping Lin {
11842cd27853SHisping Lin 	TEEC_Result TeecResult;
11852cd27853SHisping Lin 	TEEC_Context TeecContext;
11862cd27853SHisping Lin 	TEEC_Session TeecSession;
11872cd27853SHisping Lin 	uint32_t ErrorOrigin;
11882cd27853SHisping Lin 
11892cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11902cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11912cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11922cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
11932cd27853SHisping Lin 
11942cd27853SHisping Lin 	OpteeClientApiLibInitialize();
11952cd27853SHisping Lin 
11962cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
11972cd27853SHisping Lin 
11982cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11992cd27853SHisping Lin 				&TeecSession,
12002cd27853SHisping Lin 				TeecUuid,
12012cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
12022cd27853SHisping Lin 				NULL,
12032cd27853SHisping Lin 				NULL,
12042cd27853SHisping Lin 				&ErrorOrigin);
12052cd27853SHisping Lin 
12062cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
12072cd27853SHisping Lin 
12082cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
12092cd27853SHisping Lin 	SharedMem0.flags = 0;
12102cd27853SHisping Lin 
12112cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
12122cd27853SHisping Lin 
12132cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
12142cd27853SHisping Lin 
12152cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12162cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12172cd27853SHisping Lin 
12182cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
12192cd27853SHisping Lin 						TEEC_NONE,
12202cd27853SHisping Lin 						TEEC_NONE,
12212cd27853SHisping Lin 						TEEC_NONE);
12222cd27853SHisping Lin 
12232cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12242cd27853SHisping Lin 					4,
12252cd27853SHisping Lin 					&TeecOperation,
12262cd27853SHisping Lin 					&ErrorOrigin);
12272cd27853SHisping Lin 
12282cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12292cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
12302cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12312cd27853SHisping Lin 
12322cd27853SHisping Lin 	return TeecResult;
12332cd27853SHisping Lin }
1234095e2a82SHisping Lin 
1235468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1236468df3b2SHisping Lin {
1237468df3b2SHisping Lin 	TEEC_Result TeecResult;
1238468df3b2SHisping Lin 	TEEC_Context TeecContext;
1239468df3b2SHisping Lin 	TEEC_Session TeecSession;
1240468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1241468df3b2SHisping Lin 	uint32_t bootflag;
1242468df3b2SHisping Lin 
1243468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1244468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1245468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1246468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1247468df3b2SHisping Lin 
1248468df3b2SHisping Lin 	OpteeClientApiLibInitialize();
1249468df3b2SHisping Lin 
1250468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1251468df3b2SHisping Lin 
1252468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1253468df3b2SHisping Lin 				&TeecSession,
1254468df3b2SHisping Lin 				TeecUuid,
1255468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1256468df3b2SHisping Lin 				NULL,
1257468df3b2SHisping Lin 				NULL,
1258468df3b2SHisping Lin 				&ErrorOrigin);
1259468df3b2SHisping Lin 
1260468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1261468df3b2SHisping Lin 
1262468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1263468df3b2SHisping Lin 	SharedMem0.flags = 0;
1264468df3b2SHisping Lin 
1265468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1266468df3b2SHisping Lin 
1267468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1268468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1269468df3b2SHisping Lin 
1270468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1271468df3b2SHisping Lin 						TEEC_NONE,
1272468df3b2SHisping Lin 						TEEC_NONE,
1273468df3b2SHisping Lin 						TEEC_NONE);
1274468df3b2SHisping Lin 
1275468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1276468df3b2SHisping Lin 					5,
1277468df3b2SHisping Lin 					&TeecOperation,
1278468df3b2SHisping Lin 					&ErrorOrigin);
1279468df3b2SHisping Lin 
1280468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1281468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
1282468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1283468df3b2SHisping Lin 			*flag = 1;
1284468df3b2SHisping Lin 	}
1285468df3b2SHisping Lin 
1286468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1287468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1288468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1289468df3b2SHisping Lin 
1290468df3b2SHisping Lin 	return TeecResult;
1291468df3b2SHisping Lin }
1292468df3b2SHisping Lin 
1293095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1294095e2a82SHisping Lin {
1295095e2a82SHisping Lin 	TEEC_Result TeecResult;
1296095e2a82SHisping Lin 	TEEC_Context TeecContext;
1297095e2a82SHisping Lin 	TEEC_Session TeecSession;
1298095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1299095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1300095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1301095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1302095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
13033251364cSHisping Lin 	struct blk_desc *dev_desc;
13043251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1305095e2a82SHisping Lin 
1306095e2a82SHisping Lin 	debug("testmm start\n");
1307095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1308095e2a82SHisping Lin 
1309095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1310095e2a82SHisping Lin 
13113251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
13123251364cSHisping Lin 						TEEC_NONE,
13133251364cSHisping Lin 						TEEC_NONE,
13143251364cSHisping Lin 						TEEC_NONE);
13153251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
13163251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
13173251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
13183251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
13193251364cSHisping Lin #endif
13203251364cSHisping Lin 
1321095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1322095e2a82SHisping Lin 				&TeecSession,
1323095e2a82SHisping Lin 				TeecUuid,
1324095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1325095e2a82SHisping Lin 				NULL,
13263251364cSHisping Lin 				&TeecOperation,
1327095e2a82SHisping Lin 				&ErrorOrigin);
1328095e2a82SHisping Lin 
1329095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1330095e2a82SHisping Lin 
1331095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1332095e2a82SHisping Lin 	SharedMem0.flags = 0;
1333095e2a82SHisping Lin 
1334095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1335095e2a82SHisping Lin 
1336095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1337095e2a82SHisping Lin 
1338095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1339095e2a82SHisping Lin 
1340095e2a82SHisping Lin 	SharedMem1.size = 1;
1341095e2a82SHisping Lin 	SharedMem1.flags = 0;
1342095e2a82SHisping Lin 
1343095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1344095e2a82SHisping Lin 
1345095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1346095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1347095e2a82SHisping Lin 
1348095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1349095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1350095e2a82SHisping Lin 
1351095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1352095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1353095e2a82SHisping Lin 						TEEC_NONE,
1354095e2a82SHisping Lin 						TEEC_NONE);
1355095e2a82SHisping Lin 
1356095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1357095e2a82SHisping Lin 					142,
1358095e2a82SHisping Lin 					&TeecOperation,
1359095e2a82SHisping Lin 					&ErrorOrigin);
1360095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1361095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1362095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1363095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1364095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1365095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1366095e2a82SHisping Lin 	debug("testmm end\n");
1367095e2a82SHisping Lin 
1368095e2a82SHisping Lin 	return TeecResult;
1369095e2a82SHisping Lin }
1370095e2a82SHisping Lin 
1371095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1372095e2a82SHisping Lin {
1373095e2a82SHisping Lin 	TEEC_Result TeecResult;
1374095e2a82SHisping Lin 	TEEC_Context TeecContext;
1375095e2a82SHisping Lin 	TEEC_Session TeecSession;
1376095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1377095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1378095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1379095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1380095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
13813251364cSHisping Lin 	struct blk_desc *dev_desc;
13823251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1383095e2a82SHisping Lin 
1384095e2a82SHisping Lin 	debug("testmm start\n");
1385095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1386095e2a82SHisping Lin 
1387095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1388095e2a82SHisping Lin 
13893251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
13903251364cSHisping Lin 						TEEC_NONE,
13913251364cSHisping Lin 						TEEC_NONE,
13923251364cSHisping Lin 						TEEC_NONE);
13933251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
13943251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
13953251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
13963251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
13973251364cSHisping Lin #endif
13983251364cSHisping Lin 
1399095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1400095e2a82SHisping Lin 				&TeecSession,
1401095e2a82SHisping Lin 				TeecUuid,
1402095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1403095e2a82SHisping Lin 				NULL,
14043251364cSHisping Lin 				&TeecOperation,
1405095e2a82SHisping Lin 				&ErrorOrigin);
1406095e2a82SHisping Lin 
1407095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1408095e2a82SHisping Lin 
1409095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1410095e2a82SHisping Lin 	SharedMem0.flags = 0;
1411095e2a82SHisping Lin 
1412095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1413095e2a82SHisping Lin 
1414095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1415095e2a82SHisping Lin 
1416095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1417095e2a82SHisping Lin 
1418095e2a82SHisping Lin 	SharedMem1.size = 1;
1419095e2a82SHisping Lin 	SharedMem1.flags = 0;
1420095e2a82SHisping Lin 
1421095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1422095e2a82SHisping Lin 
1423095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1424095e2a82SHisping Lin 
1425095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1426095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1427095e2a82SHisping Lin 
1428095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1429095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1430095e2a82SHisping Lin 
1431095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1432095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1433095e2a82SHisping Lin 						TEEC_NONE,
1434095e2a82SHisping Lin 						TEEC_NONE);
1435095e2a82SHisping Lin 
1436095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1437095e2a82SHisping Lin 					141,
1438095e2a82SHisping Lin 					&TeecOperation,
1439095e2a82SHisping Lin 					&ErrorOrigin);
1440095e2a82SHisping Lin 
1441095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1442095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1443095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1444095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1445095e2a82SHisping Lin 	debug("testmm end\n");
1446095e2a82SHisping Lin 
1447095e2a82SHisping Lin 	return TeecResult;
1448095e2a82SHisping Lin }
14494aa61755SAndy Ye 
14504aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
14514aa61755SAndy Ye {
14524aa61755SAndy Ye 	TEEC_Result TeecResult;
14534aa61755SAndy Ye 	TEEC_Context TeecContext;
14544aa61755SAndy Ye 	TEEC_Session TeecSession;
14554aa61755SAndy Ye 	uint32_t ErrorOrigin;
14564aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
14574aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
14584aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
14594aa61755SAndy Ye 				}
14604aa61755SAndy Ye 			     };
14614aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
14624aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
14633251364cSHisping Lin 	struct blk_desc *dev_desc;
14643251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
14654aa61755SAndy Ye 
14664aa61755SAndy Ye 	OpteeClientApiLibInitialize();
14674aa61755SAndy Ye 
14684aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
14694aa61755SAndy Ye 
14703251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
14713251364cSHisping Lin 						TEEC_NONE,
14723251364cSHisping Lin 						TEEC_NONE,
14733251364cSHisping Lin 						TEEC_NONE);
14743251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
14753251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
14763251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
14773251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
14783251364cSHisping Lin #endif
14793251364cSHisping Lin 
14804aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
14814aa61755SAndy Ye 				      &TeecSession,
14824aa61755SAndy Ye 				      TeecUuid,
14834aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
14844aa61755SAndy Ye 				      NULL,
14853251364cSHisping Lin 					&TeecOperation,
14864aa61755SAndy Ye 				      &ErrorOrigin);
14874aa61755SAndy Ye 
14884aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
14894aa61755SAndy Ye 
14904aa61755SAndy Ye 	SharedMem0.size = *dh_size;
14914aa61755SAndy Ye 	SharedMem0.flags = 0;
14924aa61755SAndy Ye 
14934aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
14944aa61755SAndy Ye 
14954aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
14964aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
14974aa61755SAndy Ye 
14984aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
14994aa61755SAndy Ye 						    TEEC_NONE,
15004aa61755SAndy Ye 						    TEEC_NONE,
15014aa61755SAndy Ye 						    TEEC_NONE);
15024aa61755SAndy Ye 
15034aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
15044aa61755SAndy Ye 					143,
15054aa61755SAndy Ye 					&TeecOperation,
15064aa61755SAndy Ye 					&ErrorOrigin);
15074aa61755SAndy Ye 
15084aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
15094aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
15104aa61755SAndy Ye 
15114aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
15124aa61755SAndy Ye 
15134aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
15144aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
15154aa61755SAndy Ye 
15164aa61755SAndy Ye 	return TeecResult;
15174aa61755SAndy Ye }
15184aa61755SAndy Ye 
15194aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
15204aa61755SAndy Ye {
15214aa61755SAndy Ye 	TEEC_Result TeecResult;
15224aa61755SAndy Ye 	TEEC_Context TeecContext;
15234aa61755SAndy Ye 	TEEC_Session TeecSession;
15244aa61755SAndy Ye 	uint32_t ErrorOrigin;
15254aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15264aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15274aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15284aa61755SAndy Ye 				}
15294aa61755SAndy Ye 			     };
15304aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15314aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
15323251364cSHisping Lin 	struct blk_desc *dev_desc;
15333251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15344aa61755SAndy Ye 
15354aa61755SAndy Ye 	OpteeClientApiLibInitialize();
15364aa61755SAndy Ye 
15374aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
15384aa61755SAndy Ye 
15393251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15403251364cSHisping Lin 						TEEC_NONE,
15413251364cSHisping Lin 						TEEC_NONE,
15423251364cSHisping Lin 						TEEC_NONE);
15433251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
15443251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
15453251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15463251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15473251364cSHisping Lin #endif
15483251364cSHisping Lin 
15494aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15504aa61755SAndy Ye 				      &TeecSession,
15514aa61755SAndy Ye 				      TeecUuid,
15524aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15534aa61755SAndy Ye 				      NULL,
15543251364cSHisping Lin 					&TeecOperation,
15554aa61755SAndy Ye 				      &ErrorOrigin);
15564aa61755SAndy Ye 
15574aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
15584aa61755SAndy Ye 
15594aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
15604aa61755SAndy Ye 	SharedMem0.flags = 0;
15614aa61755SAndy Ye 
15624aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
15634aa61755SAndy Ye 
15644aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
15654aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
15664aa61755SAndy Ye 
15674aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
15684aa61755SAndy Ye 						    TEEC_NONE,
15694aa61755SAndy Ye 						    TEEC_NONE,
15704aa61755SAndy Ye 						    TEEC_NONE);
15714aa61755SAndy Ye 
15724aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
15734aa61755SAndy Ye 					144,
15744aa61755SAndy Ye 					&TeecOperation,
15754aa61755SAndy Ye 					&ErrorOrigin);
15764aa61755SAndy Ye 
15774aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
15784aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
15794aa61755SAndy Ye 
15804aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
15814aa61755SAndy Ye 
15824aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
15834aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
15844aa61755SAndy Ye 
15854aa61755SAndy Ye 	return TeecResult;
15864aa61755SAndy Ye }
15874aa61755SAndy Ye 
15884aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
15894aa61755SAndy Ye 			      uint32_t *operation_size,
15904aa61755SAndy Ye 			      uint8_t *out,
15914aa61755SAndy Ye 			      uint32_t *out_len)
15924aa61755SAndy Ye {
15934aa61755SAndy Ye 	TEEC_Result TeecResult;
15944aa61755SAndy Ye 	TEEC_Context TeecContext;
15954aa61755SAndy Ye 	TEEC_Session TeecSession;
15964aa61755SAndy Ye 	uint32_t ErrorOrigin;
15974aa61755SAndy Ye 
15984aa61755SAndy Ye 	OpteeClientApiLibInitialize();
15994aa61755SAndy Ye 
16004aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16014aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16024aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16034aa61755SAndy Ye 				}
16044aa61755SAndy Ye 			     };
16054aa61755SAndy Ye 
16064aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16074aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16083251364cSHisping Lin 	struct blk_desc *dev_desc;
16093251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16104aa61755SAndy Ye 
16114aa61755SAndy Ye 	OpteeClientApiLibInitialize();
16124aa61755SAndy Ye 
16134aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16144aa61755SAndy Ye 
16153251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16163251364cSHisping Lin 						TEEC_NONE,
16173251364cSHisping Lin 						TEEC_NONE,
16183251364cSHisping Lin 						TEEC_NONE);
16193251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16203251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16213251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16223251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16233251364cSHisping Lin #endif
16243251364cSHisping Lin 
16254aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16264aa61755SAndy Ye 				      &TeecSession,
16274aa61755SAndy Ye 				      TeecUuid,
16284aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16294aa61755SAndy Ye 				      NULL,
16303251364cSHisping Lin 					&TeecOperation,
16314aa61755SAndy Ye 				      &ErrorOrigin);
16324aa61755SAndy Ye 
16334aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16344aa61755SAndy Ye 
16354aa61755SAndy Ye 	SharedMem0.size = *operation_size;
16364aa61755SAndy Ye 	SharedMem0.flags = 0;
16374aa61755SAndy Ye 
16384aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
16394aa61755SAndy Ye 
16404aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
16414aa61755SAndy Ye 
16424aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
16434aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
16444aa61755SAndy Ye 
16454aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
16464aa61755SAndy Ye 
16474aa61755SAndy Ye 	SharedMem1.size = *out_len;
16484aa61755SAndy Ye 	SharedMem1.flags = 0;
16494aa61755SAndy Ye 
16504aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
16514aa61755SAndy Ye 
16524aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
16534aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
16544aa61755SAndy Ye 
16554aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
16564aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
16574aa61755SAndy Ye 						    TEEC_NONE,
16584aa61755SAndy Ye 						    TEEC_NONE);
16594aa61755SAndy Ye 
16604aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16614aa61755SAndy Ye 					145,
16624aa61755SAndy Ye 					&TeecOperation,
16634aa61755SAndy Ye 					&ErrorOrigin);
16644aa61755SAndy Ye 
16654aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
16664aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
16674aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
16684aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
16694aa61755SAndy Ye 
16704aa61755SAndy Ye 	return TeecResult;
16714aa61755SAndy Ye }
16724aa61755SAndy Ye 
16734aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
16744aa61755SAndy Ye {
16754aa61755SAndy Ye 	TEEC_Result TeecResult;
16764aa61755SAndy Ye 	TEEC_Context TeecContext;
16774aa61755SAndy Ye 	TEEC_Session TeecSession;
16784aa61755SAndy Ye 	uint32_t ErrorOrigin;
16794aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16804aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16814aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16824aa61755SAndy Ye 				}
16834aa61755SAndy Ye 			     };
16844aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16854aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16863251364cSHisping Lin 	struct blk_desc *dev_desc;
16873251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16884aa61755SAndy Ye 
16894aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16904aa61755SAndy Ye 
16913251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16923251364cSHisping Lin 						TEEC_NONE,
16933251364cSHisping Lin 						TEEC_NONE,
16943251364cSHisping Lin 						TEEC_NONE);
16953251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16963251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16973251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16983251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16993251364cSHisping Lin #endif
17003251364cSHisping Lin 
17014aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17024aa61755SAndy Ye 					&TeecSession,
17034aa61755SAndy Ye 					TeecUuid,
17044aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
17054aa61755SAndy Ye 					NULL,
17063251364cSHisping Lin 					&TeecOperation,
17074aa61755SAndy Ye 					&ErrorOrigin);
17084aa61755SAndy Ye 
17094aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17104aa61755SAndy Ye 
17114aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
17124aa61755SAndy Ye 	SharedMem0.flags = 0;
17134aa61755SAndy Ye 
17144aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17154aa61755SAndy Ye 
17164aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
17174aa61755SAndy Ye 
17184aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17194aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17204aa61755SAndy Ye 
17214aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17224aa61755SAndy Ye 						    TEEC_NONE,
17234aa61755SAndy Ye 						    TEEC_NONE,
17244aa61755SAndy Ye 						    TEEC_NONE);
17254aa61755SAndy Ye 
17264aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17274aa61755SAndy Ye 					146,
17284aa61755SAndy Ye 					&TeecOperation,
17294aa61755SAndy Ye 					&ErrorOrigin);
17304aa61755SAndy Ye 
17314aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17324aa61755SAndy Ye 
17334aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
17344aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
17354aa61755SAndy Ye 
17364aa61755SAndy Ye 	return TeecResult;
17374aa61755SAndy Ye }
173878ef5fbdSqiujian 
173978ef5fbdSqiujian TEEC_Result trusty_write_oem_unlock(uint8_t unlock)
174078ef5fbdSqiujian {
174178ef5fbdSqiujian 	char *file = "oem.unlock";
174278ef5fbdSqiujian 	TEEC_Result ret;
174378ef5fbdSqiujian 
174478ef5fbdSqiujian 	ret = write_to_keymaster((uint8_t *)file, strlen(file),
174578ef5fbdSqiujian 		(uint8_t *)&unlock, 1);
174678ef5fbdSqiujian 	return ret;
174778ef5fbdSqiujian }
174878ef5fbdSqiujian 
174978ef5fbdSqiujian TEEC_Result trusty_read_oem_unlock(uint8_t *unlock)
175078ef5fbdSqiujian {
175178ef5fbdSqiujian 	char *file = "oem.unlock";
175278ef5fbdSqiujian 	TEEC_Result ret;
175378ef5fbdSqiujian 
175478ef5fbdSqiujian 	ret = read_from_keymaster((uint8_t *)file, strlen(file),
175578ef5fbdSqiujian 		unlock, 1);
175678ef5fbdSqiujian 
175778ef5fbdSqiujian 	if (ret == TEE_ERROR_ITEM_NOT_FOUND) {
175878ef5fbdSqiujian 		debug("init oem unlock status 0");
175978ef5fbdSqiujian 		ret = trusty_write_oem_unlock(0);
176078ef5fbdSqiujian 	}
176178ef5fbdSqiujian 
176278ef5fbdSqiujian 	return ret;
176378ef5fbdSqiujian }