xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision b9a7e756c4e94fc58b5962647eaf2fa12a2146a9)
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*/
48*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
49*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
50*b9a7e756SHisping Lin 	else
51*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
523251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
533251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
543251364cSHisping Lin #endif
553251364cSHisping Lin 
56ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
57ae8ec5e1SHisping Lin 				&TeecSession,
58ae8ec5e1SHisping Lin 				TeecUuid,
59ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
60ae8ec5e1SHisping Lin 				NULL,
613251364cSHisping Lin 				&TeecOperation,
62ae8ec5e1SHisping Lin 				&ErrorOrigin);
63f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
64f4e1db95SHisping Lin 		return TeecResult;
65ae8ec5e1SHisping Lin 
66ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
67ae8ec5e1SHisping Lin 
68ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
69ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
70ae8ec5e1SHisping Lin 
71ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
72f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
73f4e1db95SHisping Lin 		goto exit;
74ae8ec5e1SHisping Lin 
75ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
76ae8ec5e1SHisping Lin 
77ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
78ae8ec5e1SHisping Lin 
79ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
80ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
81ae8ec5e1SHisping Lin 
82ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
83f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
84f4e1db95SHisping Lin 		goto exit;
85ae8ec5e1SHisping Lin 
86ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
87ae8ec5e1SHisping Lin 
88ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
89ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
90ae8ec5e1SHisping Lin 
91ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
92ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
93ae8ec5e1SHisping Lin 
94ae8ec5e1SHisping Lin 
95ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
96ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
97ae8ec5e1SHisping Lin 						TEEC_NONE,
98ae8ec5e1SHisping Lin 						TEEC_NONE);
99ae8ec5e1SHisping Lin 
100ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
101ae8ec5e1SHisping Lin 					1,
102ae8ec5e1SHisping Lin 					&TeecOperation,
103ae8ec5e1SHisping Lin 					&ErrorOrigin);
104f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
105f4e1db95SHisping Lin 		goto exit;
106f4e1db95SHisping Lin exit:
107ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
108ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
109ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
11046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
111f4e1db95SHisping Lin 	return TeecResult;
112ae8ec5e1SHisping Lin }
113ae8ec5e1SHisping Lin 
114ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
115ae8ec5e1SHisping Lin {
116ae8ec5e1SHisping Lin 	if (in > 9)
117ae8ec5e1SHisping Lin 		return in + 55;
118ae8ec5e1SHisping Lin 	else
119ae8ec5e1SHisping Lin 		return in + 48;
120ae8ec5e1SHisping Lin }
121ae8ec5e1SHisping Lin 
122ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
123ae8ec5e1SHisping Lin {
124ae8ec5e1SHisping Lin 	uint32_t i = 0;
125ae8ec5e1SHisping Lin 
126ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
127ae8ec5e1SHisping Lin 		return 0;
128ae8ec5e1SHisping Lin 
129ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
130ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
131ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
132ae8ec5e1SHisping Lin 	}
133ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
134ae8ec5e1SHisping Lin 
135ae8ec5e1SHisping Lin 	return blen * 2;
136ae8ec5e1SHisping Lin }
137ae8ec5e1SHisping Lin 
138ae8ec5e1SHisping Lin 
139ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
140ae8ec5e1SHisping Lin {
141ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
142ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
143ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
144ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
145ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
146ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
147ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
148ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
149ae8ec5e1SHisping Lin 	uint8_t hs[9];
150ae8ec5e1SHisping Lin 
1513251364cSHisping Lin 	struct blk_desc *dev_desc;
1523251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1536651d4c0SJason Zhu 	if (!dev_desc) {
1546651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1556651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1566651d4c0SJason Zhu 	}
1573251364cSHisping Lin 
158ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
159f4e1db95SHisping Lin 
160f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
161f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
162f4e1db95SHisping Lin 		return TeecResult;
163ae8ec5e1SHisping Lin 
164ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
165f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
166f4e1db95SHisping Lin 		return TeecResult;
167ae8ec5e1SHisping Lin 
1683251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1693251364cSHisping Lin 						TEEC_NONE,
1703251364cSHisping Lin 						TEEC_NONE,
1713251364cSHisping Lin 						TEEC_NONE);
1723251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
173*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
174*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
175*b9a7e756SHisping Lin 	else
176*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1773251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1783251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1793251364cSHisping Lin #endif
1803251364cSHisping Lin 
181ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
182ae8ec5e1SHisping Lin 				&TeecSession,
183ae8ec5e1SHisping Lin 				TeecUuid,
184ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
185ae8ec5e1SHisping Lin 				NULL,
1863251364cSHisping Lin 				&TeecOperation,
187ae8ec5e1SHisping Lin 				&ErrorOrigin);
188f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
189f4e1db95SHisping Lin 		return TeecResult;
190ae8ec5e1SHisping Lin 
191ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
192ae8ec5e1SHisping Lin 
193ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
194ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
195ae8ec5e1SHisping Lin 
196ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
197f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
198f4e1db95SHisping Lin 		goto exit;
199ae8ec5e1SHisping Lin 
200ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
201ae8ec5e1SHisping Lin 
202ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
203ae8ec5e1SHisping Lin 
204ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
205ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
206ae8ec5e1SHisping Lin 
207ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
208f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
209f4e1db95SHisping Lin 		goto exit;
210ae8ec5e1SHisping Lin 
211ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
212ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
213ae8ec5e1SHisping Lin 
214ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
215ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
216ae8ec5e1SHisping Lin 
217ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
218ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
219ae8ec5e1SHisping Lin 						TEEC_NONE,
220ae8ec5e1SHisping Lin 						TEEC_NONE);
221ae8ec5e1SHisping Lin 
222ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
223ae8ec5e1SHisping Lin 					0,
224ae8ec5e1SHisping Lin 					&TeecOperation,
225ae8ec5e1SHisping Lin 					&ErrorOrigin);
22646b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
227ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
228f4e1db95SHisping Lin exit:
229ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
230ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
231ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
23246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
233ae8ec5e1SHisping Lin 
234ae8ec5e1SHisping Lin 	return TeecResult;
235ae8ec5e1SHisping Lin }
236ae8ec5e1SHisping Lin 
237ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
238ae8ec5e1SHisping Lin {
239ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
240ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
241ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
242ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
243ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
244ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
245ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
246ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
247ae8ec5e1SHisping Lin 	uint8_t hs[9];
2483251364cSHisping Lin 	struct blk_desc *dev_desc;
2493251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
2506651d4c0SJason Zhu 	if (!dev_desc) {
2516651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
2526651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
2536651d4c0SJason Zhu 	}
2543251364cSHisping Lin 
255ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
256f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
257f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
258f4e1db95SHisping Lin 		return TeecResult;
259ae8ec5e1SHisping Lin 
260ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
261f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
262f4e1db95SHisping Lin 		return TeecResult;
263ae8ec5e1SHisping Lin 
2643251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2653251364cSHisping Lin 						TEEC_NONE,
2663251364cSHisping Lin 						TEEC_NONE,
2673251364cSHisping Lin 						TEEC_NONE);
2683251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
269*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
270*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
271*b9a7e756SHisping Lin 	else
272*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
2733251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
2743251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
2753251364cSHisping Lin #endif
2763251364cSHisping Lin 
277ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
278ae8ec5e1SHisping Lin 				&TeecSession,
279ae8ec5e1SHisping Lin 				TeecUuid,
280ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
281ae8ec5e1SHisping Lin 				NULL,
2823251364cSHisping Lin 				&TeecOperation,
283ae8ec5e1SHisping Lin 				&ErrorOrigin);
284f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
285f4e1db95SHisping Lin 		return TeecResult;
286ae8ec5e1SHisping Lin 
287ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
288ae8ec5e1SHisping Lin 
289ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
290ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
291ae8ec5e1SHisping Lin 
292ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
293f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
294f4e1db95SHisping Lin 		goto exit;
295ae8ec5e1SHisping Lin 
296ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
297ae8ec5e1SHisping Lin 
298ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
299ae8ec5e1SHisping Lin 
300ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
301ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
302ae8ec5e1SHisping Lin 
303ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
304f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
305f4e1db95SHisping Lin 		goto exit;
306ae8ec5e1SHisping Lin 
307ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
308ae8ec5e1SHisping Lin 
309ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
310ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
311ae8ec5e1SHisping Lin 
312ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
313ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
314ae8ec5e1SHisping Lin 
315ae8ec5e1SHisping Lin 
316ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
317ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
318ae8ec5e1SHisping Lin 						TEEC_NONE,
319ae8ec5e1SHisping Lin 						TEEC_NONE);
320ae8ec5e1SHisping Lin 
321ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
322ae8ec5e1SHisping Lin 					1,
323ae8ec5e1SHisping Lin 					&TeecOperation,
324ae8ec5e1SHisping Lin 					&ErrorOrigin);
325f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
326f4e1db95SHisping Lin 		goto exit;
327f4e1db95SHisping Lin exit:
328ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
329ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
330ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
33146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
332ae8ec5e1SHisping Lin 
333ae8ec5e1SHisping Lin 	return TeecResult;
334ae8ec5e1SHisping Lin }
335ae8ec5e1SHisping Lin 
336ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
337ae8ec5e1SHisping Lin {
338ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
339ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
340ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
341ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
34299830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
34399830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
344ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
345ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
3463251364cSHisping Lin 	struct blk_desc *dev_desc;
3473251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
3486651d4c0SJason Zhu 	if (!dev_desc) {
3496651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
3506651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
3516651d4c0SJason Zhu 	}
352ae8ec5e1SHisping Lin 
353f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
354f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
355f4e1db95SHisping Lin 		return TeecResult;
356ae8ec5e1SHisping Lin 
357ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
358f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
359f4e1db95SHisping Lin 		return TeecResult;
360ae8ec5e1SHisping Lin 
3613251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3623251364cSHisping Lin 						TEEC_NONE,
3633251364cSHisping Lin 						TEEC_NONE,
3643251364cSHisping Lin 						TEEC_NONE);
3653251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
366*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
367*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
368*b9a7e756SHisping Lin 	else
369*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
370*b9a7e756SHisping Lin 
3713251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3723251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3733251364cSHisping Lin #endif
3743251364cSHisping Lin 
375ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
376ae8ec5e1SHisping Lin 				&TeecSession,
377ae8ec5e1SHisping Lin 				TeecUuid,
378ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
379ae8ec5e1SHisping Lin 				NULL,
3803251364cSHisping Lin 				&TeecOperation,
381ae8ec5e1SHisping Lin 				&ErrorOrigin);
382f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
383f4e1db95SHisping Lin 		return TeecResult;
384ae8ec5e1SHisping Lin 
385ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
386ae8ec5e1SHisping Lin 
387ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
388ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
389ae8ec5e1SHisping Lin 
390ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
391f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
392f4e1db95SHisping Lin 		goto exit;
393ae8ec5e1SHisping Lin 
394ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
395ae8ec5e1SHisping Lin 
396ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
397ae8ec5e1SHisping Lin 
398ae8ec5e1SHisping Lin 	SharedMem1.size = size;
399ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
400ae8ec5e1SHisping Lin 
401ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
402f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
403f4e1db95SHisping Lin 		goto exit;
404ae8ec5e1SHisping Lin 
405ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
406ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
407ae8ec5e1SHisping Lin 
408ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
409ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
410ae8ec5e1SHisping Lin 
411ae8ec5e1SHisping Lin 
412ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
413ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
414ae8ec5e1SHisping Lin 						TEEC_NONE,
415ae8ec5e1SHisping Lin 						TEEC_NONE);
416ae8ec5e1SHisping Lin 
417ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
41899830019SHisping Lin 					0,
419ae8ec5e1SHisping Lin 					&TeecOperation,
420ae8ec5e1SHisping Lin 					&ErrorOrigin);
42146b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
422ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
423f4e1db95SHisping Lin exit:
424ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
425ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
426ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
42746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
428ae8ec5e1SHisping Lin 
429ae8ec5e1SHisping Lin 	return TeecResult;
430ae8ec5e1SHisping Lin }
431ae8ec5e1SHisping Lin 
432ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
433ae8ec5e1SHisping Lin {
434ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
435ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
436ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
437ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
43899830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
43999830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
440ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
441ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
4423251364cSHisping Lin 	struct blk_desc *dev_desc;
4433251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
4446651d4c0SJason Zhu 	if (!dev_desc) {
4456651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
4466651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
4476651d4c0SJason Zhu 	}
448ae8ec5e1SHisping Lin 
449f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
450f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
451f4e1db95SHisping Lin 		return TeecResult;
452ae8ec5e1SHisping Lin 
453ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
454f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
455f4e1db95SHisping Lin 		return TeecResult;
456ae8ec5e1SHisping Lin 
4573251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4583251364cSHisping Lin 						TEEC_NONE,
4593251364cSHisping Lin 						TEEC_NONE,
4603251364cSHisping Lin 						TEEC_NONE);
4613251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
462*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
463*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
464*b9a7e756SHisping Lin 	else
465*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
466*b9a7e756SHisping Lin 
4673251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4683251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4693251364cSHisping Lin #endif
4703251364cSHisping Lin 
471ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
472ae8ec5e1SHisping Lin 				&TeecSession,
473ae8ec5e1SHisping Lin 				TeecUuid,
474ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
475ae8ec5e1SHisping Lin 				NULL,
4763251364cSHisping Lin 				&TeecOperation,
477ae8ec5e1SHisping Lin 				&ErrorOrigin);
478f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
479f4e1db95SHisping Lin 		return TeecResult;
480ae8ec5e1SHisping Lin 
481ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
482ae8ec5e1SHisping Lin 
483ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
484ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
485ae8ec5e1SHisping Lin 
486ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
487f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
488f4e1db95SHisping Lin 		goto exit;
489ae8ec5e1SHisping Lin 
490ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
491ae8ec5e1SHisping Lin 
492ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
493ae8ec5e1SHisping Lin 
494ae8ec5e1SHisping Lin 	SharedMem1.size = size;
495ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
496ae8ec5e1SHisping Lin 
497ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
498f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
499f4e1db95SHisping Lin 		goto exit;
500ae8ec5e1SHisping Lin 
501ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
502ae8ec5e1SHisping Lin 
503ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
504ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
505ae8ec5e1SHisping Lin 
506ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
507ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
508ae8ec5e1SHisping Lin 
509ae8ec5e1SHisping Lin 
510ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
511ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
512ae8ec5e1SHisping Lin 						TEEC_NONE,
513ae8ec5e1SHisping Lin 						TEEC_NONE);
514ae8ec5e1SHisping Lin 
515ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
51699830019SHisping Lin 					1,
517ae8ec5e1SHisping Lin 					&TeecOperation,
518ae8ec5e1SHisping Lin 					&ErrorOrigin);
519f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
520f4e1db95SHisping Lin 		goto exit;
521f4e1db95SHisping Lin exit:
522ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
523ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
524ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
52546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
526ae8ec5e1SHisping Lin 
527ae8ec5e1SHisping Lin 	return TeecResult;
528ae8ec5e1SHisping Lin }
529ae8ec5e1SHisping Lin 
530564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
531564654ebSJason Zhu 					      uint32_t size)
532564654ebSJason Zhu {
533564654ebSJason Zhu 	TEEC_Result TeecResult;
534564654ebSJason Zhu 	TEEC_Context TeecContext;
535564654ebSJason Zhu 	TEEC_Session TeecSession;
536564654ebSJason Zhu 	uint32_t ErrorOrigin;
537564654ebSJason Zhu 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
538564654ebSJason Zhu 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
539564654ebSJason Zhu 	TEEC_UUID *TeecUuid = &tempuuid;
540564654ebSJason Zhu 	TEEC_Operation TeecOperation = {0};
541564654ebSJason Zhu 	struct blk_desc *dev_desc;
542564654ebSJason Zhu 
543564654ebSJason Zhu 	dev_desc = rockchip_get_bootdev();
544564654ebSJason Zhu 	if (!dev_desc) {
545564654ebSJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
546564654ebSJason Zhu 		return -TEEC_ERROR_GENERIC;
547564654ebSJason Zhu 	}
548564654ebSJason Zhu 
549f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
550f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
551f4e1db95SHisping Lin 		return TeecResult;
552f4e1db95SHisping Lin 
553564654ebSJason Zhu 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
554f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
555f4e1db95SHisping Lin 		return TeecResult;
556f4e1db95SHisping Lin 
557564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
558564654ebSJason Zhu 						    TEEC_NONE,
559564654ebSJason Zhu 						    TEEC_NONE,
560564654ebSJason Zhu 						    TEEC_NONE);
561564654ebSJason Zhu 	/*0 nand or emmc "security" partition , 1 rpmb*/
562*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
563*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
564*b9a7e756SHisping Lin 	else
565*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
566*b9a7e756SHisping Lin 
567564654ebSJason Zhu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
568564654ebSJason Zhu 	TeecOperation.params[0].value.a = 0;
569564654ebSJason Zhu #endif
570564654ebSJason Zhu 
571564654ebSJason Zhu 	TeecResult = TEEC_OpenSession(&TeecContext,
572564654ebSJason Zhu 				      &TeecSession,
573564654ebSJason Zhu 				      TeecUuid,
574564654ebSJason Zhu 				      TEEC_LOGIN_PUBLIC,
575564654ebSJason Zhu 				      NULL,
576564654ebSJason Zhu 				      &TeecOperation,
577564654ebSJason Zhu 				      &ErrorOrigin);
578f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
579f4e1db95SHisping Lin 		return TeecResult;
580564654ebSJason Zhu 
581564654ebSJason Zhu 	TEEC_SharedMemory SharedMem0 = {0};
582564654ebSJason Zhu 
583564654ebSJason Zhu 	SharedMem0.size = sizeof("rsacer");
584564654ebSJason Zhu 	SharedMem0.flags = 0;
585564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
586f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
587f4e1db95SHisping Lin 		goto exit;
588564654ebSJason Zhu 	memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size);
589564654ebSJason Zhu 	TEEC_SharedMemory SharedMem1 = {0};
590564654ebSJason Zhu 
591564654ebSJason Zhu 	SharedMem1.size = size;
592564654ebSJason Zhu 	SharedMem1.flags = 0;
593564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
594f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
595f4e1db95SHisping Lin 		goto exit;
596564654ebSJason Zhu 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
597564654ebSJason Zhu 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
598564654ebSJason Zhu 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
599564654ebSJason Zhu 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
600564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
601564654ebSJason Zhu 						    TEEC_MEMREF_TEMP_INOUT,
602564654ebSJason Zhu 						    TEEC_NONE,
603564654ebSJason Zhu 						    TEEC_NONE);
604564654ebSJason Zhu 
605564654ebSJason Zhu 	TeecResult = TEEC_InvokeCommand(&TeecSession,
606564654ebSJason Zhu 					0,
607564654ebSJason Zhu 					&TeecOperation,
608564654ebSJason Zhu 					&ErrorOrigin);
609564654ebSJason Zhu 	if (TeecResult == TEEC_SUCCESS)
610564654ebSJason Zhu 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
611f4e1db95SHisping Lin exit:
612564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem0);
613564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem1);
614564654ebSJason Zhu 	TEEC_CloseSession(&TeecSession);
615564654ebSJason Zhu 	TEEC_FinalizeContext(&TeecContext);
616564654ebSJason Zhu 
617564654ebSJason Zhu 	return TeecResult;
618564654ebSJason Zhu }
619564654ebSJason Zhu 
620564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
621564654ebSJason Zhu 					       uint32_t size)
622564654ebSJason Zhu {
623564654ebSJason Zhu 	TEEC_Result TeecResult;
624564654ebSJason Zhu 	TEEC_Context TeecContext;
625564654ebSJason Zhu 	TEEC_Session TeecSession;
626564654ebSJason Zhu 	uint32_t ErrorOrigin;
627564654ebSJason Zhu 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
628564654ebSJason Zhu 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
629564654ebSJason Zhu 	TEEC_UUID *TeecUuid = &tempuuid;
630564654ebSJason Zhu 	TEEC_Operation TeecOperation = {0};
631564654ebSJason Zhu 	struct blk_desc *dev_desc;
632564654ebSJason Zhu 
633564654ebSJason Zhu 	dev_desc = rockchip_get_bootdev();
634564654ebSJason Zhu 	if (!dev_desc) {
635564654ebSJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
636564654ebSJason Zhu 		return -TEEC_ERROR_GENERIC;
637564654ebSJason Zhu 	}
638564654ebSJason Zhu 
639f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
640f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
641f4e1db95SHisping Lin 		return TeecResult;
642f4e1db95SHisping Lin 
643564654ebSJason Zhu 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
644f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
645f4e1db95SHisping Lin 		return TeecResult;
646f4e1db95SHisping Lin 
647564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
648564654ebSJason Zhu 						    TEEC_NONE,
649564654ebSJason Zhu 						    TEEC_NONE,
650564654ebSJason Zhu 						    TEEC_NONE);
651564654ebSJason Zhu 	/*0 nand or emmc "security" partition , 1 rpmb*/
652*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
653*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
654*b9a7e756SHisping Lin 	else
655*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
656*b9a7e756SHisping Lin 
657564654ebSJason Zhu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
658564654ebSJason Zhu 	TeecOperation.params[0].value.a = 0;
659564654ebSJason Zhu #endif
660564654ebSJason Zhu 
661564654ebSJason Zhu 	TeecResult = TEEC_OpenSession(&TeecContext,
662564654ebSJason Zhu 				      &TeecSession,
663564654ebSJason Zhu 				      TeecUuid,
664564654ebSJason Zhu 				      TEEC_LOGIN_PUBLIC,
665564654ebSJason Zhu 				      NULL,
666564654ebSJason Zhu 				      &TeecOperation,
667564654ebSJason Zhu 				      &ErrorOrigin);
668f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
669f4e1db95SHisping Lin 		return TeecResult;
670564654ebSJason Zhu 
671564654ebSJason Zhu 	TEEC_SharedMemory SharedMem0 = {0};
672564654ebSJason Zhu 
673564654ebSJason Zhu 	SharedMem0.size = sizeof("rsacer");
674564654ebSJason Zhu 	SharedMem0.flags = 0;
675564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
676f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
677f4e1db95SHisping Lin 		goto exit;
678564654ebSJason Zhu 	memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size);
679564654ebSJason Zhu 	TEEC_SharedMemory SharedMem1 = {0};
680564654ebSJason Zhu 
681564654ebSJason Zhu 	SharedMem1.size = size;
682564654ebSJason Zhu 	SharedMem1.flags = 0;
683564654ebSJason Zhu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
684f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
685f4e1db95SHisping Lin 		goto exit;
686564654ebSJason Zhu 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
687564654ebSJason Zhu 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
688564654ebSJason Zhu 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
689564654ebSJason Zhu 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
690564654ebSJason Zhu 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
691564654ebSJason Zhu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
692564654ebSJason Zhu 						    TEEC_MEMREF_TEMP_INOUT,
693564654ebSJason Zhu 						    TEEC_NONE,
694564654ebSJason Zhu 						    TEEC_NONE);
695564654ebSJason Zhu 
696564654ebSJason Zhu 	TeecResult = TEEC_InvokeCommand(&TeecSession,
697564654ebSJason Zhu 					1,
698564654ebSJason Zhu 					&TeecOperation,
699564654ebSJason Zhu 					&ErrorOrigin);
700f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
701f4e1db95SHisping Lin 		goto exit;
702f4e1db95SHisping Lin exit:
703564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem0);
704564654ebSJason Zhu 	TEEC_ReleaseSharedMemory(&SharedMem1);
705564654ebSJason Zhu 	TEEC_CloseSession(&TeecSession);
706564654ebSJason Zhu 	TEEC_FinalizeContext(&TeecContext);
707564654ebSJason Zhu 
708564654ebSJason Zhu 	return TeecResult;
709564654ebSJason Zhu }
710564654ebSJason Zhu 
711ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
712ae8ec5e1SHisping Lin {
713ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
714ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
715ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
716ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
717ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
718ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
719ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
720ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
7213251364cSHisping Lin 	struct blk_desc *dev_desc;
7223251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7236651d4c0SJason Zhu 	if (!dev_desc) {
7246651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7256651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7266651d4c0SJason Zhu 	}
727ae8ec5e1SHisping Lin 
728f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
729f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
730f4e1db95SHisping Lin 		return TeecResult;
731ae8ec5e1SHisping Lin 
732ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
733f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
734f4e1db95SHisping Lin 		return TeecResult;
735ae8ec5e1SHisping Lin 
7363251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7373251364cSHisping Lin 						TEEC_NONE,
7383251364cSHisping Lin 						TEEC_NONE,
7393251364cSHisping Lin 						TEEC_NONE);
7403251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
741*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
742*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
743*b9a7e756SHisping Lin 	else
744*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
745*b9a7e756SHisping Lin 
7463251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7473251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7483251364cSHisping Lin #endif
749ae8ec5e1SHisping Lin 
750ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
751ae8ec5e1SHisping Lin 				&TeecSession,
752ae8ec5e1SHisping Lin 				TeecUuid,
753ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
754ae8ec5e1SHisping Lin 				NULL,
7553251364cSHisping Lin 				&TeecOperation,
756ae8ec5e1SHisping Lin 				&ErrorOrigin);
757f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
758f4e1db95SHisping Lin 		return TeecResult;
759ae8ec5e1SHisping Lin 
760ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
761ae8ec5e1SHisping Lin 
762ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
763ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
764ae8ec5e1SHisping Lin 
765ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
766f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
767f4e1db95SHisping Lin 		goto exit;
768ae8ec5e1SHisping Lin 
769ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
770ae8ec5e1SHisping Lin 
771ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
772ae8ec5e1SHisping Lin 
773ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
774ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
775ae8ec5e1SHisping Lin 
776ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
777f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
778f4e1db95SHisping Lin 		goto exit;
779ae8ec5e1SHisping Lin 
780ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
781ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
782ae8ec5e1SHisping Lin 
783ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
784ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
785ae8ec5e1SHisping Lin 
786ae8ec5e1SHisping Lin 
787ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
788ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
789ae8ec5e1SHisping Lin 						TEEC_NONE,
790ae8ec5e1SHisping Lin 						TEEC_NONE);
791ae8ec5e1SHisping Lin 
792ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
793ae8ec5e1SHisping Lin 					0,
794ae8ec5e1SHisping Lin 					&TeecOperation,
795ae8ec5e1SHisping Lin 					&ErrorOrigin);
79646b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
797ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
798f4e1db95SHisping Lin exit:
799ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
800ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
801ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
80246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
803ae8ec5e1SHisping Lin 
804ae8ec5e1SHisping Lin 	return TeecResult;
805ae8ec5e1SHisping Lin }
806ae8ec5e1SHisping Lin 
807ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
808ae8ec5e1SHisping Lin {
809ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
810ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
811ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
812ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
813ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
814ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
815ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
816ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
8173251364cSHisping Lin 	struct blk_desc *dev_desc;
8183251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8196651d4c0SJason Zhu 	if (!dev_desc) {
8206651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8216651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8226651d4c0SJason Zhu 	}
823ae8ec5e1SHisping Lin 
824f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
825f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
826f4e1db95SHisping Lin 		return TeecResult;
827ae8ec5e1SHisping Lin 
828ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
829f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
830f4e1db95SHisping Lin 		return TeecResult;
831ae8ec5e1SHisping Lin 
8323251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8333251364cSHisping Lin 						TEEC_NONE,
8343251364cSHisping Lin 						TEEC_NONE,
8353251364cSHisping Lin 						TEEC_NONE);
8363251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
837*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
838*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
839*b9a7e756SHisping Lin 	else
840*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
841*b9a7e756SHisping Lin 
8423251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8433251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8443251364cSHisping Lin #endif
8453251364cSHisping Lin 
846ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
847ae8ec5e1SHisping Lin 				&TeecSession,
848ae8ec5e1SHisping Lin 				TeecUuid,
849ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
850ae8ec5e1SHisping Lin 				NULL,
8513251364cSHisping Lin 				&TeecOperation,
852ae8ec5e1SHisping Lin 				&ErrorOrigin);
853f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
854f4e1db95SHisping Lin 		return TeecResult;
855ae8ec5e1SHisping Lin 
856ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
857ae8ec5e1SHisping Lin 
858ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
859ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
860ae8ec5e1SHisping Lin 
861ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
862f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
863f4e1db95SHisping Lin 		goto exit;
864ae8ec5e1SHisping Lin 
865ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
866ae8ec5e1SHisping Lin 
867ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
868ae8ec5e1SHisping Lin 
869ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
870ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
871ae8ec5e1SHisping Lin 
872ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
873f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
874f4e1db95SHisping Lin 		goto exit;
875ae8ec5e1SHisping Lin 
876ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
877ae8ec5e1SHisping Lin 
878ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
879ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
880ae8ec5e1SHisping Lin 
881ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
882ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
883ae8ec5e1SHisping Lin 
884ae8ec5e1SHisping Lin 
885ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
886ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
887ae8ec5e1SHisping Lin 						TEEC_NONE,
888ae8ec5e1SHisping Lin 						TEEC_NONE);
889ae8ec5e1SHisping Lin 
890ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
891ae8ec5e1SHisping Lin 					1,
892ae8ec5e1SHisping Lin 					&TeecOperation,
893ae8ec5e1SHisping Lin 					&ErrorOrigin);
894f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
895f4e1db95SHisping Lin 		goto exit;
896f4e1db95SHisping Lin exit:
897ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
898ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
899ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
90046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
901ae8ec5e1SHisping Lin 
902ae8ec5e1SHisping Lin 	return TeecResult;
903ae8ec5e1SHisping Lin }
904ae8ec5e1SHisping Lin 
905ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
906ae8ec5e1SHisping Lin {
907ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
908ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
909ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
910ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
911ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
912ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
913ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
914ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
9153251364cSHisping Lin 	struct blk_desc *dev_desc;
9163251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
9176651d4c0SJason Zhu 	if (!dev_desc) {
9186651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
9196651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
9206651d4c0SJason Zhu 	}
921ae8ec5e1SHisping Lin 
922f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
923f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
924f4e1db95SHisping Lin 		return TeecResult;
925ae8ec5e1SHisping Lin 
926ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
927f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
928f4e1db95SHisping Lin 		return TeecResult;
929ae8ec5e1SHisping Lin 
9303251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9313251364cSHisping Lin 						TEEC_NONE,
9323251364cSHisping Lin 						TEEC_NONE,
9333251364cSHisping Lin 						TEEC_NONE);
9343251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
935*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
936*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
937*b9a7e756SHisping Lin 	else
938*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
939*b9a7e756SHisping Lin 
9403251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9413251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9423251364cSHisping Lin #endif
943ae8ec5e1SHisping Lin 
944ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
945ae8ec5e1SHisping Lin 				&TeecSession,
946ae8ec5e1SHisping Lin 				TeecUuid,
947ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
948ae8ec5e1SHisping Lin 				NULL,
9493251364cSHisping Lin 				&TeecOperation,
950ae8ec5e1SHisping Lin 				&ErrorOrigin);
951f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
952f4e1db95SHisping Lin 		return TeecResult;
953ae8ec5e1SHisping Lin 
954ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
955ae8ec5e1SHisping Lin 
956ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
957ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
958ae8ec5e1SHisping Lin 
959ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
960f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
961f4e1db95SHisping Lin 		goto exit;
962ae8ec5e1SHisping Lin 
963ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
964ae8ec5e1SHisping Lin 
965ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
966ae8ec5e1SHisping Lin 
967ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
968ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
969ae8ec5e1SHisping Lin 
970ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
971f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
972f4e1db95SHisping Lin 		goto exit;
973ae8ec5e1SHisping Lin 
974ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
975ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
976ae8ec5e1SHisping Lin 
977ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
978ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
979ae8ec5e1SHisping Lin 
980ae8ec5e1SHisping Lin 
981ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
982ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
983ae8ec5e1SHisping Lin 						TEEC_NONE,
984ae8ec5e1SHisping Lin 						TEEC_NONE);
985ae8ec5e1SHisping Lin 
986ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
987ae8ec5e1SHisping Lin 					0,
988ae8ec5e1SHisping Lin 					&TeecOperation,
989ae8ec5e1SHisping Lin 					&ErrorOrigin);
99046b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
991ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
992f4e1db95SHisping Lin exit:
993ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
994ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
995ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
99646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
997ae8ec5e1SHisping Lin 
998ae8ec5e1SHisping Lin 	return TeecResult;
999ae8ec5e1SHisping Lin }
1000ae8ec5e1SHisping Lin 
1001ae8ec5e1SHisping Lin 
1002ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
1003ae8ec5e1SHisping Lin {
1004ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
1005ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
1006ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
1007ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
1008ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
1009ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
1010ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1011ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
10123251364cSHisping Lin 	struct blk_desc *dev_desc;
10133251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
10146651d4c0SJason Zhu 	if (!dev_desc) {
10156651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
10166651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
10176651d4c0SJason Zhu 	}
1018ae8ec5e1SHisping Lin 
1019f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1020f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1021f4e1db95SHisping Lin 		return TeecResult;
1022ae8ec5e1SHisping Lin 
1023ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1024f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1025f4e1db95SHisping Lin 		return TeecResult;
1026ae8ec5e1SHisping Lin 
10273251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
10283251364cSHisping Lin 						TEEC_NONE,
10293251364cSHisping Lin 						TEEC_NONE,
10303251364cSHisping Lin 						TEEC_NONE);
10313251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1032*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1033*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1034*b9a7e756SHisping Lin 	else
1035*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1036*b9a7e756SHisping Lin 
10373251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
10383251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
10393251364cSHisping Lin #endif
10403251364cSHisping Lin 
1041ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1042ae8ec5e1SHisping Lin 				&TeecSession,
1043ae8ec5e1SHisping Lin 				TeecUuid,
1044ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
1045ae8ec5e1SHisping Lin 				NULL,
10463251364cSHisping Lin 				&TeecOperation,
1047ae8ec5e1SHisping Lin 				&ErrorOrigin);
1048f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1049f4e1db95SHisping Lin 		return TeecResult;
1050ae8ec5e1SHisping Lin 
1051ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1052ae8ec5e1SHisping Lin 
1053ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
1054ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
1055ae8ec5e1SHisping Lin 
1056ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1057f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1058f4e1db95SHisping Lin 		goto exit;
1059ae8ec5e1SHisping Lin 
1060ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
1061ae8ec5e1SHisping Lin 
1062ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1063ae8ec5e1SHisping Lin 
1064ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
1065ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
1066ae8ec5e1SHisping Lin 
1067ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1068f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1069f4e1db95SHisping Lin 		goto exit;
1070ae8ec5e1SHisping Lin 
1071ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
1072ae8ec5e1SHisping Lin 
1073ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1074ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1075ae8ec5e1SHisping Lin 
1076ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1077ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1078ae8ec5e1SHisping Lin 
1079ae8ec5e1SHisping Lin 
1080ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1081ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1082ae8ec5e1SHisping Lin 						TEEC_NONE,
1083ae8ec5e1SHisping Lin 						TEEC_NONE);
1084ae8ec5e1SHisping Lin 
1085ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1086ae8ec5e1SHisping Lin 					1,
1087ae8ec5e1SHisping Lin 					&TeecOperation,
1088ae8ec5e1SHisping Lin 					&ErrorOrigin);
1089f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1090f4e1db95SHisping Lin 		goto exit;
1091f4e1db95SHisping Lin exit:
1092ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1093ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1094ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
109546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1096ae8ec5e1SHisping Lin 
1097ae8ec5e1SHisping Lin 	return TeecResult;
1098ae8ec5e1SHisping Lin }
1099ae8ec5e1SHisping Lin 
11006ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
11016ef445a4SHisping Lin {
11026ef445a4SHisping Lin 	TEEC_Result TeecResult;
11036ef445a4SHisping Lin 	TEEC_Context TeecContext;
11046ef445a4SHisping Lin 	TEEC_Session TeecSession;
11056ef445a4SHisping Lin 	uint32_t ErrorOrigin;
11066ef445a4SHisping Lin 
11076ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11086ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11096ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11106ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
11116ef445a4SHisping Lin 
1112f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1113f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1114f4e1db95SHisping Lin 		return TeecResult;
11156ef445a4SHisping Lin 
11166ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1117f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1118f4e1db95SHisping Lin 		return TeecResult;
11196ef445a4SHisping Lin 
11206ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11216ef445a4SHisping Lin 				&TeecSession,
11226ef445a4SHisping Lin 				TeecUuid,
11236ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
11246ef445a4SHisping Lin 				NULL,
11256ef445a4SHisping Lin 				NULL,
11266ef445a4SHisping Lin 				&ErrorOrigin);
1127f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1128f4e1db95SHisping Lin 		return TeecResult;
11296ef445a4SHisping Lin 
11306ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11316ef445a4SHisping Lin 
11326ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
11336ef445a4SHisping Lin 	SharedMem0.flags = 0;
11346ef445a4SHisping Lin 
11356ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1136f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1137f4e1db95SHisping Lin 		goto exit;
11386ef445a4SHisping Lin 
11396ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11406ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11416ef445a4SHisping Lin 
11426ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
11436ef445a4SHisping Lin 						TEEC_NONE,
11446ef445a4SHisping Lin 						TEEC_NONE,
11456ef445a4SHisping Lin 						TEEC_NONE);
11466ef445a4SHisping Lin 
11476ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11486ef445a4SHisping Lin 					0,
11496ef445a4SHisping Lin 					&TeecOperation,
11506ef445a4SHisping Lin 					&ErrorOrigin);
11516ef445a4SHisping Lin 
11526ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
11536ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
1154f4e1db95SHisping Lin exit:
11556ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
11566ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
11576ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11586ef445a4SHisping Lin 
11596ef445a4SHisping Lin 	return TeecResult;
11606ef445a4SHisping Lin }
11616ef445a4SHisping Lin 
11626ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
11636ef445a4SHisping Lin {
11646ef445a4SHisping Lin 	TEEC_Result TeecResult;
11656ef445a4SHisping Lin 	TEEC_Context TeecContext;
11666ef445a4SHisping Lin 	TEEC_Session TeecSession;
11676ef445a4SHisping Lin 	uint32_t ErrorOrigin;
11686ef445a4SHisping Lin 
11696ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11706ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11716ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11726ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
11736ef445a4SHisping Lin 
1174f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1175f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1176f4e1db95SHisping Lin 		return TeecResult;
11776ef445a4SHisping Lin 
11786ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1179f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1180f4e1db95SHisping Lin 		return TeecResult;
11816ef445a4SHisping Lin 
11826ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11836ef445a4SHisping Lin 				&TeecSession,
11846ef445a4SHisping Lin 				TeecUuid,
11856ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
11866ef445a4SHisping Lin 				NULL,
11876ef445a4SHisping Lin 				NULL,
11886ef445a4SHisping Lin 				&ErrorOrigin);
1189f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1190f4e1db95SHisping Lin 		return TeecResult;
11916ef445a4SHisping Lin 
11926ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11936ef445a4SHisping Lin 
11946ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
11956ef445a4SHisping Lin 	SharedMem0.flags = 0;
11966ef445a4SHisping Lin 
11976ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1198f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1199f4e1db95SHisping Lin 		goto exit;
12006ef445a4SHisping Lin 
12016ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
12026ef445a4SHisping Lin 
12036ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12046ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12056ef445a4SHisping Lin 
12066ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
12076ef445a4SHisping Lin 						TEEC_NONE,
12086ef445a4SHisping Lin 						TEEC_NONE,
12096ef445a4SHisping Lin 						TEEC_NONE);
12106ef445a4SHisping Lin 
12116ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12126ef445a4SHisping Lin 					1,
12136ef445a4SHisping Lin 					&TeecOperation,
12146ef445a4SHisping Lin 					&ErrorOrigin);
1215f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1216f4e1db95SHisping Lin 		goto exit;
1217f4e1db95SHisping Lin exit:
12186ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12196ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
12206ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12216ef445a4SHisping Lin 
12226ef445a4SHisping Lin 	return TeecResult;
12236ef445a4SHisping Lin }
122416539616SHisping Lin 
122516539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
122616539616SHisping Lin {
122716539616SHisping Lin 	TEEC_Result TeecResult;
122816539616SHisping Lin 	TEEC_Context TeecContext;
122916539616SHisping Lin 	TEEC_Session TeecSession;
123016539616SHisping Lin 	uint32_t ErrorOrigin;
123116539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
123216539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
123316539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
123416539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
123516539616SHisping Lin 
1236f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1237f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1238f4e1db95SHisping Lin 		return TeecResult;
123916539616SHisping Lin 
124016539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1241f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1242f4e1db95SHisping Lin 		return TeecResult;
124316539616SHisping Lin 
124416539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
124516539616SHisping Lin 				&TeecSession,
124616539616SHisping Lin 				TeecUuid,
124716539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
124816539616SHisping Lin 				NULL,
124916539616SHisping Lin 				NULL,
125016539616SHisping Lin 				&ErrorOrigin);
1251f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1252f4e1db95SHisping Lin 		return TeecResult;
125316539616SHisping Lin 
125416539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
125516539616SHisping Lin 						TEEC_NONE,
125616539616SHisping Lin 						TEEC_NONE,
125716539616SHisping Lin 						TEEC_NONE);
125816539616SHisping Lin 
125916539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
126016539616SHisping Lin 					2,
126116539616SHisping Lin 					&TeecOperation,
126216539616SHisping Lin 					&ErrorOrigin);
1263f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1264f4e1db95SHisping Lin 		goto exit;
1265f4e1db95SHisping Lin exit:
126616539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
126716539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
126816539616SHisping Lin 
126916539616SHisping Lin 	return TeecResult;
127016539616SHisping Lin }
127116539616SHisping Lin 
127216539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
127316539616SHisping Lin {
127416539616SHisping Lin 	TEEC_Result TeecResult;
127516539616SHisping Lin 	TEEC_Context TeecContext;
127616539616SHisping Lin 	TEEC_Session TeecSession;
127716539616SHisping Lin 	uint32_t ErrorOrigin;
127816539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
127916539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
128016539616SHisping Lin 
128116539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
128216539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
128316539616SHisping Lin 
1284f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1285f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1286f4e1db95SHisping Lin 		return TeecResult;
128716539616SHisping Lin 
128816539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1289f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1290f4e1db95SHisping Lin 		return TeecResult;
129116539616SHisping Lin 
129216539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
129316539616SHisping Lin 				&TeecSession,
129416539616SHisping Lin 				TeecUuid,
129516539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
129616539616SHisping Lin 				NULL,
129716539616SHisping Lin 				NULL,
129816539616SHisping Lin 				&ErrorOrigin);
1299f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1300f4e1db95SHisping Lin 		return TeecResult;
130116539616SHisping Lin 
130216539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
130316539616SHisping Lin 						TEEC_NONE,
130416539616SHisping Lin 						TEEC_NONE,
130516539616SHisping Lin 						TEEC_NONE);
130616539616SHisping Lin 
130716539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
130816539616SHisping Lin 					2,
130916539616SHisping Lin 					&TeecOperation,
131016539616SHisping Lin 					&ErrorOrigin);
1311f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1312f4e1db95SHisping Lin 		goto exit;
1313f4e1db95SHisping Lin exit:
131416539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
131516539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
131616539616SHisping Lin 
131716539616SHisping Lin 	return TeecResult;
131816539616SHisping Lin }
131916539616SHisping Lin 
132016539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
132116539616SHisping Lin {
132216539616SHisping Lin 	TEEC_Result res;
132316539616SHisping Lin 	res = notify_optee_rpmb_ta();
132416539616SHisping Lin 	res |= notify_optee_efuse_ta();
132516539616SHisping Lin 	return res;
132616539616SHisping Lin }
13272cd27853SHisping Lin 
13282cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
13292cd27853SHisping Lin {
13302cd27853SHisping Lin 	TEEC_Result TeecResult;
13312cd27853SHisping Lin 	TEEC_Context TeecContext;
13322cd27853SHisping Lin 	TEEC_Session TeecSession;
13332cd27853SHisping Lin 	uint32_t ErrorOrigin;
13342cd27853SHisping Lin 
13352cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
13362cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
13372cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13382cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
13392cd27853SHisping Lin 
1340f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1341f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1342f4e1db95SHisping Lin 		return TeecResult;
13432cd27853SHisping Lin 
13442cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1345f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1346f4e1db95SHisping Lin 		return TeecResult;
13472cd27853SHisping Lin 
13482cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
13492cd27853SHisping Lin 				&TeecSession,
13502cd27853SHisping Lin 				TeecUuid,
13512cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
13522cd27853SHisping Lin 				NULL,
13532cd27853SHisping Lin 				NULL,
13542cd27853SHisping Lin 				&ErrorOrigin);
1355f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1356f4e1db95SHisping Lin 		return TeecResult;
13572cd27853SHisping Lin 
13582cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
13592cd27853SHisping Lin 
13602cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
13612cd27853SHisping Lin 	SharedMem0.flags = 0;
13622cd27853SHisping Lin 
13632cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1364f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1365f4e1db95SHisping Lin 		goto exit;
13662cd27853SHisping Lin 
13672cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13682cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13692cd27853SHisping Lin 
13702cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
13712cd27853SHisping Lin 						TEEC_NONE,
13722cd27853SHisping Lin 						TEEC_NONE,
13732cd27853SHisping Lin 						TEEC_NONE);
13742cd27853SHisping Lin 
13752cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13762cd27853SHisping Lin 					3,
13772cd27853SHisping Lin 					&TeecOperation,
13782cd27853SHisping Lin 					&ErrorOrigin);
13792cd27853SHisping Lin 
13802cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
13812cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
1382f4e1db95SHisping Lin exit:
13832cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
13842cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
13852cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
13862cd27853SHisping Lin 
13872cd27853SHisping Lin 	return TeecResult;
13882cd27853SHisping Lin }
13892cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
13902cd27853SHisping Lin {
13912cd27853SHisping Lin 	TEEC_Result TeecResult;
13922cd27853SHisping Lin 	TEEC_Context TeecContext;
13932cd27853SHisping Lin 	TEEC_Session TeecSession;
13942cd27853SHisping Lin 	uint32_t ErrorOrigin;
13952cd27853SHisping Lin 
13962cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
13972cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
13982cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13992cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
14002cd27853SHisping Lin 
1401f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1402f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1403f4e1db95SHisping Lin 		return TeecResult;
14042cd27853SHisping Lin 
14052cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1406f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1407f4e1db95SHisping Lin 		return TeecResult;
14082cd27853SHisping Lin 
14092cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
14102cd27853SHisping Lin 				&TeecSession,
14112cd27853SHisping Lin 				TeecUuid,
14122cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
14132cd27853SHisping Lin 				NULL,
14142cd27853SHisping Lin 				NULL,
14152cd27853SHisping Lin 				&ErrorOrigin);
1416f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1417f4e1db95SHisping Lin 		return TeecResult;
14182cd27853SHisping Lin 
14192cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
14202cd27853SHisping Lin 
14212cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
14222cd27853SHisping Lin 	SharedMem0.flags = 0;
14232cd27853SHisping Lin 
14242cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1425f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1426f4e1db95SHisping Lin 		goto exit;
14272cd27853SHisping Lin 
14282cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
14292cd27853SHisping Lin 
14302cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
14312cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
14322cd27853SHisping Lin 
14332cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
14342cd27853SHisping Lin 						TEEC_NONE,
14352cd27853SHisping Lin 						TEEC_NONE,
14362cd27853SHisping Lin 						TEEC_NONE);
14372cd27853SHisping Lin 
14382cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14392cd27853SHisping Lin 					4,
14402cd27853SHisping Lin 					&TeecOperation,
14412cd27853SHisping Lin 					&ErrorOrigin);
1442f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1443f4e1db95SHisping Lin 		goto exit;
1444f4e1db95SHisping Lin exit:
14452cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
14462cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
14472cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14482cd27853SHisping Lin 
14492cd27853SHisping Lin 	return TeecResult;
14502cd27853SHisping Lin }
1451095e2a82SHisping Lin 
1452468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1453468df3b2SHisping Lin {
1454468df3b2SHisping Lin 	TEEC_Result TeecResult;
1455468df3b2SHisping Lin 	TEEC_Context TeecContext;
1456468df3b2SHisping Lin 	TEEC_Session TeecSession;
1457468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1458468df3b2SHisping Lin 	uint32_t bootflag;
1459468df3b2SHisping Lin 
1460468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1461468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1462468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1463468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1464468df3b2SHisping Lin 
1465f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1466f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1467f4e1db95SHisping Lin 		return TeecResult;
1468468df3b2SHisping Lin 
1469468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1470f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1471f4e1db95SHisping Lin 		return TeecResult;
1472468df3b2SHisping Lin 
1473468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1474468df3b2SHisping Lin 				&TeecSession,
1475468df3b2SHisping Lin 				TeecUuid,
1476468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1477468df3b2SHisping Lin 				NULL,
1478468df3b2SHisping Lin 				NULL,
1479468df3b2SHisping Lin 				&ErrorOrigin);
1480f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1481f4e1db95SHisping Lin 		return TeecResult;
1482468df3b2SHisping Lin 
1483468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1484468df3b2SHisping Lin 
1485468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1486468df3b2SHisping Lin 	SharedMem0.flags = 0;
1487468df3b2SHisping Lin 
1488468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1489f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1490f4e1db95SHisping Lin 		goto exit;
1491468df3b2SHisping Lin 
1492468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1493468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1494468df3b2SHisping Lin 
1495468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1496468df3b2SHisping Lin 						TEEC_NONE,
1497468df3b2SHisping Lin 						TEEC_NONE,
1498468df3b2SHisping Lin 						TEEC_NONE);
1499468df3b2SHisping Lin 
1500468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1501468df3b2SHisping Lin 					5,
1502468df3b2SHisping Lin 					&TeecOperation,
1503468df3b2SHisping Lin 					&ErrorOrigin);
1504468df3b2SHisping Lin 
1505468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1506468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
15070202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
15080202ee8aSHisping Lin 		if (bootflag == 0x00000001)
15090202ee8aSHisping Lin 			*flag = 1;
15100202ee8aSHisping Lin #else
1511468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1512468df3b2SHisping Lin 			*flag = 1;
15130202ee8aSHisping Lin #endif
1514468df3b2SHisping Lin 	}
1515f4e1db95SHisping Lin exit:
1516468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1517468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1518468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1519468df3b2SHisping Lin 
1520468df3b2SHisping Lin 	return TeecResult;
1521468df3b2SHisping Lin }
1522468df3b2SHisping Lin 
1523095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1524095e2a82SHisping Lin {
1525095e2a82SHisping Lin 	TEEC_Result TeecResult;
1526095e2a82SHisping Lin 	TEEC_Context TeecContext;
1527095e2a82SHisping Lin 	TEEC_Session TeecSession;
1528095e2a82SHisping Lin 	uint32_t ErrorOrigin;
152999830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
153099830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
1531095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1532095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
15333251364cSHisping Lin 	struct blk_desc *dev_desc;
15343251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15356651d4c0SJason Zhu 	if (!dev_desc) {
15366651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15376651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15386651d4c0SJason Zhu 	}
1539095e2a82SHisping Lin 
1540f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1541f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1542f4e1db95SHisping Lin 		return TeecResult;
1543095e2a82SHisping Lin 
1544095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1545f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1546f4e1db95SHisping Lin 		return TeecResult;
1547095e2a82SHisping Lin 
15483251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15493251364cSHisping Lin 						TEEC_NONE,
15503251364cSHisping Lin 						TEEC_NONE,
15513251364cSHisping Lin 						TEEC_NONE);
15523251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1553*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1554*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1555*b9a7e756SHisping Lin 	else
1556*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1557*b9a7e756SHisping Lin 
15583251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15593251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15603251364cSHisping Lin #endif
15613251364cSHisping Lin 
1562095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1563095e2a82SHisping Lin 				&TeecSession,
1564095e2a82SHisping Lin 				TeecUuid,
1565095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1566095e2a82SHisping Lin 				NULL,
15673251364cSHisping Lin 				&TeecOperation,
1568095e2a82SHisping Lin 				&ErrorOrigin);
1569f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1570f4e1db95SHisping Lin 		return TeecResult;
1571095e2a82SHisping Lin 
1572095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1573095e2a82SHisping Lin 
1574095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1575095e2a82SHisping Lin 	SharedMem0.flags = 0;
1576095e2a82SHisping Lin 
1577095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1578f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1579f4e1db95SHisping Lin 		goto exit;
1580095e2a82SHisping Lin 
1581095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1582095e2a82SHisping Lin 
1583095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1584095e2a82SHisping Lin 
1585095e2a82SHisping Lin 	SharedMem1.size = 1;
1586095e2a82SHisping Lin 	SharedMem1.flags = 0;
1587095e2a82SHisping Lin 
1588095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1589f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1590f4e1db95SHisping Lin 		goto exit;
1591095e2a82SHisping Lin 
1592095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1593095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1594095e2a82SHisping Lin 
1595095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1596095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1597095e2a82SHisping Lin 
1598095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1599095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1600095e2a82SHisping Lin 						TEEC_NONE,
1601095e2a82SHisping Lin 						TEEC_NONE);
1602095e2a82SHisping Lin 
1603095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
160499830019SHisping Lin 					0,
1605095e2a82SHisping Lin 					&TeecOperation,
1606095e2a82SHisping Lin 					&ErrorOrigin);
1607095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1608095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1609f4e1db95SHisping Lin exit:
1610095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1611095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1612095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1613095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1614095e2a82SHisping Lin 
1615095e2a82SHisping Lin 	return TeecResult;
1616095e2a82SHisping Lin }
1617095e2a82SHisping Lin 
1618095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1619095e2a82SHisping Lin {
1620095e2a82SHisping Lin 	TEEC_Result TeecResult;
1621095e2a82SHisping Lin 	TEEC_Context TeecContext;
1622095e2a82SHisping Lin 	TEEC_Session TeecSession;
1623095e2a82SHisping Lin 	uint32_t ErrorOrigin;
162499830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
162599830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
1626095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1627095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
16283251364cSHisping Lin 	struct blk_desc *dev_desc;
16293251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16306651d4c0SJason Zhu 	if (!dev_desc) {
16316651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
16326651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
16336651d4c0SJason Zhu 	}
1634095e2a82SHisping Lin 
1635f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1636f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1637f4e1db95SHisping Lin 		return TeecResult;
1638095e2a82SHisping Lin 
1639095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1640f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1641f4e1db95SHisping Lin 		return TeecResult;
1642095e2a82SHisping Lin 
16433251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16443251364cSHisping Lin 						TEEC_NONE,
16453251364cSHisping Lin 						TEEC_NONE,
16463251364cSHisping Lin 						TEEC_NONE);
16473251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1648*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1649*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1650*b9a7e756SHisping Lin 	else
1651*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1652*b9a7e756SHisping Lin 
16533251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16543251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16553251364cSHisping Lin #endif
16563251364cSHisping Lin 
1657095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1658095e2a82SHisping Lin 				&TeecSession,
1659095e2a82SHisping Lin 				TeecUuid,
1660095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1661095e2a82SHisping Lin 				NULL,
16623251364cSHisping Lin 				&TeecOperation,
1663095e2a82SHisping Lin 				&ErrorOrigin);
1664f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1665f4e1db95SHisping Lin 		return TeecResult;
1666095e2a82SHisping Lin 
1667095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1668095e2a82SHisping Lin 
1669095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1670095e2a82SHisping Lin 	SharedMem0.flags = 0;
1671095e2a82SHisping Lin 
1672095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1673f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1674f4e1db95SHisping Lin 		goto exit;
1675095e2a82SHisping Lin 
1676095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1677095e2a82SHisping Lin 
1678095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1679095e2a82SHisping Lin 
1680095e2a82SHisping Lin 	SharedMem1.size = 1;
1681095e2a82SHisping Lin 	SharedMem1.flags = 0;
1682095e2a82SHisping Lin 
1683095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1684f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1685f4e1db95SHisping Lin 		goto exit;
1686095e2a82SHisping Lin 
1687095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1688095e2a82SHisping Lin 
1689095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1690095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1691095e2a82SHisping Lin 
1692095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1693095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1694095e2a82SHisping Lin 
1695095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1696095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1697095e2a82SHisping Lin 						TEEC_NONE,
1698095e2a82SHisping Lin 						TEEC_NONE);
1699095e2a82SHisping Lin 
1700095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
170199830019SHisping Lin 					1,
1702095e2a82SHisping Lin 					&TeecOperation,
1703095e2a82SHisping Lin 					&ErrorOrigin);
1704f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1705f4e1db95SHisping Lin 		goto exit;
1706f4e1db95SHisping Lin exit:
1707095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1708095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1709095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1710095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1711095e2a82SHisping Lin 
1712095e2a82SHisping Lin 	return TeecResult;
1713095e2a82SHisping Lin }
17144aa61755SAndy Ye 
17154aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
17164aa61755SAndy Ye {
17174aa61755SAndy Ye 	TEEC_Result TeecResult;
17184aa61755SAndy Ye 	TEEC_Context TeecContext;
17194aa61755SAndy Ye 	TEEC_Session TeecSession;
17204aa61755SAndy Ye 	uint32_t ErrorOrigin;
17214aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17224aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17234aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17244aa61755SAndy Ye 				}
17254aa61755SAndy Ye 			     };
17264aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17274aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17283251364cSHisping Lin 	struct blk_desc *dev_desc;
17293251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17306651d4c0SJason Zhu 	if (!dev_desc) {
17316651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17326651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17336651d4c0SJason Zhu 	}
17344aa61755SAndy Ye 
1735f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1736f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1737f4e1db95SHisping Lin 		return TeecResult;
17384aa61755SAndy Ye 
17394aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1740f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1741f4e1db95SHisping Lin 		return TeecResult;
17424aa61755SAndy Ye 
17433251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17443251364cSHisping Lin 						TEEC_NONE,
17453251364cSHisping Lin 						TEEC_NONE,
17463251364cSHisping Lin 						TEEC_NONE);
17473251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1748*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1749*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1750*b9a7e756SHisping Lin 	else
1751*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1752*b9a7e756SHisping Lin 
17533251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17543251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17553251364cSHisping Lin #endif
17563251364cSHisping Lin 
17574aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17584aa61755SAndy Ye 				      &TeecSession,
17594aa61755SAndy Ye 				      TeecUuid,
17604aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17614aa61755SAndy Ye 				      NULL,
17623251364cSHisping Lin 					&TeecOperation,
17634aa61755SAndy Ye 				      &ErrorOrigin);
1764f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1765f4e1db95SHisping Lin 		return TeecResult;
17664aa61755SAndy Ye 
17674aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17684aa61755SAndy Ye 
17694aa61755SAndy Ye 	SharedMem0.size = *dh_size;
17704aa61755SAndy Ye 	SharedMem0.flags = 0;
17714aa61755SAndy Ye 
17724aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1773f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1774f4e1db95SHisping Lin 		goto exit;
17754aa61755SAndy Ye 
17764aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17774aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17784aa61755SAndy Ye 
17794aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17804aa61755SAndy Ye 						    TEEC_NONE,
17814aa61755SAndy Ye 						    TEEC_NONE,
17824aa61755SAndy Ye 						    TEEC_NONE);
17834aa61755SAndy Ye 
17844aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17854aa61755SAndy Ye 					143,
17864aa61755SAndy Ye 					&TeecOperation,
17874aa61755SAndy Ye 					&ErrorOrigin);
1788f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1789f4e1db95SHisping Lin 		goto exit;
17904aa61755SAndy Ye 
17914aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
17924aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1793f4e1db95SHisping Lin exit:
17944aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17954aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1796f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
17974aa61755SAndy Ye 
17984aa61755SAndy Ye 	return TeecResult;
17994aa61755SAndy Ye }
18004aa61755SAndy Ye 
18014aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
18024aa61755SAndy Ye {
18034aa61755SAndy Ye 	TEEC_Result TeecResult;
18044aa61755SAndy Ye 	TEEC_Context TeecContext;
18054aa61755SAndy Ye 	TEEC_Session TeecSession;
18064aa61755SAndy Ye 	uint32_t ErrorOrigin;
18074aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18084aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18094aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
18104aa61755SAndy Ye 				}
18114aa61755SAndy Ye 			     };
18124aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
18134aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
18143251364cSHisping Lin 	struct blk_desc *dev_desc;
18153251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
18166651d4c0SJason Zhu 	if (!dev_desc) {
18176651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
18186651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
18196651d4c0SJason Zhu 	}
18204aa61755SAndy Ye 
1821f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1822f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1823f4e1db95SHisping Lin 		return TeecResult;
18244aa61755SAndy Ye 
18254aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1826f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1827f4e1db95SHisping Lin 		return TeecResult;
18284aa61755SAndy Ye 
18293251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
18303251364cSHisping Lin 						TEEC_NONE,
18313251364cSHisping Lin 						TEEC_NONE,
18323251364cSHisping Lin 						TEEC_NONE);
18333251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1834*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1835*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1836*b9a7e756SHisping Lin 	else
1837*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1838*b9a7e756SHisping Lin 
18393251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
18403251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
18413251364cSHisping Lin #endif
18423251364cSHisping Lin 
18434aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
18444aa61755SAndy Ye 				      &TeecSession,
18454aa61755SAndy Ye 				      TeecUuid,
18464aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
18474aa61755SAndy Ye 				      NULL,
18483251364cSHisping Lin 					&TeecOperation,
18494aa61755SAndy Ye 				      &ErrorOrigin);
1850f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1851f4e1db95SHisping Lin 		return TeecResult;
18524aa61755SAndy Ye 
18534aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
18544aa61755SAndy Ye 
18554aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
18564aa61755SAndy Ye 	SharedMem0.flags = 0;
18574aa61755SAndy Ye 
18584aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1859f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1860f4e1db95SHisping Lin 		goto exit;
18614aa61755SAndy Ye 
18624aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18634aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18644aa61755SAndy Ye 
18654aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
18664aa61755SAndy Ye 						    TEEC_NONE,
18674aa61755SAndy Ye 						    TEEC_NONE,
18684aa61755SAndy Ye 						    TEEC_NONE);
18694aa61755SAndy Ye 
18704aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18714aa61755SAndy Ye 					144,
18724aa61755SAndy Ye 					&TeecOperation,
18734aa61755SAndy Ye 					&ErrorOrigin);
1874f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1875f4e1db95SHisping Lin 		goto exit;
18764aa61755SAndy Ye 
18774aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
18784aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1879f4e1db95SHisping Lin exit:
18804aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18814aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1882f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18834aa61755SAndy Ye 
18844aa61755SAndy Ye 	return TeecResult;
18854aa61755SAndy Ye }
18864aa61755SAndy Ye 
18874aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
18884aa61755SAndy Ye 			      uint32_t *operation_size,
18894aa61755SAndy Ye 			      uint8_t *out,
18904aa61755SAndy Ye 			      uint32_t *out_len)
18914aa61755SAndy Ye {
18924aa61755SAndy Ye 	TEEC_Result TeecResult;
18934aa61755SAndy Ye 	TEEC_Context TeecContext;
18944aa61755SAndy Ye 	TEEC_Session TeecSession;
18954aa61755SAndy Ye 	uint32_t ErrorOrigin;
18964aa61755SAndy Ye 
18974aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18984aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18994aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
19004aa61755SAndy Ye 				}
19014aa61755SAndy Ye 			     };
19024aa61755SAndy Ye 
19034aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
19044aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
19053251364cSHisping Lin 	struct blk_desc *dev_desc;
19063251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
19076651d4c0SJason Zhu 	if (!dev_desc) {
19086651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
19096651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
19106651d4c0SJason Zhu 	}
19114aa61755SAndy Ye 
1912f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1913f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1914f4e1db95SHisping Lin 		return TeecResult;
19154aa61755SAndy Ye 
19164aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1917f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1918f4e1db95SHisping Lin 		return TeecResult;
19194aa61755SAndy Ye 
19203251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
19213251364cSHisping Lin 						TEEC_NONE,
19223251364cSHisping Lin 						TEEC_NONE,
19233251364cSHisping Lin 						TEEC_NONE);
19243251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1925*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1926*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1927*b9a7e756SHisping Lin 	else
1928*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1929*b9a7e756SHisping Lin 
19303251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
19313251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
19323251364cSHisping Lin #endif
19333251364cSHisping Lin 
19344aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
19354aa61755SAndy Ye 				      &TeecSession,
19364aa61755SAndy Ye 				      TeecUuid,
19374aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
19384aa61755SAndy Ye 				      NULL,
19393251364cSHisping Lin 					&TeecOperation,
19404aa61755SAndy Ye 				      &ErrorOrigin);
1941f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1942f4e1db95SHisping Lin 		return TeecResult;
19434aa61755SAndy Ye 
19444aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
19454aa61755SAndy Ye 
19464aa61755SAndy Ye 	SharedMem0.size = *operation_size;
19474aa61755SAndy Ye 	SharedMem0.flags = 0;
19484aa61755SAndy Ye 
19494aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1950f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1951f4e1db95SHisping Lin 		goto exit;
19524aa61755SAndy Ye 
19534aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
19544aa61755SAndy Ye 
19554aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
19564aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
19574aa61755SAndy Ye 
19584aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
19594aa61755SAndy Ye 
19604aa61755SAndy Ye 	SharedMem1.size = *out_len;
19614aa61755SAndy Ye 	SharedMem1.flags = 0;
19624aa61755SAndy Ye 
19634aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1964f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1965f4e1db95SHisping Lin 		goto exit;
19664aa61755SAndy Ye 
19674aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
19684aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
19694aa61755SAndy Ye 
19704aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
19714aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
19724aa61755SAndy Ye 						    TEEC_NONE,
19734aa61755SAndy Ye 						    TEEC_NONE);
19744aa61755SAndy Ye 
19754aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
19764aa61755SAndy Ye 					145,
19774aa61755SAndy Ye 					&TeecOperation,
19784aa61755SAndy Ye 					&ErrorOrigin);
1979f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1980f4e1db95SHisping Lin 		goto exit;
19814aa61755SAndy Ye 
19824aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
19834aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1984f4e1db95SHisping Lin exit:
19854aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
19864aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1987f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1988f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
19894aa61755SAndy Ye 
19904aa61755SAndy Ye 	return TeecResult;
19914aa61755SAndy Ye }
19924aa61755SAndy Ye 
19934aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
19944aa61755SAndy Ye {
19954aa61755SAndy Ye 	TEEC_Result TeecResult;
19964aa61755SAndy Ye 	TEEC_Context TeecContext;
19974aa61755SAndy Ye 	TEEC_Session TeecSession;
19984aa61755SAndy Ye 	uint32_t ErrorOrigin;
19994aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
20004aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
20014aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
20024aa61755SAndy Ye 				}
20034aa61755SAndy Ye 			     };
20044aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
20054aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
20063251364cSHisping Lin 	struct blk_desc *dev_desc;
20073251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
20086651d4c0SJason Zhu 	if (!dev_desc) {
20096651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
20106651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
20116651d4c0SJason Zhu 	}
2012f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
2013f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2014f4e1db95SHisping Lin 		return TeecResult;
20154aa61755SAndy Ye 
20164aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
2017f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2018f4e1db95SHisping Lin 		return TeecResult;
20194aa61755SAndy Ye 
20203251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
20213251364cSHisping Lin 						TEEC_NONE,
20223251364cSHisping Lin 						TEEC_NONE,
20233251364cSHisping Lin 						TEEC_NONE);
20243251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2025*b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
2026*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
2027*b9a7e756SHisping Lin 	else
2028*b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
2029*b9a7e756SHisping Lin 
20303251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
20313251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
20323251364cSHisping Lin #endif
20333251364cSHisping Lin 
20344aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
20354aa61755SAndy Ye 					&TeecSession,
20364aa61755SAndy Ye 					TeecUuid,
20374aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
20384aa61755SAndy Ye 					NULL,
20393251364cSHisping Lin 					&TeecOperation,
20404aa61755SAndy Ye 					&ErrorOrigin);
2041f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2042f4e1db95SHisping Lin 		return TeecResult;
20434aa61755SAndy Ye 
20444aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
20454aa61755SAndy Ye 
20464aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
20474aa61755SAndy Ye 	SharedMem0.flags = 0;
20484aa61755SAndy Ye 
20494aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
2050f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2051f4e1db95SHisping Lin 		goto exit;
20524aa61755SAndy Ye 
20534aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
20544aa61755SAndy Ye 
20554aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
20564aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
20574aa61755SAndy Ye 
20584aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
20594aa61755SAndy Ye 						    TEEC_NONE,
20604aa61755SAndy Ye 						    TEEC_NONE,
20614aa61755SAndy Ye 						    TEEC_NONE);
20624aa61755SAndy Ye 
20634aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
20644aa61755SAndy Ye 					146,
20654aa61755SAndy Ye 					&TeecOperation,
20664aa61755SAndy Ye 					&ErrorOrigin);
2067f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2068f4e1db95SHisping Lin 		goto exit;
2069f4e1db95SHisping Lin exit:
20704aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
20714aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
2072f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
20734aa61755SAndy Ye 
20744aa61755SAndy Ye 	return TeecResult;
20754aa61755SAndy Ye }
2076