xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 6651d4c0fb8433da6f9737983230f0dd687b8fb1)
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();
26*6651d4c0SJason Zhu 	if (!dev_desc) {
27*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
28*6651d4c0SJason Zhu 		return;
29*6651d4c0SJason Zhu 	}
30ae8ec5e1SHisping Lin 
31ae8ec5e1SHisping Lin 	debug("testmm start\n");
32ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
33ae8ec5e1SHisping Lin 
34ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
35ae8ec5e1SHisping Lin 
363251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
373251364cSHisping Lin 						TEEC_NONE,
383251364cSHisping Lin 						TEEC_NONE,
393251364cSHisping Lin 						TEEC_NONE);
403251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
413251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
423251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
433251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
443251364cSHisping Lin #endif
453251364cSHisping Lin 
46ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
47ae8ec5e1SHisping Lin 				&TeecSession,
48ae8ec5e1SHisping Lin 				TeecUuid,
49ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
50ae8ec5e1SHisping Lin 				NULL,
513251364cSHisping Lin 				&TeecOperation,
52ae8ec5e1SHisping Lin 				&ErrorOrigin);
53ae8ec5e1SHisping Lin 
54ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
55ae8ec5e1SHisping Lin 
56ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
57ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
58ae8ec5e1SHisping Lin 
59ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
60ae8ec5e1SHisping Lin 
61ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
62ae8ec5e1SHisping Lin 
63ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
64ae8ec5e1SHisping Lin 
65ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
66ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
67ae8ec5e1SHisping Lin 
68ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
69ae8ec5e1SHisping Lin 
70ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
71ae8ec5e1SHisping Lin 
72ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
73ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
74ae8ec5e1SHisping Lin 
75ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
76ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
77ae8ec5e1SHisping Lin 
78ae8ec5e1SHisping Lin 
79ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
80ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
81ae8ec5e1SHisping Lin 						TEEC_NONE,
82ae8ec5e1SHisping Lin 						TEEC_NONE);
83ae8ec5e1SHisping Lin 
84ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
85ae8ec5e1SHisping Lin 					1,
86ae8ec5e1SHisping Lin 					&TeecOperation,
87ae8ec5e1SHisping Lin 					&ErrorOrigin);
88ae8ec5e1SHisping Lin 
89ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
90ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
91ae8ec5e1SHisping Lin 
92ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
93ae8ec5e1SHisping Lin 
9446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
95ae8ec5e1SHisping Lin 
96ae8ec5e1SHisping Lin 	debug("testmm end\n");
97ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
98ae8ec5e1SHisping Lin }
99ae8ec5e1SHisping Lin 
100ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
101ae8ec5e1SHisping Lin {
102ae8ec5e1SHisping Lin 	if (in > 9)
103ae8ec5e1SHisping Lin 		return in + 55;
104ae8ec5e1SHisping Lin 	else
105ae8ec5e1SHisping Lin 		return in + 48;
106ae8ec5e1SHisping Lin }
107ae8ec5e1SHisping Lin 
108ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
109ae8ec5e1SHisping Lin {
110ae8ec5e1SHisping Lin 	uint32_t i = 0;
111ae8ec5e1SHisping Lin 
112ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
113ae8ec5e1SHisping Lin 		return 0;
114ae8ec5e1SHisping Lin 
115ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
116ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
117ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
118ae8ec5e1SHisping Lin 	}
119ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
120ae8ec5e1SHisping Lin 
121ae8ec5e1SHisping Lin 	return blen * 2;
122ae8ec5e1SHisping Lin }
123ae8ec5e1SHisping Lin 
124ae8ec5e1SHisping Lin 
125ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
126ae8ec5e1SHisping Lin {
127ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
128ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
129ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
130ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
131ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
132ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
133ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
134ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
135ae8ec5e1SHisping Lin 	uint8_t hs[9];
136ae8ec5e1SHisping Lin 
1373251364cSHisping Lin 	struct blk_desc *dev_desc;
1383251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
139*6651d4c0SJason Zhu 	if (!dev_desc) {
140*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
141*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
142*6651d4c0SJason Zhu 	}
1433251364cSHisping Lin 
144ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
145ae8ec5e1SHisping Lin 	debug("testmm start\n");
146ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
147ae8ec5e1SHisping Lin 
148ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
149ae8ec5e1SHisping Lin 
1503251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1513251364cSHisping Lin 						TEEC_NONE,
1523251364cSHisping Lin 						TEEC_NONE,
1533251364cSHisping Lin 						TEEC_NONE);
1543251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1553251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1563251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1573251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1583251364cSHisping Lin #endif
1593251364cSHisping Lin 
160ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
161ae8ec5e1SHisping Lin 				&TeecSession,
162ae8ec5e1SHisping Lin 				TeecUuid,
163ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
164ae8ec5e1SHisping Lin 				NULL,
1653251364cSHisping Lin 				&TeecOperation,
166f303baf0SHisping Lin 
167ae8ec5e1SHisping Lin 				&ErrorOrigin);
168ae8ec5e1SHisping Lin 
169ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
170ae8ec5e1SHisping Lin 
171ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
172ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
173ae8ec5e1SHisping Lin 
174ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
175ae8ec5e1SHisping Lin 
176ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
177ae8ec5e1SHisping Lin 
178ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
179ae8ec5e1SHisping Lin 
180ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
181ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
182ae8ec5e1SHisping Lin 
183ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
184ae8ec5e1SHisping Lin 
185ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
186ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
187ae8ec5e1SHisping Lin 
188ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
189ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
190ae8ec5e1SHisping Lin 
191ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
192ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
193ae8ec5e1SHisping Lin 						TEEC_NONE,
194ae8ec5e1SHisping Lin 						TEEC_NONE);
195ae8ec5e1SHisping Lin 
196ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
197ae8ec5e1SHisping Lin 					0,
198ae8ec5e1SHisping Lin 					&TeecOperation,
199ae8ec5e1SHisping Lin 					&ErrorOrigin);
20046b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
201ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
202ae8ec5e1SHisping Lin 
203ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
204ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
205ae8ec5e1SHisping Lin 
206ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
207ae8ec5e1SHisping Lin 
20846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
209ae8ec5e1SHisping Lin 
210ae8ec5e1SHisping Lin 	debug("testmm end\n");
211ae8ec5e1SHisping Lin 	return TeecResult;
212ae8ec5e1SHisping Lin }
213ae8ec5e1SHisping Lin 
214ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
215ae8ec5e1SHisping Lin {
216ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
217ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
218ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
219ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
220ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
221ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
222ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
223ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
224ae8ec5e1SHisping Lin 	uint8_t hs[9];
2253251364cSHisping Lin 	struct blk_desc *dev_desc;
2263251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
227*6651d4c0SJason Zhu 	if (!dev_desc) {
228*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
229*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
230*6651d4c0SJason Zhu 	}
2313251364cSHisping Lin 
232ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
233ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
234ae8ec5e1SHisping Lin 
235ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
236ae8ec5e1SHisping Lin 
2373251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2383251364cSHisping Lin 						TEEC_NONE,
2393251364cSHisping Lin 						TEEC_NONE,
2403251364cSHisping Lin 						TEEC_NONE);
2413251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2423251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
2433251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
2443251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
2453251364cSHisping Lin #endif
2463251364cSHisping Lin 
247ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
248ae8ec5e1SHisping Lin 				&TeecSession,
249ae8ec5e1SHisping Lin 				TeecUuid,
250ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
251ae8ec5e1SHisping Lin 				NULL,
2523251364cSHisping Lin 				&TeecOperation,
253ae8ec5e1SHisping Lin 				&ErrorOrigin);
254ae8ec5e1SHisping Lin 
255ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
256ae8ec5e1SHisping Lin 
257ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
258ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
259ae8ec5e1SHisping Lin 
260ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
261ae8ec5e1SHisping Lin 
262ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
263ae8ec5e1SHisping Lin 
264ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
265ae8ec5e1SHisping Lin 
266ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
267ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
268ae8ec5e1SHisping Lin 
269ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
270ae8ec5e1SHisping Lin 
271ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
274ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
275ae8ec5e1SHisping Lin 
276ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
277ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
278ae8ec5e1SHisping Lin 
279ae8ec5e1SHisping Lin 
280ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
281ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
282ae8ec5e1SHisping Lin 						TEEC_NONE,
283ae8ec5e1SHisping Lin 						TEEC_NONE);
284ae8ec5e1SHisping Lin 
285ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
286ae8ec5e1SHisping Lin 					1,
287ae8ec5e1SHisping Lin 					&TeecOperation,
288ae8ec5e1SHisping Lin 					&ErrorOrigin);
289ae8ec5e1SHisping Lin 
290ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
291ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
292ae8ec5e1SHisping Lin 
293ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
294ae8ec5e1SHisping Lin 
29546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
296ae8ec5e1SHisping Lin 
297ae8ec5e1SHisping Lin 	debug("testmm end\n");
298ae8ec5e1SHisping Lin 
299ae8ec5e1SHisping Lin 	return TeecResult;
300ae8ec5e1SHisping Lin }
301ae8ec5e1SHisping Lin 
302ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
303ae8ec5e1SHisping Lin {
304ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
305ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
306ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
307ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
30846b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
30946b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
310ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
311ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
3123251364cSHisping Lin 	struct blk_desc *dev_desc;
3133251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
314*6651d4c0SJason Zhu 	if (!dev_desc) {
315*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
316*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
317*6651d4c0SJason Zhu 	}
318ae8ec5e1SHisping Lin 
319ae8ec5e1SHisping Lin 	debug("testmm start\n");
320ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
321ae8ec5e1SHisping Lin 
322ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
323ae8ec5e1SHisping Lin 
3243251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3253251364cSHisping Lin 						TEEC_NONE,
3263251364cSHisping Lin 						TEEC_NONE,
3273251364cSHisping Lin 						TEEC_NONE);
3283251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
3293251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
3303251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3313251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3323251364cSHisping Lin #endif
3333251364cSHisping Lin 
334ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
335ae8ec5e1SHisping Lin 				&TeecSession,
336ae8ec5e1SHisping Lin 				TeecUuid,
337ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
338ae8ec5e1SHisping Lin 				NULL,
3393251364cSHisping Lin 				&TeecOperation,
340ae8ec5e1SHisping Lin 				&ErrorOrigin);
341ae8ec5e1SHisping Lin 
342ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
343ae8ec5e1SHisping Lin 
344ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
345ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
346ae8ec5e1SHisping Lin 
347ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
348ae8ec5e1SHisping Lin 
349ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
350ae8ec5e1SHisping Lin 
351ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
352ae8ec5e1SHisping Lin 
353ae8ec5e1SHisping Lin 	SharedMem1.size = size;
354ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
355ae8ec5e1SHisping Lin 
356ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
357ae8ec5e1SHisping Lin 
358ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
359ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
360ae8ec5e1SHisping Lin 
361ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
362ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
363ae8ec5e1SHisping Lin 
364ae8ec5e1SHisping Lin 
365ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
366ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
367ae8ec5e1SHisping Lin 						TEEC_NONE,
368ae8ec5e1SHisping Lin 						TEEC_NONE);
369ae8ec5e1SHisping Lin 
370ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
37146b2a054SHisping Lin 					142,
372ae8ec5e1SHisping Lin 					&TeecOperation,
373ae8ec5e1SHisping Lin 					&ErrorOrigin);
37446b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
375ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
376ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
377ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
378ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
37946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
380ae8ec5e1SHisping Lin 	debug("testmm end\n");
381ae8ec5e1SHisping Lin 
382ae8ec5e1SHisping Lin 	return TeecResult;
383ae8ec5e1SHisping Lin }
384ae8ec5e1SHisping Lin 
385ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
386ae8ec5e1SHisping Lin {
387ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
388ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
389ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
390ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
39146b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
39246b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
393ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
394ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
3953251364cSHisping Lin 	struct blk_desc *dev_desc;
3963251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
397*6651d4c0SJason Zhu 	if (!dev_desc) {
398*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
399*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
400*6651d4c0SJason Zhu 	}
401ae8ec5e1SHisping Lin 
402ae8ec5e1SHisping Lin 	debug("testmm start\n");
403ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
404ae8ec5e1SHisping Lin 
405ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
406ae8ec5e1SHisping Lin 
4073251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4083251364cSHisping Lin 						TEEC_NONE,
4093251364cSHisping Lin 						TEEC_NONE,
4103251364cSHisping Lin 						TEEC_NONE);
4113251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
4123251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
4133251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4143251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4153251364cSHisping Lin #endif
4163251364cSHisping Lin 
417ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
418ae8ec5e1SHisping Lin 				&TeecSession,
419ae8ec5e1SHisping Lin 				TeecUuid,
420ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
421ae8ec5e1SHisping Lin 				NULL,
4223251364cSHisping Lin 				&TeecOperation,
423ae8ec5e1SHisping Lin 				&ErrorOrigin);
424ae8ec5e1SHisping Lin 
425ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
426ae8ec5e1SHisping Lin 
427ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
428ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
429ae8ec5e1SHisping Lin 
430ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
431ae8ec5e1SHisping Lin 
432ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
433ae8ec5e1SHisping Lin 
434ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
435ae8ec5e1SHisping Lin 
436ae8ec5e1SHisping Lin 	SharedMem1.size = size;
437ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
438ae8ec5e1SHisping Lin 
439ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
440ae8ec5e1SHisping Lin 
441ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
442ae8ec5e1SHisping Lin 
443ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
444ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
445ae8ec5e1SHisping Lin 
446ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
447ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
448ae8ec5e1SHisping Lin 
449ae8ec5e1SHisping Lin 
450ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
451ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
452ae8ec5e1SHisping Lin 						TEEC_NONE,
453ae8ec5e1SHisping Lin 						TEEC_NONE);
454ae8ec5e1SHisping Lin 
455ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
45646b2a054SHisping Lin 					141,
457ae8ec5e1SHisping Lin 					&TeecOperation,
458ae8ec5e1SHisping Lin 					&ErrorOrigin);
459ae8ec5e1SHisping Lin 
460ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
461ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
462ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
46346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
464ae8ec5e1SHisping Lin 	debug("testmm end\n");
465ae8ec5e1SHisping Lin 
466ae8ec5e1SHisping Lin 	return TeecResult;
467ae8ec5e1SHisping Lin }
468ae8ec5e1SHisping Lin 
469ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
470ae8ec5e1SHisping Lin {
471ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
472ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
473ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
474ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
475ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
476ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
477ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
478ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
4793251364cSHisping Lin 	struct blk_desc *dev_desc;
4803251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
481*6651d4c0SJason Zhu 	if (!dev_desc) {
482*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
483*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
484*6651d4c0SJason Zhu 	}
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 				&TeecOperation,
507ae8ec5e1SHisping Lin 				&ErrorOrigin);
508ae8ec5e1SHisping Lin 
509ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
510ae8ec5e1SHisping Lin 
511ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
512ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
513ae8ec5e1SHisping Lin 
514ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
515ae8ec5e1SHisping Lin 
516ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
517ae8ec5e1SHisping Lin 
518ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
519ae8ec5e1SHisping Lin 
520ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
521ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
522ae8ec5e1SHisping Lin 
523ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
524ae8ec5e1SHisping Lin 
525ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
526ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
527ae8ec5e1SHisping Lin 
528ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
529ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
530ae8ec5e1SHisping Lin 
531ae8ec5e1SHisping Lin 
532ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
533ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
534ae8ec5e1SHisping Lin 						TEEC_NONE,
535ae8ec5e1SHisping Lin 						TEEC_NONE);
536ae8ec5e1SHisping Lin 
537ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
538ae8ec5e1SHisping Lin 					0,
539ae8ec5e1SHisping Lin 					&TeecOperation,
540ae8ec5e1SHisping Lin 					&ErrorOrigin);
54146b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
542ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
543ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
544ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
545ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
54646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
547ae8ec5e1SHisping Lin 	debug("testmm end\n");
548ae8ec5e1SHisping Lin 
549ae8ec5e1SHisping Lin 	return TeecResult;
550ae8ec5e1SHisping Lin }
551ae8ec5e1SHisping Lin 
552ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
553ae8ec5e1SHisping Lin {
554ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
555ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
556ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
557ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
558ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
559ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
560ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
561ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
5623251364cSHisping Lin 	struct blk_desc *dev_desc;
5633251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
564*6651d4c0SJason Zhu 	if (!dev_desc) {
565*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
566*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
567*6651d4c0SJason Zhu 	}
568ae8ec5e1SHisping Lin 
569ae8ec5e1SHisping Lin 	debug("testmm start\n");
570ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
571ae8ec5e1SHisping Lin 
572ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
573ae8ec5e1SHisping Lin 
5743251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
5753251364cSHisping Lin 						TEEC_NONE,
5763251364cSHisping Lin 						TEEC_NONE,
5773251364cSHisping Lin 						TEEC_NONE);
5783251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
5793251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
5803251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
5813251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
5823251364cSHisping Lin #endif
5833251364cSHisping Lin 
584ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
585ae8ec5e1SHisping Lin 				&TeecSession,
586ae8ec5e1SHisping Lin 				TeecUuid,
587ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
588ae8ec5e1SHisping Lin 				NULL,
5893251364cSHisping Lin 				&TeecOperation,
590ae8ec5e1SHisping Lin 				&ErrorOrigin);
591ae8ec5e1SHisping Lin 
592ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
593ae8ec5e1SHisping Lin 
594ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
595ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
596ae8ec5e1SHisping Lin 
597ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
598ae8ec5e1SHisping Lin 
599ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
600ae8ec5e1SHisping Lin 
601ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
602ae8ec5e1SHisping Lin 
603ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
604ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
605ae8ec5e1SHisping Lin 
606ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
607ae8ec5e1SHisping Lin 
608ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
609ae8ec5e1SHisping Lin 
610ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
611ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
612ae8ec5e1SHisping Lin 
613ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
614ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
615ae8ec5e1SHisping Lin 
616ae8ec5e1SHisping Lin 
617ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
618ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
619ae8ec5e1SHisping Lin 						TEEC_NONE,
620ae8ec5e1SHisping Lin 						TEEC_NONE);
621ae8ec5e1SHisping Lin 
622ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
623ae8ec5e1SHisping Lin 					1,
624ae8ec5e1SHisping Lin 					&TeecOperation,
625ae8ec5e1SHisping Lin 					&ErrorOrigin);
626ae8ec5e1SHisping Lin 
627ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
628ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
629ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
63046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
631ae8ec5e1SHisping Lin 	debug("testmm end\n");
632ae8ec5e1SHisping Lin 
633ae8ec5e1SHisping Lin 	return TeecResult;
634ae8ec5e1SHisping Lin }
635ae8ec5e1SHisping Lin 
636ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
637ae8ec5e1SHisping Lin {
638ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
639ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
640ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
641ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
642ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
643ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
644ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
645ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
6463251364cSHisping Lin 	struct blk_desc *dev_desc;
6473251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
648*6651d4c0SJason Zhu 	if (!dev_desc) {
649*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
650*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
651*6651d4c0SJason Zhu 	}
652ae8ec5e1SHisping Lin 
653ae8ec5e1SHisping Lin 	debug("testmm start\n");
654ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
655ae8ec5e1SHisping Lin 
656ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
657ae8ec5e1SHisping Lin 
6583251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6593251364cSHisping Lin 						TEEC_NONE,
6603251364cSHisping Lin 						TEEC_NONE,
6613251364cSHisping Lin 						TEEC_NONE);
6623251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
6633251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
6643251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6653251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6663251364cSHisping Lin #endif
667ae8ec5e1SHisping Lin 
668ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
669ae8ec5e1SHisping Lin 				&TeecSession,
670ae8ec5e1SHisping Lin 				TeecUuid,
671ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
672ae8ec5e1SHisping Lin 				NULL,
6733251364cSHisping Lin 				&TeecOperation,
674ae8ec5e1SHisping Lin 				&ErrorOrigin);
675ae8ec5e1SHisping Lin 
676ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
677ae8ec5e1SHisping Lin 
678ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
679ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
680ae8ec5e1SHisping Lin 
681ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
682ae8ec5e1SHisping Lin 
683ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
684ae8ec5e1SHisping Lin 
685ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
686ae8ec5e1SHisping Lin 
687ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
688ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
689ae8ec5e1SHisping Lin 
690ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
691ae8ec5e1SHisping Lin 
692ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
693ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
694ae8ec5e1SHisping Lin 
695ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
696ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
697ae8ec5e1SHisping Lin 
698ae8ec5e1SHisping Lin 
699ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
700ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
701ae8ec5e1SHisping Lin 						TEEC_NONE,
702ae8ec5e1SHisping Lin 						TEEC_NONE);
703ae8ec5e1SHisping Lin 
704ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
705ae8ec5e1SHisping Lin 					0,
706ae8ec5e1SHisping Lin 					&TeecOperation,
707ae8ec5e1SHisping Lin 					&ErrorOrigin);
70846b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
709ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
710ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
711ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
712ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
71346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
714ae8ec5e1SHisping Lin 	debug("testmm end\n");
715ae8ec5e1SHisping Lin 
716ae8ec5e1SHisping Lin 	return TeecResult;
717ae8ec5e1SHisping Lin }
718ae8ec5e1SHisping Lin 
719ae8ec5e1SHisping Lin 
720ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
721ae8ec5e1SHisping Lin {
722ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
723ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
724ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
725ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
726ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
727ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
728ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
729ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
7303251364cSHisping Lin 	struct blk_desc *dev_desc;
7313251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
732*6651d4c0SJason Zhu 	if (!dev_desc) {
733*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
734*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
735*6651d4c0SJason Zhu 	}
736ae8ec5e1SHisping Lin 
737ae8ec5e1SHisping Lin 	debug("testmm start\n");
738ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
739ae8ec5e1SHisping Lin 
740ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
741ae8ec5e1SHisping Lin 
7423251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7433251364cSHisping Lin 						TEEC_NONE,
7443251364cSHisping Lin 						TEEC_NONE,
7453251364cSHisping Lin 						TEEC_NONE);
7463251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
7473251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
7483251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7493251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7503251364cSHisping Lin #endif
7513251364cSHisping Lin 
752ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
753ae8ec5e1SHisping Lin 				&TeecSession,
754ae8ec5e1SHisping Lin 				TeecUuid,
755ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
756ae8ec5e1SHisping Lin 				NULL,
7573251364cSHisping Lin 				&TeecOperation,
758ae8ec5e1SHisping Lin 				&ErrorOrigin);
759ae8ec5e1SHisping Lin 
760ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
761ae8ec5e1SHisping Lin 
762ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
763ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
764ae8ec5e1SHisping Lin 
765ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
766ae8ec5e1SHisping Lin 
767ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
768ae8ec5e1SHisping Lin 
769ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
770ae8ec5e1SHisping Lin 
771ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
772ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
773ae8ec5e1SHisping Lin 
774ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
775ae8ec5e1SHisping Lin 
776ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
777ae8ec5e1SHisping Lin 
778ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
779ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
780ae8ec5e1SHisping Lin 
781ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
782ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
783ae8ec5e1SHisping Lin 
784ae8ec5e1SHisping Lin 
785ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
786ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
787ae8ec5e1SHisping Lin 						TEEC_NONE,
788ae8ec5e1SHisping Lin 						TEEC_NONE);
789ae8ec5e1SHisping Lin 
790ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
791ae8ec5e1SHisping Lin 					1,
792ae8ec5e1SHisping Lin 					&TeecOperation,
793ae8ec5e1SHisping Lin 					&ErrorOrigin);
794ae8ec5e1SHisping Lin 
795ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
796ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
797ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
79846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
799ae8ec5e1SHisping Lin 	debug("testmm end\n");
800ae8ec5e1SHisping Lin 
801ae8ec5e1SHisping Lin 	return TeecResult;
802ae8ec5e1SHisping Lin }
803ae8ec5e1SHisping Lin 
80478ef5fbdSqiujian TEEC_Result read_from_keymaster(uint8_t *filename,
80578ef5fbdSqiujian 		uint32_t filename_size,
80678ef5fbdSqiujian 		uint8_t *data,
80778ef5fbdSqiujian 		uint32_t size)
80878ef5fbdSqiujian {
80978ef5fbdSqiujian 	TEEC_Result TeecResult;
81078ef5fbdSqiujian 	TEEC_Context TeecContext;
81178ef5fbdSqiujian 	TEEC_Session TeecSession;
81278ef5fbdSqiujian 	uint32_t ErrorOrigin;
81378ef5fbdSqiujian 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
81478ef5fbdSqiujian 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
81578ef5fbdSqiujian 	TEEC_UUID *TeecUuid = &tempuuid;
81678ef5fbdSqiujian 	TEEC_Operation TeecOperation = {0};
81778ef5fbdSqiujian 	struct blk_desc *dev_desc;
81878ef5fbdSqiujian 	dev_desc = rockchip_get_bootdev();
819*6651d4c0SJason Zhu 	if (!dev_desc) {
820*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
821*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
822*6651d4c0SJason Zhu 	}
82378ef5fbdSqiujian 
82478ef5fbdSqiujian 	debug("read_from_keymaster start\n");
82578ef5fbdSqiujian 	OpteeClientApiLibInitialize();
82678ef5fbdSqiujian 
82778ef5fbdSqiujian 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
82878ef5fbdSqiujian 
82978ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
83078ef5fbdSqiujian 						TEEC_NONE,
83178ef5fbdSqiujian 						TEEC_NONE,
83278ef5fbdSqiujian 						TEEC_NONE);
83378ef5fbdSqiujian 	/*0 nand or emmc "security" partition , 1 rpmb*/
83478ef5fbdSqiujian 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
83578ef5fbdSqiujian #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
83678ef5fbdSqiujian 	TeecOperation.params[0].value.a = 0;
83778ef5fbdSqiujian #endif
83878ef5fbdSqiujian 
83978ef5fbdSqiujian 	TeecResult = TEEC_OpenSession(&TeecContext,
84078ef5fbdSqiujian 				&TeecSession,
84178ef5fbdSqiujian 				TeecUuid,
84278ef5fbdSqiujian 				TEEC_LOGIN_PUBLIC,
84378ef5fbdSqiujian 				NULL,
84478ef5fbdSqiujian 				&TeecOperation,
84578ef5fbdSqiujian 				&ErrorOrigin);
84678ef5fbdSqiujian 
84778ef5fbdSqiujian 	TEEC_SharedMemory SharedMem0 = {0};
84878ef5fbdSqiujian 
84978ef5fbdSqiujian 	SharedMem0.size = filename_size;
85078ef5fbdSqiujian 	SharedMem0.flags = 0;
85178ef5fbdSqiujian 
85278ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
85378ef5fbdSqiujian 
85478ef5fbdSqiujian 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
85578ef5fbdSqiujian 
85678ef5fbdSqiujian 	TEEC_SharedMemory SharedMem1 = {0};
85778ef5fbdSqiujian 
85878ef5fbdSqiujian 	SharedMem1.size = size;
85978ef5fbdSqiujian 	SharedMem1.flags = 0;
86078ef5fbdSqiujian 
86178ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
86278ef5fbdSqiujian 
86378ef5fbdSqiujian 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
86478ef5fbdSqiujian 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
86578ef5fbdSqiujian 
86678ef5fbdSqiujian 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
86778ef5fbdSqiujian 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
86878ef5fbdSqiujian 
86978ef5fbdSqiujian 
87078ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
87178ef5fbdSqiujian 						TEEC_MEMREF_TEMP_INOUT,
87278ef5fbdSqiujian 						TEEC_NONE,
87378ef5fbdSqiujian 						TEEC_NONE);
87478ef5fbdSqiujian 
87578ef5fbdSqiujian 	TeecResult = TEEC_InvokeCommand(&TeecSession,
87678ef5fbdSqiujian 					142,
87778ef5fbdSqiujian 					&TeecOperation,
87878ef5fbdSqiujian 					&ErrorOrigin);
87978ef5fbdSqiujian 	if (TeecResult == TEEC_SUCCESS)
88078ef5fbdSqiujian 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
88178ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem0);
88278ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem1);
88378ef5fbdSqiujian 	TEEC_CloseSession(&TeecSession);
88478ef5fbdSqiujian 	TEEC_FinalizeContext(&TeecContext);
88578ef5fbdSqiujian 	debug("read_from_keymaster end\n");
88678ef5fbdSqiujian 
88778ef5fbdSqiujian 	return TeecResult;
88878ef5fbdSqiujian }
88978ef5fbdSqiujian 
890ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
891ae8ec5e1SHisping Lin 		uint32_t filename_size,
892ae8ec5e1SHisping Lin 		uint8_t *data,
893ae8ec5e1SHisping Lin 		uint32_t data_size)
894ae8ec5e1SHisping Lin {
895ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
896ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
897ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
898ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
899ae8ec5e1SHisping Lin 
900ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
901ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
902ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
903ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
9043251364cSHisping Lin 	struct blk_desc *dev_desc;
9053251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
906*6651d4c0SJason Zhu 	if (!dev_desc) {
907*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
908*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
909*6651d4c0SJason Zhu 	}
910ae8ec5e1SHisping Lin 
911ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
912ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
913ae8ec5e1SHisping Lin 
914ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
915ae8ec5e1SHisping Lin 
9163251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9173251364cSHisping Lin 						TEEC_NONE,
9183251364cSHisping Lin 						TEEC_NONE,
9193251364cSHisping Lin 						TEEC_NONE);
9203251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
9213251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
9223251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9233251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9243251364cSHisping Lin #endif
9253251364cSHisping Lin 
926ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
927ae8ec5e1SHisping Lin 				&TeecSession,
928ae8ec5e1SHisping Lin 				TeecUuid,
929ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
930ae8ec5e1SHisping Lin 				NULL,
9313251364cSHisping Lin 				&TeecOperation,
932ae8ec5e1SHisping Lin 				&ErrorOrigin);
933ae8ec5e1SHisping Lin 
934ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
935ae8ec5e1SHisping Lin 
936ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
937ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
938ae8ec5e1SHisping Lin 
939ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
940ae8ec5e1SHisping Lin 
941ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
942ae8ec5e1SHisping Lin 
943ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
944ae8ec5e1SHisping Lin 
945ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
946ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
947ae8ec5e1SHisping Lin 
948ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
949ae8ec5e1SHisping Lin 
950ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
951ae8ec5e1SHisping Lin 
952ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
953ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
954ae8ec5e1SHisping Lin 
955ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
956ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
957ae8ec5e1SHisping Lin 
958ae8ec5e1SHisping Lin 
959ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
960ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
961ae8ec5e1SHisping Lin 						TEEC_NONE,
962ae8ec5e1SHisping Lin 						TEEC_NONE);
963ae8ec5e1SHisping Lin 
964ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9651f25ada2SHisping Lin 					141,
966ae8ec5e1SHisping Lin 					&TeecOperation,
967ae8ec5e1SHisping Lin 					&ErrorOrigin);
968ae8ec5e1SHisping Lin 
969ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
970ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
971ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
97246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
97378ef5fbdSqiujian 	debug("write_to_keymaster end\n");
974ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
975ae8ec5e1SHisping Lin 
976ae8ec5e1SHisping Lin 	return TeecResult;
977ae8ec5e1SHisping Lin }
9786ef445a4SHisping Lin 
9796ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
9806ef445a4SHisping Lin {
9816ef445a4SHisping Lin 	TEEC_Result TeecResult;
9826ef445a4SHisping Lin 	TEEC_Context TeecContext;
9836ef445a4SHisping Lin 	TEEC_Session TeecSession;
9846ef445a4SHisping Lin 	uint32_t ErrorOrigin;
9856ef445a4SHisping Lin 
9866ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
9876ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9886ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9896ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
9906ef445a4SHisping Lin 
9916ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
9926ef445a4SHisping Lin 
9936ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9946ef445a4SHisping Lin 
9956ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9966ef445a4SHisping Lin 				&TeecSession,
9976ef445a4SHisping Lin 				TeecUuid,
9986ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
9996ef445a4SHisping Lin 				NULL,
10006ef445a4SHisping Lin 				NULL,
10016ef445a4SHisping Lin 				&ErrorOrigin);
10026ef445a4SHisping Lin 
10036ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
10046ef445a4SHisping Lin 
10056ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
10066ef445a4SHisping Lin 	SharedMem0.flags = 0;
10076ef445a4SHisping Lin 
10086ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
10096ef445a4SHisping Lin 
10106ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10116ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10126ef445a4SHisping Lin 
10136ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
10146ef445a4SHisping Lin 						TEEC_NONE,
10156ef445a4SHisping Lin 						TEEC_NONE,
10166ef445a4SHisping Lin 						TEEC_NONE);
10176ef445a4SHisping Lin 
10186ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10196ef445a4SHisping Lin 					0,
10206ef445a4SHisping Lin 					&TeecOperation,
10216ef445a4SHisping Lin 					&ErrorOrigin);
10226ef445a4SHisping Lin 
10236ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
10246ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
10256ef445a4SHisping Lin 
10266ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
10276ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
10286ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10296ef445a4SHisping Lin 
10306ef445a4SHisping Lin 	return TeecResult;
10316ef445a4SHisping Lin }
10326ef445a4SHisping Lin 
10336ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
10346ef445a4SHisping Lin {
10356ef445a4SHisping Lin 	TEEC_Result TeecResult;
10366ef445a4SHisping Lin 	TEEC_Context TeecContext;
10376ef445a4SHisping Lin 	TEEC_Session TeecSession;
10386ef445a4SHisping Lin 	uint32_t ErrorOrigin;
10396ef445a4SHisping Lin 
10406ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
10416ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
10426ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
10436ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
10446ef445a4SHisping Lin 
10456ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
10466ef445a4SHisping Lin 
10476ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
10486ef445a4SHisping Lin 
10496ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
10506ef445a4SHisping Lin 				&TeecSession,
10516ef445a4SHisping Lin 				TeecUuid,
10526ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
10536ef445a4SHisping Lin 				NULL,
10546ef445a4SHisping Lin 				NULL,
10556ef445a4SHisping Lin 				&ErrorOrigin);
10566ef445a4SHisping Lin 
10576ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
10586ef445a4SHisping Lin 
10596ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
10606ef445a4SHisping Lin 	SharedMem0.flags = 0;
10616ef445a4SHisping Lin 
10626ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
10636ef445a4SHisping Lin 
10646ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
10656ef445a4SHisping Lin 
10666ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10676ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10686ef445a4SHisping Lin 
10696ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
10706ef445a4SHisping Lin 						TEEC_NONE,
10716ef445a4SHisping Lin 						TEEC_NONE,
10726ef445a4SHisping Lin 						TEEC_NONE);
10736ef445a4SHisping Lin 
10746ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10756ef445a4SHisping Lin 					1,
10766ef445a4SHisping Lin 					&TeecOperation,
10776ef445a4SHisping Lin 					&ErrorOrigin);
10786ef445a4SHisping Lin 
10796ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
10806ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
10816ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10826ef445a4SHisping Lin 
10836ef445a4SHisping Lin 	return TeecResult;
10846ef445a4SHisping Lin }
108516539616SHisping Lin 
108616539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
108716539616SHisping Lin {
108816539616SHisping Lin 	TEEC_Result TeecResult;
108916539616SHisping Lin 	TEEC_Context TeecContext;
109016539616SHisping Lin 	TEEC_Session TeecSession;
109116539616SHisping Lin 	uint32_t ErrorOrigin;
109216539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
109316539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
109416539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
109516539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
109616539616SHisping Lin 
109716539616SHisping Lin 	OpteeClientApiLibInitialize();
109816539616SHisping Lin 
109916539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
110016539616SHisping Lin 
110116539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
110216539616SHisping Lin 				&TeecSession,
110316539616SHisping Lin 				TeecUuid,
110416539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
110516539616SHisping Lin 				NULL,
110616539616SHisping Lin 				NULL,
110716539616SHisping Lin 				&ErrorOrigin);
110816539616SHisping Lin 
110916539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
111016539616SHisping Lin 						TEEC_NONE,
111116539616SHisping Lin 						TEEC_NONE,
111216539616SHisping Lin 						TEEC_NONE);
111316539616SHisping Lin 
111416539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
111516539616SHisping Lin 					2,
111616539616SHisping Lin 					&TeecOperation,
111716539616SHisping Lin 					&ErrorOrigin);
111816539616SHisping Lin 
111916539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
112016539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
112116539616SHisping Lin 
112216539616SHisping Lin 	return TeecResult;
112316539616SHisping Lin }
112416539616SHisping Lin 
112516539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
112616539616SHisping Lin {
112716539616SHisping Lin 	TEEC_Result TeecResult;
112816539616SHisping Lin 	TEEC_Context TeecContext;
112916539616SHisping Lin 	TEEC_Session TeecSession;
113016539616SHisping Lin 	uint32_t ErrorOrigin;
113116539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
113216539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
113316539616SHisping Lin 
113416539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
113516539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
113616539616SHisping Lin 
113716539616SHisping Lin 	OpteeClientApiLibInitialize();
113816539616SHisping Lin 
113916539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
114016539616SHisping Lin 
114116539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
114216539616SHisping Lin 				&TeecSession,
114316539616SHisping Lin 				TeecUuid,
114416539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
114516539616SHisping Lin 				NULL,
114616539616SHisping Lin 				NULL,
114716539616SHisping Lin 				&ErrorOrigin);
114816539616SHisping Lin 
114916539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
115016539616SHisping Lin 						TEEC_NONE,
115116539616SHisping Lin 						TEEC_NONE,
115216539616SHisping Lin 						TEEC_NONE);
115316539616SHisping Lin 
115416539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
115516539616SHisping Lin 					2,
115616539616SHisping Lin 					&TeecOperation,
115716539616SHisping Lin 					&ErrorOrigin);
115816539616SHisping Lin 
115916539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
116016539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
116116539616SHisping Lin 
116216539616SHisping Lin 	return TeecResult;
116316539616SHisping Lin }
116416539616SHisping Lin 
116516539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
116616539616SHisping Lin {
116716539616SHisping Lin 	TEEC_Result res;
116816539616SHisping Lin 	res = notify_optee_rpmb_ta();
116916539616SHisping Lin 	res |= notify_optee_efuse_ta();
117016539616SHisping Lin 	return res;
117116539616SHisping Lin }
11722cd27853SHisping Lin 
11732cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
11742cd27853SHisping Lin {
11752cd27853SHisping Lin 	TEEC_Result TeecResult;
11762cd27853SHisping Lin 	TEEC_Context TeecContext;
11772cd27853SHisping Lin 	TEEC_Session TeecSession;
11782cd27853SHisping Lin 	uint32_t ErrorOrigin;
11792cd27853SHisping Lin 
11802cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11812cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11822cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11832cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
11842cd27853SHisping Lin 
11852cd27853SHisping Lin 	OpteeClientApiLibInitialize();
11862cd27853SHisping Lin 
11872cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
11882cd27853SHisping Lin 
11892cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11902cd27853SHisping Lin 				&TeecSession,
11912cd27853SHisping Lin 				TeecUuid,
11922cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
11932cd27853SHisping Lin 				NULL,
11942cd27853SHisping Lin 				NULL,
11952cd27853SHisping Lin 				&ErrorOrigin);
11962cd27853SHisping Lin 
11972cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11982cd27853SHisping Lin 
11992cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
12002cd27853SHisping Lin 	SharedMem0.flags = 0;
12012cd27853SHisping Lin 
12022cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
12032cd27853SHisping Lin 
12042cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12052cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12062cd27853SHisping Lin 
12072cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
12082cd27853SHisping Lin 						TEEC_NONE,
12092cd27853SHisping Lin 						TEEC_NONE,
12102cd27853SHisping Lin 						TEEC_NONE);
12112cd27853SHisping Lin 
12122cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12132cd27853SHisping Lin 					3,
12142cd27853SHisping Lin 					&TeecOperation,
12152cd27853SHisping Lin 					&ErrorOrigin);
12162cd27853SHisping Lin 
12172cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
12182cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
12192cd27853SHisping Lin 
12202cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12212cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
12222cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12232cd27853SHisping Lin 
12242cd27853SHisping Lin 	return TeecResult;
12252cd27853SHisping Lin }
12262cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
12272cd27853SHisping Lin {
12282cd27853SHisping Lin 	TEEC_Result TeecResult;
12292cd27853SHisping Lin 	TEEC_Context TeecContext;
12302cd27853SHisping Lin 	TEEC_Session TeecSession;
12312cd27853SHisping Lin 	uint32_t ErrorOrigin;
12322cd27853SHisping Lin 
12332cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
12342cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
12352cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
12362cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
12372cd27853SHisping Lin 
12382cd27853SHisping Lin 	OpteeClientApiLibInitialize();
12392cd27853SHisping Lin 
12402cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
12412cd27853SHisping Lin 
12422cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
12432cd27853SHisping Lin 				&TeecSession,
12442cd27853SHisping Lin 				TeecUuid,
12452cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
12462cd27853SHisping Lin 				NULL,
12472cd27853SHisping Lin 				NULL,
12482cd27853SHisping Lin 				&ErrorOrigin);
12492cd27853SHisping Lin 
12502cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
12512cd27853SHisping Lin 
12522cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
12532cd27853SHisping Lin 	SharedMem0.flags = 0;
12542cd27853SHisping Lin 
12552cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
12562cd27853SHisping Lin 
12572cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
12582cd27853SHisping Lin 
12592cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12602cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12612cd27853SHisping Lin 
12622cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
12632cd27853SHisping Lin 						TEEC_NONE,
12642cd27853SHisping Lin 						TEEC_NONE,
12652cd27853SHisping Lin 						TEEC_NONE);
12662cd27853SHisping Lin 
12672cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12682cd27853SHisping Lin 					4,
12692cd27853SHisping Lin 					&TeecOperation,
12702cd27853SHisping Lin 					&ErrorOrigin);
12712cd27853SHisping Lin 
12722cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12732cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
12742cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12752cd27853SHisping Lin 
12762cd27853SHisping Lin 	return TeecResult;
12772cd27853SHisping Lin }
1278095e2a82SHisping Lin 
1279468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1280468df3b2SHisping Lin {
1281468df3b2SHisping Lin 	TEEC_Result TeecResult;
1282468df3b2SHisping Lin 	TEEC_Context TeecContext;
1283468df3b2SHisping Lin 	TEEC_Session TeecSession;
1284468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1285468df3b2SHisping Lin 	uint32_t bootflag;
1286468df3b2SHisping Lin 
1287468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1288468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1289468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1290468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1291468df3b2SHisping Lin 
1292468df3b2SHisping Lin 	OpteeClientApiLibInitialize();
1293468df3b2SHisping Lin 
1294468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1295468df3b2SHisping Lin 
1296468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1297468df3b2SHisping Lin 				&TeecSession,
1298468df3b2SHisping Lin 				TeecUuid,
1299468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1300468df3b2SHisping Lin 				NULL,
1301468df3b2SHisping Lin 				NULL,
1302468df3b2SHisping Lin 				&ErrorOrigin);
1303468df3b2SHisping Lin 
1304468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1305468df3b2SHisping Lin 
1306468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1307468df3b2SHisping Lin 	SharedMem0.flags = 0;
1308468df3b2SHisping Lin 
1309468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1310468df3b2SHisping Lin 
1311468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1312468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1313468df3b2SHisping Lin 
1314468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1315468df3b2SHisping Lin 						TEEC_NONE,
1316468df3b2SHisping Lin 						TEEC_NONE,
1317468df3b2SHisping Lin 						TEEC_NONE);
1318468df3b2SHisping Lin 
1319468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1320468df3b2SHisping Lin 					5,
1321468df3b2SHisping Lin 					&TeecOperation,
1322468df3b2SHisping Lin 					&ErrorOrigin);
1323468df3b2SHisping Lin 
1324468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1325468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
1326468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1327468df3b2SHisping Lin 			*flag = 1;
1328468df3b2SHisping Lin 	}
1329468df3b2SHisping Lin 
1330468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1331468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1332468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1333468df3b2SHisping Lin 
1334468df3b2SHisping Lin 	return TeecResult;
1335468df3b2SHisping Lin }
1336468df3b2SHisping Lin 
1337095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1338095e2a82SHisping Lin {
1339095e2a82SHisping Lin 	TEEC_Result TeecResult;
1340095e2a82SHisping Lin 	TEEC_Context TeecContext;
1341095e2a82SHisping Lin 	TEEC_Session TeecSession;
1342095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1343095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1344095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1345095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1346095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
13473251364cSHisping Lin 	struct blk_desc *dev_desc;
13483251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1349*6651d4c0SJason Zhu 	if (!dev_desc) {
1350*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1351*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1352*6651d4c0SJason Zhu 	}
1353095e2a82SHisping Lin 
1354095e2a82SHisping Lin 	debug("testmm start\n");
1355095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1356095e2a82SHisping Lin 
1357095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1358095e2a82SHisping Lin 
13593251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
13603251364cSHisping Lin 						TEEC_NONE,
13613251364cSHisping Lin 						TEEC_NONE,
13623251364cSHisping Lin 						TEEC_NONE);
13633251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
13643251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
13653251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
13663251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
13673251364cSHisping Lin #endif
13683251364cSHisping Lin 
1369095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1370095e2a82SHisping Lin 				&TeecSession,
1371095e2a82SHisping Lin 				TeecUuid,
1372095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1373095e2a82SHisping Lin 				NULL,
13743251364cSHisping Lin 				&TeecOperation,
1375095e2a82SHisping Lin 				&ErrorOrigin);
1376095e2a82SHisping Lin 
1377095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1378095e2a82SHisping Lin 
1379095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1380095e2a82SHisping Lin 	SharedMem0.flags = 0;
1381095e2a82SHisping Lin 
1382095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1383095e2a82SHisping Lin 
1384095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1385095e2a82SHisping Lin 
1386095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1387095e2a82SHisping Lin 
1388095e2a82SHisping Lin 	SharedMem1.size = 1;
1389095e2a82SHisping Lin 	SharedMem1.flags = 0;
1390095e2a82SHisping Lin 
1391095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1392095e2a82SHisping Lin 
1393095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1394095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1395095e2a82SHisping Lin 
1396095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1397095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1398095e2a82SHisping Lin 
1399095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1400095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1401095e2a82SHisping Lin 						TEEC_NONE,
1402095e2a82SHisping Lin 						TEEC_NONE);
1403095e2a82SHisping Lin 
1404095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1405095e2a82SHisping Lin 					142,
1406095e2a82SHisping Lin 					&TeecOperation,
1407095e2a82SHisping Lin 					&ErrorOrigin);
1408095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1409095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1410095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1411095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1412095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1413095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1414095e2a82SHisping Lin 	debug("testmm end\n");
1415095e2a82SHisping Lin 
1416095e2a82SHisping Lin 	return TeecResult;
1417095e2a82SHisping Lin }
1418095e2a82SHisping Lin 
1419095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1420095e2a82SHisping Lin {
1421095e2a82SHisping Lin 	TEEC_Result TeecResult;
1422095e2a82SHisping Lin 	TEEC_Context TeecContext;
1423095e2a82SHisping Lin 	TEEC_Session TeecSession;
1424095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1425095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1426095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1427095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1428095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
14293251364cSHisping Lin 	struct blk_desc *dev_desc;
14303251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1431*6651d4c0SJason Zhu 	if (!dev_desc) {
1432*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1433*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1434*6651d4c0SJason Zhu 	}
1435095e2a82SHisping Lin 
1436095e2a82SHisping Lin 	debug("testmm start\n");
1437095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1438095e2a82SHisping Lin 
1439095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1440095e2a82SHisping Lin 
14413251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
14423251364cSHisping Lin 						TEEC_NONE,
14433251364cSHisping Lin 						TEEC_NONE,
14443251364cSHisping Lin 						TEEC_NONE);
14453251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
14463251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
14473251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
14483251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
14493251364cSHisping Lin #endif
14503251364cSHisping Lin 
1451095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1452095e2a82SHisping Lin 				&TeecSession,
1453095e2a82SHisping Lin 				TeecUuid,
1454095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1455095e2a82SHisping Lin 				NULL,
14563251364cSHisping Lin 				&TeecOperation,
1457095e2a82SHisping Lin 				&ErrorOrigin);
1458095e2a82SHisping Lin 
1459095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1460095e2a82SHisping Lin 
1461095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1462095e2a82SHisping Lin 	SharedMem0.flags = 0;
1463095e2a82SHisping Lin 
1464095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1465095e2a82SHisping Lin 
1466095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1467095e2a82SHisping Lin 
1468095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1469095e2a82SHisping Lin 
1470095e2a82SHisping Lin 	SharedMem1.size = 1;
1471095e2a82SHisping Lin 	SharedMem1.flags = 0;
1472095e2a82SHisping Lin 
1473095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1474095e2a82SHisping Lin 
1475095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1476095e2a82SHisping Lin 
1477095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1478095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1479095e2a82SHisping Lin 
1480095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1481095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1482095e2a82SHisping Lin 
1483095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1484095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1485095e2a82SHisping Lin 						TEEC_NONE,
1486095e2a82SHisping Lin 						TEEC_NONE);
1487095e2a82SHisping Lin 
1488095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1489095e2a82SHisping Lin 					141,
1490095e2a82SHisping Lin 					&TeecOperation,
1491095e2a82SHisping Lin 					&ErrorOrigin);
1492095e2a82SHisping Lin 
1493095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1494095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1495095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1496095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1497095e2a82SHisping Lin 	debug("testmm end\n");
1498095e2a82SHisping Lin 
1499095e2a82SHisping Lin 	return TeecResult;
1500095e2a82SHisping Lin }
15014aa61755SAndy Ye 
15024aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
15034aa61755SAndy Ye {
15044aa61755SAndy Ye 	TEEC_Result TeecResult;
15054aa61755SAndy Ye 	TEEC_Context TeecContext;
15064aa61755SAndy Ye 	TEEC_Session TeecSession;
15074aa61755SAndy Ye 	uint32_t ErrorOrigin;
15084aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15094aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15104aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15114aa61755SAndy Ye 				}
15124aa61755SAndy Ye 			     };
15134aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15144aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
15153251364cSHisping Lin 	struct blk_desc *dev_desc;
15163251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1517*6651d4c0SJason Zhu 	if (!dev_desc) {
1518*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1519*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1520*6651d4c0SJason Zhu 	}
15214aa61755SAndy Ye 
15224aa61755SAndy Ye 	OpteeClientApiLibInitialize();
15234aa61755SAndy Ye 
15244aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
15254aa61755SAndy Ye 
15263251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15273251364cSHisping Lin 						TEEC_NONE,
15283251364cSHisping Lin 						TEEC_NONE,
15293251364cSHisping Lin 						TEEC_NONE);
15303251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
15313251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
15323251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15333251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15343251364cSHisping Lin #endif
15353251364cSHisping Lin 
15364aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15374aa61755SAndy Ye 				      &TeecSession,
15384aa61755SAndy Ye 				      TeecUuid,
15394aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15404aa61755SAndy Ye 				      NULL,
15413251364cSHisping Lin 					&TeecOperation,
15424aa61755SAndy Ye 				      &ErrorOrigin);
15434aa61755SAndy Ye 
15444aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
15454aa61755SAndy Ye 
15464aa61755SAndy Ye 	SharedMem0.size = *dh_size;
15474aa61755SAndy Ye 	SharedMem0.flags = 0;
15484aa61755SAndy Ye 
15494aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
15504aa61755SAndy Ye 
15514aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
15524aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
15534aa61755SAndy Ye 
15544aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
15554aa61755SAndy Ye 						    TEEC_NONE,
15564aa61755SAndy Ye 						    TEEC_NONE,
15574aa61755SAndy Ye 						    TEEC_NONE);
15584aa61755SAndy Ye 
15594aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
15604aa61755SAndy Ye 					143,
15614aa61755SAndy Ye 					&TeecOperation,
15624aa61755SAndy Ye 					&ErrorOrigin);
15634aa61755SAndy Ye 
15644aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
15654aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
15664aa61755SAndy Ye 
15674aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
15684aa61755SAndy Ye 
15694aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
15704aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
15714aa61755SAndy Ye 
15724aa61755SAndy Ye 	return TeecResult;
15734aa61755SAndy Ye }
15744aa61755SAndy Ye 
15754aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
15764aa61755SAndy Ye {
15774aa61755SAndy Ye 	TEEC_Result TeecResult;
15784aa61755SAndy Ye 	TEEC_Context TeecContext;
15794aa61755SAndy Ye 	TEEC_Session TeecSession;
15804aa61755SAndy Ye 	uint32_t ErrorOrigin;
15814aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15824aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15834aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15844aa61755SAndy Ye 				}
15854aa61755SAndy Ye 			     };
15864aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15874aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
15883251364cSHisping Lin 	struct blk_desc *dev_desc;
15893251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1590*6651d4c0SJason Zhu 	if (!dev_desc) {
1591*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1592*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1593*6651d4c0SJason Zhu 	}
15944aa61755SAndy Ye 
15954aa61755SAndy Ye 	OpteeClientApiLibInitialize();
15964aa61755SAndy Ye 
15974aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
15984aa61755SAndy Ye 
15993251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16003251364cSHisping Lin 						TEEC_NONE,
16013251364cSHisping Lin 						TEEC_NONE,
16023251364cSHisping Lin 						TEEC_NONE);
16033251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16043251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16053251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16063251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16073251364cSHisping Lin #endif
16083251364cSHisping Lin 
16094aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16104aa61755SAndy Ye 				      &TeecSession,
16114aa61755SAndy Ye 				      TeecUuid,
16124aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16134aa61755SAndy Ye 				      NULL,
16143251364cSHisping Lin 					&TeecOperation,
16154aa61755SAndy Ye 				      &ErrorOrigin);
16164aa61755SAndy Ye 
16174aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16184aa61755SAndy Ye 
16194aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
16204aa61755SAndy Ye 	SharedMem0.flags = 0;
16214aa61755SAndy Ye 
16224aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
16234aa61755SAndy Ye 
16244aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
16254aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
16264aa61755SAndy Ye 
16274aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
16284aa61755SAndy Ye 						    TEEC_NONE,
16294aa61755SAndy Ye 						    TEEC_NONE,
16304aa61755SAndy Ye 						    TEEC_NONE);
16314aa61755SAndy Ye 
16324aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16334aa61755SAndy Ye 					144,
16344aa61755SAndy Ye 					&TeecOperation,
16354aa61755SAndy Ye 					&ErrorOrigin);
16364aa61755SAndy Ye 
16374aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
16384aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
16394aa61755SAndy Ye 
16404aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
16414aa61755SAndy Ye 
16424aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
16434aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
16444aa61755SAndy Ye 
16454aa61755SAndy Ye 	return TeecResult;
16464aa61755SAndy Ye }
16474aa61755SAndy Ye 
16484aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
16494aa61755SAndy Ye 			      uint32_t *operation_size,
16504aa61755SAndy Ye 			      uint8_t *out,
16514aa61755SAndy Ye 			      uint32_t *out_len)
16524aa61755SAndy Ye {
16534aa61755SAndy Ye 	TEEC_Result TeecResult;
16544aa61755SAndy Ye 	TEEC_Context TeecContext;
16554aa61755SAndy Ye 	TEEC_Session TeecSession;
16564aa61755SAndy Ye 	uint32_t ErrorOrigin;
16574aa61755SAndy Ye 
16584aa61755SAndy Ye 	OpteeClientApiLibInitialize();
16594aa61755SAndy Ye 
16604aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16614aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16624aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16634aa61755SAndy Ye 				}
16644aa61755SAndy Ye 			     };
16654aa61755SAndy Ye 
16664aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16674aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16683251364cSHisping Lin 	struct blk_desc *dev_desc;
16693251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1670*6651d4c0SJason Zhu 	if (!dev_desc) {
1671*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1672*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1673*6651d4c0SJason Zhu 	}
16744aa61755SAndy Ye 
16754aa61755SAndy Ye 	OpteeClientApiLibInitialize();
16764aa61755SAndy Ye 
16774aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16784aa61755SAndy Ye 
16793251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16803251364cSHisping Lin 						TEEC_NONE,
16813251364cSHisping Lin 						TEEC_NONE,
16823251364cSHisping Lin 						TEEC_NONE);
16833251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16843251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16853251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16863251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16873251364cSHisping Lin #endif
16883251364cSHisping Lin 
16894aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16904aa61755SAndy Ye 				      &TeecSession,
16914aa61755SAndy Ye 				      TeecUuid,
16924aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16934aa61755SAndy Ye 				      NULL,
16943251364cSHisping Lin 					&TeecOperation,
16954aa61755SAndy Ye 				      &ErrorOrigin);
16964aa61755SAndy Ye 
16974aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16984aa61755SAndy Ye 
16994aa61755SAndy Ye 	SharedMem0.size = *operation_size;
17004aa61755SAndy Ye 	SharedMem0.flags = 0;
17014aa61755SAndy Ye 
17024aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17034aa61755SAndy Ye 
17044aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
17054aa61755SAndy Ye 
17064aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17074aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17084aa61755SAndy Ye 
17094aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
17104aa61755SAndy Ye 
17114aa61755SAndy Ye 	SharedMem1.size = *out_len;
17124aa61755SAndy Ye 	SharedMem1.flags = 0;
17134aa61755SAndy Ye 
17144aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
17154aa61755SAndy Ye 
17164aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
17174aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
17184aa61755SAndy Ye 
17194aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17204aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
17214aa61755SAndy Ye 						    TEEC_NONE,
17224aa61755SAndy Ye 						    TEEC_NONE);
17234aa61755SAndy Ye 
17244aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17254aa61755SAndy Ye 					145,
17264aa61755SAndy Ye 					&TeecOperation,
17274aa61755SAndy Ye 					&ErrorOrigin);
17284aa61755SAndy Ye 
17294aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
17304aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
17314aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17324aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
17334aa61755SAndy Ye 
17344aa61755SAndy Ye 	return TeecResult;
17354aa61755SAndy Ye }
17364aa61755SAndy Ye 
17374aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
17384aa61755SAndy Ye {
17394aa61755SAndy Ye 	TEEC_Result TeecResult;
17404aa61755SAndy Ye 	TEEC_Context TeecContext;
17414aa61755SAndy Ye 	TEEC_Session TeecSession;
17424aa61755SAndy Ye 	uint32_t ErrorOrigin;
17434aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17444aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17454aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17464aa61755SAndy Ye 				}
17474aa61755SAndy Ye 			     };
17484aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17494aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17503251364cSHisping Lin 	struct blk_desc *dev_desc;
17513251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1752*6651d4c0SJason Zhu 	if (!dev_desc) {
1753*6651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1754*6651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1755*6651d4c0SJason Zhu 	}
17564aa61755SAndy Ye 
17574aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
17584aa61755SAndy Ye 
17593251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17603251364cSHisping Lin 						TEEC_NONE,
17613251364cSHisping Lin 						TEEC_NONE,
17623251364cSHisping Lin 						TEEC_NONE);
17633251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
17643251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
17653251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17663251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17673251364cSHisping Lin #endif
17683251364cSHisping Lin 
17694aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17704aa61755SAndy Ye 					&TeecSession,
17714aa61755SAndy Ye 					TeecUuid,
17724aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
17734aa61755SAndy Ye 					NULL,
17743251364cSHisping Lin 					&TeecOperation,
17754aa61755SAndy Ye 					&ErrorOrigin);
17764aa61755SAndy Ye 
17774aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17784aa61755SAndy Ye 
17794aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
17804aa61755SAndy Ye 	SharedMem0.flags = 0;
17814aa61755SAndy Ye 
17824aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17834aa61755SAndy Ye 
17844aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
17854aa61755SAndy Ye 
17864aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17874aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17884aa61755SAndy Ye 
17894aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17904aa61755SAndy Ye 						    TEEC_NONE,
17914aa61755SAndy Ye 						    TEEC_NONE,
17924aa61755SAndy Ye 						    TEEC_NONE);
17934aa61755SAndy Ye 
17944aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17954aa61755SAndy Ye 					146,
17964aa61755SAndy Ye 					&TeecOperation,
17974aa61755SAndy Ye 					&ErrorOrigin);
17984aa61755SAndy Ye 
17994aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18004aa61755SAndy Ye 
18014aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
18024aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
18034aa61755SAndy Ye 
18044aa61755SAndy Ye 	return TeecResult;
18054aa61755SAndy Ye }
180678ef5fbdSqiujian 
180778ef5fbdSqiujian TEEC_Result trusty_write_oem_unlock(uint8_t unlock)
180878ef5fbdSqiujian {
180978ef5fbdSqiujian 	char *file = "oem.unlock";
181078ef5fbdSqiujian 	TEEC_Result ret;
181178ef5fbdSqiujian 
181278ef5fbdSqiujian 	ret = write_to_keymaster((uint8_t *)file, strlen(file),
181378ef5fbdSqiujian 		(uint8_t *)&unlock, 1);
181478ef5fbdSqiujian 	return ret;
181578ef5fbdSqiujian }
181678ef5fbdSqiujian 
181778ef5fbdSqiujian TEEC_Result trusty_read_oem_unlock(uint8_t *unlock)
181878ef5fbdSqiujian {
181978ef5fbdSqiujian 	char *file = "oem.unlock";
182078ef5fbdSqiujian 	TEEC_Result ret;
182178ef5fbdSqiujian 
182278ef5fbdSqiujian 	ret = read_from_keymaster((uint8_t *)file, strlen(file),
182378ef5fbdSqiujian 		unlock, 1);
182478ef5fbdSqiujian 
182578ef5fbdSqiujian 	if (ret == TEE_ERROR_ITEM_NOT_FOUND) {
182678ef5fbdSqiujian 		debug("init oem unlock status 0");
182778ef5fbdSqiujian 		ret = trusty_write_oem_unlock(0);
182878ef5fbdSqiujian 	}
182978ef5fbdSqiujian 
183078ef5fbdSqiujian 	return ret;
183178ef5fbdSqiujian }