xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 78ef5fbdb92712dc771643c913975ff4faff380d)
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*78ef5fbdSqiujian #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 #ifdef CONFIG_OPTEE_V1
48ae8ec5e1SHisping Lin 				NULL,
493251364cSHisping Lin #endif
503251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
513251364cSHisping Lin 				&TeecOperation,
523251364cSHisping Lin #endif
53ae8ec5e1SHisping Lin 				&ErrorOrigin);
54ae8ec5e1SHisping Lin 
55ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
56ae8ec5e1SHisping Lin 
57ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
58ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
59ae8ec5e1SHisping Lin 
60ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
61ae8ec5e1SHisping Lin 
62ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
63ae8ec5e1SHisping Lin 
64ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
65ae8ec5e1SHisping Lin 
66ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
67ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
68ae8ec5e1SHisping Lin 
69ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
70ae8ec5e1SHisping Lin 
71ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
72ae8ec5e1SHisping Lin 
73ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
74ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
75ae8ec5e1SHisping Lin 
76ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
77ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
78ae8ec5e1SHisping Lin 
79ae8ec5e1SHisping Lin 
80ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
81ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
82ae8ec5e1SHisping Lin 						TEEC_NONE,
83ae8ec5e1SHisping Lin 						TEEC_NONE);
84ae8ec5e1SHisping Lin 
85ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
86ae8ec5e1SHisping Lin 					1,
87ae8ec5e1SHisping Lin 					&TeecOperation,
88ae8ec5e1SHisping Lin 					&ErrorOrigin);
89ae8ec5e1SHisping Lin 
90ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
91ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
92ae8ec5e1SHisping Lin 
93ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
94ae8ec5e1SHisping Lin 
9546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
96ae8ec5e1SHisping Lin 
97ae8ec5e1SHisping Lin 	debug("testmm end\n");
98ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
99ae8ec5e1SHisping Lin }
100ae8ec5e1SHisping Lin 
101ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
102ae8ec5e1SHisping Lin {
103ae8ec5e1SHisping Lin 	if (in > 9)
104ae8ec5e1SHisping Lin 		return in + 55;
105ae8ec5e1SHisping Lin 	else
106ae8ec5e1SHisping Lin 		return in + 48;
107ae8ec5e1SHisping Lin }
108ae8ec5e1SHisping Lin 
109ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
110ae8ec5e1SHisping Lin {
111ae8ec5e1SHisping Lin 	uint32_t i = 0;
112ae8ec5e1SHisping Lin 
113ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
114ae8ec5e1SHisping Lin 		return 0;
115ae8ec5e1SHisping Lin 
116ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
117ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
118ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
119ae8ec5e1SHisping Lin 	}
120ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
121ae8ec5e1SHisping Lin 
122ae8ec5e1SHisping Lin 	return blen * 2;
123ae8ec5e1SHisping Lin }
124ae8ec5e1SHisping Lin 
125ae8ec5e1SHisping Lin 
126ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
127ae8ec5e1SHisping Lin {
128ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
129ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
130ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
131ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
132ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
133ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
134ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
135ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
136ae8ec5e1SHisping Lin 	uint8_t hs[9];
137ae8ec5e1SHisping Lin 
1383251364cSHisping Lin 	struct blk_desc *dev_desc;
1393251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1403251364cSHisping Lin 
141ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
142ae8ec5e1SHisping Lin 	debug("testmm start\n");
143ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
144ae8ec5e1SHisping Lin 
145ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
146ae8ec5e1SHisping Lin 
1473251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1483251364cSHisping Lin 						TEEC_NONE,
1493251364cSHisping Lin 						TEEC_NONE,
1503251364cSHisping Lin 						TEEC_NONE);
1513251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1523251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1533251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1543251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1553251364cSHisping Lin #endif
1563251364cSHisping Lin 
157ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
158ae8ec5e1SHisping Lin 				&TeecSession,
159ae8ec5e1SHisping Lin 				TeecUuid,
160ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
161ae8ec5e1SHisping Lin 				NULL,
1623251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
163ae8ec5e1SHisping Lin 				NULL,
1643251364cSHisping Lin #endif
1653251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
1663251364cSHisping Lin 				&TeecOperation,
1673251364cSHisping Lin #endif
168ae8ec5e1SHisping Lin 				&ErrorOrigin);
169ae8ec5e1SHisping Lin 
170ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
171ae8ec5e1SHisping Lin 
172ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
173ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
174ae8ec5e1SHisping Lin 
175ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
176ae8ec5e1SHisping Lin 
177ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
178ae8ec5e1SHisping Lin 
179ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
180ae8ec5e1SHisping Lin 
181ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
182ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
183ae8ec5e1SHisping Lin 
184ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
185ae8ec5e1SHisping Lin 
186ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
187ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
188ae8ec5e1SHisping Lin 
189ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
190ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
191ae8ec5e1SHisping Lin 
192ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
193ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
194ae8ec5e1SHisping Lin 						TEEC_NONE,
195ae8ec5e1SHisping Lin 						TEEC_NONE);
196ae8ec5e1SHisping Lin 
197ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
198ae8ec5e1SHisping Lin 					0,
199ae8ec5e1SHisping Lin 					&TeecOperation,
200ae8ec5e1SHisping Lin 					&ErrorOrigin);
20146b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
202ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
203ae8ec5e1SHisping Lin 
204ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
205ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
206ae8ec5e1SHisping Lin 
207ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
208ae8ec5e1SHisping Lin 
20946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
210ae8ec5e1SHisping Lin 
211ae8ec5e1SHisping Lin 	debug("testmm end\n");
212ae8ec5e1SHisping Lin 	return TeecResult;
213ae8ec5e1SHisping Lin }
214ae8ec5e1SHisping Lin 
215ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
216ae8ec5e1SHisping Lin {
217ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
218ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
219ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
220ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
221ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
222ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
223ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
224ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
225ae8ec5e1SHisping Lin 	uint8_t hs[9];
2263251364cSHisping Lin 	struct blk_desc *dev_desc;
2273251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
2283251364cSHisping Lin 
229ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
230ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
231ae8ec5e1SHisping Lin 
232ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
233ae8ec5e1SHisping Lin 
2343251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2353251364cSHisping Lin 						TEEC_NONE,
2363251364cSHisping Lin 						TEEC_NONE,
2373251364cSHisping Lin 						TEEC_NONE);
2383251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2393251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
2403251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
2413251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
2423251364cSHisping Lin #endif
2433251364cSHisping Lin 
244ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
245ae8ec5e1SHisping Lin 				&TeecSession,
246ae8ec5e1SHisping Lin 				TeecUuid,
247ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
248ae8ec5e1SHisping Lin 				NULL,
2493251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
250ae8ec5e1SHisping Lin 				NULL,
2513251364cSHisping Lin #endif
2523251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
2533251364cSHisping Lin 				&TeecOperation,
2543251364cSHisping Lin #endif
255ae8ec5e1SHisping Lin 				&ErrorOrigin);
256ae8ec5e1SHisping Lin 
257ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
258ae8ec5e1SHisping Lin 
259ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
260ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
261ae8ec5e1SHisping Lin 
262ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
263ae8ec5e1SHisping Lin 
264ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
265ae8ec5e1SHisping Lin 
266ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
267ae8ec5e1SHisping Lin 
268ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
269ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
270ae8ec5e1SHisping Lin 
271ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
274ae8ec5e1SHisping Lin 
275ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
276ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
277ae8ec5e1SHisping Lin 
278ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
279ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
280ae8ec5e1SHisping Lin 
281ae8ec5e1SHisping Lin 
282ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
283ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
284ae8ec5e1SHisping Lin 						TEEC_NONE,
285ae8ec5e1SHisping Lin 						TEEC_NONE);
286ae8ec5e1SHisping Lin 
287ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
288ae8ec5e1SHisping Lin 					1,
289ae8ec5e1SHisping Lin 					&TeecOperation,
290ae8ec5e1SHisping Lin 					&ErrorOrigin);
291ae8ec5e1SHisping Lin 
292ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
293ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
294ae8ec5e1SHisping Lin 
295ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
296ae8ec5e1SHisping Lin 
29746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
298ae8ec5e1SHisping Lin 
299ae8ec5e1SHisping Lin 	debug("testmm end\n");
300ae8ec5e1SHisping Lin 
301ae8ec5e1SHisping Lin 	return TeecResult;
302ae8ec5e1SHisping Lin }
303ae8ec5e1SHisping Lin 
304ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
305ae8ec5e1SHisping Lin {
306ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
307ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
308ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
309ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
31046b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
31146b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
312ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
313ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
3143251364cSHisping Lin 	struct blk_desc *dev_desc;
3153251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
316ae8ec5e1SHisping Lin 
317ae8ec5e1SHisping Lin 	debug("testmm start\n");
318ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
319ae8ec5e1SHisping Lin 
320ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
321ae8ec5e1SHisping Lin 
3223251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3233251364cSHisping Lin 						TEEC_NONE,
3243251364cSHisping Lin 						TEEC_NONE,
3253251364cSHisping Lin 						TEEC_NONE);
3263251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
3273251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
3283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3293251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3303251364cSHisping Lin #endif
3313251364cSHisping Lin 
332ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
333ae8ec5e1SHisping Lin 				&TeecSession,
334ae8ec5e1SHisping Lin 				TeecUuid,
335ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
336ae8ec5e1SHisping Lin 				NULL,
3373251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
338ae8ec5e1SHisping Lin 				NULL,
3393251364cSHisping Lin #endif
3403251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
3413251364cSHisping Lin 				&TeecOperation,
3423251364cSHisping Lin #endif
343ae8ec5e1SHisping Lin 				&ErrorOrigin);
344ae8ec5e1SHisping Lin 
345ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
346ae8ec5e1SHisping Lin 
347ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
348ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
349ae8ec5e1SHisping Lin 
350ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
351ae8ec5e1SHisping Lin 
352ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
353ae8ec5e1SHisping Lin 
354ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
355ae8ec5e1SHisping Lin 
356ae8ec5e1SHisping Lin 	SharedMem1.size = size;
357ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
358ae8ec5e1SHisping Lin 
359ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
360ae8ec5e1SHisping Lin 
361ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
362ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
363ae8ec5e1SHisping Lin 
364ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
365ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
366ae8ec5e1SHisping Lin 
367ae8ec5e1SHisping Lin 
368ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
369ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
370ae8ec5e1SHisping Lin 						TEEC_NONE,
371ae8ec5e1SHisping Lin 						TEEC_NONE);
372ae8ec5e1SHisping Lin 
373ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
37446b2a054SHisping Lin 					142,
375ae8ec5e1SHisping Lin 					&TeecOperation,
376ae8ec5e1SHisping Lin 					&ErrorOrigin);
37746b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
378ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
379ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
380ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
381ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
38246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
383ae8ec5e1SHisping Lin 	debug("testmm end\n");
384ae8ec5e1SHisping Lin 
385ae8ec5e1SHisping Lin 	return TeecResult;
386ae8ec5e1SHisping Lin }
387ae8ec5e1SHisping Lin 
388ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
389ae8ec5e1SHisping Lin {
390ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
391ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
392ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
393ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
39446b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
39546b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
396ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
397ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
3983251364cSHisping Lin 	struct blk_desc *dev_desc;
3993251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
400ae8ec5e1SHisping Lin 
401ae8ec5e1SHisping Lin 	debug("testmm start\n");
402ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
403ae8ec5e1SHisping Lin 
404ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
405ae8ec5e1SHisping Lin 
4063251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4073251364cSHisping Lin 						TEEC_NONE,
4083251364cSHisping Lin 						TEEC_NONE,
4093251364cSHisping Lin 						TEEC_NONE);
4103251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
4113251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
4123251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4133251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4143251364cSHisping Lin #endif
4153251364cSHisping Lin 
416ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
417ae8ec5e1SHisping Lin 				&TeecSession,
418ae8ec5e1SHisping Lin 				TeecUuid,
419ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
420ae8ec5e1SHisping Lin 				NULL,
4213251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
422ae8ec5e1SHisping Lin 				NULL,
4233251364cSHisping Lin #endif
4243251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
4253251364cSHisping Lin 				&TeecOperation,
4263251364cSHisping Lin #endif
427ae8ec5e1SHisping Lin 				&ErrorOrigin);
428ae8ec5e1SHisping Lin 
429ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
430ae8ec5e1SHisping Lin 
431ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
432ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
433ae8ec5e1SHisping Lin 
434ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
435ae8ec5e1SHisping Lin 
436ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
437ae8ec5e1SHisping Lin 
438ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
439ae8ec5e1SHisping Lin 
440ae8ec5e1SHisping Lin 	SharedMem1.size = size;
441ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
442ae8ec5e1SHisping Lin 
443ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
444ae8ec5e1SHisping Lin 
445ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
446ae8ec5e1SHisping Lin 
447ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
448ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
449ae8ec5e1SHisping Lin 
450ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
451ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
452ae8ec5e1SHisping Lin 
453ae8ec5e1SHisping Lin 
454ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
455ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
456ae8ec5e1SHisping Lin 						TEEC_NONE,
457ae8ec5e1SHisping Lin 						TEEC_NONE);
458ae8ec5e1SHisping Lin 
459ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
46046b2a054SHisping Lin 					141,
461ae8ec5e1SHisping Lin 					&TeecOperation,
462ae8ec5e1SHisping Lin 					&ErrorOrigin);
463ae8ec5e1SHisping Lin 
464ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
465ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
466ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
46746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
468ae8ec5e1SHisping Lin 	debug("testmm end\n");
469ae8ec5e1SHisping Lin 
470ae8ec5e1SHisping Lin 	return TeecResult;
471ae8ec5e1SHisping Lin }
472ae8ec5e1SHisping Lin 
473ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
474ae8ec5e1SHisping Lin {
475ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
476ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
477ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
478ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
479ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
480ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
481ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
482ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
4833251364cSHisping Lin 	struct blk_desc *dev_desc;
4843251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
485ae8ec5e1SHisping Lin 
486ae8ec5e1SHisping Lin 	debug("testmm start\n");
487ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
488ae8ec5e1SHisping Lin 
489ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
490ae8ec5e1SHisping Lin 
4913251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4923251364cSHisping Lin 						TEEC_NONE,
4933251364cSHisping Lin 						TEEC_NONE,
4943251364cSHisping Lin 						TEEC_NONE);
4953251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
4963251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
4973251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4983251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4993251364cSHisping Lin #endif
500ae8ec5e1SHisping Lin 
501ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
502ae8ec5e1SHisping Lin 				&TeecSession,
503ae8ec5e1SHisping Lin 				TeecUuid,
504ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
505ae8ec5e1SHisping Lin 				NULL,
5063251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
507ae8ec5e1SHisping Lin 				NULL,
5083251364cSHisping Lin #endif
5093251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
5103251364cSHisping Lin 				&TeecOperation,
5113251364cSHisping Lin #endif
512ae8ec5e1SHisping Lin 				&ErrorOrigin);
513ae8ec5e1SHisping Lin 
514ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
515ae8ec5e1SHisping Lin 
516ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
517ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
518ae8ec5e1SHisping Lin 
519ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
520ae8ec5e1SHisping Lin 
521ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
522ae8ec5e1SHisping Lin 
523ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
524ae8ec5e1SHisping Lin 
525ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
526ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
527ae8ec5e1SHisping Lin 
528ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
529ae8ec5e1SHisping Lin 
530ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
531ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
532ae8ec5e1SHisping Lin 
533ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
534ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
535ae8ec5e1SHisping Lin 
536ae8ec5e1SHisping Lin 
537ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
538ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
539ae8ec5e1SHisping Lin 						TEEC_NONE,
540ae8ec5e1SHisping Lin 						TEEC_NONE);
541ae8ec5e1SHisping Lin 
542ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
543ae8ec5e1SHisping Lin 					0,
544ae8ec5e1SHisping Lin 					&TeecOperation,
545ae8ec5e1SHisping Lin 					&ErrorOrigin);
54646b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
547ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
548ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
549ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
550ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
55146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
552ae8ec5e1SHisping Lin 	debug("testmm end\n");
553ae8ec5e1SHisping Lin 
554ae8ec5e1SHisping Lin 	return TeecResult;
555ae8ec5e1SHisping Lin }
556ae8ec5e1SHisping Lin 
557ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
558ae8ec5e1SHisping Lin {
559ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
560ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
561ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
562ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
563ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
564ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
565ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
566ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
5673251364cSHisping Lin 	struct blk_desc *dev_desc;
5683251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
569ae8ec5e1SHisping Lin 
570ae8ec5e1SHisping Lin 	debug("testmm start\n");
571ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
572ae8ec5e1SHisping Lin 
573ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
574ae8ec5e1SHisping Lin 
5753251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
5763251364cSHisping Lin 						TEEC_NONE,
5773251364cSHisping Lin 						TEEC_NONE,
5783251364cSHisping Lin 						TEEC_NONE);
5793251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
5803251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
5813251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
5823251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
5833251364cSHisping Lin #endif
5843251364cSHisping Lin 
585ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
586ae8ec5e1SHisping Lin 				&TeecSession,
587ae8ec5e1SHisping Lin 				TeecUuid,
588ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
589ae8ec5e1SHisping Lin 				NULL,
5903251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
591ae8ec5e1SHisping Lin 				NULL,
5923251364cSHisping Lin #endif
5933251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
5943251364cSHisping Lin 				&TeecOperation,
5953251364cSHisping Lin #endif
596ae8ec5e1SHisping Lin 				&ErrorOrigin);
597ae8ec5e1SHisping Lin 
598ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
599ae8ec5e1SHisping Lin 
600ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
601ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
602ae8ec5e1SHisping Lin 
603ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
604ae8ec5e1SHisping Lin 
605ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
606ae8ec5e1SHisping Lin 
607ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
608ae8ec5e1SHisping Lin 
609ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
610ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
611ae8ec5e1SHisping Lin 
612ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
613ae8ec5e1SHisping Lin 
614ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
615ae8ec5e1SHisping Lin 
616ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
617ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
618ae8ec5e1SHisping Lin 
619ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
620ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
621ae8ec5e1SHisping Lin 
622ae8ec5e1SHisping Lin 
623ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
624ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
625ae8ec5e1SHisping Lin 						TEEC_NONE,
626ae8ec5e1SHisping Lin 						TEEC_NONE);
627ae8ec5e1SHisping Lin 
628ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
629ae8ec5e1SHisping Lin 					1,
630ae8ec5e1SHisping Lin 					&TeecOperation,
631ae8ec5e1SHisping Lin 					&ErrorOrigin);
632ae8ec5e1SHisping Lin 
633ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
634ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
635ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
63646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
637ae8ec5e1SHisping Lin 	debug("testmm end\n");
638ae8ec5e1SHisping Lin 
639ae8ec5e1SHisping Lin 	return TeecResult;
640ae8ec5e1SHisping Lin }
641ae8ec5e1SHisping Lin 
642ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
643ae8ec5e1SHisping Lin {
644ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
645ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
646ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
647ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
648ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
649ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
650ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
651ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
6523251364cSHisping Lin 	struct blk_desc *dev_desc;
6533251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
654ae8ec5e1SHisping Lin 
655ae8ec5e1SHisping Lin 	debug("testmm start\n");
656ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
657ae8ec5e1SHisping Lin 
658ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
659ae8ec5e1SHisping Lin 
6603251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6613251364cSHisping Lin 						TEEC_NONE,
6623251364cSHisping Lin 						TEEC_NONE,
6633251364cSHisping Lin 						TEEC_NONE);
6643251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
6653251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
6663251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6673251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6683251364cSHisping Lin #endif
669ae8ec5e1SHisping Lin 
670ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
671ae8ec5e1SHisping Lin 				&TeecSession,
672ae8ec5e1SHisping Lin 				TeecUuid,
673ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
674ae8ec5e1SHisping Lin 				NULL,
6753251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
676ae8ec5e1SHisping Lin 				NULL,
6773251364cSHisping Lin #endif
6783251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
6793251364cSHisping Lin 				&TeecOperation,
6803251364cSHisping Lin #endif
681ae8ec5e1SHisping Lin 				&ErrorOrigin);
682ae8ec5e1SHisping Lin 
683ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
684ae8ec5e1SHisping Lin 
685ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
686ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
687ae8ec5e1SHisping Lin 
688ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
689ae8ec5e1SHisping Lin 
690ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
691ae8ec5e1SHisping Lin 
692ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
693ae8ec5e1SHisping Lin 
694ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
695ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
696ae8ec5e1SHisping Lin 
697ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
698ae8ec5e1SHisping Lin 
699ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
700ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
701ae8ec5e1SHisping Lin 
702ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
703ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
704ae8ec5e1SHisping Lin 
705ae8ec5e1SHisping Lin 
706ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
707ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
708ae8ec5e1SHisping Lin 						TEEC_NONE,
709ae8ec5e1SHisping Lin 						TEEC_NONE);
710ae8ec5e1SHisping Lin 
711ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
712ae8ec5e1SHisping Lin 					0,
713ae8ec5e1SHisping Lin 					&TeecOperation,
714ae8ec5e1SHisping Lin 					&ErrorOrigin);
71546b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
716ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
717ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
718ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
719ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
72046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
721ae8ec5e1SHisping Lin 	debug("testmm end\n");
722ae8ec5e1SHisping Lin 
723ae8ec5e1SHisping Lin 	return TeecResult;
724ae8ec5e1SHisping Lin }
725ae8ec5e1SHisping Lin 
726ae8ec5e1SHisping Lin 
727ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
728ae8ec5e1SHisping Lin {
729ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
730ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
731ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
732ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
733ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
734ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
735ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
736ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
7373251364cSHisping Lin 	struct blk_desc *dev_desc;
7383251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
739ae8ec5e1SHisping Lin 
740ae8ec5e1SHisping Lin 	debug("testmm start\n");
741ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
742ae8ec5e1SHisping Lin 
743ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
744ae8ec5e1SHisping Lin 
7453251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7463251364cSHisping Lin 						TEEC_NONE,
7473251364cSHisping Lin 						TEEC_NONE,
7483251364cSHisping Lin 						TEEC_NONE);
7493251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
7503251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
7513251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7523251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7533251364cSHisping Lin #endif
7543251364cSHisping Lin 
755ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
756ae8ec5e1SHisping Lin 				&TeecSession,
757ae8ec5e1SHisping Lin 				TeecUuid,
758ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
759ae8ec5e1SHisping Lin 				NULL,
7603251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
761ae8ec5e1SHisping Lin 				NULL,
7623251364cSHisping Lin #endif
7633251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
7643251364cSHisping Lin 				&TeecOperation,
7653251364cSHisping Lin #endif
766ae8ec5e1SHisping Lin 				&ErrorOrigin);
767ae8ec5e1SHisping Lin 
768ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
769ae8ec5e1SHisping Lin 
770ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
771ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
772ae8ec5e1SHisping Lin 
773ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
774ae8ec5e1SHisping Lin 
775ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
776ae8ec5e1SHisping Lin 
777ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
778ae8ec5e1SHisping Lin 
779ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
780ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
781ae8ec5e1SHisping Lin 
782ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
783ae8ec5e1SHisping Lin 
784ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
785ae8ec5e1SHisping Lin 
786ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
787ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
788ae8ec5e1SHisping Lin 
789ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
790ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
791ae8ec5e1SHisping Lin 
792ae8ec5e1SHisping Lin 
793ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
794ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
795ae8ec5e1SHisping Lin 						TEEC_NONE,
796ae8ec5e1SHisping Lin 						TEEC_NONE);
797ae8ec5e1SHisping Lin 
798ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
799ae8ec5e1SHisping Lin 					1,
800ae8ec5e1SHisping Lin 					&TeecOperation,
801ae8ec5e1SHisping Lin 					&ErrorOrigin);
802ae8ec5e1SHisping Lin 
803ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
804ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
805ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
80646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
807ae8ec5e1SHisping Lin 	debug("testmm end\n");
808ae8ec5e1SHisping Lin 
809ae8ec5e1SHisping Lin 	return TeecResult;
810ae8ec5e1SHisping Lin }
811ae8ec5e1SHisping Lin 
812*78ef5fbdSqiujian TEEC_Result read_from_keymaster(uint8_t *filename,
813*78ef5fbdSqiujian 		uint32_t filename_size,
814*78ef5fbdSqiujian 		uint8_t *data,
815*78ef5fbdSqiujian 		uint32_t size)
816*78ef5fbdSqiujian {
817*78ef5fbdSqiujian 	TEEC_Result TeecResult;
818*78ef5fbdSqiujian 	TEEC_Context TeecContext;
819*78ef5fbdSqiujian 	TEEC_Session TeecSession;
820*78ef5fbdSqiujian 	uint32_t ErrorOrigin;
821*78ef5fbdSqiujian 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
822*78ef5fbdSqiujian 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
823*78ef5fbdSqiujian 	TEEC_UUID *TeecUuid = &tempuuid;
824*78ef5fbdSqiujian 	TEEC_Operation TeecOperation = {0};
825*78ef5fbdSqiujian 	struct blk_desc *dev_desc;
826*78ef5fbdSqiujian 	dev_desc = rockchip_get_bootdev();
827*78ef5fbdSqiujian 
828*78ef5fbdSqiujian 	debug("read_from_keymaster start\n");
829*78ef5fbdSqiujian 	OpteeClientApiLibInitialize();
830*78ef5fbdSqiujian 
831*78ef5fbdSqiujian 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
832*78ef5fbdSqiujian 
833*78ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
834*78ef5fbdSqiujian 						TEEC_NONE,
835*78ef5fbdSqiujian 						TEEC_NONE,
836*78ef5fbdSqiujian 						TEEC_NONE);
837*78ef5fbdSqiujian 	/*0 nand or emmc "security" partition , 1 rpmb*/
838*78ef5fbdSqiujian 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
839*78ef5fbdSqiujian #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
840*78ef5fbdSqiujian 	TeecOperation.params[0].value.a = 0;
841*78ef5fbdSqiujian #endif
842*78ef5fbdSqiujian 
843*78ef5fbdSqiujian 	TeecResult = TEEC_OpenSession(&TeecContext,
844*78ef5fbdSqiujian 				&TeecSession,
845*78ef5fbdSqiujian 				TeecUuid,
846*78ef5fbdSqiujian 				TEEC_LOGIN_PUBLIC,
847*78ef5fbdSqiujian 				NULL,
848*78ef5fbdSqiujian #ifdef CONFIG_OPTEE_V1
849*78ef5fbdSqiujian 				NULL,
850*78ef5fbdSqiujian #endif
851*78ef5fbdSqiujian #ifdef CONFIG_OPTEE_V2
852*78ef5fbdSqiujian 				&TeecOperation,
853*78ef5fbdSqiujian #endif
854*78ef5fbdSqiujian 				&ErrorOrigin);
855*78ef5fbdSqiujian 
856*78ef5fbdSqiujian 	TEEC_SharedMemory SharedMem0 = {0};
857*78ef5fbdSqiujian 
858*78ef5fbdSqiujian 	SharedMem0.size = filename_size;
859*78ef5fbdSqiujian 	SharedMem0.flags = 0;
860*78ef5fbdSqiujian 
861*78ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
862*78ef5fbdSqiujian 
863*78ef5fbdSqiujian 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
864*78ef5fbdSqiujian 
865*78ef5fbdSqiujian 	TEEC_SharedMemory SharedMem1 = {0};
866*78ef5fbdSqiujian 
867*78ef5fbdSqiujian 	SharedMem1.size = size;
868*78ef5fbdSqiujian 	SharedMem1.flags = 0;
869*78ef5fbdSqiujian 
870*78ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
871*78ef5fbdSqiujian 
872*78ef5fbdSqiujian 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
873*78ef5fbdSqiujian 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
874*78ef5fbdSqiujian 
875*78ef5fbdSqiujian 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
876*78ef5fbdSqiujian 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
877*78ef5fbdSqiujian 
878*78ef5fbdSqiujian 
879*78ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
880*78ef5fbdSqiujian 						TEEC_MEMREF_TEMP_INOUT,
881*78ef5fbdSqiujian 						TEEC_NONE,
882*78ef5fbdSqiujian 						TEEC_NONE);
883*78ef5fbdSqiujian 
884*78ef5fbdSqiujian 	TeecResult = TEEC_InvokeCommand(&TeecSession,
885*78ef5fbdSqiujian 					142,
886*78ef5fbdSqiujian 					&TeecOperation,
887*78ef5fbdSqiujian 					&ErrorOrigin);
888*78ef5fbdSqiujian 	if (TeecResult == TEEC_SUCCESS)
889*78ef5fbdSqiujian 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
890*78ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem0);
891*78ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem1);
892*78ef5fbdSqiujian 	TEEC_CloseSession(&TeecSession);
893*78ef5fbdSqiujian 	TEEC_FinalizeContext(&TeecContext);
894*78ef5fbdSqiujian 	debug("read_from_keymaster end\n");
895*78ef5fbdSqiujian 
896*78ef5fbdSqiujian 	return TeecResult;
897*78ef5fbdSqiujian }
898*78ef5fbdSqiujian 
899ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
900ae8ec5e1SHisping Lin 		uint32_t filename_size,
901ae8ec5e1SHisping Lin 		uint8_t *data,
902ae8ec5e1SHisping Lin 		uint32_t data_size)
903ae8ec5e1SHisping Lin {
904ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
905ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
906ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
907ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
908ae8ec5e1SHisping Lin 
909ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
910ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
911ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
912ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
9133251364cSHisping Lin 	struct blk_desc *dev_desc;
9143251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
915ae8ec5e1SHisping Lin 
916ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
917ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
918ae8ec5e1SHisping Lin 
919ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
920ae8ec5e1SHisping Lin 
9213251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9223251364cSHisping Lin 						TEEC_NONE,
9233251364cSHisping Lin 						TEEC_NONE,
9243251364cSHisping Lin 						TEEC_NONE);
9253251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
9263251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
9273251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9283251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9293251364cSHisping Lin #endif
9303251364cSHisping Lin 
931ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
932ae8ec5e1SHisping Lin 				&TeecSession,
933ae8ec5e1SHisping Lin 				TeecUuid,
934ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
935ae8ec5e1SHisping Lin 				NULL,
9363251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
937ae8ec5e1SHisping Lin 				NULL,
9383251364cSHisping Lin #endif
9393251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
9403251364cSHisping Lin 				&TeecOperation,
9413251364cSHisping Lin #endif
942ae8ec5e1SHisping Lin 				&ErrorOrigin);
943ae8ec5e1SHisping Lin 
944ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
945ae8ec5e1SHisping Lin 
946ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
947ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
948ae8ec5e1SHisping Lin 
949ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
950ae8ec5e1SHisping Lin 
951ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
952ae8ec5e1SHisping Lin 
953ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
954ae8ec5e1SHisping Lin 
955ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
956ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
957ae8ec5e1SHisping Lin 
958ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
959ae8ec5e1SHisping Lin 
960ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
961ae8ec5e1SHisping Lin 
962ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
963ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
964ae8ec5e1SHisping Lin 
965ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
966ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
967ae8ec5e1SHisping Lin 
968ae8ec5e1SHisping Lin 
969ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
970ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
971ae8ec5e1SHisping Lin 						TEEC_NONE,
972ae8ec5e1SHisping Lin 						TEEC_NONE);
973ae8ec5e1SHisping Lin 
974ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9751f25ada2SHisping Lin 					141,
976ae8ec5e1SHisping Lin 					&TeecOperation,
977ae8ec5e1SHisping Lin 					&ErrorOrigin);
978ae8ec5e1SHisping Lin 
979ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
980ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
981ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
98246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
983*78ef5fbdSqiujian 	debug("write_to_keymaster end\n");
984ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
985ae8ec5e1SHisping Lin 
986ae8ec5e1SHisping Lin 	return TeecResult;
987ae8ec5e1SHisping Lin }
9886ef445a4SHisping Lin 
9896ef445a4SHisping Lin uint32_t trusty_read_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 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10216ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10226ef445a4SHisping Lin 
10236ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
10246ef445a4SHisping Lin 						TEEC_NONE,
10256ef445a4SHisping Lin 						TEEC_NONE,
10266ef445a4SHisping Lin 						TEEC_NONE);
10276ef445a4SHisping Lin 
10286ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10296ef445a4SHisping Lin 					0,
10306ef445a4SHisping Lin 					&TeecOperation,
10316ef445a4SHisping Lin 					&ErrorOrigin);
10326ef445a4SHisping Lin 
10336ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
10346ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
10356ef445a4SHisping Lin 
10366ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
10376ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
10386ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10396ef445a4SHisping Lin 
10406ef445a4SHisping Lin 	return TeecResult;
10416ef445a4SHisping Lin }
10426ef445a4SHisping Lin 
10436ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
10446ef445a4SHisping Lin {
10456ef445a4SHisping Lin 	TEEC_Result TeecResult;
10466ef445a4SHisping Lin 	TEEC_Context TeecContext;
10476ef445a4SHisping Lin 	TEEC_Session TeecSession;
10486ef445a4SHisping Lin 	uint32_t ErrorOrigin;
10496ef445a4SHisping Lin 
10506ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
10516ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
10526ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
10536ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
10546ef445a4SHisping Lin 
10556ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
10566ef445a4SHisping Lin 
10576ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
10586ef445a4SHisping Lin 
10596ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
10606ef445a4SHisping Lin 				&TeecSession,
10616ef445a4SHisping Lin 				TeecUuid,
10626ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
10636ef445a4SHisping Lin 				NULL,
10646ef445a4SHisping Lin 				NULL,
10656ef445a4SHisping Lin 				&ErrorOrigin);
10666ef445a4SHisping Lin 
10676ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
10686ef445a4SHisping Lin 
10696ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
10706ef445a4SHisping Lin 	SharedMem0.flags = 0;
10716ef445a4SHisping Lin 
10726ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
10736ef445a4SHisping Lin 
10746ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
10756ef445a4SHisping Lin 
10766ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10776ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10786ef445a4SHisping Lin 
10796ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
10806ef445a4SHisping Lin 						TEEC_NONE,
10816ef445a4SHisping Lin 						TEEC_NONE,
10826ef445a4SHisping Lin 						TEEC_NONE);
10836ef445a4SHisping Lin 
10846ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10856ef445a4SHisping Lin 					1,
10866ef445a4SHisping Lin 					&TeecOperation,
10876ef445a4SHisping Lin 					&ErrorOrigin);
10886ef445a4SHisping Lin 
10896ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
10906ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
10916ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10926ef445a4SHisping Lin 
10936ef445a4SHisping Lin 	return TeecResult;
10946ef445a4SHisping Lin }
109516539616SHisping Lin 
109616539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
109716539616SHisping Lin {
109816539616SHisping Lin 	TEEC_Result TeecResult;
109916539616SHisping Lin 	TEEC_Context TeecContext;
110016539616SHisping Lin 	TEEC_Session TeecSession;
110116539616SHisping Lin 	uint32_t ErrorOrigin;
110216539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
110316539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
110416539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
110516539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
110616539616SHisping Lin 
110716539616SHisping Lin 	OpteeClientApiLibInitialize();
110816539616SHisping Lin 
110916539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
111016539616SHisping Lin 
111116539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
111216539616SHisping Lin 				&TeecSession,
111316539616SHisping Lin 				TeecUuid,
111416539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
111516539616SHisping Lin 				NULL,
111616539616SHisping Lin 				NULL,
111716539616SHisping Lin 				&ErrorOrigin);
111816539616SHisping Lin 
111916539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
112016539616SHisping Lin 						TEEC_NONE,
112116539616SHisping Lin 						TEEC_NONE,
112216539616SHisping Lin 						TEEC_NONE);
112316539616SHisping Lin 
112416539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
112516539616SHisping Lin 					2,
112616539616SHisping Lin 					&TeecOperation,
112716539616SHisping Lin 					&ErrorOrigin);
112816539616SHisping Lin 
112916539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
113016539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
113116539616SHisping Lin 
113216539616SHisping Lin 	return TeecResult;
113316539616SHisping Lin }
113416539616SHisping Lin 
113516539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
113616539616SHisping Lin {
113716539616SHisping Lin 	TEEC_Result TeecResult;
113816539616SHisping Lin 	TEEC_Context TeecContext;
113916539616SHisping Lin 	TEEC_Session TeecSession;
114016539616SHisping Lin 	uint32_t ErrorOrigin;
114116539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
114216539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
114316539616SHisping Lin 
114416539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
114516539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
114616539616SHisping Lin 
114716539616SHisping Lin 	OpteeClientApiLibInitialize();
114816539616SHisping Lin 
114916539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
115016539616SHisping Lin 
115116539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
115216539616SHisping Lin 				&TeecSession,
115316539616SHisping Lin 				TeecUuid,
115416539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
115516539616SHisping Lin 				NULL,
115616539616SHisping Lin 				NULL,
115716539616SHisping Lin 				&ErrorOrigin);
115816539616SHisping Lin 
115916539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
116016539616SHisping Lin 						TEEC_NONE,
116116539616SHisping Lin 						TEEC_NONE,
116216539616SHisping Lin 						TEEC_NONE);
116316539616SHisping Lin 
116416539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
116516539616SHisping Lin 					2,
116616539616SHisping Lin 					&TeecOperation,
116716539616SHisping Lin 					&ErrorOrigin);
116816539616SHisping Lin 
116916539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
117016539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
117116539616SHisping Lin 
117216539616SHisping Lin 	return TeecResult;
117316539616SHisping Lin }
117416539616SHisping Lin 
117516539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
117616539616SHisping Lin {
117716539616SHisping Lin 	TEEC_Result res;
117816539616SHisping Lin 	res = notify_optee_rpmb_ta();
117916539616SHisping Lin 	res |= notify_optee_efuse_ta();
118016539616SHisping Lin 	return res;
118116539616SHisping Lin }
11822cd27853SHisping Lin 
11832cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
11842cd27853SHisping Lin {
11852cd27853SHisping Lin 	TEEC_Result TeecResult;
11862cd27853SHisping Lin 	TEEC_Context TeecContext;
11872cd27853SHisping Lin 	TEEC_Session TeecSession;
11882cd27853SHisping Lin 	uint32_t ErrorOrigin;
11892cd27853SHisping Lin 
11902cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11912cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11922cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11932cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
11942cd27853SHisping Lin 
11952cd27853SHisping Lin 	OpteeClientApiLibInitialize();
11962cd27853SHisping Lin 
11972cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
11982cd27853SHisping Lin 
11992cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
12002cd27853SHisping Lin 				&TeecSession,
12012cd27853SHisping Lin 				TeecUuid,
12022cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
12032cd27853SHisping Lin 				NULL,
12042cd27853SHisping Lin 				NULL,
12052cd27853SHisping Lin 				&ErrorOrigin);
12062cd27853SHisping Lin 
12072cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
12082cd27853SHisping Lin 
12092cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
12102cd27853SHisping Lin 	SharedMem0.flags = 0;
12112cd27853SHisping Lin 
12122cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
12132cd27853SHisping Lin 
12142cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12152cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12162cd27853SHisping Lin 
12172cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
12182cd27853SHisping Lin 						TEEC_NONE,
12192cd27853SHisping Lin 						TEEC_NONE,
12202cd27853SHisping Lin 						TEEC_NONE);
12212cd27853SHisping Lin 
12222cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12232cd27853SHisping Lin 					3,
12242cd27853SHisping Lin 					&TeecOperation,
12252cd27853SHisping Lin 					&ErrorOrigin);
12262cd27853SHisping Lin 
12272cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
12282cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
12292cd27853SHisping Lin 
12302cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12312cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
12322cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12332cd27853SHisping Lin 
12342cd27853SHisping Lin 	return TeecResult;
12352cd27853SHisping Lin }
12362cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
12372cd27853SHisping Lin {
12382cd27853SHisping Lin 	TEEC_Result TeecResult;
12392cd27853SHisping Lin 	TEEC_Context TeecContext;
12402cd27853SHisping Lin 	TEEC_Session TeecSession;
12412cd27853SHisping Lin 	uint32_t ErrorOrigin;
12422cd27853SHisping Lin 
12432cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
12442cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
12452cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
12462cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
12472cd27853SHisping Lin 
12482cd27853SHisping Lin 	OpteeClientApiLibInitialize();
12492cd27853SHisping Lin 
12502cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
12512cd27853SHisping Lin 
12522cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
12532cd27853SHisping Lin 				&TeecSession,
12542cd27853SHisping Lin 				TeecUuid,
12552cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
12562cd27853SHisping Lin 				NULL,
12572cd27853SHisping Lin 				NULL,
12582cd27853SHisping Lin 				&ErrorOrigin);
12592cd27853SHisping Lin 
12602cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
12612cd27853SHisping Lin 
12622cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
12632cd27853SHisping Lin 	SharedMem0.flags = 0;
12642cd27853SHisping Lin 
12652cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
12662cd27853SHisping Lin 
12672cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
12682cd27853SHisping Lin 
12692cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12702cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12712cd27853SHisping Lin 
12722cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
12732cd27853SHisping Lin 						TEEC_NONE,
12742cd27853SHisping Lin 						TEEC_NONE,
12752cd27853SHisping Lin 						TEEC_NONE);
12762cd27853SHisping Lin 
12772cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12782cd27853SHisping Lin 					4,
12792cd27853SHisping Lin 					&TeecOperation,
12802cd27853SHisping Lin 					&ErrorOrigin);
12812cd27853SHisping Lin 
12822cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12832cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
12842cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12852cd27853SHisping Lin 
12862cd27853SHisping Lin 	return TeecResult;
12872cd27853SHisping Lin }
1288095e2a82SHisping Lin 
1289468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1290468df3b2SHisping Lin {
1291468df3b2SHisping Lin 	TEEC_Result TeecResult;
1292468df3b2SHisping Lin 	TEEC_Context TeecContext;
1293468df3b2SHisping Lin 	TEEC_Session TeecSession;
1294468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1295468df3b2SHisping Lin 	uint32_t bootflag;
1296468df3b2SHisping Lin 
1297468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1298468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1299468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1300468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1301468df3b2SHisping Lin 
1302468df3b2SHisping Lin 	OpteeClientApiLibInitialize();
1303468df3b2SHisping Lin 
1304468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1305468df3b2SHisping Lin 
1306468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1307468df3b2SHisping Lin 				&TeecSession,
1308468df3b2SHisping Lin 				TeecUuid,
1309468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1310468df3b2SHisping Lin 				NULL,
1311468df3b2SHisping Lin 				NULL,
1312468df3b2SHisping Lin 				&ErrorOrigin);
1313468df3b2SHisping Lin 
1314468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1315468df3b2SHisping Lin 
1316468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1317468df3b2SHisping Lin 	SharedMem0.flags = 0;
1318468df3b2SHisping Lin 
1319468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1320468df3b2SHisping Lin 
1321468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1322468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1323468df3b2SHisping Lin 
1324468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1325468df3b2SHisping Lin 						TEEC_NONE,
1326468df3b2SHisping Lin 						TEEC_NONE,
1327468df3b2SHisping Lin 						TEEC_NONE);
1328468df3b2SHisping Lin 
1329468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1330468df3b2SHisping Lin 					5,
1331468df3b2SHisping Lin 					&TeecOperation,
1332468df3b2SHisping Lin 					&ErrorOrigin);
1333468df3b2SHisping Lin 
1334468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1335468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
1336468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1337468df3b2SHisping Lin 			*flag = 1;
1338468df3b2SHisping Lin 	}
1339468df3b2SHisping Lin 
1340468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1341468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1342468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1343468df3b2SHisping Lin 
1344468df3b2SHisping Lin 	return TeecResult;
1345468df3b2SHisping Lin }
1346468df3b2SHisping Lin 
1347095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1348095e2a82SHisping Lin {
1349095e2a82SHisping Lin 	TEEC_Result TeecResult;
1350095e2a82SHisping Lin 	TEEC_Context TeecContext;
1351095e2a82SHisping Lin 	TEEC_Session TeecSession;
1352095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1353095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1354095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1355095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1356095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
13573251364cSHisping Lin 	struct blk_desc *dev_desc;
13583251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1359095e2a82SHisping Lin 
1360095e2a82SHisping Lin 	debug("testmm start\n");
1361095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1362095e2a82SHisping Lin 
1363095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1364095e2a82SHisping Lin 
13653251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
13663251364cSHisping Lin 						TEEC_NONE,
13673251364cSHisping Lin 						TEEC_NONE,
13683251364cSHisping Lin 						TEEC_NONE);
13693251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
13703251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
13713251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
13723251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
13733251364cSHisping Lin #endif
13743251364cSHisping Lin 
1375095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1376095e2a82SHisping Lin 				&TeecSession,
1377095e2a82SHisping Lin 				TeecUuid,
1378095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1379095e2a82SHisping Lin 				NULL,
13803251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
1381095e2a82SHisping Lin 				NULL,
13823251364cSHisping Lin #endif
13833251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
13843251364cSHisping Lin 				&TeecOperation,
13853251364cSHisping Lin #endif
1386095e2a82SHisping Lin 				&ErrorOrigin);
1387095e2a82SHisping Lin 
1388095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1389095e2a82SHisping Lin 
1390095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1391095e2a82SHisping Lin 	SharedMem0.flags = 0;
1392095e2a82SHisping Lin 
1393095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1394095e2a82SHisping Lin 
1395095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1396095e2a82SHisping Lin 
1397095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1398095e2a82SHisping Lin 
1399095e2a82SHisping Lin 	SharedMem1.size = 1;
1400095e2a82SHisping Lin 	SharedMem1.flags = 0;
1401095e2a82SHisping Lin 
1402095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1403095e2a82SHisping Lin 
1404095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1405095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1406095e2a82SHisping Lin 
1407095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1408095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1409095e2a82SHisping Lin 
1410095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1411095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1412095e2a82SHisping Lin 						TEEC_NONE,
1413095e2a82SHisping Lin 						TEEC_NONE);
1414095e2a82SHisping Lin 
1415095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1416095e2a82SHisping Lin 					142,
1417095e2a82SHisping Lin 					&TeecOperation,
1418095e2a82SHisping Lin 					&ErrorOrigin);
1419095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1420095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1421095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1422095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1423095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1424095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1425095e2a82SHisping Lin 	debug("testmm end\n");
1426095e2a82SHisping Lin 
1427095e2a82SHisping Lin 	return TeecResult;
1428095e2a82SHisping Lin }
1429095e2a82SHisping Lin 
1430095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1431095e2a82SHisping Lin {
1432095e2a82SHisping Lin 	TEEC_Result TeecResult;
1433095e2a82SHisping Lin 	TEEC_Context TeecContext;
1434095e2a82SHisping Lin 	TEEC_Session TeecSession;
1435095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1436095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1437095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1438095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1439095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
14403251364cSHisping Lin 	struct blk_desc *dev_desc;
14413251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1442095e2a82SHisping Lin 
1443095e2a82SHisping Lin 	debug("testmm start\n");
1444095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1445095e2a82SHisping Lin 
1446095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1447095e2a82SHisping Lin 
14483251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
14493251364cSHisping Lin 						TEEC_NONE,
14503251364cSHisping Lin 						TEEC_NONE,
14513251364cSHisping Lin 						TEEC_NONE);
14523251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
14533251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
14543251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
14553251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
14563251364cSHisping Lin #endif
14573251364cSHisping Lin 
1458095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1459095e2a82SHisping Lin 				&TeecSession,
1460095e2a82SHisping Lin 				TeecUuid,
1461095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1462095e2a82SHisping Lin 				NULL,
14633251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
1464095e2a82SHisping Lin 				NULL,
14653251364cSHisping Lin #endif
14663251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
14673251364cSHisping Lin 				&TeecOperation,
14683251364cSHisping Lin #endif
1469095e2a82SHisping Lin 				&ErrorOrigin);
1470095e2a82SHisping Lin 
1471095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1472095e2a82SHisping Lin 
1473095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1474095e2a82SHisping Lin 	SharedMem0.flags = 0;
1475095e2a82SHisping Lin 
1476095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1477095e2a82SHisping Lin 
1478095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1479095e2a82SHisping Lin 
1480095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1481095e2a82SHisping Lin 
1482095e2a82SHisping Lin 	SharedMem1.size = 1;
1483095e2a82SHisping Lin 	SharedMem1.flags = 0;
1484095e2a82SHisping Lin 
1485095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1486095e2a82SHisping Lin 
1487095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1488095e2a82SHisping Lin 
1489095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1490095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1491095e2a82SHisping Lin 
1492095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1493095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1494095e2a82SHisping Lin 
1495095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1496095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1497095e2a82SHisping Lin 						TEEC_NONE,
1498095e2a82SHisping Lin 						TEEC_NONE);
1499095e2a82SHisping Lin 
1500095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1501095e2a82SHisping Lin 					141,
1502095e2a82SHisping Lin 					&TeecOperation,
1503095e2a82SHisping Lin 					&ErrorOrigin);
1504095e2a82SHisping Lin 
1505095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1506095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1507095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1508095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1509095e2a82SHisping Lin 	debug("testmm end\n");
1510095e2a82SHisping Lin 
1511095e2a82SHisping Lin 	return TeecResult;
1512095e2a82SHisping Lin }
15134aa61755SAndy Ye 
15144aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
15154aa61755SAndy Ye {
15164aa61755SAndy Ye 	TEEC_Result TeecResult;
15174aa61755SAndy Ye 	TEEC_Context TeecContext;
15184aa61755SAndy Ye 	TEEC_Session TeecSession;
15194aa61755SAndy Ye 	uint32_t ErrorOrigin;
15204aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15214aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15224aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15234aa61755SAndy Ye 				}
15244aa61755SAndy Ye 			     };
15254aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15264aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
15273251364cSHisping Lin 	struct blk_desc *dev_desc;
15283251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15294aa61755SAndy Ye 
15304aa61755SAndy Ye 	OpteeClientApiLibInitialize();
15314aa61755SAndy Ye 
15324aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
15334aa61755SAndy Ye 
15343251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15353251364cSHisping Lin 						TEEC_NONE,
15363251364cSHisping Lin 						TEEC_NONE,
15373251364cSHisping Lin 						TEEC_NONE);
15383251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
15393251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
15403251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15413251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15423251364cSHisping Lin #endif
15433251364cSHisping Lin 
15444aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15454aa61755SAndy Ye 				      &TeecSession,
15464aa61755SAndy Ye 				      TeecUuid,
15474aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15484aa61755SAndy Ye 				      NULL,
15493251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
15504aa61755SAndy Ye 					NULL,
15513251364cSHisping Lin #endif
15523251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
15533251364cSHisping Lin 					&TeecOperation,
15543251364cSHisping Lin #endif
15554aa61755SAndy Ye 				      &ErrorOrigin);
15564aa61755SAndy Ye 
15574aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
15584aa61755SAndy Ye 
15594aa61755SAndy Ye 	SharedMem0.size = *dh_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 					143,
15744aa61755SAndy Ye 					&TeecOperation,
15754aa61755SAndy Ye 					&ErrorOrigin);
15764aa61755SAndy Ye 
15774aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
15784aa61755SAndy Ye 	memcpy(dh, 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_uuid(uint8_t *uuid, uint32_t *uuid_size)
15894aa61755SAndy Ye {
15904aa61755SAndy Ye 	TEEC_Result TeecResult;
15914aa61755SAndy Ye 	TEEC_Context TeecContext;
15924aa61755SAndy Ye 	TEEC_Session TeecSession;
15934aa61755SAndy Ye 	uint32_t ErrorOrigin;
15944aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15954aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15964aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15974aa61755SAndy Ye 				}
15984aa61755SAndy Ye 			     };
15994aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16004aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16013251364cSHisping Lin 	struct blk_desc *dev_desc;
16023251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16034aa61755SAndy Ye 
16044aa61755SAndy Ye 	OpteeClientApiLibInitialize();
16054aa61755SAndy Ye 
16064aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16074aa61755SAndy Ye 
16083251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16093251364cSHisping Lin 						TEEC_NONE,
16103251364cSHisping Lin 						TEEC_NONE,
16113251364cSHisping Lin 						TEEC_NONE);
16123251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16133251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16143251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16153251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16163251364cSHisping Lin #endif
16173251364cSHisping Lin 
16184aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16194aa61755SAndy Ye 				      &TeecSession,
16204aa61755SAndy Ye 				      TeecUuid,
16214aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16224aa61755SAndy Ye 				      NULL,
16233251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
16244aa61755SAndy Ye 					NULL,
16253251364cSHisping Lin #endif
16263251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
16273251364cSHisping Lin 					&TeecOperation,
16283251364cSHisping Lin #endif
16294aa61755SAndy Ye 				      &ErrorOrigin);
16304aa61755SAndy Ye 
16314aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16324aa61755SAndy Ye 
16334aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
16344aa61755SAndy Ye 	SharedMem0.flags = 0;
16354aa61755SAndy Ye 
16364aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
16374aa61755SAndy Ye 
16384aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
16394aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
16404aa61755SAndy Ye 
16414aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
16424aa61755SAndy Ye 						    TEEC_NONE,
16434aa61755SAndy Ye 						    TEEC_NONE,
16444aa61755SAndy Ye 						    TEEC_NONE);
16454aa61755SAndy Ye 
16464aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16474aa61755SAndy Ye 					144,
16484aa61755SAndy Ye 					&TeecOperation,
16494aa61755SAndy Ye 					&ErrorOrigin);
16504aa61755SAndy Ye 
16514aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
16524aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
16534aa61755SAndy Ye 
16544aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
16554aa61755SAndy Ye 
16564aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
16574aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
16584aa61755SAndy Ye 
16594aa61755SAndy Ye 	return TeecResult;
16604aa61755SAndy Ye }
16614aa61755SAndy Ye 
16624aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
16634aa61755SAndy Ye 			      uint32_t *operation_size,
16644aa61755SAndy Ye 			      uint8_t *out,
16654aa61755SAndy Ye 			      uint32_t *out_len)
16664aa61755SAndy Ye {
16674aa61755SAndy Ye 	TEEC_Result TeecResult;
16684aa61755SAndy Ye 	TEEC_Context TeecContext;
16694aa61755SAndy Ye 	TEEC_Session TeecSession;
16704aa61755SAndy Ye 	uint32_t ErrorOrigin;
16714aa61755SAndy Ye 
16724aa61755SAndy Ye 	OpteeClientApiLibInitialize();
16734aa61755SAndy Ye 
16744aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16754aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16764aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16774aa61755SAndy Ye 				}
16784aa61755SAndy Ye 			     };
16794aa61755SAndy Ye 
16804aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16814aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16823251364cSHisping Lin 	struct blk_desc *dev_desc;
16833251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16844aa61755SAndy Ye 
16854aa61755SAndy Ye 	OpteeClientApiLibInitialize();
16864aa61755SAndy Ye 
16874aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16884aa61755SAndy Ye 
16893251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16903251364cSHisping Lin 						TEEC_NONE,
16913251364cSHisping Lin 						TEEC_NONE,
16923251364cSHisping Lin 						TEEC_NONE);
16933251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16943251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16953251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16963251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16973251364cSHisping Lin #endif
16983251364cSHisping Lin 
16994aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17004aa61755SAndy Ye 				      &TeecSession,
17014aa61755SAndy Ye 				      TeecUuid,
17024aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17034aa61755SAndy Ye 				      NULL,
17043251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
17054aa61755SAndy Ye 					NULL,
17063251364cSHisping Lin #endif
17073251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
17083251364cSHisping Lin 					&TeecOperation,
17093251364cSHisping Lin #endif
17104aa61755SAndy Ye 				      &ErrorOrigin);
17114aa61755SAndy Ye 
17124aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17134aa61755SAndy Ye 
17144aa61755SAndy Ye 	SharedMem0.size = *operation_size;
17154aa61755SAndy Ye 	SharedMem0.flags = 0;
17164aa61755SAndy Ye 
17174aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17184aa61755SAndy Ye 
17194aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
17204aa61755SAndy Ye 
17214aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17224aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17234aa61755SAndy Ye 
17244aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
17254aa61755SAndy Ye 
17264aa61755SAndy Ye 	SharedMem1.size = *out_len;
17274aa61755SAndy Ye 	SharedMem1.flags = 0;
17284aa61755SAndy Ye 
17294aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
17304aa61755SAndy Ye 
17314aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
17324aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
17334aa61755SAndy Ye 
17344aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17354aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
17364aa61755SAndy Ye 						    TEEC_NONE,
17374aa61755SAndy Ye 						    TEEC_NONE);
17384aa61755SAndy Ye 
17394aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17404aa61755SAndy Ye 					145,
17414aa61755SAndy Ye 					&TeecOperation,
17424aa61755SAndy Ye 					&ErrorOrigin);
17434aa61755SAndy Ye 
17444aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
17454aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
17464aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17474aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
17484aa61755SAndy Ye 
17494aa61755SAndy Ye 	return TeecResult;
17504aa61755SAndy Ye }
17514aa61755SAndy Ye 
17524aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
17534aa61755SAndy Ye {
17544aa61755SAndy Ye 	TEEC_Result TeecResult;
17554aa61755SAndy Ye 	TEEC_Context TeecContext;
17564aa61755SAndy Ye 	TEEC_Session TeecSession;
17574aa61755SAndy Ye 	uint32_t ErrorOrigin;
17584aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17594aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17604aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17614aa61755SAndy Ye 				}
17624aa61755SAndy Ye 			     };
17634aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17644aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17653251364cSHisping Lin 	struct blk_desc *dev_desc;
17663251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17674aa61755SAndy Ye 
17684aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
17694aa61755SAndy Ye 
17703251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17713251364cSHisping Lin 						TEEC_NONE,
17723251364cSHisping Lin 						TEEC_NONE,
17733251364cSHisping Lin 						TEEC_NONE);
17743251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
17753251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
17763251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17773251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17783251364cSHisping Lin #endif
17793251364cSHisping Lin 
17804aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17814aa61755SAndy Ye 					&TeecSession,
17824aa61755SAndy Ye 					TeecUuid,
17834aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
17844aa61755SAndy Ye 					NULL,
17853251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
17864aa61755SAndy Ye 					NULL,
17873251364cSHisping Lin #endif
17883251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
17893251364cSHisping Lin 					&TeecOperation,
17903251364cSHisping Lin #endif
17914aa61755SAndy Ye 					&ErrorOrigin);
17924aa61755SAndy Ye 
17934aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17944aa61755SAndy Ye 
17954aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
17964aa61755SAndy Ye 	SharedMem0.flags = 0;
17974aa61755SAndy Ye 
17984aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17994aa61755SAndy Ye 
18004aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
18014aa61755SAndy Ye 
18024aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18034aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18044aa61755SAndy Ye 
18054aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
18064aa61755SAndy Ye 						    TEEC_NONE,
18074aa61755SAndy Ye 						    TEEC_NONE,
18084aa61755SAndy Ye 						    TEEC_NONE);
18094aa61755SAndy Ye 
18104aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18114aa61755SAndy Ye 					146,
18124aa61755SAndy Ye 					&TeecOperation,
18134aa61755SAndy Ye 					&ErrorOrigin);
18144aa61755SAndy Ye 
18154aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18164aa61755SAndy Ye 
18174aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
18184aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
18194aa61755SAndy Ye 
18204aa61755SAndy Ye 	return TeecResult;
18214aa61755SAndy Ye }
1822*78ef5fbdSqiujian 
1823*78ef5fbdSqiujian TEEC_Result trusty_write_oem_unlock(uint8_t unlock)
1824*78ef5fbdSqiujian {
1825*78ef5fbdSqiujian 	char *file = "oem.unlock";
1826*78ef5fbdSqiujian 	TEEC_Result ret;
1827*78ef5fbdSqiujian 
1828*78ef5fbdSqiujian 	ret = write_to_keymaster((uint8_t *)file, strlen(file),
1829*78ef5fbdSqiujian 		(uint8_t *)&unlock, 1);
1830*78ef5fbdSqiujian 	return ret;
1831*78ef5fbdSqiujian }
1832*78ef5fbdSqiujian 
1833*78ef5fbdSqiujian TEEC_Result trusty_read_oem_unlock(uint8_t *unlock)
1834*78ef5fbdSqiujian {
1835*78ef5fbdSqiujian 	char *file = "oem.unlock";
1836*78ef5fbdSqiujian 	TEEC_Result ret;
1837*78ef5fbdSqiujian 
1838*78ef5fbdSqiujian 	ret = read_from_keymaster((uint8_t *)file, strlen(file),
1839*78ef5fbdSqiujian 		unlock, 1);
1840*78ef5fbdSqiujian 
1841*78ef5fbdSqiujian 	if (ret == TEE_ERROR_ITEM_NOT_FOUND) {
1842*78ef5fbdSqiujian 		debug("init oem unlock status 0");
1843*78ef5fbdSqiujian 		ret = trusty_write_oem_unlock(0);
1844*78ef5fbdSqiujian 	}
1845*78ef5fbdSqiujian 
1846*78ef5fbdSqiujian 	return ret;
1847*78ef5fbdSqiujian }