xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 0202ee8aefc1cbe36925b21b5fd0dce585adfb91)
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 
18f4e1db95SHisping Lin uint32_t 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__);
32f4e1db95SHisping Lin 		return -TEEC_ERROR_GENERIC;
336651d4c0SJason Zhu 	}
34ae8ec5e1SHisping Lin 
35f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
36f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
37f4e1db95SHisping Lin 		return TeecResult;
38ae8ec5e1SHisping Lin 
39ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
40f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
41f4e1db95SHisping Lin 		return TeecResult;
42ae8ec5e1SHisping Lin 
433251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
443251364cSHisping Lin 						TEEC_NONE,
453251364cSHisping Lin 						TEEC_NONE,
463251364cSHisping Lin 						TEEC_NONE);
473251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
483251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
493251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
503251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
513251364cSHisping Lin #endif
523251364cSHisping Lin 
53ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
54ae8ec5e1SHisping Lin 				&TeecSession,
55ae8ec5e1SHisping Lin 				TeecUuid,
56ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
57ae8ec5e1SHisping Lin 				NULL,
583251364cSHisping Lin 				&TeecOperation,
59ae8ec5e1SHisping Lin 				&ErrorOrigin);
60f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
61f4e1db95SHisping Lin 		return TeecResult;
62ae8ec5e1SHisping Lin 
63ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
64ae8ec5e1SHisping Lin 
65ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
66ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
67ae8ec5e1SHisping Lin 
68ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
69f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
70f4e1db95SHisping Lin 		goto exit;
71ae8ec5e1SHisping Lin 
72ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
73ae8ec5e1SHisping Lin 
74ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
75ae8ec5e1SHisping Lin 
76ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
77ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
78ae8ec5e1SHisping Lin 
79ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
80f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
81f4e1db95SHisping Lin 		goto exit;
82ae8ec5e1SHisping Lin 
83ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
84ae8ec5e1SHisping Lin 
85ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
86ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
87ae8ec5e1SHisping Lin 
88ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
89ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
90ae8ec5e1SHisping Lin 
91ae8ec5e1SHisping Lin 
92ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
93ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
94ae8ec5e1SHisping Lin 						TEEC_NONE,
95ae8ec5e1SHisping Lin 						TEEC_NONE);
96ae8ec5e1SHisping Lin 
97ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
98ae8ec5e1SHisping Lin 					1,
99ae8ec5e1SHisping Lin 					&TeecOperation,
100ae8ec5e1SHisping Lin 					&ErrorOrigin);
101f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
102f4e1db95SHisping Lin 		goto exit;
103f4e1db95SHisping Lin exit:
104ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
105ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
106ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
10746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
108f4e1db95SHisping Lin 	return TeecResult;
109ae8ec5e1SHisping Lin }
110ae8ec5e1SHisping Lin 
111ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
112ae8ec5e1SHisping Lin {
113ae8ec5e1SHisping Lin 	if (in > 9)
114ae8ec5e1SHisping Lin 		return in + 55;
115ae8ec5e1SHisping Lin 	else
116ae8ec5e1SHisping Lin 		return in + 48;
117ae8ec5e1SHisping Lin }
118ae8ec5e1SHisping Lin 
119ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
120ae8ec5e1SHisping Lin {
121ae8ec5e1SHisping Lin 	uint32_t i = 0;
122ae8ec5e1SHisping Lin 
123ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
124ae8ec5e1SHisping Lin 		return 0;
125ae8ec5e1SHisping Lin 
126ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
127ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
128ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
129ae8ec5e1SHisping Lin 	}
130ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
131ae8ec5e1SHisping Lin 
132ae8ec5e1SHisping Lin 	return blen * 2;
133ae8ec5e1SHisping Lin }
134ae8ec5e1SHisping Lin 
135ae8ec5e1SHisping Lin 
136ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
137ae8ec5e1SHisping Lin {
138ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
139ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
140ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
141ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
142ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
143ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
144ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
145ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
146ae8ec5e1SHisping Lin 	uint8_t hs[9];
147ae8ec5e1SHisping Lin 
1483251364cSHisping Lin 	struct blk_desc *dev_desc;
1493251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1506651d4c0SJason Zhu 	if (!dev_desc) {
1516651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1526651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1536651d4c0SJason Zhu 	}
1543251364cSHisping Lin 
155ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
156f4e1db95SHisping Lin 
157f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
158f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
159f4e1db95SHisping Lin 		return TeecResult;
160ae8ec5e1SHisping Lin 
161ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
162f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
163f4e1db95SHisping Lin 		return TeecResult;
164ae8ec5e1SHisping Lin 
1653251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1663251364cSHisping Lin 						TEEC_NONE,
1673251364cSHisping Lin 						TEEC_NONE,
1683251364cSHisping Lin 						TEEC_NONE);
1693251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1703251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1713251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1723251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1733251364cSHisping Lin #endif
1743251364cSHisping Lin 
175ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
176ae8ec5e1SHisping Lin 				&TeecSession,
177ae8ec5e1SHisping Lin 				TeecUuid,
178ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
179ae8ec5e1SHisping Lin 				NULL,
1803251364cSHisping Lin 				&TeecOperation,
181ae8ec5e1SHisping Lin 				&ErrorOrigin);
182f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
183f4e1db95SHisping Lin 		return TeecResult;
184ae8ec5e1SHisping Lin 
185ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
186ae8ec5e1SHisping Lin 
187ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
188ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
189ae8ec5e1SHisping Lin 
190ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
191f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
192f4e1db95SHisping Lin 		goto exit;
193ae8ec5e1SHisping Lin 
194ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
195ae8ec5e1SHisping Lin 
196ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
197ae8ec5e1SHisping Lin 
198ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
199ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
200ae8ec5e1SHisping Lin 
201ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
202f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
203f4e1db95SHisping Lin 		goto exit;
204ae8ec5e1SHisping Lin 
205ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
206ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
207ae8ec5e1SHisping Lin 
208ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
209ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
210ae8ec5e1SHisping Lin 
211ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
212ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
213ae8ec5e1SHisping Lin 						TEEC_NONE,
214ae8ec5e1SHisping Lin 						TEEC_NONE);
215ae8ec5e1SHisping Lin 
216ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
217ae8ec5e1SHisping Lin 					0,
218ae8ec5e1SHisping Lin 					&TeecOperation,
219ae8ec5e1SHisping Lin 					&ErrorOrigin);
22046b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
221ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
222f4e1db95SHisping Lin exit:
223ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
224ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
225ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
22646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
227ae8ec5e1SHisping Lin 
228ae8ec5e1SHisping Lin 	return TeecResult;
229ae8ec5e1SHisping Lin }
230ae8ec5e1SHisping Lin 
231ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
232ae8ec5e1SHisping Lin {
233ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
234ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
235ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
236ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
237ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
238ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
239ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
240ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
241ae8ec5e1SHisping Lin 	uint8_t hs[9];
2423251364cSHisping Lin 	struct blk_desc *dev_desc;
2433251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
2446651d4c0SJason Zhu 	if (!dev_desc) {
2456651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
2466651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
2476651d4c0SJason Zhu 	}
2483251364cSHisping Lin 
249ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
250f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
251f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
252f4e1db95SHisping Lin 		return TeecResult;
253ae8ec5e1SHisping Lin 
254ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
255f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
256f4e1db95SHisping Lin 		return TeecResult;
257ae8ec5e1SHisping Lin 
2583251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2593251364cSHisping Lin 						TEEC_NONE,
2603251364cSHisping Lin 						TEEC_NONE,
2613251364cSHisping Lin 						TEEC_NONE);
2623251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2633251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
2643251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
2653251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
2663251364cSHisping Lin #endif
2673251364cSHisping Lin 
268ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
269ae8ec5e1SHisping Lin 				&TeecSession,
270ae8ec5e1SHisping Lin 				TeecUuid,
271ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
272ae8ec5e1SHisping Lin 				NULL,
2733251364cSHisping Lin 				&TeecOperation,
274ae8ec5e1SHisping Lin 				&ErrorOrigin);
275f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
276f4e1db95SHisping Lin 		return TeecResult;
277ae8ec5e1SHisping Lin 
278ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
279ae8ec5e1SHisping Lin 
280ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
281ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
282ae8ec5e1SHisping Lin 
283ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
284f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
285f4e1db95SHisping Lin 		goto exit;
286ae8ec5e1SHisping Lin 
287ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
288ae8ec5e1SHisping Lin 
289ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
290ae8ec5e1SHisping Lin 
291ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
292ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
293ae8ec5e1SHisping Lin 
294ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
295f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
296f4e1db95SHisping Lin 		goto exit;
297ae8ec5e1SHisping Lin 
298ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
299ae8ec5e1SHisping Lin 
300ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
301ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
302ae8ec5e1SHisping Lin 
303ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
304ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
305ae8ec5e1SHisping Lin 
306ae8ec5e1SHisping Lin 
307ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
308ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
309ae8ec5e1SHisping Lin 						TEEC_NONE,
310ae8ec5e1SHisping Lin 						TEEC_NONE);
311ae8ec5e1SHisping Lin 
312ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
313ae8ec5e1SHisping Lin 					1,
314ae8ec5e1SHisping Lin 					&TeecOperation,
315ae8ec5e1SHisping Lin 					&ErrorOrigin);
316f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
317f4e1db95SHisping Lin 		goto exit;
318f4e1db95SHisping Lin exit:
319ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
320ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
321ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
32246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
323ae8ec5e1SHisping Lin 
324ae8ec5e1SHisping Lin 	return TeecResult;
325ae8ec5e1SHisping Lin }
326ae8ec5e1SHisping Lin 
327ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
328ae8ec5e1SHisping Lin {
329ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
330ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
331ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
332ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
33399830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
33499830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
335ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
336ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
3373251364cSHisping Lin 	struct blk_desc *dev_desc;
3383251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
3396651d4c0SJason Zhu 	if (!dev_desc) {
3406651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
3416651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
3426651d4c0SJason Zhu 	}
343ae8ec5e1SHisping Lin 
344f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
345f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
346f4e1db95SHisping Lin 		return TeecResult;
347ae8ec5e1SHisping Lin 
348ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
349f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
350f4e1db95SHisping Lin 		return TeecResult;
351ae8ec5e1SHisping Lin 
3523251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3533251364cSHisping Lin 						TEEC_NONE,
3543251364cSHisping Lin 						TEEC_NONE,
3553251364cSHisping Lin 						TEEC_NONE);
3563251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
3573251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
3583251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3593251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3603251364cSHisping Lin #endif
3613251364cSHisping Lin 
362ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
363ae8ec5e1SHisping Lin 				&TeecSession,
364ae8ec5e1SHisping Lin 				TeecUuid,
365ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
366ae8ec5e1SHisping Lin 				NULL,
3673251364cSHisping Lin 				&TeecOperation,
368ae8ec5e1SHisping Lin 				&ErrorOrigin);
369f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
370f4e1db95SHisping Lin 		return TeecResult;
371ae8ec5e1SHisping Lin 
372ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
373ae8ec5e1SHisping Lin 
374ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
375ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
376ae8ec5e1SHisping Lin 
377ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
378f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
379f4e1db95SHisping Lin 		goto exit;
380ae8ec5e1SHisping Lin 
381ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
382ae8ec5e1SHisping Lin 
383ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
384ae8ec5e1SHisping Lin 
385ae8ec5e1SHisping Lin 	SharedMem1.size = size;
386ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
387ae8ec5e1SHisping Lin 
388ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
389f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
390f4e1db95SHisping Lin 		goto exit;
391ae8ec5e1SHisping Lin 
392ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
393ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
394ae8ec5e1SHisping Lin 
395ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
396ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
397ae8ec5e1SHisping Lin 
398ae8ec5e1SHisping Lin 
399ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
400ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
401ae8ec5e1SHisping Lin 						TEEC_NONE,
402ae8ec5e1SHisping Lin 						TEEC_NONE);
403ae8ec5e1SHisping Lin 
404ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
40599830019SHisping Lin 					0,
406ae8ec5e1SHisping Lin 					&TeecOperation,
407ae8ec5e1SHisping Lin 					&ErrorOrigin);
40846b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
409ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
410f4e1db95SHisping Lin exit:
411ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
412ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
413ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
41446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
415ae8ec5e1SHisping Lin 
416ae8ec5e1SHisping Lin 	return TeecResult;
417ae8ec5e1SHisping Lin }
418ae8ec5e1SHisping Lin 
419ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
420ae8ec5e1SHisping Lin {
421ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
422ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
423ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
424ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
42599830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
42699830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
427ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
428ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
4293251364cSHisping Lin 	struct blk_desc *dev_desc;
4303251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
4316651d4c0SJason Zhu 	if (!dev_desc) {
4326651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
4336651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
4346651d4c0SJason Zhu 	}
435ae8ec5e1SHisping Lin 
436f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
437f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
438f4e1db95SHisping Lin 		return TeecResult;
439ae8ec5e1SHisping Lin 
440ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
441f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
442f4e1db95SHisping Lin 		return TeecResult;
443ae8ec5e1SHisping Lin 
4443251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4453251364cSHisping Lin 						TEEC_NONE,
4463251364cSHisping Lin 						TEEC_NONE,
4473251364cSHisping Lin 						TEEC_NONE);
4483251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
4493251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
4503251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4513251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4523251364cSHisping Lin #endif
4533251364cSHisping Lin 
454ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
455ae8ec5e1SHisping Lin 				&TeecSession,
456ae8ec5e1SHisping Lin 				TeecUuid,
457ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
458ae8ec5e1SHisping Lin 				NULL,
4593251364cSHisping Lin 				&TeecOperation,
460ae8ec5e1SHisping Lin 				&ErrorOrigin);
461f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
462f4e1db95SHisping Lin 		return TeecResult;
463ae8ec5e1SHisping Lin 
464ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
465ae8ec5e1SHisping Lin 
466ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
467ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
468ae8ec5e1SHisping Lin 
469ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
470f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
471f4e1db95SHisping Lin 		goto exit;
472ae8ec5e1SHisping Lin 
473ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
474ae8ec5e1SHisping Lin 
475ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
476ae8ec5e1SHisping Lin 
477ae8ec5e1SHisping Lin 	SharedMem1.size = size;
478ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
479ae8ec5e1SHisping Lin 
480ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
481f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
482f4e1db95SHisping Lin 		goto exit;
483ae8ec5e1SHisping Lin 
484ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
485ae8ec5e1SHisping Lin 
486ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
487ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
488ae8ec5e1SHisping Lin 
489ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
490ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
491ae8ec5e1SHisping Lin 
492ae8ec5e1SHisping Lin 
493ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
494ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
495ae8ec5e1SHisping Lin 						TEEC_NONE,
496ae8ec5e1SHisping Lin 						TEEC_NONE);
497ae8ec5e1SHisping Lin 
498ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
49999830019SHisping Lin 					1,
500ae8ec5e1SHisping Lin 					&TeecOperation,
501ae8ec5e1SHisping Lin 					&ErrorOrigin);
502f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
503f4e1db95SHisping Lin 		goto exit;
504f4e1db95SHisping Lin exit:
505ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
506ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
507ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
50846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
509ae8ec5e1SHisping Lin 
510ae8ec5e1SHisping Lin 	return TeecResult;
511ae8ec5e1SHisping Lin }
512ae8ec5e1SHisping Lin 
513564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
514564654ebSJason Zhu 					      uint32_t size)
515564654ebSJason Zhu {
516564654ebSJason Zhu 	TEEC_Result TeecResult;
517564654ebSJason Zhu 	TEEC_Context TeecContext;
518564654ebSJason Zhu 	TEEC_Session TeecSession;
519564654ebSJason Zhu 	uint32_t ErrorOrigin;
520564654ebSJason Zhu 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
521564654ebSJason Zhu 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
522564654ebSJason Zhu 	TEEC_UUID *TeecUuid = &tempuuid;
523564654ebSJason Zhu 	TEEC_Operation TeecOperation = {0};
524564654ebSJason Zhu 	struct blk_desc *dev_desc;
525564654ebSJason Zhu 
526564654ebSJason Zhu 	dev_desc = rockchip_get_bootdev();
527564654ebSJason Zhu 	if (!dev_desc) {
528564654ebSJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
529564654ebSJason Zhu 		return -TEEC_ERROR_GENERIC;
530564654ebSJason Zhu 	}
531564654ebSJason Zhu 
532f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
533f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
534f4e1db95SHisping Lin 		return TeecResult;
535f4e1db95SHisping Lin 
536564654ebSJason Zhu 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
537f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
538f4e1db95SHisping Lin 		return TeecResult;
539f4e1db95SHisping Lin 
540564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
541564654ebSJason Zhu 						    TEEC_NONE,
542564654ebSJason Zhu 						    TEEC_NONE,
543564654ebSJason Zhu 						    TEEC_NONE);
544564654ebSJason Zhu 	/*0 nand or emmc "security" partition , 1 rpmb*/
545564654ebSJason Zhu 	TeecOperation.params[0].value.a =
546564654ebSJason Zhu 		(dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
547564654ebSJason Zhu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
548564654ebSJason Zhu 	TeecOperation.params[0].value.a = 0;
549564654ebSJason Zhu #endif
550564654ebSJason Zhu 
551564654ebSJason Zhu 	TeecResult = TEEC_OpenSession(&TeecContext,
552564654ebSJason Zhu 				      &TeecSession,
553564654ebSJason Zhu 				      TeecUuid,
554564654ebSJason Zhu 				      TEEC_LOGIN_PUBLIC,
555564654ebSJason Zhu 				      NULL,
556564654ebSJason Zhu 				      &TeecOperation,
557564654ebSJason Zhu 				      &ErrorOrigin);
558f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
559f4e1db95SHisping Lin 		return TeecResult;
560564654ebSJason Zhu 
561564654ebSJason Zhu 	TEEC_SharedMemory SharedMem0 = {0};
562564654ebSJason Zhu 
563564654ebSJason Zhu 	SharedMem0.size = sizeof("rsacer");
564564654ebSJason Zhu 	SharedMem0.flags = 0;
565564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
566f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
567f4e1db95SHisping Lin 		goto exit;
568564654ebSJason Zhu 	memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size);
569564654ebSJason Zhu 	TEEC_SharedMemory SharedMem1 = {0};
570564654ebSJason Zhu 
571564654ebSJason Zhu 	SharedMem1.size = size;
572564654ebSJason Zhu 	SharedMem1.flags = 0;
573564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
574f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
575f4e1db95SHisping Lin 		goto exit;
576564654ebSJason Zhu 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
577564654ebSJason Zhu 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
578564654ebSJason Zhu 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
579564654ebSJason Zhu 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
580564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
581564654ebSJason Zhu 						    TEEC_MEMREF_TEMP_INOUT,
582564654ebSJason Zhu 						    TEEC_NONE,
583564654ebSJason Zhu 						    TEEC_NONE);
584564654ebSJason Zhu 
585564654ebSJason Zhu 	TeecResult = TEEC_InvokeCommand(&TeecSession,
586564654ebSJason Zhu 					0,
587564654ebSJason Zhu 					&TeecOperation,
588564654ebSJason Zhu 					&ErrorOrigin);
589564654ebSJason Zhu 	if (TeecResult == TEEC_SUCCESS)
590564654ebSJason Zhu 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
591f4e1db95SHisping Lin exit:
592564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem0);
593564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem1);
594564654ebSJason Zhu 	TEEC_CloseSession(&TeecSession);
595564654ebSJason Zhu 	TEEC_FinalizeContext(&TeecContext);
596564654ebSJason Zhu 
597564654ebSJason Zhu 	return TeecResult;
598564654ebSJason Zhu }
599564654ebSJason Zhu 
600564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
601564654ebSJason Zhu 					       uint32_t size)
602564654ebSJason Zhu {
603564654ebSJason Zhu 	TEEC_Result TeecResult;
604564654ebSJason Zhu 	TEEC_Context TeecContext;
605564654ebSJason Zhu 	TEEC_Session TeecSession;
606564654ebSJason Zhu 	uint32_t ErrorOrigin;
607564654ebSJason Zhu 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
608564654ebSJason Zhu 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
609564654ebSJason Zhu 	TEEC_UUID *TeecUuid = &tempuuid;
610564654ebSJason Zhu 	TEEC_Operation TeecOperation = {0};
611564654ebSJason Zhu 	struct blk_desc *dev_desc;
612564654ebSJason Zhu 
613564654ebSJason Zhu 	dev_desc = rockchip_get_bootdev();
614564654ebSJason Zhu 	if (!dev_desc) {
615564654ebSJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
616564654ebSJason Zhu 		return -TEEC_ERROR_GENERIC;
617564654ebSJason Zhu 	}
618564654ebSJason Zhu 
619f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
620f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
621f4e1db95SHisping Lin 		return TeecResult;
622f4e1db95SHisping Lin 
623564654ebSJason Zhu 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
624f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
625f4e1db95SHisping Lin 		return TeecResult;
626f4e1db95SHisping Lin 
627564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
628564654ebSJason Zhu 						    TEEC_NONE,
629564654ebSJason Zhu 						    TEEC_NONE,
630564654ebSJason Zhu 						    TEEC_NONE);
631564654ebSJason Zhu 	/*0 nand or emmc "security" partition , 1 rpmb*/
632564654ebSJason Zhu 	TeecOperation.params[0].value.a =
633564654ebSJason Zhu 		(dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
634564654ebSJason Zhu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
635564654ebSJason Zhu 	TeecOperation.params[0].value.a = 0;
636564654ebSJason Zhu #endif
637564654ebSJason Zhu 
638564654ebSJason Zhu 	TeecResult = TEEC_OpenSession(&TeecContext,
639564654ebSJason Zhu 				      &TeecSession,
640564654ebSJason Zhu 				      TeecUuid,
641564654ebSJason Zhu 				      TEEC_LOGIN_PUBLIC,
642564654ebSJason Zhu 				      NULL,
643564654ebSJason Zhu 				      &TeecOperation,
644564654ebSJason Zhu 				      &ErrorOrigin);
645f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
646f4e1db95SHisping Lin 		return TeecResult;
647564654ebSJason Zhu 
648564654ebSJason Zhu 	TEEC_SharedMemory SharedMem0 = {0};
649564654ebSJason Zhu 
650564654ebSJason Zhu 	SharedMem0.size = sizeof("rsacer");
651564654ebSJason Zhu 	SharedMem0.flags = 0;
652564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
653f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
654f4e1db95SHisping Lin 		goto exit;
655564654ebSJason Zhu 	memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size);
656564654ebSJason Zhu 	TEEC_SharedMemory SharedMem1 = {0};
657564654ebSJason Zhu 
658564654ebSJason Zhu 	SharedMem1.size = size;
659564654ebSJason Zhu 	SharedMem1.flags = 0;
660564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
661f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
662f4e1db95SHisping Lin 		goto exit;
663564654ebSJason Zhu 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
664564654ebSJason Zhu 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
665564654ebSJason Zhu 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
666564654ebSJason Zhu 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
667564654ebSJason Zhu 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
668564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
669564654ebSJason Zhu 						    TEEC_MEMREF_TEMP_INOUT,
670564654ebSJason Zhu 						    TEEC_NONE,
671564654ebSJason Zhu 						    TEEC_NONE);
672564654ebSJason Zhu 
673564654ebSJason Zhu 	TeecResult = TEEC_InvokeCommand(&TeecSession,
674564654ebSJason Zhu 					1,
675564654ebSJason Zhu 					&TeecOperation,
676564654ebSJason Zhu 					&ErrorOrigin);
677f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
678f4e1db95SHisping Lin 		goto exit;
679f4e1db95SHisping Lin exit:
680564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem0);
681564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem1);
682564654ebSJason Zhu 	TEEC_CloseSession(&TeecSession);
683564654ebSJason Zhu 	TEEC_FinalizeContext(&TeecContext);
684564654ebSJason Zhu 
685564654ebSJason Zhu 	return TeecResult;
686564654ebSJason Zhu }
687564654ebSJason Zhu 
688ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
689ae8ec5e1SHisping Lin {
690ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
691ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
692ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
693ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
694ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
695ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
696ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
697ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
6983251364cSHisping Lin 	struct blk_desc *dev_desc;
6993251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7006651d4c0SJason Zhu 	if (!dev_desc) {
7016651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7026651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7036651d4c0SJason Zhu 	}
704ae8ec5e1SHisping Lin 
705f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
706f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
707f4e1db95SHisping Lin 		return TeecResult;
708ae8ec5e1SHisping Lin 
709ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
710f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
711f4e1db95SHisping Lin 		return TeecResult;
712ae8ec5e1SHisping Lin 
7133251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7143251364cSHisping Lin 						TEEC_NONE,
7153251364cSHisping Lin 						TEEC_NONE,
7163251364cSHisping Lin 						TEEC_NONE);
7173251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
7183251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
7193251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7203251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7213251364cSHisping Lin #endif
722ae8ec5e1SHisping Lin 
723ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
724ae8ec5e1SHisping Lin 				&TeecSession,
725ae8ec5e1SHisping Lin 				TeecUuid,
726ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
727ae8ec5e1SHisping Lin 				NULL,
7283251364cSHisping Lin 				&TeecOperation,
729ae8ec5e1SHisping Lin 				&ErrorOrigin);
730f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
731f4e1db95SHisping Lin 		return TeecResult;
732ae8ec5e1SHisping Lin 
733ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
734ae8ec5e1SHisping Lin 
735ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
736ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
737ae8ec5e1SHisping Lin 
738ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
739f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
740f4e1db95SHisping Lin 		goto exit;
741ae8ec5e1SHisping Lin 
742ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
743ae8ec5e1SHisping Lin 
744ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
745ae8ec5e1SHisping Lin 
746ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
747ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
748ae8ec5e1SHisping Lin 
749ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
750f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
751f4e1db95SHisping Lin 		goto exit;
752ae8ec5e1SHisping Lin 
753ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
754ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
755ae8ec5e1SHisping Lin 
756ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
757ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
758ae8ec5e1SHisping Lin 
759ae8ec5e1SHisping Lin 
760ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
761ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
762ae8ec5e1SHisping Lin 						TEEC_NONE,
763ae8ec5e1SHisping Lin 						TEEC_NONE);
764ae8ec5e1SHisping Lin 
765ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
766ae8ec5e1SHisping Lin 					0,
767ae8ec5e1SHisping Lin 					&TeecOperation,
768ae8ec5e1SHisping Lin 					&ErrorOrigin);
76946b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
770ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
771f4e1db95SHisping Lin exit:
772ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
773ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
774ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
77546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
776ae8ec5e1SHisping Lin 
777ae8ec5e1SHisping Lin 	return TeecResult;
778ae8ec5e1SHisping Lin }
779ae8ec5e1SHisping Lin 
780ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
781ae8ec5e1SHisping Lin {
782ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
783ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
784ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
785ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
786ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
787ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
788ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
789ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
7903251364cSHisping Lin 	struct blk_desc *dev_desc;
7913251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7926651d4c0SJason Zhu 	if (!dev_desc) {
7936651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7946651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7956651d4c0SJason Zhu 	}
796ae8ec5e1SHisping Lin 
797f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
798f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
799f4e1db95SHisping Lin 		return TeecResult;
800ae8ec5e1SHisping Lin 
801ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
802f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
803f4e1db95SHisping Lin 		return TeecResult;
804ae8ec5e1SHisping Lin 
8053251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8063251364cSHisping Lin 						TEEC_NONE,
8073251364cSHisping Lin 						TEEC_NONE,
8083251364cSHisping Lin 						TEEC_NONE);
8093251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
8103251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
8113251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8123251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8133251364cSHisping Lin #endif
8143251364cSHisping Lin 
815ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
816ae8ec5e1SHisping Lin 				&TeecSession,
817ae8ec5e1SHisping Lin 				TeecUuid,
818ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
819ae8ec5e1SHisping Lin 				NULL,
8203251364cSHisping Lin 				&TeecOperation,
821ae8ec5e1SHisping Lin 				&ErrorOrigin);
822f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
823f4e1db95SHisping Lin 		return TeecResult;
824ae8ec5e1SHisping Lin 
825ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
826ae8ec5e1SHisping Lin 
827ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
828ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
829ae8ec5e1SHisping Lin 
830ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
831f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
832f4e1db95SHisping Lin 		goto exit;
833ae8ec5e1SHisping Lin 
834ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
835ae8ec5e1SHisping Lin 
836ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
837ae8ec5e1SHisping Lin 
838ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
839ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
840ae8ec5e1SHisping Lin 
841ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
842f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
843f4e1db95SHisping Lin 		goto exit;
844ae8ec5e1SHisping Lin 
845ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
846ae8ec5e1SHisping Lin 
847ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
848ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
849ae8ec5e1SHisping Lin 
850ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
851ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
852ae8ec5e1SHisping Lin 
853ae8ec5e1SHisping Lin 
854ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
855ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
856ae8ec5e1SHisping Lin 						TEEC_NONE,
857ae8ec5e1SHisping Lin 						TEEC_NONE);
858ae8ec5e1SHisping Lin 
859ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
860ae8ec5e1SHisping Lin 					1,
861ae8ec5e1SHisping Lin 					&TeecOperation,
862ae8ec5e1SHisping Lin 					&ErrorOrigin);
863f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
864f4e1db95SHisping Lin 		goto exit;
865f4e1db95SHisping Lin exit:
866ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
867ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
868ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
86946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
870ae8ec5e1SHisping Lin 
871ae8ec5e1SHisping Lin 	return TeecResult;
872ae8ec5e1SHisping Lin }
873ae8ec5e1SHisping Lin 
874ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
875ae8ec5e1SHisping Lin {
876ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
877ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
878ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
879ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
880ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
881ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
882ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
883ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
8843251364cSHisping Lin 	struct blk_desc *dev_desc;
8853251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8866651d4c0SJason Zhu 	if (!dev_desc) {
8876651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8886651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8896651d4c0SJason Zhu 	}
890ae8ec5e1SHisping Lin 
891f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
892f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
893f4e1db95SHisping Lin 		return TeecResult;
894ae8ec5e1SHisping Lin 
895ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
896f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
897f4e1db95SHisping Lin 		return TeecResult;
898ae8ec5e1SHisping Lin 
8993251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9003251364cSHisping Lin 						TEEC_NONE,
9013251364cSHisping Lin 						TEEC_NONE,
9023251364cSHisping Lin 						TEEC_NONE);
9033251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
9043251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
9053251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9063251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9073251364cSHisping Lin #endif
908ae8ec5e1SHisping Lin 
909ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
910ae8ec5e1SHisping Lin 				&TeecSession,
911ae8ec5e1SHisping Lin 				TeecUuid,
912ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
913ae8ec5e1SHisping Lin 				NULL,
9143251364cSHisping Lin 				&TeecOperation,
915ae8ec5e1SHisping Lin 				&ErrorOrigin);
916f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
917f4e1db95SHisping Lin 		return TeecResult;
918ae8ec5e1SHisping Lin 
919ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
920ae8ec5e1SHisping Lin 
921ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
922ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
923ae8ec5e1SHisping Lin 
924ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
925f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
926f4e1db95SHisping Lin 		goto exit;
927ae8ec5e1SHisping Lin 
928ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
929ae8ec5e1SHisping Lin 
930ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
931ae8ec5e1SHisping Lin 
932ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
933ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
934ae8ec5e1SHisping Lin 
935ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
936f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
937f4e1db95SHisping Lin 		goto exit;
938ae8ec5e1SHisping Lin 
939ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
940ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
941ae8ec5e1SHisping Lin 
942ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
943ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
944ae8ec5e1SHisping Lin 
945ae8ec5e1SHisping Lin 
946ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
947ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
948ae8ec5e1SHisping Lin 						TEEC_NONE,
949ae8ec5e1SHisping Lin 						TEEC_NONE);
950ae8ec5e1SHisping Lin 
951ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
952ae8ec5e1SHisping Lin 					0,
953ae8ec5e1SHisping Lin 					&TeecOperation,
954ae8ec5e1SHisping Lin 					&ErrorOrigin);
95546b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
956ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
957f4e1db95SHisping Lin exit:
958ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
959ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
960ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
96146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
962ae8ec5e1SHisping Lin 
963ae8ec5e1SHisping Lin 	return TeecResult;
964ae8ec5e1SHisping Lin }
965ae8ec5e1SHisping Lin 
966ae8ec5e1SHisping Lin 
967ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
968ae8ec5e1SHisping Lin {
969ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
970ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
971ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
972ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
973ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
974ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
975ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
976ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
9773251364cSHisping Lin 	struct blk_desc *dev_desc;
9783251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
9796651d4c0SJason Zhu 	if (!dev_desc) {
9806651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
9816651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
9826651d4c0SJason Zhu 	}
983ae8ec5e1SHisping Lin 
984f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
985f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
986f4e1db95SHisping Lin 		return TeecResult;
987ae8ec5e1SHisping Lin 
988ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
989f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
990f4e1db95SHisping Lin 		return TeecResult;
991ae8ec5e1SHisping Lin 
9923251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9933251364cSHisping Lin 						TEEC_NONE,
9943251364cSHisping Lin 						TEEC_NONE,
9953251364cSHisping Lin 						TEEC_NONE);
9963251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
9973251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
9983251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9993251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
10003251364cSHisping Lin #endif
10013251364cSHisping Lin 
1002ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1003ae8ec5e1SHisping Lin 				&TeecSession,
1004ae8ec5e1SHisping Lin 				TeecUuid,
1005ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
1006ae8ec5e1SHisping Lin 				NULL,
10073251364cSHisping Lin 				&TeecOperation,
1008ae8ec5e1SHisping Lin 				&ErrorOrigin);
1009f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1010f4e1db95SHisping Lin 		return TeecResult;
1011ae8ec5e1SHisping Lin 
1012ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1013ae8ec5e1SHisping Lin 
1014ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
1015ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
1016ae8ec5e1SHisping Lin 
1017ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1018f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1019f4e1db95SHisping Lin 		goto exit;
1020ae8ec5e1SHisping Lin 
1021ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
1022ae8ec5e1SHisping Lin 
1023ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1024ae8ec5e1SHisping Lin 
1025ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
1026ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
1027ae8ec5e1SHisping Lin 
1028ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1029f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1030f4e1db95SHisping Lin 		goto exit;
1031ae8ec5e1SHisping Lin 
1032ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
1033ae8ec5e1SHisping Lin 
1034ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1035ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1036ae8ec5e1SHisping Lin 
1037ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1038ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1039ae8ec5e1SHisping Lin 
1040ae8ec5e1SHisping Lin 
1041ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1042ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1043ae8ec5e1SHisping Lin 						TEEC_NONE,
1044ae8ec5e1SHisping Lin 						TEEC_NONE);
1045ae8ec5e1SHisping Lin 
1046ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1047ae8ec5e1SHisping Lin 					1,
1048ae8ec5e1SHisping Lin 					&TeecOperation,
1049ae8ec5e1SHisping Lin 					&ErrorOrigin);
1050f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1051f4e1db95SHisping Lin 		goto exit;
1052f4e1db95SHisping Lin exit:
1053ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1054ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1055ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
105646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1057ae8ec5e1SHisping Lin 
1058ae8ec5e1SHisping Lin 	return TeecResult;
1059ae8ec5e1SHisping Lin }
1060ae8ec5e1SHisping Lin 
10616ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
10626ef445a4SHisping Lin {
10636ef445a4SHisping Lin 	TEEC_Result TeecResult;
10646ef445a4SHisping Lin 	TEEC_Context TeecContext;
10656ef445a4SHisping Lin 	TEEC_Session TeecSession;
10666ef445a4SHisping Lin 	uint32_t ErrorOrigin;
10676ef445a4SHisping Lin 
10686ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
10696ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
10706ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
10716ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
10726ef445a4SHisping Lin 
1073f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1074f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1075f4e1db95SHisping Lin 		return TeecResult;
10766ef445a4SHisping Lin 
10776ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1078f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1079f4e1db95SHisping Lin 		return TeecResult;
10806ef445a4SHisping Lin 
10816ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
10826ef445a4SHisping Lin 				&TeecSession,
10836ef445a4SHisping Lin 				TeecUuid,
10846ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
10856ef445a4SHisping Lin 				NULL,
10866ef445a4SHisping Lin 				NULL,
10876ef445a4SHisping Lin 				&ErrorOrigin);
1088f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1089f4e1db95SHisping Lin 		return TeecResult;
10906ef445a4SHisping Lin 
10916ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
10926ef445a4SHisping Lin 
10936ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
10946ef445a4SHisping Lin 	SharedMem0.flags = 0;
10956ef445a4SHisping Lin 
10966ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1097f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1098f4e1db95SHisping Lin 		goto exit;
10996ef445a4SHisping Lin 
11006ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11016ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11026ef445a4SHisping Lin 
11036ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
11046ef445a4SHisping Lin 						TEEC_NONE,
11056ef445a4SHisping Lin 						TEEC_NONE,
11066ef445a4SHisping Lin 						TEEC_NONE);
11076ef445a4SHisping Lin 
11086ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11096ef445a4SHisping Lin 					0,
11106ef445a4SHisping Lin 					&TeecOperation,
11116ef445a4SHisping Lin 					&ErrorOrigin);
11126ef445a4SHisping Lin 
11136ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
11146ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
1115f4e1db95SHisping Lin exit:
11166ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
11176ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
11186ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11196ef445a4SHisping Lin 
11206ef445a4SHisping Lin 	return TeecResult;
11216ef445a4SHisping Lin }
11226ef445a4SHisping Lin 
11236ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
11246ef445a4SHisping Lin {
11256ef445a4SHisping Lin 	TEEC_Result TeecResult;
11266ef445a4SHisping Lin 	TEEC_Context TeecContext;
11276ef445a4SHisping Lin 	TEEC_Session TeecSession;
11286ef445a4SHisping Lin 	uint32_t ErrorOrigin;
11296ef445a4SHisping Lin 
11306ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11316ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11326ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11336ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
11346ef445a4SHisping Lin 
1135f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1136f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1137f4e1db95SHisping Lin 		return TeecResult;
11386ef445a4SHisping Lin 
11396ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1140f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1141f4e1db95SHisping Lin 		return TeecResult;
11426ef445a4SHisping Lin 
11436ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11446ef445a4SHisping Lin 				&TeecSession,
11456ef445a4SHisping Lin 				TeecUuid,
11466ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
11476ef445a4SHisping Lin 				NULL,
11486ef445a4SHisping Lin 				NULL,
11496ef445a4SHisping Lin 				&ErrorOrigin);
1150f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1151f4e1db95SHisping Lin 		return TeecResult;
11526ef445a4SHisping Lin 
11536ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11546ef445a4SHisping Lin 
11556ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
11566ef445a4SHisping Lin 	SharedMem0.flags = 0;
11576ef445a4SHisping Lin 
11586ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1159f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1160f4e1db95SHisping Lin 		goto exit;
11616ef445a4SHisping Lin 
11626ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
11636ef445a4SHisping Lin 
11646ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11656ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11666ef445a4SHisping Lin 
11676ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
11686ef445a4SHisping Lin 						TEEC_NONE,
11696ef445a4SHisping Lin 						TEEC_NONE,
11706ef445a4SHisping Lin 						TEEC_NONE);
11716ef445a4SHisping Lin 
11726ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11736ef445a4SHisping Lin 					1,
11746ef445a4SHisping Lin 					&TeecOperation,
11756ef445a4SHisping Lin 					&ErrorOrigin);
1176f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1177f4e1db95SHisping Lin 		goto exit;
1178f4e1db95SHisping Lin exit:
11796ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
11806ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
11816ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11826ef445a4SHisping Lin 
11836ef445a4SHisping Lin 	return TeecResult;
11846ef445a4SHisping Lin }
118516539616SHisping Lin 
118616539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
118716539616SHisping Lin {
118816539616SHisping Lin 	TEEC_Result TeecResult;
118916539616SHisping Lin 	TEEC_Context TeecContext;
119016539616SHisping Lin 	TEEC_Session TeecSession;
119116539616SHisping Lin 	uint32_t ErrorOrigin;
119216539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
119316539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
119416539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
119516539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
119616539616SHisping Lin 
1197f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1198f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1199f4e1db95SHisping Lin 		return TeecResult;
120016539616SHisping Lin 
120116539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1202f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1203f4e1db95SHisping Lin 		return TeecResult;
120416539616SHisping Lin 
120516539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
120616539616SHisping Lin 				&TeecSession,
120716539616SHisping Lin 				TeecUuid,
120816539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
120916539616SHisping Lin 				NULL,
121016539616SHisping Lin 				NULL,
121116539616SHisping Lin 				&ErrorOrigin);
1212f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1213f4e1db95SHisping Lin 		return TeecResult;
121416539616SHisping Lin 
121516539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
121616539616SHisping Lin 						TEEC_NONE,
121716539616SHisping Lin 						TEEC_NONE,
121816539616SHisping Lin 						TEEC_NONE);
121916539616SHisping Lin 
122016539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
122116539616SHisping Lin 					2,
122216539616SHisping Lin 					&TeecOperation,
122316539616SHisping Lin 					&ErrorOrigin);
1224f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1225f4e1db95SHisping Lin 		goto exit;
1226f4e1db95SHisping Lin exit:
122716539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
122816539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
122916539616SHisping Lin 
123016539616SHisping Lin 	return TeecResult;
123116539616SHisping Lin }
123216539616SHisping Lin 
123316539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
123416539616SHisping Lin {
123516539616SHisping Lin 	TEEC_Result TeecResult;
123616539616SHisping Lin 	TEEC_Context TeecContext;
123716539616SHisping Lin 	TEEC_Session TeecSession;
123816539616SHisping Lin 	uint32_t ErrorOrigin;
123916539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
124016539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
124116539616SHisping Lin 
124216539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
124316539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
124416539616SHisping Lin 
1245f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1246f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1247f4e1db95SHisping Lin 		return TeecResult;
124816539616SHisping Lin 
124916539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1250f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1251f4e1db95SHisping Lin 		return TeecResult;
125216539616SHisping Lin 
125316539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
125416539616SHisping Lin 				&TeecSession,
125516539616SHisping Lin 				TeecUuid,
125616539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
125716539616SHisping Lin 				NULL,
125816539616SHisping Lin 				NULL,
125916539616SHisping Lin 				&ErrorOrigin);
1260f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1261f4e1db95SHisping Lin 		return TeecResult;
126216539616SHisping Lin 
126316539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
126416539616SHisping Lin 						TEEC_NONE,
126516539616SHisping Lin 						TEEC_NONE,
126616539616SHisping Lin 						TEEC_NONE);
126716539616SHisping Lin 
126816539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
126916539616SHisping Lin 					2,
127016539616SHisping Lin 					&TeecOperation,
127116539616SHisping Lin 					&ErrorOrigin);
1272f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1273f4e1db95SHisping Lin 		goto exit;
1274f4e1db95SHisping Lin exit:
127516539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
127616539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
127716539616SHisping Lin 
127816539616SHisping Lin 	return TeecResult;
127916539616SHisping Lin }
128016539616SHisping Lin 
128116539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
128216539616SHisping Lin {
128316539616SHisping Lin 	TEEC_Result res;
128416539616SHisping Lin 	res = notify_optee_rpmb_ta();
128516539616SHisping Lin 	res |= notify_optee_efuse_ta();
128616539616SHisping Lin 	return res;
128716539616SHisping Lin }
12882cd27853SHisping Lin 
12892cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
12902cd27853SHisping Lin {
12912cd27853SHisping Lin 	TEEC_Result TeecResult;
12922cd27853SHisping Lin 	TEEC_Context TeecContext;
12932cd27853SHisping Lin 	TEEC_Session TeecSession;
12942cd27853SHisping Lin 	uint32_t ErrorOrigin;
12952cd27853SHisping Lin 
12962cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
12972cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
12982cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
12992cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
13002cd27853SHisping Lin 
1301f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1302f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1303f4e1db95SHisping Lin 		return TeecResult;
13042cd27853SHisping Lin 
13052cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1306f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1307f4e1db95SHisping Lin 		return TeecResult;
13082cd27853SHisping Lin 
13092cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
13102cd27853SHisping Lin 				&TeecSession,
13112cd27853SHisping Lin 				TeecUuid,
13122cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
13132cd27853SHisping Lin 				NULL,
13142cd27853SHisping Lin 				NULL,
13152cd27853SHisping Lin 				&ErrorOrigin);
1316f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1317f4e1db95SHisping Lin 		return TeecResult;
13182cd27853SHisping Lin 
13192cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
13202cd27853SHisping Lin 
13212cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
13222cd27853SHisping Lin 	SharedMem0.flags = 0;
13232cd27853SHisping Lin 
13242cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1325f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1326f4e1db95SHisping Lin 		goto exit;
13272cd27853SHisping Lin 
13282cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13292cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13302cd27853SHisping Lin 
13312cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
13322cd27853SHisping Lin 						TEEC_NONE,
13332cd27853SHisping Lin 						TEEC_NONE,
13342cd27853SHisping Lin 						TEEC_NONE);
13352cd27853SHisping Lin 
13362cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13372cd27853SHisping Lin 					3,
13382cd27853SHisping Lin 					&TeecOperation,
13392cd27853SHisping Lin 					&ErrorOrigin);
13402cd27853SHisping Lin 
13412cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
13422cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
1343f4e1db95SHisping Lin exit:
13442cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
13452cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
13462cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
13472cd27853SHisping Lin 
13482cd27853SHisping Lin 	return TeecResult;
13492cd27853SHisping Lin }
13502cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
13512cd27853SHisping Lin {
13522cd27853SHisping Lin 	TEEC_Result TeecResult;
13532cd27853SHisping Lin 	TEEC_Context TeecContext;
13542cd27853SHisping Lin 	TEEC_Session TeecSession;
13552cd27853SHisping Lin 	uint32_t ErrorOrigin;
13562cd27853SHisping Lin 
13572cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
13582cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
13592cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13602cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
13612cd27853SHisping Lin 
1362f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1363f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1364f4e1db95SHisping Lin 		return TeecResult;
13652cd27853SHisping Lin 
13662cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1367f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1368f4e1db95SHisping Lin 		return TeecResult;
13692cd27853SHisping Lin 
13702cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
13712cd27853SHisping Lin 				&TeecSession,
13722cd27853SHisping Lin 				TeecUuid,
13732cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
13742cd27853SHisping Lin 				NULL,
13752cd27853SHisping Lin 				NULL,
13762cd27853SHisping Lin 				&ErrorOrigin);
1377f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1378f4e1db95SHisping Lin 		return TeecResult;
13792cd27853SHisping Lin 
13802cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
13812cd27853SHisping Lin 
13822cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
13832cd27853SHisping Lin 	SharedMem0.flags = 0;
13842cd27853SHisping Lin 
13852cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1386f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1387f4e1db95SHisping Lin 		goto exit;
13882cd27853SHisping Lin 
13892cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
13902cd27853SHisping Lin 
13912cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13922cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13932cd27853SHisping Lin 
13942cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
13952cd27853SHisping Lin 						TEEC_NONE,
13962cd27853SHisping Lin 						TEEC_NONE,
13972cd27853SHisping Lin 						TEEC_NONE);
13982cd27853SHisping Lin 
13992cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14002cd27853SHisping Lin 					4,
14012cd27853SHisping Lin 					&TeecOperation,
14022cd27853SHisping Lin 					&ErrorOrigin);
1403f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1404f4e1db95SHisping Lin 		goto exit;
1405f4e1db95SHisping Lin exit:
14062cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
14072cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
14082cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14092cd27853SHisping Lin 
14102cd27853SHisping Lin 	return TeecResult;
14112cd27853SHisping Lin }
1412095e2a82SHisping Lin 
1413468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1414468df3b2SHisping Lin {
1415468df3b2SHisping Lin 	TEEC_Result TeecResult;
1416468df3b2SHisping Lin 	TEEC_Context TeecContext;
1417468df3b2SHisping Lin 	TEEC_Session TeecSession;
1418468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1419468df3b2SHisping Lin 	uint32_t bootflag;
1420468df3b2SHisping Lin 
1421468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1422468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1423468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1424468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1425468df3b2SHisping Lin 
1426f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1427f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1428f4e1db95SHisping Lin 		return TeecResult;
1429468df3b2SHisping Lin 
1430468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1431f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1432f4e1db95SHisping Lin 		return TeecResult;
1433468df3b2SHisping Lin 
1434468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1435468df3b2SHisping Lin 				&TeecSession,
1436468df3b2SHisping Lin 				TeecUuid,
1437468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1438468df3b2SHisping Lin 				NULL,
1439468df3b2SHisping Lin 				NULL,
1440468df3b2SHisping Lin 				&ErrorOrigin);
1441f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1442f4e1db95SHisping Lin 		return TeecResult;
1443468df3b2SHisping Lin 
1444468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1445468df3b2SHisping Lin 
1446468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1447468df3b2SHisping Lin 	SharedMem0.flags = 0;
1448468df3b2SHisping Lin 
1449468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1450f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1451f4e1db95SHisping Lin 		goto exit;
1452468df3b2SHisping Lin 
1453468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1454468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1455468df3b2SHisping Lin 
1456468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1457468df3b2SHisping Lin 						TEEC_NONE,
1458468df3b2SHisping Lin 						TEEC_NONE,
1459468df3b2SHisping Lin 						TEEC_NONE);
1460468df3b2SHisping Lin 
1461468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1462468df3b2SHisping Lin 					5,
1463468df3b2SHisping Lin 					&TeecOperation,
1464468df3b2SHisping Lin 					&ErrorOrigin);
1465468df3b2SHisping Lin 
1466468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1467468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
1468*0202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
1469*0202ee8aSHisping Lin 		if (bootflag == 0x00000001)
1470*0202ee8aSHisping Lin 			*flag = 1;
1471*0202ee8aSHisping Lin #else
1472468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1473468df3b2SHisping Lin 			*flag = 1;
1474*0202ee8aSHisping Lin #endif
1475468df3b2SHisping Lin 	}
1476f4e1db95SHisping Lin exit:
1477468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1478468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1479468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1480468df3b2SHisping Lin 
1481468df3b2SHisping Lin 	return TeecResult;
1482468df3b2SHisping Lin }
1483468df3b2SHisping Lin 
1484095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1485095e2a82SHisping Lin {
1486095e2a82SHisping Lin 	TEEC_Result TeecResult;
1487095e2a82SHisping Lin 	TEEC_Context TeecContext;
1488095e2a82SHisping Lin 	TEEC_Session TeecSession;
1489095e2a82SHisping Lin 	uint32_t ErrorOrigin;
149099830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
149199830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
1492095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1493095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
14943251364cSHisping Lin 	struct blk_desc *dev_desc;
14953251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
14966651d4c0SJason Zhu 	if (!dev_desc) {
14976651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
14986651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
14996651d4c0SJason Zhu 	}
1500095e2a82SHisping Lin 
1501f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1502f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1503f4e1db95SHisping Lin 		return TeecResult;
1504095e2a82SHisping Lin 
1505095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1506f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1507f4e1db95SHisping Lin 		return TeecResult;
1508095e2a82SHisping Lin 
15093251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15103251364cSHisping Lin 						TEEC_NONE,
15113251364cSHisping Lin 						TEEC_NONE,
15123251364cSHisping Lin 						TEEC_NONE);
15133251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
15143251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
15153251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15163251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15173251364cSHisping Lin #endif
15183251364cSHisping Lin 
1519095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1520095e2a82SHisping Lin 				&TeecSession,
1521095e2a82SHisping Lin 				TeecUuid,
1522095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1523095e2a82SHisping Lin 				NULL,
15243251364cSHisping Lin 				&TeecOperation,
1525095e2a82SHisping Lin 				&ErrorOrigin);
1526f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1527f4e1db95SHisping Lin 		return TeecResult;
1528095e2a82SHisping Lin 
1529095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1530095e2a82SHisping Lin 
1531095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1532095e2a82SHisping Lin 	SharedMem0.flags = 0;
1533095e2a82SHisping Lin 
1534095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1535f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1536f4e1db95SHisping Lin 		goto exit;
1537095e2a82SHisping Lin 
1538095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1539095e2a82SHisping Lin 
1540095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1541095e2a82SHisping Lin 
1542095e2a82SHisping Lin 	SharedMem1.size = 1;
1543095e2a82SHisping Lin 	SharedMem1.flags = 0;
1544095e2a82SHisping Lin 
1545095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1546f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1547f4e1db95SHisping Lin 		goto exit;
1548095e2a82SHisping Lin 
1549095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1550095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1551095e2a82SHisping Lin 
1552095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1553095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1554095e2a82SHisping Lin 
1555095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1556095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1557095e2a82SHisping Lin 						TEEC_NONE,
1558095e2a82SHisping Lin 						TEEC_NONE);
1559095e2a82SHisping Lin 
1560095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
156199830019SHisping Lin 					0,
1562095e2a82SHisping Lin 					&TeecOperation,
1563095e2a82SHisping Lin 					&ErrorOrigin);
1564095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1565095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1566f4e1db95SHisping Lin exit:
1567095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1568095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1569095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1570095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1571095e2a82SHisping Lin 
1572095e2a82SHisping Lin 	return TeecResult;
1573095e2a82SHisping Lin }
1574095e2a82SHisping Lin 
1575095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1576095e2a82SHisping Lin {
1577095e2a82SHisping Lin 	TEEC_Result TeecResult;
1578095e2a82SHisping Lin 	TEEC_Context TeecContext;
1579095e2a82SHisping Lin 	TEEC_Session TeecSession;
1580095e2a82SHisping Lin 	uint32_t ErrorOrigin;
158199830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
158299830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
1583095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1584095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
15853251364cSHisping Lin 	struct blk_desc *dev_desc;
15863251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15876651d4c0SJason Zhu 	if (!dev_desc) {
15886651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15896651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15906651d4c0SJason Zhu 	}
1591095e2a82SHisping Lin 
1592f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1593f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1594f4e1db95SHisping Lin 		return TeecResult;
1595095e2a82SHisping Lin 
1596095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1597f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1598f4e1db95SHisping Lin 		return TeecResult;
1599095e2a82SHisping Lin 
16003251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16013251364cSHisping Lin 						TEEC_NONE,
16023251364cSHisping Lin 						TEEC_NONE,
16033251364cSHisping Lin 						TEEC_NONE);
16043251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16053251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16063251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16073251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16083251364cSHisping Lin #endif
16093251364cSHisping Lin 
1610095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1611095e2a82SHisping Lin 				&TeecSession,
1612095e2a82SHisping Lin 				TeecUuid,
1613095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1614095e2a82SHisping Lin 				NULL,
16153251364cSHisping Lin 				&TeecOperation,
1616095e2a82SHisping Lin 				&ErrorOrigin);
1617f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1618f4e1db95SHisping Lin 		return TeecResult;
1619095e2a82SHisping Lin 
1620095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1621095e2a82SHisping Lin 
1622095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1623095e2a82SHisping Lin 	SharedMem0.flags = 0;
1624095e2a82SHisping Lin 
1625095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1626f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1627f4e1db95SHisping Lin 		goto exit;
1628095e2a82SHisping Lin 
1629095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1630095e2a82SHisping Lin 
1631095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1632095e2a82SHisping Lin 
1633095e2a82SHisping Lin 	SharedMem1.size = 1;
1634095e2a82SHisping Lin 	SharedMem1.flags = 0;
1635095e2a82SHisping Lin 
1636095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1637f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1638f4e1db95SHisping Lin 		goto exit;
1639095e2a82SHisping Lin 
1640095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1641095e2a82SHisping Lin 
1642095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1643095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1644095e2a82SHisping Lin 
1645095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1646095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1647095e2a82SHisping Lin 
1648095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1649095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1650095e2a82SHisping Lin 						TEEC_NONE,
1651095e2a82SHisping Lin 						TEEC_NONE);
1652095e2a82SHisping Lin 
1653095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
165499830019SHisping Lin 					1,
1655095e2a82SHisping Lin 					&TeecOperation,
1656095e2a82SHisping Lin 					&ErrorOrigin);
1657f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1658f4e1db95SHisping Lin 		goto exit;
1659f4e1db95SHisping Lin exit:
1660095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1661095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1662095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1663095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1664095e2a82SHisping Lin 
1665095e2a82SHisping Lin 	return TeecResult;
1666095e2a82SHisping Lin }
16674aa61755SAndy Ye 
16684aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
16694aa61755SAndy Ye {
16704aa61755SAndy Ye 	TEEC_Result TeecResult;
16714aa61755SAndy Ye 	TEEC_Context TeecContext;
16724aa61755SAndy Ye 	TEEC_Session TeecSession;
16734aa61755SAndy Ye 	uint32_t ErrorOrigin;
16744aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16754aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16764aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16774aa61755SAndy Ye 				}
16784aa61755SAndy Ye 			     };
16794aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16804aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16813251364cSHisping Lin 	struct blk_desc *dev_desc;
16823251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16836651d4c0SJason Zhu 	if (!dev_desc) {
16846651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
16856651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
16866651d4c0SJason Zhu 	}
16874aa61755SAndy Ye 
1688f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1689f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1690f4e1db95SHisping Lin 		return TeecResult;
16914aa61755SAndy Ye 
16924aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1693f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1694f4e1db95SHisping Lin 		return TeecResult;
16954aa61755SAndy Ye 
16963251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16973251364cSHisping Lin 						TEEC_NONE,
16983251364cSHisping Lin 						TEEC_NONE,
16993251364cSHisping Lin 						TEEC_NONE);
17003251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
17013251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
17023251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17033251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17043251364cSHisping Lin #endif
17053251364cSHisping Lin 
17064aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17074aa61755SAndy Ye 				      &TeecSession,
17084aa61755SAndy Ye 				      TeecUuid,
17094aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17104aa61755SAndy Ye 				      NULL,
17113251364cSHisping Lin 					&TeecOperation,
17124aa61755SAndy Ye 				      &ErrorOrigin);
1713f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1714f4e1db95SHisping Lin 		return TeecResult;
17154aa61755SAndy Ye 
17164aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17174aa61755SAndy Ye 
17184aa61755SAndy Ye 	SharedMem0.size = *dh_size;
17194aa61755SAndy Ye 	SharedMem0.flags = 0;
17204aa61755SAndy Ye 
17214aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1722f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1723f4e1db95SHisping Lin 		goto exit;
17244aa61755SAndy Ye 
17254aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17264aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17274aa61755SAndy Ye 
17284aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17294aa61755SAndy Ye 						    TEEC_NONE,
17304aa61755SAndy Ye 						    TEEC_NONE,
17314aa61755SAndy Ye 						    TEEC_NONE);
17324aa61755SAndy Ye 
17334aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17344aa61755SAndy Ye 					143,
17354aa61755SAndy Ye 					&TeecOperation,
17364aa61755SAndy Ye 					&ErrorOrigin);
1737f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1738f4e1db95SHisping Lin 		goto exit;
17394aa61755SAndy Ye 
17404aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
17414aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1742f4e1db95SHisping Lin exit:
17434aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17444aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1745f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
17464aa61755SAndy Ye 
17474aa61755SAndy Ye 	return TeecResult;
17484aa61755SAndy Ye }
17494aa61755SAndy Ye 
17504aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
17514aa61755SAndy Ye {
17524aa61755SAndy Ye 	TEEC_Result TeecResult;
17534aa61755SAndy Ye 	TEEC_Context TeecContext;
17544aa61755SAndy Ye 	TEEC_Session TeecSession;
17554aa61755SAndy Ye 	uint32_t ErrorOrigin;
17564aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17574aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17584aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17594aa61755SAndy Ye 				}
17604aa61755SAndy Ye 			     };
17614aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17624aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17633251364cSHisping Lin 	struct blk_desc *dev_desc;
17643251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17656651d4c0SJason Zhu 	if (!dev_desc) {
17666651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17676651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17686651d4c0SJason Zhu 	}
17694aa61755SAndy Ye 
1770f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1771f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1772f4e1db95SHisping Lin 		return TeecResult;
17734aa61755SAndy Ye 
17744aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1775f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1776f4e1db95SHisping Lin 		return TeecResult;
17774aa61755SAndy Ye 
17783251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17793251364cSHisping Lin 						TEEC_NONE,
17803251364cSHisping Lin 						TEEC_NONE,
17813251364cSHisping Lin 						TEEC_NONE);
17823251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
17833251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
17843251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17853251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17863251364cSHisping Lin #endif
17873251364cSHisping Lin 
17884aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17894aa61755SAndy Ye 				      &TeecSession,
17904aa61755SAndy Ye 				      TeecUuid,
17914aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17924aa61755SAndy Ye 				      NULL,
17933251364cSHisping Lin 					&TeecOperation,
17944aa61755SAndy Ye 				      &ErrorOrigin);
1795f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1796f4e1db95SHisping Lin 		return TeecResult;
17974aa61755SAndy Ye 
17984aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17994aa61755SAndy Ye 
18004aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
18014aa61755SAndy Ye 	SharedMem0.flags = 0;
18024aa61755SAndy Ye 
18034aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1804f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1805f4e1db95SHisping Lin 		goto exit;
18064aa61755SAndy Ye 
18074aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18084aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18094aa61755SAndy Ye 
18104aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
18114aa61755SAndy Ye 						    TEEC_NONE,
18124aa61755SAndy Ye 						    TEEC_NONE,
18134aa61755SAndy Ye 						    TEEC_NONE);
18144aa61755SAndy Ye 
18154aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18164aa61755SAndy Ye 					144,
18174aa61755SAndy Ye 					&TeecOperation,
18184aa61755SAndy Ye 					&ErrorOrigin);
1819f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1820f4e1db95SHisping Lin 		goto exit;
18214aa61755SAndy Ye 
18224aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
18234aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1824f4e1db95SHisping Lin exit:
18254aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18264aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1827f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18284aa61755SAndy Ye 
18294aa61755SAndy Ye 	return TeecResult;
18304aa61755SAndy Ye }
18314aa61755SAndy Ye 
18324aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
18334aa61755SAndy Ye 			      uint32_t *operation_size,
18344aa61755SAndy Ye 			      uint8_t *out,
18354aa61755SAndy Ye 			      uint32_t *out_len)
18364aa61755SAndy Ye {
18374aa61755SAndy Ye 	TEEC_Result TeecResult;
18384aa61755SAndy Ye 	TEEC_Context TeecContext;
18394aa61755SAndy Ye 	TEEC_Session TeecSession;
18404aa61755SAndy Ye 	uint32_t ErrorOrigin;
18414aa61755SAndy Ye 
18424aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18434aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18444aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
18454aa61755SAndy Ye 				}
18464aa61755SAndy Ye 			     };
18474aa61755SAndy Ye 
18484aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
18494aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
18503251364cSHisping Lin 	struct blk_desc *dev_desc;
18513251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
18526651d4c0SJason Zhu 	if (!dev_desc) {
18536651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
18546651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
18556651d4c0SJason Zhu 	}
18564aa61755SAndy Ye 
1857f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1858f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1859f4e1db95SHisping Lin 		return TeecResult;
18604aa61755SAndy Ye 
18614aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1862f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1863f4e1db95SHisping Lin 		return TeecResult;
18644aa61755SAndy Ye 
18653251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
18663251364cSHisping Lin 						TEEC_NONE,
18673251364cSHisping Lin 						TEEC_NONE,
18683251364cSHisping Lin 						TEEC_NONE);
18693251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
18703251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
18713251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
18723251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
18733251364cSHisping Lin #endif
18743251364cSHisping Lin 
18754aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
18764aa61755SAndy Ye 				      &TeecSession,
18774aa61755SAndy Ye 				      TeecUuid,
18784aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
18794aa61755SAndy Ye 				      NULL,
18803251364cSHisping Lin 					&TeecOperation,
18814aa61755SAndy Ye 				      &ErrorOrigin);
1882f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1883f4e1db95SHisping Lin 		return TeecResult;
18844aa61755SAndy Ye 
18854aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
18864aa61755SAndy Ye 
18874aa61755SAndy Ye 	SharedMem0.size = *operation_size;
18884aa61755SAndy Ye 	SharedMem0.flags = 0;
18894aa61755SAndy Ye 
18904aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1891f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1892f4e1db95SHisping Lin 		goto exit;
18934aa61755SAndy Ye 
18944aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
18954aa61755SAndy Ye 
18964aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18974aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18984aa61755SAndy Ye 
18994aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
19004aa61755SAndy Ye 
19014aa61755SAndy Ye 	SharedMem1.size = *out_len;
19024aa61755SAndy Ye 	SharedMem1.flags = 0;
19034aa61755SAndy Ye 
19044aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1905f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1906f4e1db95SHisping Lin 		goto exit;
19074aa61755SAndy Ye 
19084aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
19094aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
19104aa61755SAndy Ye 
19114aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
19124aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
19134aa61755SAndy Ye 						    TEEC_NONE,
19144aa61755SAndy Ye 						    TEEC_NONE);
19154aa61755SAndy Ye 
19164aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
19174aa61755SAndy Ye 					145,
19184aa61755SAndy Ye 					&TeecOperation,
19194aa61755SAndy Ye 					&ErrorOrigin);
1920f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1921f4e1db95SHisping Lin 		goto exit;
19224aa61755SAndy Ye 
19234aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
19244aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1925f4e1db95SHisping Lin exit:
19264aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
19274aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1928f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1929f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
19304aa61755SAndy Ye 
19314aa61755SAndy Ye 	return TeecResult;
19324aa61755SAndy Ye }
19334aa61755SAndy Ye 
19344aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
19354aa61755SAndy Ye {
19364aa61755SAndy Ye 	TEEC_Result TeecResult;
19374aa61755SAndy Ye 	TEEC_Context TeecContext;
19384aa61755SAndy Ye 	TEEC_Session TeecSession;
19394aa61755SAndy Ye 	uint32_t ErrorOrigin;
19404aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
19414aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
19424aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
19434aa61755SAndy Ye 				}
19444aa61755SAndy Ye 			     };
19454aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
19464aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
19473251364cSHisping Lin 	struct blk_desc *dev_desc;
19483251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
19496651d4c0SJason Zhu 	if (!dev_desc) {
19506651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
19516651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
19526651d4c0SJason Zhu 	}
1953f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1954f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1955f4e1db95SHisping Lin 		return TeecResult;
19564aa61755SAndy Ye 
19574aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1958f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1959f4e1db95SHisping Lin 		return TeecResult;
19604aa61755SAndy Ye 
19613251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
19623251364cSHisping Lin 						TEEC_NONE,
19633251364cSHisping Lin 						TEEC_NONE,
19643251364cSHisping Lin 						TEEC_NONE);
19653251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
19663251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
19673251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
19683251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
19693251364cSHisping Lin #endif
19703251364cSHisping Lin 
19714aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
19724aa61755SAndy Ye 					&TeecSession,
19734aa61755SAndy Ye 					TeecUuid,
19744aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
19754aa61755SAndy Ye 					NULL,
19763251364cSHisping Lin 					&TeecOperation,
19774aa61755SAndy Ye 					&ErrorOrigin);
1978f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1979f4e1db95SHisping Lin 		return TeecResult;
19804aa61755SAndy Ye 
19814aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
19824aa61755SAndy Ye 
19834aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
19844aa61755SAndy Ye 	SharedMem0.flags = 0;
19854aa61755SAndy Ye 
19864aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1987f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1988f4e1db95SHisping Lin 		goto exit;
19894aa61755SAndy Ye 
19904aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
19914aa61755SAndy Ye 
19924aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
19934aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
19944aa61755SAndy Ye 
19954aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
19964aa61755SAndy Ye 						    TEEC_NONE,
19974aa61755SAndy Ye 						    TEEC_NONE,
19984aa61755SAndy Ye 						    TEEC_NONE);
19994aa61755SAndy Ye 
20004aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
20014aa61755SAndy Ye 					146,
20024aa61755SAndy Ye 					&TeecOperation,
20034aa61755SAndy Ye 					&ErrorOrigin);
2004f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2005f4e1db95SHisping Lin 		goto exit;
2006f4e1db95SHisping Lin exit:
20074aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
20084aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
2009f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
20104aa61755SAndy Ye 
20114aa61755SAndy Ye 	return TeecResult;
20124aa61755SAndy Ye }
2013