xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 165396163ee1502fdaa9d187e17bae957d1d281f)
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>
11ae8ec5e1SHisping Lin 
12ae8ec5e1SHisping Lin void test_optee(void)
13ae8ec5e1SHisping Lin {
14ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
15ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
16ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
17ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
18ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
19ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
20ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
21ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
22ae8ec5e1SHisping Lin 
23ae8ec5e1SHisping Lin 	debug("testmm start\n");
24ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
25ae8ec5e1SHisping Lin 
26ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
27ae8ec5e1SHisping Lin 
28ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
29ae8ec5e1SHisping Lin 				&TeecSession,
30ae8ec5e1SHisping Lin 				TeecUuid,
31ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
32ae8ec5e1SHisping Lin 				NULL,
33ae8ec5e1SHisping Lin 				NULL,
34ae8ec5e1SHisping Lin 				&ErrorOrigin);
35ae8ec5e1SHisping Lin 
36ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
37ae8ec5e1SHisping Lin 
38ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
39ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
40ae8ec5e1SHisping Lin 
41ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
42ae8ec5e1SHisping Lin 
43ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
44ae8ec5e1SHisping Lin 
45ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
46ae8ec5e1SHisping Lin 
47ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
48ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
49ae8ec5e1SHisping Lin 
50ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
51ae8ec5e1SHisping Lin 
52ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
53ae8ec5e1SHisping Lin 
54ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
55ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
56ae8ec5e1SHisping Lin 
57ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
58ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
59ae8ec5e1SHisping Lin 
60ae8ec5e1SHisping Lin 
61ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
62ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
63ae8ec5e1SHisping Lin 						TEEC_NONE,
64ae8ec5e1SHisping Lin 						TEEC_NONE);
65ae8ec5e1SHisping Lin 
66ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
67ae8ec5e1SHisping Lin 					1,
68ae8ec5e1SHisping Lin 					&TeecOperation,
69ae8ec5e1SHisping Lin 					&ErrorOrigin);
70ae8ec5e1SHisping Lin 
71ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
72ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
73ae8ec5e1SHisping Lin 
74ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
75ae8ec5e1SHisping Lin 
76ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
77ae8ec5e1SHisping Lin 
78ae8ec5e1SHisping Lin 	debug("testmm end\n");
79ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
80ae8ec5e1SHisping Lin }
81ae8ec5e1SHisping Lin 
82ae8ec5e1SHisping Lin 
83ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
84ae8ec5e1SHisping Lin {
85ae8ec5e1SHisping Lin 	if (in > 9)
86ae8ec5e1SHisping Lin 		return in + 55;
87ae8ec5e1SHisping Lin 	else
88ae8ec5e1SHisping Lin 		return in + 48;
89ae8ec5e1SHisping Lin }
90ae8ec5e1SHisping Lin 
91ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
92ae8ec5e1SHisping Lin {
93ae8ec5e1SHisping Lin 	uint32_t i = 0;
94ae8ec5e1SHisping Lin 
95ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
96ae8ec5e1SHisping Lin 		return 0;
97ae8ec5e1SHisping Lin 
98ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
99ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
100ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
101ae8ec5e1SHisping Lin 	}
102ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
103ae8ec5e1SHisping Lin 
104ae8ec5e1SHisping Lin 	return blen * 2;
105ae8ec5e1SHisping Lin }
106ae8ec5e1SHisping Lin 
107ae8ec5e1SHisping Lin 
108ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
109ae8ec5e1SHisping Lin {
110ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
111ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
112ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
113ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
114ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
115ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
116ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
117ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
118ae8ec5e1SHisping Lin 	uint8_t hs[9];
119ae8ec5e1SHisping Lin 
120ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
121ae8ec5e1SHisping Lin 	debug("testmm start\n");
122ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
123ae8ec5e1SHisping Lin 
124ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
125ae8ec5e1SHisping Lin 
126ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
127ae8ec5e1SHisping Lin 				&TeecSession,
128ae8ec5e1SHisping Lin 				TeecUuid,
129ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
130ae8ec5e1SHisping Lin 				NULL,
131ae8ec5e1SHisping Lin 				NULL,
132ae8ec5e1SHisping Lin 				&ErrorOrigin);
133ae8ec5e1SHisping Lin 
134ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
135ae8ec5e1SHisping Lin 
136ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
137ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
138ae8ec5e1SHisping Lin 
139ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
140ae8ec5e1SHisping Lin 
141ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
142ae8ec5e1SHisping Lin 
143ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
144ae8ec5e1SHisping Lin 
145ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
146ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
147ae8ec5e1SHisping Lin 
148ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
149ae8ec5e1SHisping Lin 
150ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
151ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
152ae8ec5e1SHisping Lin 
153ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
154ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
155ae8ec5e1SHisping Lin 
156ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
157ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
158ae8ec5e1SHisping Lin 						TEEC_NONE,
159ae8ec5e1SHisping Lin 						TEEC_NONE);
160ae8ec5e1SHisping Lin 
161ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
162ae8ec5e1SHisping Lin 					0,
163ae8ec5e1SHisping Lin 					&TeecOperation,
164ae8ec5e1SHisping Lin 					&ErrorOrigin);
165ae8ec5e1SHisping Lin 
166ae8ec5e1SHisping Lin 	memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
167ae8ec5e1SHisping Lin 
168ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
169ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
170ae8ec5e1SHisping Lin 
171ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
172ae8ec5e1SHisping Lin 
173ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
174ae8ec5e1SHisping Lin 
175ae8ec5e1SHisping Lin 	debug("testmm end\n");
176ae8ec5e1SHisping Lin 	return TeecResult;
177ae8ec5e1SHisping Lin }
178ae8ec5e1SHisping Lin 
179ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
180ae8ec5e1SHisping Lin {
181ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
182ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
183ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
184ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
185ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
186ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
187ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
188ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
189ae8ec5e1SHisping Lin 	uint8_t hs[9];
190ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
191ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
192ae8ec5e1SHisping Lin 
193ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
194ae8ec5e1SHisping Lin 
195ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
196ae8ec5e1SHisping Lin 				&TeecSession,
197ae8ec5e1SHisping Lin 				TeecUuid,
198ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
199ae8ec5e1SHisping Lin 				NULL,
200ae8ec5e1SHisping Lin 				NULL,
201ae8ec5e1SHisping Lin 				&ErrorOrigin);
202ae8ec5e1SHisping Lin 
203ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
204ae8ec5e1SHisping Lin 
205ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
206ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
207ae8ec5e1SHisping Lin 
208ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
209ae8ec5e1SHisping Lin 
210ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
211ae8ec5e1SHisping Lin 
212ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
213ae8ec5e1SHisping Lin 
214ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
215ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
216ae8ec5e1SHisping Lin 
217ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
218ae8ec5e1SHisping Lin 
219ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
220ae8ec5e1SHisping Lin 
221ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
222ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
223ae8ec5e1SHisping Lin 
224ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
225ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
226ae8ec5e1SHisping Lin 
227ae8ec5e1SHisping Lin 
228ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
229ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
230ae8ec5e1SHisping Lin 						TEEC_NONE,
231ae8ec5e1SHisping Lin 						TEEC_NONE);
232ae8ec5e1SHisping Lin 
233ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
234ae8ec5e1SHisping Lin 					1,
235ae8ec5e1SHisping Lin 					&TeecOperation,
236ae8ec5e1SHisping Lin 					&ErrorOrigin);
237ae8ec5e1SHisping Lin 
238ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
239ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
240ae8ec5e1SHisping Lin 
241ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
242ae8ec5e1SHisping Lin 
243ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
244ae8ec5e1SHisping Lin 
245ae8ec5e1SHisping Lin 	debug("testmm end\n");
246ae8ec5e1SHisping Lin 
247ae8ec5e1SHisping Lin 	return TeecResult;
248ae8ec5e1SHisping Lin }
249ae8ec5e1SHisping Lin 
250ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
251ae8ec5e1SHisping Lin {
252ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
253ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
254ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
255ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
256ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
257ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
258ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
259ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
260ae8ec5e1SHisping Lin 
261ae8ec5e1SHisping Lin 	debug("testmm start\n");
262ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
263ae8ec5e1SHisping Lin 
264ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
265ae8ec5e1SHisping Lin 
266ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
267ae8ec5e1SHisping Lin 				&TeecSession,
268ae8ec5e1SHisping Lin 				TeecUuid,
269ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
270ae8ec5e1SHisping Lin 				NULL,
271ae8ec5e1SHisping Lin 				NULL,
272ae8ec5e1SHisping Lin 				&ErrorOrigin);
273ae8ec5e1SHisping Lin 
274ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
275ae8ec5e1SHisping Lin 
276ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
277ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
278ae8ec5e1SHisping Lin 
279ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
280ae8ec5e1SHisping Lin 
281ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
282ae8ec5e1SHisping Lin 
283ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
284ae8ec5e1SHisping Lin 
285ae8ec5e1SHisping Lin 	SharedMem1.size = size;
286ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
287ae8ec5e1SHisping Lin 
288ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
289ae8ec5e1SHisping Lin 
290ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
291ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
292ae8ec5e1SHisping Lin 
293ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
294ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
295ae8ec5e1SHisping Lin 
296ae8ec5e1SHisping Lin 
297ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
298ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
299ae8ec5e1SHisping Lin 						TEEC_NONE,
300ae8ec5e1SHisping Lin 						TEEC_NONE);
301ae8ec5e1SHisping Lin 
302ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
303ae8ec5e1SHisping Lin 					0,
304ae8ec5e1SHisping Lin 					&TeecOperation,
305ae8ec5e1SHisping Lin 					&ErrorOrigin);
306ae8ec5e1SHisping Lin 
307ae8ec5e1SHisping Lin 	memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
308ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
309ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
310ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
311ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
312ae8ec5e1SHisping Lin 	debug("testmm end\n");
313ae8ec5e1SHisping Lin 
314ae8ec5e1SHisping Lin 	return TeecResult;
315ae8ec5e1SHisping Lin }
316ae8ec5e1SHisping Lin 
317ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
318ae8ec5e1SHisping Lin {
319ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
320ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
321ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
322ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
323ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
324ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
325ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
326ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
327ae8ec5e1SHisping Lin 
328ae8ec5e1SHisping Lin 	debug("testmm start\n");
329ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
330ae8ec5e1SHisping Lin 
331ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
332ae8ec5e1SHisping Lin 
333ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
334ae8ec5e1SHisping Lin 				&TeecSession,
335ae8ec5e1SHisping Lin 				TeecUuid,
336ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
337ae8ec5e1SHisping Lin 				NULL,
338ae8ec5e1SHisping Lin 				NULL,
339ae8ec5e1SHisping Lin 				&ErrorOrigin);
340ae8ec5e1SHisping Lin 
341ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
342ae8ec5e1SHisping Lin 
343ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
344ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
345ae8ec5e1SHisping Lin 
346ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
347ae8ec5e1SHisping Lin 
348ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
349ae8ec5e1SHisping Lin 
350ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
351ae8ec5e1SHisping Lin 
352ae8ec5e1SHisping Lin 	SharedMem1.size = size;
353ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
354ae8ec5e1SHisping Lin 
355ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
356ae8ec5e1SHisping Lin 
357ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
358ae8ec5e1SHisping Lin 
359ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
360ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
361ae8ec5e1SHisping Lin 
362ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
363ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
364ae8ec5e1SHisping Lin 
365ae8ec5e1SHisping Lin 
366ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
367ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
368ae8ec5e1SHisping Lin 						TEEC_NONE,
369ae8ec5e1SHisping Lin 						TEEC_NONE);
370ae8ec5e1SHisping Lin 
371ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
372ae8ec5e1SHisping Lin 					1,
373ae8ec5e1SHisping Lin 					&TeecOperation,
374ae8ec5e1SHisping Lin 					&ErrorOrigin);
375ae8ec5e1SHisping Lin 
376ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
377ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
378ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
379ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
380ae8ec5e1SHisping Lin 	debug("testmm end\n");
381ae8ec5e1SHisping Lin 
382ae8ec5e1SHisping Lin 	return TeecResult;
383ae8ec5e1SHisping Lin }
384ae8ec5e1SHisping Lin 
385ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
386ae8ec5e1SHisping Lin {
387ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
388ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
389ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
390ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
391ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
392ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
393ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
394ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
395ae8ec5e1SHisping Lin 
396ae8ec5e1SHisping Lin 	debug("testmm start\n");
397ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
398ae8ec5e1SHisping Lin 
399ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
400ae8ec5e1SHisping Lin 
401ae8ec5e1SHisping Lin 
402ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
403ae8ec5e1SHisping Lin 				&TeecSession,
404ae8ec5e1SHisping Lin 				TeecUuid,
405ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
406ae8ec5e1SHisping Lin 				NULL,
407ae8ec5e1SHisping Lin 				NULL,
408ae8ec5e1SHisping Lin 				&ErrorOrigin);
409ae8ec5e1SHisping Lin 
410ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
411ae8ec5e1SHisping Lin 
412ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
413ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
414ae8ec5e1SHisping Lin 
415ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
416ae8ec5e1SHisping Lin 
417ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
418ae8ec5e1SHisping Lin 
419ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
420ae8ec5e1SHisping Lin 
421ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
422ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
423ae8ec5e1SHisping Lin 
424ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
425ae8ec5e1SHisping Lin 
426ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
427ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
428ae8ec5e1SHisping Lin 
429ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
430ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
431ae8ec5e1SHisping Lin 
432ae8ec5e1SHisping Lin 
433ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
434ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
435ae8ec5e1SHisping Lin 						TEEC_NONE,
436ae8ec5e1SHisping Lin 						TEEC_NONE);
437ae8ec5e1SHisping Lin 
438ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
439ae8ec5e1SHisping Lin 					0,
440ae8ec5e1SHisping Lin 					&TeecOperation,
441ae8ec5e1SHisping Lin 					&ErrorOrigin);
442ae8ec5e1SHisping Lin 
443ae8ec5e1SHisping Lin 	memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
444ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
445ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
446ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
447ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
448ae8ec5e1SHisping Lin 	debug("testmm end\n");
449ae8ec5e1SHisping Lin 
450ae8ec5e1SHisping Lin 	return TeecResult;
451ae8ec5e1SHisping Lin }
452ae8ec5e1SHisping Lin 
453ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
454ae8ec5e1SHisping Lin {
455ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
456ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
457ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
458ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
459ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
460ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
461ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
462ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
463ae8ec5e1SHisping Lin 
464ae8ec5e1SHisping Lin 	debug("testmm start\n");
465ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
466ae8ec5e1SHisping Lin 
467ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
468ae8ec5e1SHisping Lin 
469ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
470ae8ec5e1SHisping Lin 				&TeecSession,
471ae8ec5e1SHisping Lin 				TeecUuid,
472ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
473ae8ec5e1SHisping Lin 				NULL,
474ae8ec5e1SHisping Lin 				NULL,
475ae8ec5e1SHisping Lin 				&ErrorOrigin);
476ae8ec5e1SHisping Lin 
477ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
478ae8ec5e1SHisping Lin 
479ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
480ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
481ae8ec5e1SHisping Lin 
482ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
483ae8ec5e1SHisping Lin 
484ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
485ae8ec5e1SHisping Lin 
486ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
487ae8ec5e1SHisping Lin 
488ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
489ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
490ae8ec5e1SHisping Lin 
491ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
492ae8ec5e1SHisping Lin 
493ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
494ae8ec5e1SHisping Lin 
495ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
496ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
497ae8ec5e1SHisping Lin 
498ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
499ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
500ae8ec5e1SHisping Lin 
501ae8ec5e1SHisping Lin 
502ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
503ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
504ae8ec5e1SHisping Lin 						TEEC_NONE,
505ae8ec5e1SHisping Lin 						TEEC_NONE);
506ae8ec5e1SHisping Lin 
507ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
508ae8ec5e1SHisping Lin 					1,
509ae8ec5e1SHisping Lin 					&TeecOperation,
510ae8ec5e1SHisping Lin 					&ErrorOrigin);
511ae8ec5e1SHisping Lin 
512ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
513ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
514ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
515ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
516ae8ec5e1SHisping Lin 	debug("testmm end\n");
517ae8ec5e1SHisping Lin 
518ae8ec5e1SHisping Lin 	return TeecResult;
519ae8ec5e1SHisping Lin }
520ae8ec5e1SHisping Lin 
521ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
522ae8ec5e1SHisping Lin {
523ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
524ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
525ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
526ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
527ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
528ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
529ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
530ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
531ae8ec5e1SHisping Lin 
532ae8ec5e1SHisping Lin 	debug("testmm start\n");
533ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
534ae8ec5e1SHisping Lin 
535ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
536ae8ec5e1SHisping Lin 
537ae8ec5e1SHisping Lin 
538ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
539ae8ec5e1SHisping Lin 				&TeecSession,
540ae8ec5e1SHisping Lin 				TeecUuid,
541ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
542ae8ec5e1SHisping Lin 				NULL,
543ae8ec5e1SHisping Lin 				NULL,
544ae8ec5e1SHisping Lin 				&ErrorOrigin);
545ae8ec5e1SHisping Lin 
546ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
547ae8ec5e1SHisping Lin 
548ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
549ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
550ae8ec5e1SHisping Lin 
551ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
552ae8ec5e1SHisping Lin 
553ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
554ae8ec5e1SHisping Lin 
555ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
556ae8ec5e1SHisping Lin 
557ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
558ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
559ae8ec5e1SHisping Lin 
560ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
561ae8ec5e1SHisping Lin 
562ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
563ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
564ae8ec5e1SHisping Lin 
565ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
566ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
567ae8ec5e1SHisping Lin 
568ae8ec5e1SHisping Lin 
569ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
570ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
571ae8ec5e1SHisping Lin 						TEEC_NONE,
572ae8ec5e1SHisping Lin 						TEEC_NONE);
573ae8ec5e1SHisping Lin 
574ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
575ae8ec5e1SHisping Lin 					0,
576ae8ec5e1SHisping Lin 					&TeecOperation,
577ae8ec5e1SHisping Lin 					&ErrorOrigin);
578ae8ec5e1SHisping Lin 
579ae8ec5e1SHisping Lin 	memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
580ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
581ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
582ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
583ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
584ae8ec5e1SHisping Lin 	debug("testmm end\n");
585ae8ec5e1SHisping Lin 
586ae8ec5e1SHisping Lin 	return TeecResult;
587ae8ec5e1SHisping Lin }
588ae8ec5e1SHisping Lin 
589ae8ec5e1SHisping Lin 
590ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
591ae8ec5e1SHisping Lin {
592ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
593ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
594ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
595ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
596ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
597ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
598ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
599ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
600ae8ec5e1SHisping Lin 
601ae8ec5e1SHisping Lin 	debug("testmm start\n");
602ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
603ae8ec5e1SHisping Lin 
604ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
605ae8ec5e1SHisping Lin 
606ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
607ae8ec5e1SHisping Lin 				&TeecSession,
608ae8ec5e1SHisping Lin 				TeecUuid,
609ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
610ae8ec5e1SHisping Lin 				NULL,
611ae8ec5e1SHisping Lin 				NULL,
612ae8ec5e1SHisping Lin 				&ErrorOrigin);
613ae8ec5e1SHisping Lin 
614ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
615ae8ec5e1SHisping Lin 
616ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
617ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
618ae8ec5e1SHisping Lin 
619ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
620ae8ec5e1SHisping Lin 
621ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
622ae8ec5e1SHisping Lin 
623ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
624ae8ec5e1SHisping Lin 
625ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
626ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
627ae8ec5e1SHisping Lin 
628ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
629ae8ec5e1SHisping Lin 
630ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
631ae8ec5e1SHisping Lin 
632ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
633ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
634ae8ec5e1SHisping Lin 
635ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
636ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
637ae8ec5e1SHisping Lin 
638ae8ec5e1SHisping Lin 
639ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
640ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
641ae8ec5e1SHisping Lin 						TEEC_NONE,
642ae8ec5e1SHisping Lin 						TEEC_NONE);
643ae8ec5e1SHisping Lin 
644ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
645ae8ec5e1SHisping Lin 					1,
646ae8ec5e1SHisping Lin 					&TeecOperation,
647ae8ec5e1SHisping Lin 					&ErrorOrigin);
648ae8ec5e1SHisping Lin 
649ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
650ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
651ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
652ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
653ae8ec5e1SHisping Lin 	debug("testmm end\n");
654ae8ec5e1SHisping Lin 
655ae8ec5e1SHisping Lin 	return TeecResult;
656ae8ec5e1SHisping Lin }
657ae8ec5e1SHisping Lin 
658ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
659ae8ec5e1SHisping Lin 		uint32_t filename_size,
660ae8ec5e1SHisping Lin 		uint8_t *data,
661ae8ec5e1SHisping Lin 		uint32_t data_size)
662ae8ec5e1SHisping Lin {
663ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
664ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
665ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
666ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
667ae8ec5e1SHisping Lin 
668ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
669ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
670ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
671ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
672ae8ec5e1SHisping Lin 
673ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
674ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
675ae8ec5e1SHisping Lin 
676ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
677ae8ec5e1SHisping Lin 
678ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
679ae8ec5e1SHisping Lin 				&TeecSession,
680ae8ec5e1SHisping Lin 				TeecUuid,
681ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
682ae8ec5e1SHisping Lin 				NULL,
683ae8ec5e1SHisping Lin 				NULL,
684ae8ec5e1SHisping Lin 				&ErrorOrigin);
685ae8ec5e1SHisping Lin 
686ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
687ae8ec5e1SHisping Lin 
688ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
689ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
690ae8ec5e1SHisping Lin 
691ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
692ae8ec5e1SHisping Lin 
693ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
694ae8ec5e1SHisping Lin 
695ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
696ae8ec5e1SHisping Lin 
697ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
698ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
699ae8ec5e1SHisping Lin 
700ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
701ae8ec5e1SHisping Lin 
702ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
703ae8ec5e1SHisping Lin 
704ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
705ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
706ae8ec5e1SHisping Lin 
707ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
708ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
709ae8ec5e1SHisping Lin 
710ae8ec5e1SHisping Lin 
711ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
712ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
713ae8ec5e1SHisping Lin 						TEEC_NONE,
714ae8ec5e1SHisping Lin 						TEEC_NONE);
715ae8ec5e1SHisping Lin 
716ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
717ae8ec5e1SHisping Lin 					139,
718ae8ec5e1SHisping Lin 					&TeecOperation,
719ae8ec5e1SHisping Lin 					&ErrorOrigin);
720ae8ec5e1SHisping Lin 
721ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
722ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
723ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
724ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
725ae8ec5e1SHisping Lin 	debug("testmm end\n");
726ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
727ae8ec5e1SHisping Lin 
728ae8ec5e1SHisping Lin 	return TeecResult;
729ae8ec5e1SHisping Lin }
7306ef445a4SHisping Lin 
7316ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
7326ef445a4SHisping Lin {
7336ef445a4SHisping Lin 	TEEC_Result TeecResult;
7346ef445a4SHisping Lin 	TEEC_Context TeecContext;
7356ef445a4SHisping Lin 	TEEC_Session TeecSession;
7366ef445a4SHisping Lin 	uint32_t ErrorOrigin;
7376ef445a4SHisping Lin 
7386ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
7396ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
7406ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
7416ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
7426ef445a4SHisping Lin 
7436ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
7446ef445a4SHisping Lin 
7456ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
7466ef445a4SHisping Lin 
7476ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
7486ef445a4SHisping Lin 				&TeecSession,
7496ef445a4SHisping Lin 				TeecUuid,
7506ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
7516ef445a4SHisping Lin 				NULL,
7526ef445a4SHisping Lin 				NULL,
7536ef445a4SHisping Lin 				&ErrorOrigin);
7546ef445a4SHisping Lin 
7556ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
7566ef445a4SHisping Lin 
7576ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
7586ef445a4SHisping Lin 	SharedMem0.flags = 0;
7596ef445a4SHisping Lin 
7606ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
7616ef445a4SHisping Lin 
7626ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
7636ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
7646ef445a4SHisping Lin 
7656ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
7666ef445a4SHisping Lin 						TEEC_NONE,
7676ef445a4SHisping Lin 						TEEC_NONE,
7686ef445a4SHisping Lin 						TEEC_NONE);
7696ef445a4SHisping Lin 
7706ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
7716ef445a4SHisping Lin 					0,
7726ef445a4SHisping Lin 					&TeecOperation,
7736ef445a4SHisping Lin 					&ErrorOrigin);
7746ef445a4SHisping Lin 
7756ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
7766ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
7776ef445a4SHisping Lin 
7786ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
7796ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
7806ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
7816ef445a4SHisping Lin 
7826ef445a4SHisping Lin 	return TeecResult;
7836ef445a4SHisping Lin }
7846ef445a4SHisping Lin 
7856ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
7866ef445a4SHisping Lin {
7876ef445a4SHisping Lin 	TEEC_Result TeecResult;
7886ef445a4SHisping Lin 	TEEC_Context TeecContext;
7896ef445a4SHisping Lin 	TEEC_Session TeecSession;
7906ef445a4SHisping Lin 	uint32_t ErrorOrigin;
7916ef445a4SHisping Lin 
7926ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
7936ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
7946ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
7956ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
7966ef445a4SHisping Lin 
7976ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
7986ef445a4SHisping Lin 
7996ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
8006ef445a4SHisping Lin 
8016ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
8026ef445a4SHisping Lin 				&TeecSession,
8036ef445a4SHisping Lin 				TeecUuid,
8046ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
8056ef445a4SHisping Lin 				NULL,
8066ef445a4SHisping Lin 				NULL,
8076ef445a4SHisping Lin 				&ErrorOrigin);
8086ef445a4SHisping Lin 
8096ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
8106ef445a4SHisping Lin 
8116ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
8126ef445a4SHisping Lin 	SharedMem0.flags = 0;
8136ef445a4SHisping Lin 
8146ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
8156ef445a4SHisping Lin 
8166ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
8176ef445a4SHisping Lin 
8186ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
8196ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
8206ef445a4SHisping Lin 
8216ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
8226ef445a4SHisping Lin 						TEEC_NONE,
8236ef445a4SHisping Lin 						TEEC_NONE,
8246ef445a4SHisping Lin 						TEEC_NONE);
8256ef445a4SHisping Lin 
8266ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8276ef445a4SHisping Lin 					1,
8286ef445a4SHisping Lin 					&TeecOperation,
8296ef445a4SHisping Lin 					&ErrorOrigin);
8306ef445a4SHisping Lin 
8316ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
8326ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
8336ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8346ef445a4SHisping Lin 
8356ef445a4SHisping Lin 	return TeecResult;
8366ef445a4SHisping Lin }
837*16539616SHisping Lin 
838*16539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
839*16539616SHisping Lin {
840*16539616SHisping Lin 	TEEC_Result TeecResult;
841*16539616SHisping Lin 	TEEC_Context TeecContext;
842*16539616SHisping Lin 	TEEC_Session TeecSession;
843*16539616SHisping Lin 	uint32_t ErrorOrigin;
844*16539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
845*16539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
846*16539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
847*16539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
848*16539616SHisping Lin 
849*16539616SHisping Lin 	OpteeClientApiLibInitialize();
850*16539616SHisping Lin 
851*16539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
852*16539616SHisping Lin 
853*16539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
854*16539616SHisping Lin 				&TeecSession,
855*16539616SHisping Lin 				TeecUuid,
856*16539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
857*16539616SHisping Lin 				NULL,
858*16539616SHisping Lin 				NULL,
859*16539616SHisping Lin 				&ErrorOrigin);
860*16539616SHisping Lin 
861*16539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
862*16539616SHisping Lin 						TEEC_NONE,
863*16539616SHisping Lin 						TEEC_NONE,
864*16539616SHisping Lin 						TEEC_NONE);
865*16539616SHisping Lin 
866*16539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
867*16539616SHisping Lin 					2,
868*16539616SHisping Lin 					&TeecOperation,
869*16539616SHisping Lin 					&ErrorOrigin);
870*16539616SHisping Lin 
871*16539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
872*16539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
873*16539616SHisping Lin 
874*16539616SHisping Lin 	return TeecResult;
875*16539616SHisping Lin }
876*16539616SHisping Lin 
877*16539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
878*16539616SHisping Lin {
879*16539616SHisping Lin 	TEEC_Result TeecResult;
880*16539616SHisping Lin 	TEEC_Context TeecContext;
881*16539616SHisping Lin 	TEEC_Session TeecSession;
882*16539616SHisping Lin 	uint32_t ErrorOrigin;
883*16539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
884*16539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
885*16539616SHisping Lin 
886*16539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
887*16539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
888*16539616SHisping Lin 
889*16539616SHisping Lin 	OpteeClientApiLibInitialize();
890*16539616SHisping Lin 
891*16539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
892*16539616SHisping Lin 
893*16539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
894*16539616SHisping Lin 				&TeecSession,
895*16539616SHisping Lin 				TeecUuid,
896*16539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
897*16539616SHisping Lin 				NULL,
898*16539616SHisping Lin 				NULL,
899*16539616SHisping Lin 				&ErrorOrigin);
900*16539616SHisping Lin 
901*16539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
902*16539616SHisping Lin 						TEEC_NONE,
903*16539616SHisping Lin 						TEEC_NONE,
904*16539616SHisping Lin 						TEEC_NONE);
905*16539616SHisping Lin 
906*16539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
907*16539616SHisping Lin 					2,
908*16539616SHisping Lin 					&TeecOperation,
909*16539616SHisping Lin 					&ErrorOrigin);
910*16539616SHisping Lin 
911*16539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
912*16539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
913*16539616SHisping Lin 
914*16539616SHisping Lin 	return TeecResult;
915*16539616SHisping Lin }
916*16539616SHisping Lin 
917*16539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
918*16539616SHisping Lin {
919*16539616SHisping Lin 	TEEC_Result res;
920*16539616SHisping Lin 	res = notify_optee_rpmb_ta();
921*16539616SHisping Lin 	res |= notify_optee_efuse_ta();
922*16539616SHisping Lin 	return res;
923*16539616SHisping Lin }
924