xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 564654eb9cb4e87d6745e05ed833a19d233610cd)
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>
13a7df4868Stony.xu #include <stdlib.h>
141e8c0e44STony Xu #include <attestation_key.h>
15a7df4868Stony.xu 
16a7df4868Stony.xu #define	BOOT_FROM_EMMC	(1 << 1)
17ae8ec5e1SHisping Lin 
18ae8ec5e1SHisping Lin void test_optee(void)
19ae8ec5e1SHisping Lin {
20ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
21ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
22ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
23ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
24a7df4868Stony.xu 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, \
25ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
26ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
27ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
283251364cSHisping Lin 	struct blk_desc *dev_desc;
293251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
306651d4c0SJason Zhu 	if (!dev_desc) {
316651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
326651d4c0SJason Zhu 		return;
336651d4c0SJason Zhu 	}
34ae8ec5e1SHisping Lin 
35ae8ec5e1SHisping Lin 	debug("testmm start\n");
36ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
37ae8ec5e1SHisping Lin 
38ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
39ae8ec5e1SHisping Lin 
403251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
413251364cSHisping Lin 						TEEC_NONE,
423251364cSHisping Lin 						TEEC_NONE,
433251364cSHisping Lin 						TEEC_NONE);
443251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
453251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
463251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
473251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
483251364cSHisping Lin #endif
493251364cSHisping Lin 
50ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
51ae8ec5e1SHisping Lin 				&TeecSession,
52ae8ec5e1SHisping Lin 				TeecUuid,
53ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
54ae8ec5e1SHisping Lin 				NULL,
553251364cSHisping Lin 				&TeecOperation,
56ae8ec5e1SHisping Lin 				&ErrorOrigin);
57ae8ec5e1SHisping Lin 
58ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
59ae8ec5e1SHisping Lin 
60ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
61ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
62ae8ec5e1SHisping Lin 
63ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
64ae8ec5e1SHisping Lin 
65ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
66ae8ec5e1SHisping Lin 
67ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
68ae8ec5e1SHisping Lin 
69ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
70ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
71ae8ec5e1SHisping Lin 
72ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
73ae8ec5e1SHisping Lin 
74ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
75ae8ec5e1SHisping Lin 
76ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
77ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
78ae8ec5e1SHisping Lin 
79ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
80ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
81ae8ec5e1SHisping Lin 
82ae8ec5e1SHisping Lin 
83ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
84ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
85ae8ec5e1SHisping Lin 						TEEC_NONE,
86ae8ec5e1SHisping Lin 						TEEC_NONE);
87ae8ec5e1SHisping Lin 
88ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
89ae8ec5e1SHisping Lin 					1,
90ae8ec5e1SHisping Lin 					&TeecOperation,
91ae8ec5e1SHisping Lin 					&ErrorOrigin);
92ae8ec5e1SHisping Lin 
93ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
94ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
95ae8ec5e1SHisping Lin 
96ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
97ae8ec5e1SHisping Lin 
9846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
99ae8ec5e1SHisping Lin 
100ae8ec5e1SHisping Lin 	debug("testmm end\n");
101ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
102ae8ec5e1SHisping Lin }
103ae8ec5e1SHisping Lin 
104ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
105ae8ec5e1SHisping Lin {
106ae8ec5e1SHisping Lin 	if (in > 9)
107ae8ec5e1SHisping Lin 		return in + 55;
108ae8ec5e1SHisping Lin 	else
109ae8ec5e1SHisping Lin 		return in + 48;
110ae8ec5e1SHisping Lin }
111ae8ec5e1SHisping Lin 
112ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
113ae8ec5e1SHisping Lin {
114ae8ec5e1SHisping Lin 	uint32_t i = 0;
115ae8ec5e1SHisping Lin 
116ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
117ae8ec5e1SHisping Lin 		return 0;
118ae8ec5e1SHisping Lin 
119ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
120ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
121ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
122ae8ec5e1SHisping Lin 	}
123ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
124ae8ec5e1SHisping Lin 
125ae8ec5e1SHisping Lin 	return blen * 2;
126ae8ec5e1SHisping Lin }
127ae8ec5e1SHisping Lin 
128ae8ec5e1SHisping Lin 
129ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
130ae8ec5e1SHisping Lin {
131ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
132ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
133ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
134ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
135ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
136ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
137ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
138ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
139ae8ec5e1SHisping Lin 	uint8_t hs[9];
140ae8ec5e1SHisping Lin 
1413251364cSHisping Lin 	struct blk_desc *dev_desc;
1423251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1436651d4c0SJason Zhu 	if (!dev_desc) {
1446651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1456651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1466651d4c0SJason Zhu 	}
1473251364cSHisping Lin 
148ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
149ae8ec5e1SHisping Lin 	debug("testmm start\n");
150ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
151ae8ec5e1SHisping Lin 
152ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
153ae8ec5e1SHisping Lin 
1543251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1553251364cSHisping Lin 						TEEC_NONE,
1563251364cSHisping Lin 						TEEC_NONE,
1573251364cSHisping Lin 						TEEC_NONE);
1583251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1593251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1603251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1613251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1623251364cSHisping Lin #endif
1633251364cSHisping Lin 
164ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
165ae8ec5e1SHisping Lin 				&TeecSession,
166ae8ec5e1SHisping Lin 				TeecUuid,
167ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
168ae8ec5e1SHisping Lin 				NULL,
1693251364cSHisping Lin 				&TeecOperation,
170f303baf0SHisping Lin 
171ae8ec5e1SHisping Lin 				&ErrorOrigin);
172ae8ec5e1SHisping Lin 
173ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
174ae8ec5e1SHisping Lin 
175ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
176ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
177ae8ec5e1SHisping Lin 
178ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
179ae8ec5e1SHisping Lin 
180ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
181ae8ec5e1SHisping Lin 
182ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
183ae8ec5e1SHisping Lin 
184ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
185ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
186ae8ec5e1SHisping Lin 
187ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
188ae8ec5e1SHisping Lin 
189ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
190ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
191ae8ec5e1SHisping Lin 
192ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
193ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
194ae8ec5e1SHisping Lin 
195ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
196ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
197ae8ec5e1SHisping Lin 						TEEC_NONE,
198ae8ec5e1SHisping Lin 						TEEC_NONE);
199ae8ec5e1SHisping Lin 
200ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
201ae8ec5e1SHisping Lin 					0,
202ae8ec5e1SHisping Lin 					&TeecOperation,
203ae8ec5e1SHisping Lin 					&ErrorOrigin);
20446b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
205ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
206ae8ec5e1SHisping Lin 
207ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
208ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
209ae8ec5e1SHisping Lin 
210ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
211ae8ec5e1SHisping Lin 
21246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
213ae8ec5e1SHisping Lin 
214ae8ec5e1SHisping Lin 	debug("testmm end\n");
215ae8ec5e1SHisping Lin 	return TeecResult;
216ae8ec5e1SHisping Lin }
217ae8ec5e1SHisping Lin 
218ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
219ae8ec5e1SHisping Lin {
220ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
221ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
222ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
223ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
224ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
225ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
226ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
227ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
228ae8ec5e1SHisping Lin 	uint8_t hs[9];
2293251364cSHisping Lin 	struct blk_desc *dev_desc;
2303251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
2316651d4c0SJason Zhu 	if (!dev_desc) {
2326651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
2336651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
2346651d4c0SJason Zhu 	}
2353251364cSHisping Lin 
236ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
237ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
238ae8ec5e1SHisping Lin 
239ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
240ae8ec5e1SHisping Lin 
2413251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2423251364cSHisping Lin 						TEEC_NONE,
2433251364cSHisping Lin 						TEEC_NONE,
2443251364cSHisping Lin 						TEEC_NONE);
2453251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2463251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
2473251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
2483251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
2493251364cSHisping Lin #endif
2503251364cSHisping Lin 
251ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
252ae8ec5e1SHisping Lin 				&TeecSession,
253ae8ec5e1SHisping Lin 				TeecUuid,
254ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
255ae8ec5e1SHisping Lin 				NULL,
2563251364cSHisping Lin 				&TeecOperation,
257ae8ec5e1SHisping Lin 				&ErrorOrigin);
258ae8ec5e1SHisping Lin 
259ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
260ae8ec5e1SHisping Lin 
261ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
262ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
263ae8ec5e1SHisping Lin 
264ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
265ae8ec5e1SHisping Lin 
266ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
267ae8ec5e1SHisping Lin 
268ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
269ae8ec5e1SHisping Lin 
270ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
271ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
274ae8ec5e1SHisping Lin 
275ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
276ae8ec5e1SHisping Lin 
277ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
278ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
279ae8ec5e1SHisping Lin 
280ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
281ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
282ae8ec5e1SHisping Lin 
283ae8ec5e1SHisping Lin 
284ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
285ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
286ae8ec5e1SHisping Lin 						TEEC_NONE,
287ae8ec5e1SHisping Lin 						TEEC_NONE);
288ae8ec5e1SHisping Lin 
289ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
290ae8ec5e1SHisping Lin 					1,
291ae8ec5e1SHisping Lin 					&TeecOperation,
292ae8ec5e1SHisping Lin 					&ErrorOrigin);
293ae8ec5e1SHisping Lin 
294ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
295ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
296ae8ec5e1SHisping Lin 
297ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
298ae8ec5e1SHisping Lin 
29946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
300ae8ec5e1SHisping Lin 
301ae8ec5e1SHisping Lin 	debug("testmm end\n");
302ae8ec5e1SHisping Lin 
303ae8ec5e1SHisping Lin 	return TeecResult;
304ae8ec5e1SHisping Lin }
305ae8ec5e1SHisping Lin 
306ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
307ae8ec5e1SHisping Lin {
308ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
309ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
310ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
311ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
31299830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
31399830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
314ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
315ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
3163251364cSHisping Lin 	struct blk_desc *dev_desc;
3173251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
3186651d4c0SJason Zhu 	if (!dev_desc) {
3196651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
3206651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
3216651d4c0SJason Zhu 	}
322ae8ec5e1SHisping Lin 
323ae8ec5e1SHisping Lin 	debug("testmm start\n");
324ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
325ae8ec5e1SHisping Lin 
326ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
327ae8ec5e1SHisping Lin 
3283251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3293251364cSHisping Lin 						TEEC_NONE,
3303251364cSHisping Lin 						TEEC_NONE,
3313251364cSHisping Lin 						TEEC_NONE);
3323251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
3333251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
3343251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3353251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3363251364cSHisping Lin #endif
3373251364cSHisping Lin 
338ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
339ae8ec5e1SHisping Lin 				&TeecSession,
340ae8ec5e1SHisping Lin 				TeecUuid,
341ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
342ae8ec5e1SHisping Lin 				NULL,
3433251364cSHisping Lin 				&TeecOperation,
344ae8ec5e1SHisping Lin 				&ErrorOrigin);
345ae8ec5e1SHisping Lin 
346ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
347ae8ec5e1SHisping Lin 
348ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
349ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
350ae8ec5e1SHisping Lin 
351ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
352ae8ec5e1SHisping Lin 
353ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
354ae8ec5e1SHisping Lin 
355ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
356ae8ec5e1SHisping Lin 
357ae8ec5e1SHisping Lin 	SharedMem1.size = size;
358ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
359ae8ec5e1SHisping Lin 
360ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
361ae8ec5e1SHisping Lin 
362ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
363ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
364ae8ec5e1SHisping Lin 
365ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
366ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
367ae8ec5e1SHisping Lin 
368ae8ec5e1SHisping Lin 
369ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
370ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
371ae8ec5e1SHisping Lin 						TEEC_NONE,
372ae8ec5e1SHisping Lin 						TEEC_NONE);
373ae8ec5e1SHisping Lin 
374ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
37599830019SHisping Lin 					0,
376ae8ec5e1SHisping Lin 					&TeecOperation,
377ae8ec5e1SHisping Lin 					&ErrorOrigin);
37846b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
379ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
380ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
381ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
382ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
38346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
384ae8ec5e1SHisping Lin 	debug("testmm end\n");
385ae8ec5e1SHisping Lin 
386ae8ec5e1SHisping Lin 	return TeecResult;
387ae8ec5e1SHisping Lin }
388ae8ec5e1SHisping Lin 
389ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
390ae8ec5e1SHisping Lin {
391ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
392ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
393ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
394ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
39599830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
39699830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
397ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
398ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
3993251364cSHisping Lin 	struct blk_desc *dev_desc;
4003251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
4016651d4c0SJason Zhu 	if (!dev_desc) {
4026651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
4036651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
4046651d4c0SJason Zhu 	}
405ae8ec5e1SHisping Lin 
406ae8ec5e1SHisping Lin 	debug("testmm start\n");
407ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
408ae8ec5e1SHisping Lin 
409ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
410ae8ec5e1SHisping Lin 
4113251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4123251364cSHisping Lin 						TEEC_NONE,
4133251364cSHisping Lin 						TEEC_NONE,
4143251364cSHisping Lin 						TEEC_NONE);
4153251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
4163251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
4173251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4183251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4193251364cSHisping Lin #endif
4203251364cSHisping Lin 
421ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
422ae8ec5e1SHisping Lin 				&TeecSession,
423ae8ec5e1SHisping Lin 				TeecUuid,
424ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
425ae8ec5e1SHisping Lin 				NULL,
4263251364cSHisping Lin 				&TeecOperation,
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,
46099830019SHisping Lin 					1,
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 
473*564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
474*564654ebSJason Zhu 					      uint32_t size)
475*564654ebSJason Zhu {
476*564654ebSJason Zhu 	TEEC_Result TeecResult;
477*564654ebSJason Zhu 	TEEC_Context TeecContext;
478*564654ebSJason Zhu 	TEEC_Session TeecSession;
479*564654ebSJason Zhu 	uint32_t ErrorOrigin;
480*564654ebSJason Zhu 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
481*564654ebSJason Zhu 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
482*564654ebSJason Zhu 	TEEC_UUID *TeecUuid = &tempuuid;
483*564654ebSJason Zhu 	TEEC_Operation TeecOperation = {0};
484*564654ebSJason Zhu 	struct blk_desc *dev_desc;
485*564654ebSJason Zhu 
486*564654ebSJason Zhu 	dev_desc = rockchip_get_bootdev();
487*564654ebSJason Zhu 	if (!dev_desc) {
488*564654ebSJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
489*564654ebSJason Zhu 		return -TEEC_ERROR_GENERIC;
490*564654ebSJason Zhu 	}
491*564654ebSJason Zhu 
492*564654ebSJason Zhu 	debug("testmm start\n");
493*564654ebSJason Zhu 	OpteeClientApiLibInitialize();
494*564654ebSJason Zhu 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
495*564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
496*564654ebSJason Zhu 						    TEEC_NONE,
497*564654ebSJason Zhu 						    TEEC_NONE,
498*564654ebSJason Zhu 						    TEEC_NONE);
499*564654ebSJason Zhu 	/*0 nand or emmc "security" partition , 1 rpmb*/
500*564654ebSJason Zhu 	TeecOperation.params[0].value.a =
501*564654ebSJason Zhu 		(dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
502*564654ebSJason Zhu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
503*564654ebSJason Zhu 	TeecOperation.params[0].value.a = 0;
504*564654ebSJason Zhu #endif
505*564654ebSJason Zhu 
506*564654ebSJason Zhu 	TeecResult = TEEC_OpenSession(&TeecContext,
507*564654ebSJason Zhu 				      &TeecSession,
508*564654ebSJason Zhu 				      TeecUuid,
509*564654ebSJason Zhu 				      TEEC_LOGIN_PUBLIC,
510*564654ebSJason Zhu 				      NULL,
511*564654ebSJason Zhu 				      &TeecOperation,
512*564654ebSJason Zhu 				      &ErrorOrigin);
513*564654ebSJason Zhu 
514*564654ebSJason Zhu 	TEEC_SharedMemory SharedMem0 = {0};
515*564654ebSJason Zhu 
516*564654ebSJason Zhu 	SharedMem0.size = sizeof("rsacer");
517*564654ebSJason Zhu 	SharedMem0.flags = 0;
518*564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
519*564654ebSJason Zhu 	memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size);
520*564654ebSJason Zhu 	TEEC_SharedMemory SharedMem1 = {0};
521*564654ebSJason Zhu 
522*564654ebSJason Zhu 	SharedMem1.size = size;
523*564654ebSJason Zhu 	SharedMem1.flags = 0;
524*564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
525*564654ebSJason Zhu 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
526*564654ebSJason Zhu 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
527*564654ebSJason Zhu 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
528*564654ebSJason Zhu 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
529*564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
530*564654ebSJason Zhu 						    TEEC_MEMREF_TEMP_INOUT,
531*564654ebSJason Zhu 						    TEEC_NONE,
532*564654ebSJason Zhu 						    TEEC_NONE);
533*564654ebSJason Zhu 
534*564654ebSJason Zhu 	TeecResult = TEEC_InvokeCommand(&TeecSession,
535*564654ebSJason Zhu 					0,
536*564654ebSJason Zhu 					&TeecOperation,
537*564654ebSJason Zhu 					&ErrorOrigin);
538*564654ebSJason Zhu 	if (TeecResult == TEEC_SUCCESS)
539*564654ebSJason Zhu 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
540*564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem0);
541*564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem1);
542*564654ebSJason Zhu 	TEEC_CloseSession(&TeecSession);
543*564654ebSJason Zhu 	TEEC_FinalizeContext(&TeecContext);
544*564654ebSJason Zhu 	debug("testmm end\n");
545*564654ebSJason Zhu 
546*564654ebSJason Zhu 	return TeecResult;
547*564654ebSJason Zhu }
548*564654ebSJason Zhu 
549*564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
550*564654ebSJason Zhu 					       uint32_t size)
551*564654ebSJason Zhu {
552*564654ebSJason Zhu 	TEEC_Result TeecResult;
553*564654ebSJason Zhu 	TEEC_Context TeecContext;
554*564654ebSJason Zhu 	TEEC_Session TeecSession;
555*564654ebSJason Zhu 	uint32_t ErrorOrigin;
556*564654ebSJason Zhu 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
557*564654ebSJason Zhu 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
558*564654ebSJason Zhu 	TEEC_UUID *TeecUuid = &tempuuid;
559*564654ebSJason Zhu 	TEEC_Operation TeecOperation = {0};
560*564654ebSJason Zhu 	struct blk_desc *dev_desc;
561*564654ebSJason Zhu 
562*564654ebSJason Zhu 	dev_desc = rockchip_get_bootdev();
563*564654ebSJason Zhu 	if (!dev_desc) {
564*564654ebSJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
565*564654ebSJason Zhu 		return -TEEC_ERROR_GENERIC;
566*564654ebSJason Zhu 	}
567*564654ebSJason Zhu 
568*564654ebSJason Zhu 	debug("testmm start\n");
569*564654ebSJason Zhu 	OpteeClientApiLibInitialize();
570*564654ebSJason Zhu 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
571*564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
572*564654ebSJason Zhu 						    TEEC_NONE,
573*564654ebSJason Zhu 						    TEEC_NONE,
574*564654ebSJason Zhu 						    TEEC_NONE);
575*564654ebSJason Zhu 	/*0 nand or emmc "security" partition , 1 rpmb*/
576*564654ebSJason Zhu 	TeecOperation.params[0].value.a =
577*564654ebSJason Zhu 		(dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
578*564654ebSJason Zhu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
579*564654ebSJason Zhu 	TeecOperation.params[0].value.a = 0;
580*564654ebSJason Zhu #endif
581*564654ebSJason Zhu 
582*564654ebSJason Zhu 	TeecResult = TEEC_OpenSession(&TeecContext,
583*564654ebSJason Zhu 				      &TeecSession,
584*564654ebSJason Zhu 				      TeecUuid,
585*564654ebSJason Zhu 				      TEEC_LOGIN_PUBLIC,
586*564654ebSJason Zhu 				      NULL,
587*564654ebSJason Zhu 				      &TeecOperation,
588*564654ebSJason Zhu 				      &ErrorOrigin);
589*564654ebSJason Zhu 
590*564654ebSJason Zhu 	TEEC_SharedMemory SharedMem0 = {0};
591*564654ebSJason Zhu 
592*564654ebSJason Zhu 	SharedMem0.size = sizeof("rsacer");
593*564654ebSJason Zhu 	SharedMem0.flags = 0;
594*564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
595*564654ebSJason Zhu 	memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size);
596*564654ebSJason Zhu 	TEEC_SharedMemory SharedMem1 = {0};
597*564654ebSJason Zhu 
598*564654ebSJason Zhu 	SharedMem1.size = size;
599*564654ebSJason Zhu 	SharedMem1.flags = 0;
600*564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
601*564654ebSJason Zhu 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
602*564654ebSJason Zhu 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
603*564654ebSJason Zhu 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
604*564654ebSJason Zhu 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
605*564654ebSJason Zhu 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
606*564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
607*564654ebSJason Zhu 						    TEEC_MEMREF_TEMP_INOUT,
608*564654ebSJason Zhu 						    TEEC_NONE,
609*564654ebSJason Zhu 						    TEEC_NONE);
610*564654ebSJason Zhu 
611*564654ebSJason Zhu 	TeecResult = TEEC_InvokeCommand(&TeecSession,
612*564654ebSJason Zhu 					1,
613*564654ebSJason Zhu 					&TeecOperation,
614*564654ebSJason Zhu 					&ErrorOrigin);
615*564654ebSJason Zhu 
616*564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem0);
617*564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem1);
618*564654ebSJason Zhu 	TEEC_CloseSession(&TeecSession);
619*564654ebSJason Zhu 	TEEC_FinalizeContext(&TeecContext);
620*564654ebSJason Zhu 	debug("testmm end\n");
621*564654ebSJason Zhu 
622*564654ebSJason Zhu 	return TeecResult;
623*564654ebSJason Zhu }
624*564654ebSJason Zhu 
625ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
626ae8ec5e1SHisping Lin {
627ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
628ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
629ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
630ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
631ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
632ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
633ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
634ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
6353251364cSHisping Lin 	struct blk_desc *dev_desc;
6363251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
6376651d4c0SJason Zhu 	if (!dev_desc) {
6386651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
6396651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
6406651d4c0SJason Zhu 	}
641ae8ec5e1SHisping Lin 
642ae8ec5e1SHisping Lin 	debug("testmm start\n");
643ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
644ae8ec5e1SHisping Lin 
645ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
646ae8ec5e1SHisping Lin 
6473251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6483251364cSHisping Lin 						TEEC_NONE,
6493251364cSHisping Lin 						TEEC_NONE,
6503251364cSHisping Lin 						TEEC_NONE);
6513251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
6523251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
6533251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6543251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6553251364cSHisping Lin #endif
656ae8ec5e1SHisping Lin 
657ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
658ae8ec5e1SHisping Lin 				&TeecSession,
659ae8ec5e1SHisping Lin 				TeecUuid,
660ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
661ae8ec5e1SHisping Lin 				NULL,
6623251364cSHisping Lin 				&TeecOperation,
663ae8ec5e1SHisping Lin 				&ErrorOrigin);
664ae8ec5e1SHisping Lin 
665ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
666ae8ec5e1SHisping Lin 
667ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
668ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
669ae8ec5e1SHisping Lin 
670ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
671ae8ec5e1SHisping Lin 
672ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
673ae8ec5e1SHisping Lin 
674ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
675ae8ec5e1SHisping Lin 
676ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
677ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
678ae8ec5e1SHisping Lin 
679ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
680ae8ec5e1SHisping Lin 
681ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
682ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
683ae8ec5e1SHisping Lin 
684ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
685ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
686ae8ec5e1SHisping Lin 
687ae8ec5e1SHisping Lin 
688ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
689ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
690ae8ec5e1SHisping Lin 						TEEC_NONE,
691ae8ec5e1SHisping Lin 						TEEC_NONE);
692ae8ec5e1SHisping Lin 
693ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
694ae8ec5e1SHisping Lin 					0,
695ae8ec5e1SHisping Lin 					&TeecOperation,
696ae8ec5e1SHisping Lin 					&ErrorOrigin);
69746b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
698ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
699ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
700ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
701ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
70246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
703ae8ec5e1SHisping Lin 	debug("testmm end\n");
704ae8ec5e1SHisping Lin 
705ae8ec5e1SHisping Lin 	return TeecResult;
706ae8ec5e1SHisping Lin }
707ae8ec5e1SHisping Lin 
708ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
709ae8ec5e1SHisping Lin {
710ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
711ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
712ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
713ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
714ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
715ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
716ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
717ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
7183251364cSHisping Lin 	struct blk_desc *dev_desc;
7193251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7206651d4c0SJason Zhu 	if (!dev_desc) {
7216651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7226651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7236651d4c0SJason Zhu 	}
724ae8ec5e1SHisping Lin 
725ae8ec5e1SHisping Lin 	debug("testmm start\n");
726ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
727ae8ec5e1SHisping Lin 
728ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
729ae8ec5e1SHisping Lin 
7303251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7313251364cSHisping Lin 						TEEC_NONE,
7323251364cSHisping Lin 						TEEC_NONE,
7333251364cSHisping Lin 						TEEC_NONE);
7343251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
7353251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
7363251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7373251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7383251364cSHisping Lin #endif
7393251364cSHisping Lin 
740ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
741ae8ec5e1SHisping Lin 				&TeecSession,
742ae8ec5e1SHisping Lin 				TeecUuid,
743ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
744ae8ec5e1SHisping Lin 				NULL,
7453251364cSHisping Lin 				&TeecOperation,
746ae8ec5e1SHisping Lin 				&ErrorOrigin);
747ae8ec5e1SHisping Lin 
748ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
749ae8ec5e1SHisping Lin 
750ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
751ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
752ae8ec5e1SHisping Lin 
753ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
754ae8ec5e1SHisping Lin 
755ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
756ae8ec5e1SHisping Lin 
757ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
758ae8ec5e1SHisping Lin 
759ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
760ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
761ae8ec5e1SHisping Lin 
762ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
763ae8ec5e1SHisping Lin 
764ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
765ae8ec5e1SHisping Lin 
766ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
767ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
768ae8ec5e1SHisping Lin 
769ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
770ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
771ae8ec5e1SHisping Lin 
772ae8ec5e1SHisping Lin 
773ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
774ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
775ae8ec5e1SHisping Lin 						TEEC_NONE,
776ae8ec5e1SHisping Lin 						TEEC_NONE);
777ae8ec5e1SHisping Lin 
778ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
779ae8ec5e1SHisping Lin 					1,
780ae8ec5e1SHisping Lin 					&TeecOperation,
781ae8ec5e1SHisping Lin 					&ErrorOrigin);
782ae8ec5e1SHisping Lin 
783ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
784ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
785ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
78646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
787ae8ec5e1SHisping Lin 	debug("testmm end\n");
788ae8ec5e1SHisping Lin 
789ae8ec5e1SHisping Lin 	return TeecResult;
790ae8ec5e1SHisping Lin }
791ae8ec5e1SHisping Lin 
792ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
793ae8ec5e1SHisping Lin {
794ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
795ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
796ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
797ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
798ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
799ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
800ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
801ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
8023251364cSHisping Lin 	struct blk_desc *dev_desc;
8033251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8046651d4c0SJason Zhu 	if (!dev_desc) {
8056651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8066651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8076651d4c0SJason Zhu 	}
808ae8ec5e1SHisping Lin 
809ae8ec5e1SHisping Lin 	debug("testmm start\n");
810ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
811ae8ec5e1SHisping Lin 
812ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
813ae8ec5e1SHisping Lin 
8143251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8153251364cSHisping Lin 						TEEC_NONE,
8163251364cSHisping Lin 						TEEC_NONE,
8173251364cSHisping Lin 						TEEC_NONE);
8183251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
8193251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
8203251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8213251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8223251364cSHisping Lin #endif
823ae8ec5e1SHisping Lin 
824ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
825ae8ec5e1SHisping Lin 				&TeecSession,
826ae8ec5e1SHisping Lin 				TeecUuid,
827ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
828ae8ec5e1SHisping Lin 				NULL,
8293251364cSHisping Lin 				&TeecOperation,
830ae8ec5e1SHisping Lin 				&ErrorOrigin);
831ae8ec5e1SHisping Lin 
832ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
833ae8ec5e1SHisping Lin 
834ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
835ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
836ae8ec5e1SHisping Lin 
837ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
838ae8ec5e1SHisping Lin 
839ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
840ae8ec5e1SHisping Lin 
841ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
842ae8ec5e1SHisping Lin 
843ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
844ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
845ae8ec5e1SHisping Lin 
846ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
847ae8ec5e1SHisping Lin 
848ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
849ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
850ae8ec5e1SHisping Lin 
851ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
852ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
853ae8ec5e1SHisping Lin 
854ae8ec5e1SHisping Lin 
855ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
856ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
857ae8ec5e1SHisping Lin 						TEEC_NONE,
858ae8ec5e1SHisping Lin 						TEEC_NONE);
859ae8ec5e1SHisping Lin 
860ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
861ae8ec5e1SHisping Lin 					0,
862ae8ec5e1SHisping Lin 					&TeecOperation,
863ae8ec5e1SHisping Lin 					&ErrorOrigin);
86446b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
865ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
866ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
867ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
868ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
86946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
870ae8ec5e1SHisping Lin 	debug("testmm end\n");
871ae8ec5e1SHisping Lin 
872ae8ec5e1SHisping Lin 	return TeecResult;
873ae8ec5e1SHisping Lin }
874ae8ec5e1SHisping Lin 
875ae8ec5e1SHisping Lin 
876ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
877ae8ec5e1SHisping Lin {
878ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
879ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
880ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
881ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
882ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
883ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
884ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
885ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
8863251364cSHisping Lin 	struct blk_desc *dev_desc;
8873251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8886651d4c0SJason Zhu 	if (!dev_desc) {
8896651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8906651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8916651d4c0SJason Zhu 	}
892ae8ec5e1SHisping Lin 
893ae8ec5e1SHisping Lin 	debug("testmm start\n");
894ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
895ae8ec5e1SHisping Lin 
896ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
897ae8ec5e1SHisping Lin 
8983251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8993251364cSHisping Lin 						TEEC_NONE,
9003251364cSHisping Lin 						TEEC_NONE,
9013251364cSHisping Lin 						TEEC_NONE);
9023251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
9033251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
9043251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9053251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9063251364cSHisping Lin #endif
9073251364cSHisping Lin 
908ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
909ae8ec5e1SHisping Lin 				&TeecSession,
910ae8ec5e1SHisping Lin 				TeecUuid,
911ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
912ae8ec5e1SHisping Lin 				NULL,
9133251364cSHisping Lin 				&TeecOperation,
914ae8ec5e1SHisping Lin 				&ErrorOrigin);
915ae8ec5e1SHisping Lin 
916ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
917ae8ec5e1SHisping Lin 
918ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
919ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
920ae8ec5e1SHisping Lin 
921ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
922ae8ec5e1SHisping Lin 
923ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
924ae8ec5e1SHisping Lin 
925ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
926ae8ec5e1SHisping Lin 
927ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
928ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
929ae8ec5e1SHisping Lin 
930ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
931ae8ec5e1SHisping Lin 
932ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
933ae8ec5e1SHisping Lin 
934ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
935ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
936ae8ec5e1SHisping Lin 
937ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
938ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
939ae8ec5e1SHisping Lin 
940ae8ec5e1SHisping Lin 
941ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
942ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
943ae8ec5e1SHisping Lin 						TEEC_NONE,
944ae8ec5e1SHisping Lin 						TEEC_NONE);
945ae8ec5e1SHisping Lin 
946ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
947ae8ec5e1SHisping Lin 					1,
948ae8ec5e1SHisping Lin 					&TeecOperation,
949ae8ec5e1SHisping Lin 					&ErrorOrigin);
950ae8ec5e1SHisping Lin 
951ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
952ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
953ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
95446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
955ae8ec5e1SHisping Lin 	debug("testmm end\n");
956ae8ec5e1SHisping Lin 
957ae8ec5e1SHisping Lin 	return TeecResult;
958ae8ec5e1SHisping Lin }
959ae8ec5e1SHisping Lin 
9606ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
9616ef445a4SHisping Lin {
9626ef445a4SHisping Lin 	TEEC_Result TeecResult;
9636ef445a4SHisping Lin 	TEEC_Context TeecContext;
9646ef445a4SHisping Lin 	TEEC_Session TeecSession;
9656ef445a4SHisping Lin 	uint32_t ErrorOrigin;
9666ef445a4SHisping Lin 
9676ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
9686ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9696ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9706ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
9716ef445a4SHisping Lin 
9726ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
9736ef445a4SHisping Lin 
9746ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9756ef445a4SHisping Lin 
9766ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9776ef445a4SHisping Lin 				&TeecSession,
9786ef445a4SHisping Lin 				TeecUuid,
9796ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
9806ef445a4SHisping Lin 				NULL,
9816ef445a4SHisping Lin 				NULL,
9826ef445a4SHisping Lin 				&ErrorOrigin);
9836ef445a4SHisping Lin 
9846ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
9856ef445a4SHisping Lin 
9866ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
9876ef445a4SHisping Lin 	SharedMem0.flags = 0;
9886ef445a4SHisping Lin 
9896ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
9906ef445a4SHisping Lin 
9916ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9926ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9936ef445a4SHisping Lin 
9946ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
9956ef445a4SHisping Lin 						TEEC_NONE,
9966ef445a4SHisping Lin 						TEEC_NONE,
9976ef445a4SHisping Lin 						TEEC_NONE);
9986ef445a4SHisping Lin 
9996ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10006ef445a4SHisping Lin 					0,
10016ef445a4SHisping Lin 					&TeecOperation,
10026ef445a4SHisping Lin 					&ErrorOrigin);
10036ef445a4SHisping Lin 
10046ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
10056ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
10066ef445a4SHisping Lin 
10076ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
10086ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
10096ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10106ef445a4SHisping Lin 
10116ef445a4SHisping Lin 	return TeecResult;
10126ef445a4SHisping Lin }
10136ef445a4SHisping Lin 
10146ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
10156ef445a4SHisping Lin {
10166ef445a4SHisping Lin 	TEEC_Result TeecResult;
10176ef445a4SHisping Lin 	TEEC_Context TeecContext;
10186ef445a4SHisping Lin 	TEEC_Session TeecSession;
10196ef445a4SHisping Lin 	uint32_t ErrorOrigin;
10206ef445a4SHisping Lin 
10216ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
10226ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
10236ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
10246ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
10256ef445a4SHisping Lin 
10266ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
10276ef445a4SHisping Lin 
10286ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
10296ef445a4SHisping Lin 
10306ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
10316ef445a4SHisping Lin 				&TeecSession,
10326ef445a4SHisping Lin 				TeecUuid,
10336ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
10346ef445a4SHisping Lin 				NULL,
10356ef445a4SHisping Lin 				NULL,
10366ef445a4SHisping Lin 				&ErrorOrigin);
10376ef445a4SHisping Lin 
10386ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
10396ef445a4SHisping Lin 
10406ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
10416ef445a4SHisping Lin 	SharedMem0.flags = 0;
10426ef445a4SHisping Lin 
10436ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
10446ef445a4SHisping Lin 
10456ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
10466ef445a4SHisping Lin 
10476ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10486ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10496ef445a4SHisping Lin 
10506ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
10516ef445a4SHisping Lin 						TEEC_NONE,
10526ef445a4SHisping Lin 						TEEC_NONE,
10536ef445a4SHisping Lin 						TEEC_NONE);
10546ef445a4SHisping Lin 
10556ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10566ef445a4SHisping Lin 					1,
10576ef445a4SHisping Lin 					&TeecOperation,
10586ef445a4SHisping Lin 					&ErrorOrigin);
10596ef445a4SHisping Lin 
10606ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
10616ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
10626ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10636ef445a4SHisping Lin 
10646ef445a4SHisping Lin 	return TeecResult;
10656ef445a4SHisping Lin }
106616539616SHisping Lin 
106716539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
106816539616SHisping Lin {
106916539616SHisping Lin 	TEEC_Result TeecResult;
107016539616SHisping Lin 	TEEC_Context TeecContext;
107116539616SHisping Lin 	TEEC_Session TeecSession;
107216539616SHisping Lin 	uint32_t ErrorOrigin;
107316539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
107416539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
107516539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
107616539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
107716539616SHisping Lin 
107816539616SHisping Lin 	OpteeClientApiLibInitialize();
107916539616SHisping Lin 
108016539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
108116539616SHisping Lin 
108216539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
108316539616SHisping Lin 				&TeecSession,
108416539616SHisping Lin 				TeecUuid,
108516539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
108616539616SHisping Lin 				NULL,
108716539616SHisping Lin 				NULL,
108816539616SHisping Lin 				&ErrorOrigin);
108916539616SHisping Lin 
109016539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
109116539616SHisping Lin 						TEEC_NONE,
109216539616SHisping Lin 						TEEC_NONE,
109316539616SHisping Lin 						TEEC_NONE);
109416539616SHisping Lin 
109516539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
109616539616SHisping Lin 					2,
109716539616SHisping Lin 					&TeecOperation,
109816539616SHisping Lin 					&ErrorOrigin);
109916539616SHisping Lin 
110016539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
110116539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
110216539616SHisping Lin 
110316539616SHisping Lin 	return TeecResult;
110416539616SHisping Lin }
110516539616SHisping Lin 
110616539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
110716539616SHisping Lin {
110816539616SHisping Lin 	TEEC_Result TeecResult;
110916539616SHisping Lin 	TEEC_Context TeecContext;
111016539616SHisping Lin 	TEEC_Session TeecSession;
111116539616SHisping Lin 	uint32_t ErrorOrigin;
111216539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
111316539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
111416539616SHisping Lin 
111516539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
111616539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
111716539616SHisping Lin 
111816539616SHisping Lin 	OpteeClientApiLibInitialize();
111916539616SHisping Lin 
112016539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
112116539616SHisping Lin 
112216539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
112316539616SHisping Lin 				&TeecSession,
112416539616SHisping Lin 				TeecUuid,
112516539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
112616539616SHisping Lin 				NULL,
112716539616SHisping Lin 				NULL,
112816539616SHisping Lin 				&ErrorOrigin);
112916539616SHisping Lin 
113016539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
113116539616SHisping Lin 						TEEC_NONE,
113216539616SHisping Lin 						TEEC_NONE,
113316539616SHisping Lin 						TEEC_NONE);
113416539616SHisping Lin 
113516539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
113616539616SHisping Lin 					2,
113716539616SHisping Lin 					&TeecOperation,
113816539616SHisping Lin 					&ErrorOrigin);
113916539616SHisping Lin 
114016539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
114116539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
114216539616SHisping Lin 
114316539616SHisping Lin 	return TeecResult;
114416539616SHisping Lin }
114516539616SHisping Lin 
114616539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
114716539616SHisping Lin {
114816539616SHisping Lin 	TEEC_Result res;
114916539616SHisping Lin 	res = notify_optee_rpmb_ta();
115016539616SHisping Lin 	res |= notify_optee_efuse_ta();
115116539616SHisping Lin 	return res;
115216539616SHisping Lin }
11532cd27853SHisping Lin 
11542cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
11552cd27853SHisping Lin {
11562cd27853SHisping Lin 	TEEC_Result TeecResult;
11572cd27853SHisping Lin 	TEEC_Context TeecContext;
11582cd27853SHisping Lin 	TEEC_Session TeecSession;
11592cd27853SHisping Lin 	uint32_t ErrorOrigin;
11602cd27853SHisping Lin 
11612cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11622cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11632cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11642cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
11652cd27853SHisping Lin 
11662cd27853SHisping Lin 	OpteeClientApiLibInitialize();
11672cd27853SHisping Lin 
11682cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
11692cd27853SHisping Lin 
11702cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11712cd27853SHisping Lin 				&TeecSession,
11722cd27853SHisping Lin 				TeecUuid,
11732cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
11742cd27853SHisping Lin 				NULL,
11752cd27853SHisping Lin 				NULL,
11762cd27853SHisping Lin 				&ErrorOrigin);
11772cd27853SHisping Lin 
11782cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11792cd27853SHisping Lin 
11802cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
11812cd27853SHisping Lin 	SharedMem0.flags = 0;
11822cd27853SHisping Lin 
11832cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
11842cd27853SHisping Lin 
11852cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11862cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11872cd27853SHisping Lin 
11882cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
11892cd27853SHisping Lin 						TEEC_NONE,
11902cd27853SHisping Lin 						TEEC_NONE,
11912cd27853SHisping Lin 						TEEC_NONE);
11922cd27853SHisping Lin 
11932cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11942cd27853SHisping Lin 					3,
11952cd27853SHisping Lin 					&TeecOperation,
11962cd27853SHisping Lin 					&ErrorOrigin);
11972cd27853SHisping Lin 
11982cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
11992cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
12002cd27853SHisping Lin 
12012cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12022cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
12032cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12042cd27853SHisping Lin 
12052cd27853SHisping Lin 	return TeecResult;
12062cd27853SHisping Lin }
12072cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
12082cd27853SHisping Lin {
12092cd27853SHisping Lin 	TEEC_Result TeecResult;
12102cd27853SHisping Lin 	TEEC_Context TeecContext;
12112cd27853SHisping Lin 	TEEC_Session TeecSession;
12122cd27853SHisping Lin 	uint32_t ErrorOrigin;
12132cd27853SHisping Lin 
12142cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
12152cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
12162cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
12172cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
12182cd27853SHisping Lin 
12192cd27853SHisping Lin 	OpteeClientApiLibInitialize();
12202cd27853SHisping Lin 
12212cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
12222cd27853SHisping Lin 
12232cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
12242cd27853SHisping Lin 				&TeecSession,
12252cd27853SHisping Lin 				TeecUuid,
12262cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
12272cd27853SHisping Lin 				NULL,
12282cd27853SHisping Lin 				NULL,
12292cd27853SHisping Lin 				&ErrorOrigin);
12302cd27853SHisping Lin 
12312cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
12322cd27853SHisping Lin 
12332cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
12342cd27853SHisping Lin 	SharedMem0.flags = 0;
12352cd27853SHisping Lin 
12362cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
12372cd27853SHisping Lin 
12382cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
12392cd27853SHisping Lin 
12402cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12412cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12422cd27853SHisping Lin 
12432cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
12442cd27853SHisping Lin 						TEEC_NONE,
12452cd27853SHisping Lin 						TEEC_NONE,
12462cd27853SHisping Lin 						TEEC_NONE);
12472cd27853SHisping Lin 
12482cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12492cd27853SHisping Lin 					4,
12502cd27853SHisping Lin 					&TeecOperation,
12512cd27853SHisping Lin 					&ErrorOrigin);
12522cd27853SHisping Lin 
12532cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12542cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
12552cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12562cd27853SHisping Lin 
12572cd27853SHisping Lin 	return TeecResult;
12582cd27853SHisping Lin }
1259095e2a82SHisping Lin 
1260468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1261468df3b2SHisping Lin {
1262468df3b2SHisping Lin 	TEEC_Result TeecResult;
1263468df3b2SHisping Lin 	TEEC_Context TeecContext;
1264468df3b2SHisping Lin 	TEEC_Session TeecSession;
1265468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1266468df3b2SHisping Lin 	uint32_t bootflag;
1267468df3b2SHisping Lin 
1268468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1269468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1270468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1271468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1272468df3b2SHisping Lin 
1273468df3b2SHisping Lin 	OpteeClientApiLibInitialize();
1274468df3b2SHisping Lin 
1275468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1276468df3b2SHisping Lin 
1277468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1278468df3b2SHisping Lin 				&TeecSession,
1279468df3b2SHisping Lin 				TeecUuid,
1280468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1281468df3b2SHisping Lin 				NULL,
1282468df3b2SHisping Lin 				NULL,
1283468df3b2SHisping Lin 				&ErrorOrigin);
1284468df3b2SHisping Lin 
1285468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1286468df3b2SHisping Lin 
1287468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1288468df3b2SHisping Lin 	SharedMem0.flags = 0;
1289468df3b2SHisping Lin 
1290468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1291468df3b2SHisping Lin 
1292468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1293468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1294468df3b2SHisping Lin 
1295468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1296468df3b2SHisping Lin 						TEEC_NONE,
1297468df3b2SHisping Lin 						TEEC_NONE,
1298468df3b2SHisping Lin 						TEEC_NONE);
1299468df3b2SHisping Lin 
1300468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1301468df3b2SHisping Lin 					5,
1302468df3b2SHisping Lin 					&TeecOperation,
1303468df3b2SHisping Lin 					&ErrorOrigin);
1304468df3b2SHisping Lin 
1305468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1306468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
1307468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1308468df3b2SHisping Lin 			*flag = 1;
1309468df3b2SHisping Lin 	}
1310468df3b2SHisping Lin 
1311468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1312468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1313468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1314468df3b2SHisping Lin 
1315468df3b2SHisping Lin 	return TeecResult;
1316468df3b2SHisping Lin }
1317468df3b2SHisping Lin 
1318095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1319095e2a82SHisping Lin {
1320095e2a82SHisping Lin 	TEEC_Result TeecResult;
1321095e2a82SHisping Lin 	TEEC_Context TeecContext;
1322095e2a82SHisping Lin 	TEEC_Session TeecSession;
1323095e2a82SHisping Lin 	uint32_t ErrorOrigin;
132499830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
132599830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
1326095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1327095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
13283251364cSHisping Lin 	struct blk_desc *dev_desc;
13293251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
13306651d4c0SJason Zhu 	if (!dev_desc) {
13316651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
13326651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
13336651d4c0SJason Zhu 	}
1334095e2a82SHisping Lin 
1335095e2a82SHisping Lin 	debug("testmm start\n");
1336095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1337095e2a82SHisping Lin 
1338095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1339095e2a82SHisping Lin 
13403251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
13413251364cSHisping Lin 						TEEC_NONE,
13423251364cSHisping Lin 						TEEC_NONE,
13433251364cSHisping Lin 						TEEC_NONE);
13443251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
13453251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
13463251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
13473251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
13483251364cSHisping Lin #endif
13493251364cSHisping Lin 
1350095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1351095e2a82SHisping Lin 				&TeecSession,
1352095e2a82SHisping Lin 				TeecUuid,
1353095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1354095e2a82SHisping Lin 				NULL,
13553251364cSHisping Lin 				&TeecOperation,
1356095e2a82SHisping Lin 				&ErrorOrigin);
1357095e2a82SHisping Lin 
1358095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1359095e2a82SHisping Lin 
1360095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1361095e2a82SHisping Lin 	SharedMem0.flags = 0;
1362095e2a82SHisping Lin 
1363095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1364095e2a82SHisping Lin 
1365095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1366095e2a82SHisping Lin 
1367095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1368095e2a82SHisping Lin 
1369095e2a82SHisping Lin 	SharedMem1.size = 1;
1370095e2a82SHisping Lin 	SharedMem1.flags = 0;
1371095e2a82SHisping Lin 
1372095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1373095e2a82SHisping Lin 
1374095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1375095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1376095e2a82SHisping Lin 
1377095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1378095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1379095e2a82SHisping Lin 
1380095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1381095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1382095e2a82SHisping Lin 						TEEC_NONE,
1383095e2a82SHisping Lin 						TEEC_NONE);
1384095e2a82SHisping Lin 
1385095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
138699830019SHisping Lin 					0,
1387095e2a82SHisping Lin 					&TeecOperation,
1388095e2a82SHisping Lin 					&ErrorOrigin);
1389095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1390095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1391095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1392095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1393095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1394095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1395095e2a82SHisping Lin 	debug("testmm end\n");
1396095e2a82SHisping Lin 
1397095e2a82SHisping Lin 	return TeecResult;
1398095e2a82SHisping Lin }
1399095e2a82SHisping Lin 
1400095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1401095e2a82SHisping Lin {
1402095e2a82SHisping Lin 	TEEC_Result TeecResult;
1403095e2a82SHisping Lin 	TEEC_Context TeecContext;
1404095e2a82SHisping Lin 	TEEC_Session TeecSession;
1405095e2a82SHisping Lin 	uint32_t ErrorOrigin;
140699830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
140799830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
1408095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1409095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
14103251364cSHisping Lin 	struct blk_desc *dev_desc;
14113251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
14126651d4c0SJason Zhu 	if (!dev_desc) {
14136651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
14146651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
14156651d4c0SJason Zhu 	}
1416095e2a82SHisping Lin 
1417095e2a82SHisping Lin 	debug("testmm start\n");
1418095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1419095e2a82SHisping Lin 
1420095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1421095e2a82SHisping Lin 
14223251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
14233251364cSHisping Lin 						TEEC_NONE,
14243251364cSHisping Lin 						TEEC_NONE,
14253251364cSHisping Lin 						TEEC_NONE);
14263251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
14273251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
14283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
14293251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
14303251364cSHisping Lin #endif
14313251364cSHisping Lin 
1432095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1433095e2a82SHisping Lin 				&TeecSession,
1434095e2a82SHisping Lin 				TeecUuid,
1435095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1436095e2a82SHisping Lin 				NULL,
14373251364cSHisping Lin 				&TeecOperation,
1438095e2a82SHisping Lin 				&ErrorOrigin);
1439095e2a82SHisping Lin 
1440095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1441095e2a82SHisping Lin 
1442095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1443095e2a82SHisping Lin 	SharedMem0.flags = 0;
1444095e2a82SHisping Lin 
1445095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1446095e2a82SHisping Lin 
1447095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1448095e2a82SHisping Lin 
1449095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1450095e2a82SHisping Lin 
1451095e2a82SHisping Lin 	SharedMem1.size = 1;
1452095e2a82SHisping Lin 	SharedMem1.flags = 0;
1453095e2a82SHisping Lin 
1454095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1455095e2a82SHisping Lin 
1456095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1457095e2a82SHisping Lin 
1458095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1459095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1460095e2a82SHisping Lin 
1461095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1462095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1463095e2a82SHisping Lin 
1464095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1465095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1466095e2a82SHisping Lin 						TEEC_NONE,
1467095e2a82SHisping Lin 						TEEC_NONE);
1468095e2a82SHisping Lin 
1469095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
147099830019SHisping Lin 					1,
1471095e2a82SHisping Lin 					&TeecOperation,
1472095e2a82SHisping Lin 					&ErrorOrigin);
1473095e2a82SHisping Lin 
1474095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1475095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1476095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1477095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1478095e2a82SHisping Lin 	debug("testmm end\n");
1479095e2a82SHisping Lin 
1480095e2a82SHisping Lin 	return TeecResult;
1481095e2a82SHisping Lin }
14824aa61755SAndy Ye 
14834aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
14844aa61755SAndy Ye {
14854aa61755SAndy Ye 	TEEC_Result TeecResult;
14864aa61755SAndy Ye 	TEEC_Context TeecContext;
14874aa61755SAndy Ye 	TEEC_Session TeecSession;
14884aa61755SAndy Ye 	uint32_t ErrorOrigin;
14894aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
14904aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
14914aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
14924aa61755SAndy Ye 				}
14934aa61755SAndy Ye 			     };
14944aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
14954aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
14963251364cSHisping Lin 	struct blk_desc *dev_desc;
14973251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
14986651d4c0SJason Zhu 	if (!dev_desc) {
14996651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15006651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15016651d4c0SJason Zhu 	}
15024aa61755SAndy Ye 
15034aa61755SAndy Ye 	OpteeClientApiLibInitialize();
15044aa61755SAndy Ye 
15054aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
15064aa61755SAndy Ye 
15073251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15083251364cSHisping Lin 						TEEC_NONE,
15093251364cSHisping Lin 						TEEC_NONE,
15103251364cSHisping Lin 						TEEC_NONE);
15113251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
15123251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
15133251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15143251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15153251364cSHisping Lin #endif
15163251364cSHisping Lin 
15174aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15184aa61755SAndy Ye 				      &TeecSession,
15194aa61755SAndy Ye 				      TeecUuid,
15204aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15214aa61755SAndy Ye 				      NULL,
15223251364cSHisping Lin 					&TeecOperation,
15234aa61755SAndy Ye 				      &ErrorOrigin);
15244aa61755SAndy Ye 
15254aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
15264aa61755SAndy Ye 
15274aa61755SAndy Ye 	SharedMem0.size = *dh_size;
15284aa61755SAndy Ye 	SharedMem0.flags = 0;
15294aa61755SAndy Ye 
15304aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
15314aa61755SAndy Ye 
15324aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
15334aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
15344aa61755SAndy Ye 
15354aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
15364aa61755SAndy Ye 						    TEEC_NONE,
15374aa61755SAndy Ye 						    TEEC_NONE,
15384aa61755SAndy Ye 						    TEEC_NONE);
15394aa61755SAndy Ye 
15404aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
15414aa61755SAndy Ye 					143,
15424aa61755SAndy Ye 					&TeecOperation,
15434aa61755SAndy Ye 					&ErrorOrigin);
15444aa61755SAndy Ye 
15454aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
15464aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
15474aa61755SAndy Ye 
15484aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
15494aa61755SAndy Ye 
15504aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
15514aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
15524aa61755SAndy Ye 
15534aa61755SAndy Ye 	return TeecResult;
15544aa61755SAndy Ye }
15554aa61755SAndy Ye 
15564aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
15574aa61755SAndy Ye {
15584aa61755SAndy Ye 	TEEC_Result TeecResult;
15594aa61755SAndy Ye 	TEEC_Context TeecContext;
15604aa61755SAndy Ye 	TEEC_Session TeecSession;
15614aa61755SAndy Ye 	uint32_t ErrorOrigin;
15624aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15634aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15644aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15654aa61755SAndy Ye 				}
15664aa61755SAndy Ye 			     };
15674aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15684aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
15693251364cSHisping Lin 	struct blk_desc *dev_desc;
15703251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15716651d4c0SJason Zhu 	if (!dev_desc) {
15726651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15736651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15746651d4c0SJason Zhu 	}
15754aa61755SAndy Ye 
15764aa61755SAndy Ye 	OpteeClientApiLibInitialize();
15774aa61755SAndy Ye 
15784aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
15794aa61755SAndy Ye 
15803251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15813251364cSHisping Lin 						TEEC_NONE,
15823251364cSHisping Lin 						TEEC_NONE,
15833251364cSHisping Lin 						TEEC_NONE);
15843251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
15853251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
15863251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15873251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15883251364cSHisping Lin #endif
15893251364cSHisping Lin 
15904aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15914aa61755SAndy Ye 				      &TeecSession,
15924aa61755SAndy Ye 				      TeecUuid,
15934aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15944aa61755SAndy Ye 				      NULL,
15953251364cSHisping Lin 					&TeecOperation,
15964aa61755SAndy Ye 				      &ErrorOrigin);
15974aa61755SAndy Ye 
15984aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
15994aa61755SAndy Ye 
16004aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
16014aa61755SAndy Ye 	SharedMem0.flags = 0;
16024aa61755SAndy Ye 
16034aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
16044aa61755SAndy Ye 
16054aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
16064aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
16074aa61755SAndy Ye 
16084aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
16094aa61755SAndy Ye 						    TEEC_NONE,
16104aa61755SAndy Ye 						    TEEC_NONE,
16114aa61755SAndy Ye 						    TEEC_NONE);
16124aa61755SAndy Ye 
16134aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16144aa61755SAndy Ye 					144,
16154aa61755SAndy Ye 					&TeecOperation,
16164aa61755SAndy Ye 					&ErrorOrigin);
16174aa61755SAndy Ye 
16184aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
16194aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
16204aa61755SAndy Ye 
16214aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
16224aa61755SAndy Ye 
16234aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
16244aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
16254aa61755SAndy Ye 
16264aa61755SAndy Ye 	return TeecResult;
16274aa61755SAndy Ye }
16284aa61755SAndy Ye 
16294aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
16304aa61755SAndy Ye 			      uint32_t *operation_size,
16314aa61755SAndy Ye 			      uint8_t *out,
16324aa61755SAndy Ye 			      uint32_t *out_len)
16334aa61755SAndy Ye {
16344aa61755SAndy Ye 	TEEC_Result TeecResult;
16354aa61755SAndy Ye 	TEEC_Context TeecContext;
16364aa61755SAndy Ye 	TEEC_Session TeecSession;
16374aa61755SAndy Ye 	uint32_t ErrorOrigin;
16384aa61755SAndy Ye 
16394aa61755SAndy Ye 	OpteeClientApiLibInitialize();
16404aa61755SAndy Ye 
16414aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16424aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16434aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16444aa61755SAndy Ye 				}
16454aa61755SAndy Ye 			     };
16464aa61755SAndy Ye 
16474aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16484aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16493251364cSHisping Lin 	struct blk_desc *dev_desc;
16503251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16516651d4c0SJason Zhu 	if (!dev_desc) {
16526651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
16536651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
16546651d4c0SJason Zhu 	}
16554aa61755SAndy Ye 
16564aa61755SAndy Ye 	OpteeClientApiLibInitialize();
16574aa61755SAndy Ye 
16584aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16594aa61755SAndy Ye 
16603251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16613251364cSHisping Lin 						TEEC_NONE,
16623251364cSHisping Lin 						TEEC_NONE,
16633251364cSHisping Lin 						TEEC_NONE);
16643251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16653251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16663251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16673251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16683251364cSHisping Lin #endif
16693251364cSHisping Lin 
16704aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16714aa61755SAndy Ye 				      &TeecSession,
16724aa61755SAndy Ye 				      TeecUuid,
16734aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16744aa61755SAndy Ye 				      NULL,
16753251364cSHisping Lin 					&TeecOperation,
16764aa61755SAndy Ye 				      &ErrorOrigin);
16774aa61755SAndy Ye 
16784aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16794aa61755SAndy Ye 
16804aa61755SAndy Ye 	SharedMem0.size = *operation_size;
16814aa61755SAndy Ye 	SharedMem0.flags = 0;
16824aa61755SAndy Ye 
16834aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
16844aa61755SAndy Ye 
16854aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
16864aa61755SAndy Ye 
16874aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
16884aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
16894aa61755SAndy Ye 
16904aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
16914aa61755SAndy Ye 
16924aa61755SAndy Ye 	SharedMem1.size = *out_len;
16934aa61755SAndy Ye 	SharedMem1.flags = 0;
16944aa61755SAndy Ye 
16954aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
16964aa61755SAndy Ye 
16974aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
16984aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
16994aa61755SAndy Ye 
17004aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17014aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
17024aa61755SAndy Ye 						    TEEC_NONE,
17034aa61755SAndy Ye 						    TEEC_NONE);
17044aa61755SAndy Ye 
17054aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17064aa61755SAndy Ye 					145,
17074aa61755SAndy Ye 					&TeecOperation,
17084aa61755SAndy Ye 					&ErrorOrigin);
17094aa61755SAndy Ye 
17104aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
17114aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
17124aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17134aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
17144aa61755SAndy Ye 
17154aa61755SAndy Ye 	return TeecResult;
17164aa61755SAndy Ye }
17174aa61755SAndy Ye 
17184aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
17194aa61755SAndy Ye {
17204aa61755SAndy Ye 	TEEC_Result TeecResult;
17214aa61755SAndy Ye 	TEEC_Context TeecContext;
17224aa61755SAndy Ye 	TEEC_Session TeecSession;
17234aa61755SAndy Ye 	uint32_t ErrorOrigin;
17244aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17254aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17264aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17274aa61755SAndy Ye 				}
17284aa61755SAndy Ye 			     };
17294aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17304aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17313251364cSHisping Lin 	struct blk_desc *dev_desc;
17323251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17336651d4c0SJason Zhu 	if (!dev_desc) {
17346651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17356651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17366651d4c0SJason Zhu 	}
17374aa61755SAndy Ye 
17384aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
17394aa61755SAndy Ye 
17403251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17413251364cSHisping Lin 						TEEC_NONE,
17423251364cSHisping Lin 						TEEC_NONE,
17433251364cSHisping Lin 						TEEC_NONE);
17443251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
17453251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
17463251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17473251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17483251364cSHisping Lin #endif
17493251364cSHisping Lin 
17504aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17514aa61755SAndy Ye 					&TeecSession,
17524aa61755SAndy Ye 					TeecUuid,
17534aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
17544aa61755SAndy Ye 					NULL,
17553251364cSHisping Lin 					&TeecOperation,
17564aa61755SAndy Ye 					&ErrorOrigin);
17574aa61755SAndy Ye 
17584aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17594aa61755SAndy Ye 
17604aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
17614aa61755SAndy Ye 	SharedMem0.flags = 0;
17624aa61755SAndy Ye 
17634aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17644aa61755SAndy Ye 
17654aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
17664aa61755SAndy Ye 
17674aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17684aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17694aa61755SAndy Ye 
17704aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17714aa61755SAndy Ye 						    TEEC_NONE,
17724aa61755SAndy Ye 						    TEEC_NONE,
17734aa61755SAndy Ye 						    TEEC_NONE);
17744aa61755SAndy Ye 
17754aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17764aa61755SAndy Ye 					146,
17774aa61755SAndy Ye 					&TeecOperation,
17784aa61755SAndy Ye 					&ErrorOrigin);
17794aa61755SAndy Ye 
17804aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17814aa61755SAndy Ye 
17824aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
17834aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
17844aa61755SAndy Ye 
17854aa61755SAndy Ye 	return TeecResult;
17864aa61755SAndy Ye }
1787