xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision a7df48681ab2521f4431d27f5bd1b30cb49f3b91)
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>
13*a7df4868Stony.xu #include <stdlib.h>
14*a7df4868Stony.xu 
15*a7df4868Stony.xu #define	BOOT_FROM_EMMC	(1 << 1)
16*a7df4868Stony.xu 
17*a7df4868Stony.xu uint32_t rk_send_keybox_to_ta(uint8_t *filename, uint32_t filename_size,
18*a7df4868Stony.xu 			      TEEC_UUID uuid,
19*a7df4868Stony.xu 			      uint8_t *key, uint32_t key_size,
20*a7df4868Stony.xu 			      uint8_t *data, uint32_t data_size)
21*a7df4868Stony.xu {
22*a7df4868Stony.xu 	TEEC_Result TeecResult;
23*a7df4868Stony.xu 	TEEC_Context TeecContext;
24*a7df4868Stony.xu 	TEEC_Session TeecSession;
25*a7df4868Stony.xu 	uint32_t ErrorOrigin;
26*a7df4868Stony.xu 
27*a7df4868Stony.xu 	TEEC_UUID *TeecUuid = &uuid;
28*a7df4868Stony.xu 	TEEC_Operation TeecOperation = {0};
29*a7df4868Stony.xu 
30*a7df4868Stony.xu 	struct blk_desc *dev_desc;
31*a7df4868Stony.xu 
32*a7df4868Stony.xu 	dev_desc = rockchip_get_bootdev();
33*a7df4868Stony.xu 	if (!dev_desc) {
34*a7df4868Stony.xu 		printf("%s: dev_desc is NULL!\n", __func__);
35*a7df4868Stony.xu 		return -TEEC_ERROR_GENERIC;
36*a7df4868Stony.xu 	}
37*a7df4868Stony.xu 
38*a7df4868Stony.xu 	OpteeClientApiLibInitialize();
39*a7df4868Stony.xu 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
40*a7df4868Stony.xu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
41*a7df4868Stony.xu 						    TEEC_NONE,
42*a7df4868Stony.xu 						    TEEC_NONE,
43*a7df4868Stony.xu 						    TEEC_NONE);
44*a7df4868Stony.xu 
45*a7df4868Stony.xu 	/* 0 nand or emmc "security" partition , 1 rpmb */
46*a7df4868Stony.xu 	TeecOperation.params[0].value.a =
47*a7df4868Stony.xu 		(dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
48*a7df4868Stony.xu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
49*a7df4868Stony.xu 	TeecOperation.params[0].value.a = 0;
50*a7df4868Stony.xu #endif
51*a7df4868Stony.xu 	TeecResult = TEEC_OpenSession(&TeecContext,
52*a7df4868Stony.xu 				      &TeecSession,
53*a7df4868Stony.xu 				      TeecUuid,
54*a7df4868Stony.xu 				      TEEC_LOGIN_PUBLIC,
55*a7df4868Stony.xu 				      NULL,
56*a7df4868Stony.xu 				      &TeecOperation,
57*a7df4868Stony.xu 				      &ErrorOrigin);
58*a7df4868Stony.xu 
59*a7df4868Stony.xu 	TEEC_SharedMemory SharedMem0 = {0};
60*a7df4868Stony.xu 
61*a7df4868Stony.xu 	SharedMem0.size = filename_size;
62*a7df4868Stony.xu 	SharedMem0.flags = 0;
63*a7df4868Stony.xu 
64*a7df4868Stony.xu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
65*a7df4868Stony.xu 
66*a7df4868Stony.xu 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
67*a7df4868Stony.xu 
68*a7df4868Stony.xu 	TEEC_SharedMemory SharedMem1 = {0};
69*a7df4868Stony.xu 
70*a7df4868Stony.xu 	SharedMem1.size = key_size;
71*a7df4868Stony.xu 	SharedMem1.flags = 0;
72*a7df4868Stony.xu 
73*a7df4868Stony.xu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
74*a7df4868Stony.xu 
75*a7df4868Stony.xu 	memcpy(SharedMem1.buffer, key, SharedMem1.size);
76*a7df4868Stony.xu 
77*a7df4868Stony.xu 	TEEC_SharedMemory SharedMem2 = {0};
78*a7df4868Stony.xu 
79*a7df4868Stony.xu 	SharedMem2.size = data_size;
80*a7df4868Stony.xu 	SharedMem2.flags = 0;
81*a7df4868Stony.xu 
82*a7df4868Stony.xu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem2);
83*a7df4868Stony.xu 
84*a7df4868Stony.xu 	memcpy(SharedMem2.buffer, data, SharedMem2.size);
85*a7df4868Stony.xu 
86*a7df4868Stony.xu 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
87*a7df4868Stony.xu 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
88*a7df4868Stony.xu 
89*a7df4868Stony.xu 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
90*a7df4868Stony.xu 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
91*a7df4868Stony.xu 
92*a7df4868Stony.xu 	TeecOperation.params[2].tmpref.buffer = SharedMem2.buffer;
93*a7df4868Stony.xu 	TeecOperation.params[2].tmpref.size = SharedMem2.size;
94*a7df4868Stony.xu 
95*a7df4868Stony.xu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
96*a7df4868Stony.xu 						    TEEC_MEMREF_TEMP_INPUT,
97*a7df4868Stony.xu 						    TEEC_MEMREF_TEMP_INOUT,
98*a7df4868Stony.xu 						    TEEC_NONE);
99*a7df4868Stony.xu 
100*a7df4868Stony.xu 	printf("check: does keybox exised in secure storage...\n");
101*a7df4868Stony.xu 	TeecResult = TEEC_InvokeCommand(&TeecSession,
102*a7df4868Stony.xu 					122,
103*a7df4868Stony.xu 					&TeecOperation,
104*a7df4868Stony.xu 					&ErrorOrigin);
105*a7df4868Stony.xu 	if (TeecResult != TEEC_SUCCESS) {
106*a7df4868Stony.xu 		printf("no keybox in secure storage, write keybox to secure storage\n");
107*a7df4868Stony.xu 		TeecResult = TEEC_InvokeCommand(&TeecSession,
108*a7df4868Stony.xu 						121,
109*a7df4868Stony.xu 						&TeecOperation,
110*a7df4868Stony.xu 						&ErrorOrigin);
111*a7df4868Stony.xu 		if (TeecResult != TEEC_SUCCESS) {
112*a7df4868Stony.xu 			printf("send data to TA failed with code 0x%x\n", TeecResult);
113*a7df4868Stony.xu 		} else {
114*a7df4868Stony.xu 			printf("send data to TA success with code 0x%x\n", TeecResult);
115*a7df4868Stony.xu 		}
116*a7df4868Stony.xu 	}
117*a7df4868Stony.xu 	TEEC_ReleaseSharedMemory(&SharedMem0);
118*a7df4868Stony.xu 	TEEC_ReleaseSharedMemory(&SharedMem1);
119*a7df4868Stony.xu 	TEEC_ReleaseSharedMemory(&SharedMem2);
120*a7df4868Stony.xu 
121*a7df4868Stony.xu 	TEEC_CloseSession(&TeecSession);
122*a7df4868Stony.xu 	TEEC_FinalizeContext(&TeecContext);
123*a7df4868Stony.xu 
124*a7df4868Stony.xu 	return TeecResult;
125*a7df4868Stony.xu }
126*a7df4868Stony.xu 
127*a7df4868Stony.xu int write_keybox_to_secure_storage(uint8_t *uboot_data, uint32_t len)
128*a7df4868Stony.xu {
129*a7df4868Stony.xu 	typedef struct VENDOR_DATA {
130*a7df4868Stony.xu 		uint8_t tag[4];
131*a7df4868Stony.xu 		uint32_t key_size;
132*a7df4868Stony.xu 		uint32_t data_size;
133*a7df4868Stony.xu 		uint8_t *all_data;
134*a7df4868Stony.xu 	} VENDOR_DATA;
135*a7df4868Stony.xu 
136*a7df4868Stony.xu 	uint8_t *key = NULL;
137*a7df4868Stony.xu 	uint8_t *data = NULL;
138*a7df4868Stony.xu 	VENDOR_DATA tmp_data;
139*a7df4868Stony.xu 
140*a7df4868Stony.xu 	memset(&tmp_data, 0, sizeof(VENDOR_DATA));
141*a7df4868Stony.xu 	memcpy(tmp_data.tag, uboot_data, 4);
142*a7df4868Stony.xu 	tmp_data.key_size = *(uboot_data + 4);
143*a7df4868Stony.xu 	tmp_data.data_size = *(uboot_data + 8);
144*a7df4868Stony.xu 	tmp_data.all_data = malloc(tmp_data.key_size + tmp_data.data_size);
145*a7df4868Stony.xu 	memcpy(tmp_data.all_data, uboot_data + 12,
146*a7df4868Stony.xu 	       tmp_data.key_size + tmp_data.data_size);
147*a7df4868Stony.xu 
148*a7df4868Stony.xu 	uint8_t widevine_tag[] = {'K', 'B', 'O', 'X'};
149*a7df4868Stony.xu 	uint8_t tag[] = {0};
150*a7df4868Stony.xu 
151*a7df4868Stony.xu 	uint32_t object_id = 101;
152*a7df4868Stony.xu 
153*a7df4868Stony.xu 	TEEC_UUID tmp_uuid;
154*a7df4868Stony.xu 
155*a7df4868Stony.xu 	if (memcmp(uboot_data, widevine_tag, 4) == 0) {
156*a7df4868Stony.xu 		TEEC_UUID widevine_uuid = { 0xc11fe8ac, 0xb997, 0x48cf,
157*a7df4868Stony.xu 			{ 0xa2, 0x8d, 0xe2, 0xa5, 0x5e, 0x52, 0x40, 0xef} };
158*a7df4868Stony.xu 		tmp_uuid = widevine_uuid;
159*a7df4868Stony.xu 		memcpy(tag, uboot_data, 4);
160*a7df4868Stony.xu 		printf("check tag success! %s\n", tag);
161*a7df4868Stony.xu 	} else {
162*a7df4868Stony.xu 		memcpy(tag, uboot_data, 4);
163*a7df4868Stony.xu 		printf("check tag failed! %s\n", tag);
164*a7df4868Stony.xu 	}
165*a7df4868Stony.xu 
166*a7df4868Stony.xu 	key = malloc(tmp_data.key_size);
167*a7df4868Stony.xu 	if (!key) {
168*a7df4868Stony.xu 		printf("Malloc key failed!!\n");
169*a7df4868Stony.xu 		goto reboot;
170*a7df4868Stony.xu 	}
171*a7df4868Stony.xu 
172*a7df4868Stony.xu 	data = malloc(tmp_data.data_size);
173*a7df4868Stony.xu 	if (!data) {
174*a7df4868Stony.xu 		printf("Malloc data failed!!\n");
175*a7df4868Stony.xu 		goto reboot;
176*a7df4868Stony.xu 	}
177*a7df4868Stony.xu 
178*a7df4868Stony.xu 	memcpy(key, tmp_data.all_data, tmp_data.key_size);
179*a7df4868Stony.xu 	memcpy(data, tmp_data.all_data + tmp_data.key_size,
180*a7df4868Stony.xu 	       tmp_data.data_size);
181*a7df4868Stony.xu 
182*a7df4868Stony.xu 	rk_send_keybox_to_ta((uint8_t *)&object_id, sizeof(uint32_t),
183*a7df4868Stony.xu 			     tmp_uuid,
184*a7df4868Stony.xu 			     key, tmp_data.key_size,
185*a7df4868Stony.xu 			     data, tmp_data.data_size);
186*a7df4868Stony.xu reboot:
187*a7df4868Stony.xu 	if (key)
188*a7df4868Stony.xu 		free(key);
189*a7df4868Stony.xu 	if (data)
190*a7df4868Stony.xu 		free(data);
191*a7df4868Stony.xu 	if (tmp_data.all_data)
192*a7df4868Stony.xu 	free(tmp_data.all_data);
193*a7df4868Stony.xu 
194*a7df4868Stony.xu 	memset(&tmp_data, 0, sizeof(VENDOR_DATA));
195*a7df4868Stony.xu 	return 0;
196*a7df4868Stony.xu }
197ae8ec5e1SHisping Lin 
198ae8ec5e1SHisping Lin void test_optee(void)
199ae8ec5e1SHisping Lin {
200ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
201ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
202ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
203ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
204*a7df4868Stony.xu 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, \
205ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
206ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
207ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
2083251364cSHisping Lin 	struct blk_desc *dev_desc;
2093251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
2106651d4c0SJason Zhu 	if (!dev_desc) {
2116651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
2126651d4c0SJason Zhu 		return;
2136651d4c0SJason Zhu 	}
214ae8ec5e1SHisping Lin 
215ae8ec5e1SHisping Lin 	debug("testmm start\n");
216ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
217ae8ec5e1SHisping Lin 
218ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
219ae8ec5e1SHisping Lin 
2203251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2213251364cSHisping Lin 						TEEC_NONE,
2223251364cSHisping Lin 						TEEC_NONE,
2233251364cSHisping Lin 						TEEC_NONE);
2243251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2253251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
2263251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
2273251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
2283251364cSHisping Lin #endif
2293251364cSHisping Lin 
230ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
231ae8ec5e1SHisping Lin 				&TeecSession,
232ae8ec5e1SHisping Lin 				TeecUuid,
233ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
234ae8ec5e1SHisping Lin 				NULL,
2353251364cSHisping Lin 				&TeecOperation,
236ae8ec5e1SHisping Lin 				&ErrorOrigin);
237ae8ec5e1SHisping Lin 
238ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
239ae8ec5e1SHisping Lin 
240ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
241ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
242ae8ec5e1SHisping Lin 
243ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
244ae8ec5e1SHisping Lin 
245ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
246ae8ec5e1SHisping Lin 
247ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
248ae8ec5e1SHisping Lin 
249ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
250ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
251ae8ec5e1SHisping Lin 
252ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
253ae8ec5e1SHisping Lin 
254ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
255ae8ec5e1SHisping Lin 
256ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
257ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
258ae8ec5e1SHisping Lin 
259ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
260ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
261ae8ec5e1SHisping Lin 
262ae8ec5e1SHisping Lin 
263ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
264ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
265ae8ec5e1SHisping Lin 						TEEC_NONE,
266ae8ec5e1SHisping Lin 						TEEC_NONE);
267ae8ec5e1SHisping Lin 
268ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
269ae8ec5e1SHisping Lin 					1,
270ae8ec5e1SHisping Lin 					&TeecOperation,
271ae8ec5e1SHisping Lin 					&ErrorOrigin);
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
274ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
275ae8ec5e1SHisping Lin 
276ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
277ae8ec5e1SHisping Lin 
27846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
279ae8ec5e1SHisping Lin 
280ae8ec5e1SHisping Lin 	debug("testmm end\n");
281ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
282ae8ec5e1SHisping Lin }
283ae8ec5e1SHisping Lin 
284ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
285ae8ec5e1SHisping Lin {
286ae8ec5e1SHisping Lin 	if (in > 9)
287ae8ec5e1SHisping Lin 		return in + 55;
288ae8ec5e1SHisping Lin 	else
289ae8ec5e1SHisping Lin 		return in + 48;
290ae8ec5e1SHisping Lin }
291ae8ec5e1SHisping Lin 
292ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
293ae8ec5e1SHisping Lin {
294ae8ec5e1SHisping Lin 	uint32_t i = 0;
295ae8ec5e1SHisping Lin 
296ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
297ae8ec5e1SHisping Lin 		return 0;
298ae8ec5e1SHisping Lin 
299ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
300ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
301ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
302ae8ec5e1SHisping Lin 	}
303ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
304ae8ec5e1SHisping Lin 
305ae8ec5e1SHisping Lin 	return blen * 2;
306ae8ec5e1SHisping Lin }
307ae8ec5e1SHisping Lin 
308ae8ec5e1SHisping Lin 
309ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
310ae8ec5e1SHisping Lin {
311ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
312ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
313ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
314ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
315ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
316ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
317ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
318ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
319ae8ec5e1SHisping Lin 	uint8_t hs[9];
320ae8ec5e1SHisping Lin 
3213251364cSHisping Lin 	struct blk_desc *dev_desc;
3223251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
3236651d4c0SJason Zhu 	if (!dev_desc) {
3246651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
3256651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
3266651d4c0SJason Zhu 	}
3273251364cSHisping Lin 
328ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
329ae8ec5e1SHisping Lin 	debug("testmm start\n");
330ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
331ae8ec5e1SHisping Lin 
332ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
333ae8ec5e1SHisping Lin 
3343251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3353251364cSHisping Lin 						TEEC_NONE,
3363251364cSHisping Lin 						TEEC_NONE,
3373251364cSHisping Lin 						TEEC_NONE);
3383251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
3393251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
3403251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3413251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3423251364cSHisping Lin #endif
3433251364cSHisping Lin 
344ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
345ae8ec5e1SHisping Lin 				&TeecSession,
346ae8ec5e1SHisping Lin 				TeecUuid,
347ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
348ae8ec5e1SHisping Lin 				NULL,
3493251364cSHisping Lin 				&TeecOperation,
350f303baf0SHisping Lin 
351ae8ec5e1SHisping Lin 				&ErrorOrigin);
352ae8ec5e1SHisping Lin 
353ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
354ae8ec5e1SHisping Lin 
355ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
356ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
357ae8ec5e1SHisping Lin 
358ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
359ae8ec5e1SHisping Lin 
360ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
361ae8ec5e1SHisping Lin 
362ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
363ae8ec5e1SHisping Lin 
364ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
365ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
366ae8ec5e1SHisping Lin 
367ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
368ae8ec5e1SHisping Lin 
369ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
370ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
371ae8ec5e1SHisping Lin 
372ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
373ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
374ae8ec5e1SHisping Lin 
375ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
376ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
377ae8ec5e1SHisping Lin 						TEEC_NONE,
378ae8ec5e1SHisping Lin 						TEEC_NONE);
379ae8ec5e1SHisping Lin 
380ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
381ae8ec5e1SHisping Lin 					0,
382ae8ec5e1SHisping Lin 					&TeecOperation,
383ae8ec5e1SHisping Lin 					&ErrorOrigin);
38446b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
385ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
386ae8ec5e1SHisping Lin 
387ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
388ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
389ae8ec5e1SHisping Lin 
390ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
391ae8ec5e1SHisping Lin 
39246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
393ae8ec5e1SHisping Lin 
394ae8ec5e1SHisping Lin 	debug("testmm end\n");
395ae8ec5e1SHisping Lin 	return TeecResult;
396ae8ec5e1SHisping Lin }
397ae8ec5e1SHisping Lin 
398ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
399ae8ec5e1SHisping Lin {
400ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
401ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
402ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
403ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
404ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
405ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
406ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
407ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
408ae8ec5e1SHisping Lin 	uint8_t hs[9];
4093251364cSHisping Lin 	struct blk_desc *dev_desc;
4103251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
4116651d4c0SJason Zhu 	if (!dev_desc) {
4126651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
4136651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
4146651d4c0SJason Zhu 	}
4153251364cSHisping Lin 
416ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
417ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
418ae8ec5e1SHisping Lin 
419ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
420ae8ec5e1SHisping Lin 
4213251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4223251364cSHisping Lin 						TEEC_NONE,
4233251364cSHisping Lin 						TEEC_NONE,
4243251364cSHisping Lin 						TEEC_NONE);
4253251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
4263251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
4273251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4283251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4293251364cSHisping Lin #endif
4303251364cSHisping Lin 
431ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
432ae8ec5e1SHisping Lin 				&TeecSession,
433ae8ec5e1SHisping Lin 				TeecUuid,
434ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
435ae8ec5e1SHisping Lin 				NULL,
4363251364cSHisping Lin 				&TeecOperation,
437ae8ec5e1SHisping Lin 				&ErrorOrigin);
438ae8ec5e1SHisping Lin 
439ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
440ae8ec5e1SHisping Lin 
441ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
442ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
443ae8ec5e1SHisping Lin 
444ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
445ae8ec5e1SHisping Lin 
446ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
447ae8ec5e1SHisping Lin 
448ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
449ae8ec5e1SHisping Lin 
450ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
451ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
452ae8ec5e1SHisping Lin 
453ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
454ae8ec5e1SHisping Lin 
455ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
456ae8ec5e1SHisping Lin 
457ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
458ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
459ae8ec5e1SHisping Lin 
460ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
461ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
462ae8ec5e1SHisping Lin 
463ae8ec5e1SHisping Lin 
464ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
465ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
466ae8ec5e1SHisping Lin 						TEEC_NONE,
467ae8ec5e1SHisping Lin 						TEEC_NONE);
468ae8ec5e1SHisping Lin 
469ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
470ae8ec5e1SHisping Lin 					1,
471ae8ec5e1SHisping Lin 					&TeecOperation,
472ae8ec5e1SHisping Lin 					&ErrorOrigin);
473ae8ec5e1SHisping Lin 
474ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
475ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
476ae8ec5e1SHisping Lin 
477ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
478ae8ec5e1SHisping Lin 
47946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
480ae8ec5e1SHisping Lin 
481ae8ec5e1SHisping Lin 	debug("testmm end\n");
482ae8ec5e1SHisping Lin 
483ae8ec5e1SHisping Lin 	return TeecResult;
484ae8ec5e1SHisping Lin }
485ae8ec5e1SHisping Lin 
486ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
487ae8ec5e1SHisping Lin {
488ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
489ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
490ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
491ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
49246b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
49346b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
494ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
495ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
4963251364cSHisping Lin 	struct blk_desc *dev_desc;
4973251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
4986651d4c0SJason Zhu 	if (!dev_desc) {
4996651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
5006651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
5016651d4c0SJason Zhu 	}
502ae8ec5e1SHisping Lin 
503ae8ec5e1SHisping Lin 	debug("testmm start\n");
504ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
505ae8ec5e1SHisping Lin 
506ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
507ae8ec5e1SHisping Lin 
5083251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
5093251364cSHisping Lin 						TEEC_NONE,
5103251364cSHisping Lin 						TEEC_NONE,
5113251364cSHisping Lin 						TEEC_NONE);
5123251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
5133251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
5143251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
5153251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
5163251364cSHisping Lin #endif
5173251364cSHisping Lin 
518ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
519ae8ec5e1SHisping Lin 				&TeecSession,
520ae8ec5e1SHisping Lin 				TeecUuid,
521ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
522ae8ec5e1SHisping Lin 				NULL,
5233251364cSHisping Lin 				&TeecOperation,
524ae8ec5e1SHisping Lin 				&ErrorOrigin);
525ae8ec5e1SHisping Lin 
526ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
527ae8ec5e1SHisping Lin 
528ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
529ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
530ae8ec5e1SHisping Lin 
531ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
532ae8ec5e1SHisping Lin 
533ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
534ae8ec5e1SHisping Lin 
535ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
536ae8ec5e1SHisping Lin 
537ae8ec5e1SHisping Lin 	SharedMem1.size = size;
538ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
539ae8ec5e1SHisping Lin 
540ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
541ae8ec5e1SHisping Lin 
542ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
543ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
544ae8ec5e1SHisping Lin 
545ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
546ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
547ae8ec5e1SHisping Lin 
548ae8ec5e1SHisping Lin 
549ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
550ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
551ae8ec5e1SHisping Lin 						TEEC_NONE,
552ae8ec5e1SHisping Lin 						TEEC_NONE);
553ae8ec5e1SHisping Lin 
554ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
55546b2a054SHisping Lin 					142,
556ae8ec5e1SHisping Lin 					&TeecOperation,
557ae8ec5e1SHisping Lin 					&ErrorOrigin);
55846b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
559ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
560ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
561ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
562ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
56346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
564ae8ec5e1SHisping Lin 	debug("testmm end\n");
565ae8ec5e1SHisping Lin 
566ae8ec5e1SHisping Lin 	return TeecResult;
567ae8ec5e1SHisping Lin }
568ae8ec5e1SHisping Lin 
569ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
570ae8ec5e1SHisping Lin {
571ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
572ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
573ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
574ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
57546b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
57646b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
577ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
578ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
5793251364cSHisping Lin 	struct blk_desc *dev_desc;
5803251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
5816651d4c0SJason Zhu 	if (!dev_desc) {
5826651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
5836651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
5846651d4c0SJason Zhu 	}
585ae8ec5e1SHisping Lin 
586ae8ec5e1SHisping Lin 	debug("testmm start\n");
587ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
588ae8ec5e1SHisping Lin 
589ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
590ae8ec5e1SHisping Lin 
5913251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
5923251364cSHisping Lin 						TEEC_NONE,
5933251364cSHisping Lin 						TEEC_NONE,
5943251364cSHisping Lin 						TEEC_NONE);
5953251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
5963251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
5973251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
5983251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
5993251364cSHisping Lin #endif
6003251364cSHisping Lin 
601ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
602ae8ec5e1SHisping Lin 				&TeecSession,
603ae8ec5e1SHisping Lin 				TeecUuid,
604ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
605ae8ec5e1SHisping Lin 				NULL,
6063251364cSHisping Lin 				&TeecOperation,
607ae8ec5e1SHisping Lin 				&ErrorOrigin);
608ae8ec5e1SHisping Lin 
609ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
610ae8ec5e1SHisping Lin 
611ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
612ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
613ae8ec5e1SHisping Lin 
614ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
615ae8ec5e1SHisping Lin 
616ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
617ae8ec5e1SHisping Lin 
618ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
619ae8ec5e1SHisping Lin 
620ae8ec5e1SHisping Lin 	SharedMem1.size = size;
621ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
622ae8ec5e1SHisping Lin 
623ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
624ae8ec5e1SHisping Lin 
625ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
626ae8ec5e1SHisping Lin 
627ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
628ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
629ae8ec5e1SHisping Lin 
630ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
631ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
632ae8ec5e1SHisping Lin 
633ae8ec5e1SHisping Lin 
634ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
635ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
636ae8ec5e1SHisping Lin 						TEEC_NONE,
637ae8ec5e1SHisping Lin 						TEEC_NONE);
638ae8ec5e1SHisping Lin 
639ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
64046b2a054SHisping Lin 					141,
641ae8ec5e1SHisping Lin 					&TeecOperation,
642ae8ec5e1SHisping Lin 					&ErrorOrigin);
643ae8ec5e1SHisping Lin 
644ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
645ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
646ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
64746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
648ae8ec5e1SHisping Lin 	debug("testmm end\n");
649ae8ec5e1SHisping Lin 
650ae8ec5e1SHisping Lin 	return TeecResult;
651ae8ec5e1SHisping Lin }
652ae8ec5e1SHisping Lin 
653ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
654ae8ec5e1SHisping Lin {
655ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
656ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
657ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
658ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
659ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
660ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
661ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
662ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
6633251364cSHisping Lin 	struct blk_desc *dev_desc;
6643251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
6656651d4c0SJason Zhu 	if (!dev_desc) {
6666651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
6676651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
6686651d4c0SJason Zhu 	}
669ae8ec5e1SHisping Lin 
670ae8ec5e1SHisping Lin 	debug("testmm start\n");
671ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
672ae8ec5e1SHisping Lin 
673ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
674ae8ec5e1SHisping Lin 
6753251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6763251364cSHisping Lin 						TEEC_NONE,
6773251364cSHisping Lin 						TEEC_NONE,
6783251364cSHisping Lin 						TEEC_NONE);
6793251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
6803251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
6813251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6823251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6833251364cSHisping Lin #endif
684ae8ec5e1SHisping Lin 
685ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
686ae8ec5e1SHisping Lin 				&TeecSession,
687ae8ec5e1SHisping Lin 				TeecUuid,
688ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
689ae8ec5e1SHisping Lin 				NULL,
6903251364cSHisping Lin 				&TeecOperation,
691ae8ec5e1SHisping Lin 				&ErrorOrigin);
692ae8ec5e1SHisping Lin 
693ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
694ae8ec5e1SHisping Lin 
695ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
696ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
697ae8ec5e1SHisping Lin 
698ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
699ae8ec5e1SHisping Lin 
700ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
701ae8ec5e1SHisping Lin 
702ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
703ae8ec5e1SHisping Lin 
704ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
705ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
706ae8ec5e1SHisping Lin 
707ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
708ae8ec5e1SHisping Lin 
709ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
710ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
711ae8ec5e1SHisping Lin 
712ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
713ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
714ae8ec5e1SHisping Lin 
715ae8ec5e1SHisping Lin 
716ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
717ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
718ae8ec5e1SHisping Lin 						TEEC_NONE,
719ae8ec5e1SHisping Lin 						TEEC_NONE);
720ae8ec5e1SHisping Lin 
721ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
722ae8ec5e1SHisping Lin 					0,
723ae8ec5e1SHisping Lin 					&TeecOperation,
724ae8ec5e1SHisping Lin 					&ErrorOrigin);
72546b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
726ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
727ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
728ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
729ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
73046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
731ae8ec5e1SHisping Lin 	debug("testmm end\n");
732ae8ec5e1SHisping Lin 
733ae8ec5e1SHisping Lin 	return TeecResult;
734ae8ec5e1SHisping Lin }
735ae8ec5e1SHisping Lin 
736ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
737ae8ec5e1SHisping Lin {
738ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
739ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
740ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
741ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
742ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
743ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
744ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
745ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
7463251364cSHisping Lin 	struct blk_desc *dev_desc;
7473251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7486651d4c0SJason Zhu 	if (!dev_desc) {
7496651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7506651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7516651d4c0SJason Zhu 	}
752ae8ec5e1SHisping Lin 
753ae8ec5e1SHisping Lin 	debug("testmm start\n");
754ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
755ae8ec5e1SHisping Lin 
756ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
757ae8ec5e1SHisping Lin 
7583251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7593251364cSHisping Lin 						TEEC_NONE,
7603251364cSHisping Lin 						TEEC_NONE,
7613251364cSHisping Lin 						TEEC_NONE);
7623251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
7633251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
7643251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7653251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7663251364cSHisping Lin #endif
7673251364cSHisping Lin 
768ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
769ae8ec5e1SHisping Lin 				&TeecSession,
770ae8ec5e1SHisping Lin 				TeecUuid,
771ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
772ae8ec5e1SHisping Lin 				NULL,
7733251364cSHisping Lin 				&TeecOperation,
774ae8ec5e1SHisping Lin 				&ErrorOrigin);
775ae8ec5e1SHisping Lin 
776ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
777ae8ec5e1SHisping Lin 
778ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
779ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
780ae8ec5e1SHisping Lin 
781ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
782ae8ec5e1SHisping Lin 
783ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
784ae8ec5e1SHisping Lin 
785ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
786ae8ec5e1SHisping Lin 
787ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
788ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
789ae8ec5e1SHisping Lin 
790ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
791ae8ec5e1SHisping Lin 
792ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
793ae8ec5e1SHisping Lin 
794ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
795ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
796ae8ec5e1SHisping Lin 
797ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
798ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
799ae8ec5e1SHisping Lin 
800ae8ec5e1SHisping Lin 
801ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
802ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
803ae8ec5e1SHisping Lin 						TEEC_NONE,
804ae8ec5e1SHisping Lin 						TEEC_NONE);
805ae8ec5e1SHisping Lin 
806ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
807ae8ec5e1SHisping Lin 					1,
808ae8ec5e1SHisping Lin 					&TeecOperation,
809ae8ec5e1SHisping Lin 					&ErrorOrigin);
810ae8ec5e1SHisping Lin 
811ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
812ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
813ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
81446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
815ae8ec5e1SHisping Lin 	debug("testmm end\n");
816ae8ec5e1SHisping Lin 
817ae8ec5e1SHisping Lin 	return TeecResult;
818ae8ec5e1SHisping Lin }
819ae8ec5e1SHisping Lin 
820ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
821ae8ec5e1SHisping Lin {
822ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
823ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
824ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
825ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
826ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
827ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
828ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
829ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
8303251364cSHisping Lin 	struct blk_desc *dev_desc;
8313251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8326651d4c0SJason Zhu 	if (!dev_desc) {
8336651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8346651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8356651d4c0SJason Zhu 	}
836ae8ec5e1SHisping Lin 
837ae8ec5e1SHisping Lin 	debug("testmm start\n");
838ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
839ae8ec5e1SHisping Lin 
840ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
841ae8ec5e1SHisping Lin 
8423251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8433251364cSHisping Lin 						TEEC_NONE,
8443251364cSHisping Lin 						TEEC_NONE,
8453251364cSHisping Lin 						TEEC_NONE);
8463251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
8473251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
8483251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8493251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8503251364cSHisping Lin #endif
851ae8ec5e1SHisping Lin 
852ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
853ae8ec5e1SHisping Lin 				&TeecSession,
854ae8ec5e1SHisping Lin 				TeecUuid,
855ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
856ae8ec5e1SHisping Lin 				NULL,
8573251364cSHisping Lin 				&TeecOperation,
858ae8ec5e1SHisping Lin 				&ErrorOrigin);
859ae8ec5e1SHisping Lin 
860ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
861ae8ec5e1SHisping Lin 
862ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
863ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
864ae8ec5e1SHisping Lin 
865ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
866ae8ec5e1SHisping Lin 
867ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
868ae8ec5e1SHisping Lin 
869ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
870ae8ec5e1SHisping Lin 
871ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
872ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
873ae8ec5e1SHisping Lin 
874ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
875ae8ec5e1SHisping Lin 
876ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
877ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
878ae8ec5e1SHisping Lin 
879ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
880ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
881ae8ec5e1SHisping Lin 
882ae8ec5e1SHisping Lin 
883ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
884ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
885ae8ec5e1SHisping Lin 						TEEC_NONE,
886ae8ec5e1SHisping Lin 						TEEC_NONE);
887ae8ec5e1SHisping Lin 
888ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
889ae8ec5e1SHisping Lin 					0,
890ae8ec5e1SHisping Lin 					&TeecOperation,
891ae8ec5e1SHisping Lin 					&ErrorOrigin);
89246b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
893ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
894ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
895ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
896ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
89746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
898ae8ec5e1SHisping Lin 	debug("testmm end\n");
899ae8ec5e1SHisping Lin 
900ae8ec5e1SHisping Lin 	return TeecResult;
901ae8ec5e1SHisping Lin }
902ae8ec5e1SHisping Lin 
903ae8ec5e1SHisping Lin 
904ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
905ae8ec5e1SHisping Lin {
906ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
907ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
908ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
909ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
910ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
911ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
912ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
913ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
9143251364cSHisping Lin 	struct blk_desc *dev_desc;
9153251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
9166651d4c0SJason Zhu 	if (!dev_desc) {
9176651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
9186651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
9196651d4c0SJason Zhu 	}
920ae8ec5e1SHisping Lin 
921ae8ec5e1SHisping Lin 	debug("testmm start\n");
922ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
923ae8ec5e1SHisping Lin 
924ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
925ae8ec5e1SHisping Lin 
9263251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9273251364cSHisping Lin 						TEEC_NONE,
9283251364cSHisping Lin 						TEEC_NONE,
9293251364cSHisping Lin 						TEEC_NONE);
9303251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
9313251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
9323251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9333251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9343251364cSHisping Lin #endif
9353251364cSHisping Lin 
936ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
937ae8ec5e1SHisping Lin 				&TeecSession,
938ae8ec5e1SHisping Lin 				TeecUuid,
939ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
940ae8ec5e1SHisping Lin 				NULL,
9413251364cSHisping Lin 				&TeecOperation,
942ae8ec5e1SHisping Lin 				&ErrorOrigin);
943ae8ec5e1SHisping Lin 
944ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
945ae8ec5e1SHisping Lin 
946ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
947ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
948ae8ec5e1SHisping Lin 
949ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
950ae8ec5e1SHisping Lin 
951ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
952ae8ec5e1SHisping Lin 
953ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
954ae8ec5e1SHisping Lin 
955ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
956ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
957ae8ec5e1SHisping Lin 
958ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
959ae8ec5e1SHisping Lin 
960ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
961ae8ec5e1SHisping Lin 
962ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
963ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
964ae8ec5e1SHisping Lin 
965ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
966ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
967ae8ec5e1SHisping Lin 
968ae8ec5e1SHisping Lin 
969ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
970ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
971ae8ec5e1SHisping Lin 						TEEC_NONE,
972ae8ec5e1SHisping Lin 						TEEC_NONE);
973ae8ec5e1SHisping Lin 
974ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
975ae8ec5e1SHisping Lin 					1,
976ae8ec5e1SHisping Lin 					&TeecOperation,
977ae8ec5e1SHisping Lin 					&ErrorOrigin);
978ae8ec5e1SHisping Lin 
979ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
980ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
981ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
98246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
983ae8ec5e1SHisping Lin 	debug("testmm end\n");
984ae8ec5e1SHisping Lin 
985ae8ec5e1SHisping Lin 	return TeecResult;
986ae8ec5e1SHisping Lin }
987ae8ec5e1SHisping Lin 
98878ef5fbdSqiujian TEEC_Result read_from_keymaster(uint8_t *filename,
98978ef5fbdSqiujian 		uint32_t filename_size,
99078ef5fbdSqiujian 		uint8_t *data,
99178ef5fbdSqiujian 		uint32_t size)
99278ef5fbdSqiujian {
99378ef5fbdSqiujian 	TEEC_Result TeecResult;
99478ef5fbdSqiujian 	TEEC_Context TeecContext;
99578ef5fbdSqiujian 	TEEC_Session TeecSession;
99678ef5fbdSqiujian 	uint32_t ErrorOrigin;
99778ef5fbdSqiujian 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
99878ef5fbdSqiujian 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
99978ef5fbdSqiujian 	TEEC_UUID *TeecUuid = &tempuuid;
100078ef5fbdSqiujian 	TEEC_Operation TeecOperation = {0};
100178ef5fbdSqiujian 	struct blk_desc *dev_desc;
100278ef5fbdSqiujian 	dev_desc = rockchip_get_bootdev();
10036651d4c0SJason Zhu 	if (!dev_desc) {
10046651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
10056651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
10066651d4c0SJason Zhu 	}
100778ef5fbdSqiujian 
100878ef5fbdSqiujian 	debug("read_from_keymaster start\n");
100978ef5fbdSqiujian 	OpteeClientApiLibInitialize();
101078ef5fbdSqiujian 
101178ef5fbdSqiujian 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
101278ef5fbdSqiujian 
101378ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
101478ef5fbdSqiujian 						TEEC_NONE,
101578ef5fbdSqiujian 						TEEC_NONE,
101678ef5fbdSqiujian 						TEEC_NONE);
101778ef5fbdSqiujian 	/*0 nand or emmc "security" partition , 1 rpmb*/
101878ef5fbdSqiujian 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
101978ef5fbdSqiujian #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
102078ef5fbdSqiujian 	TeecOperation.params[0].value.a = 0;
102178ef5fbdSqiujian #endif
102278ef5fbdSqiujian 
102378ef5fbdSqiujian 	TeecResult = TEEC_OpenSession(&TeecContext,
102478ef5fbdSqiujian 				&TeecSession,
102578ef5fbdSqiujian 				TeecUuid,
102678ef5fbdSqiujian 				TEEC_LOGIN_PUBLIC,
102778ef5fbdSqiujian 				NULL,
102878ef5fbdSqiujian 				&TeecOperation,
102978ef5fbdSqiujian 				&ErrorOrigin);
103078ef5fbdSqiujian 
103178ef5fbdSqiujian 	TEEC_SharedMemory SharedMem0 = {0};
103278ef5fbdSqiujian 
103378ef5fbdSqiujian 	SharedMem0.size = filename_size;
103478ef5fbdSqiujian 	SharedMem0.flags = 0;
103578ef5fbdSqiujian 
103678ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
103778ef5fbdSqiujian 
103878ef5fbdSqiujian 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
103978ef5fbdSqiujian 
104078ef5fbdSqiujian 	TEEC_SharedMemory SharedMem1 = {0};
104178ef5fbdSqiujian 
104278ef5fbdSqiujian 	SharedMem1.size = size;
104378ef5fbdSqiujian 	SharedMem1.flags = 0;
104478ef5fbdSqiujian 
104578ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
104678ef5fbdSqiujian 
104778ef5fbdSqiujian 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
104878ef5fbdSqiujian 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
104978ef5fbdSqiujian 
105078ef5fbdSqiujian 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
105178ef5fbdSqiujian 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
105278ef5fbdSqiujian 
105378ef5fbdSqiujian 
105478ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
105578ef5fbdSqiujian 						TEEC_MEMREF_TEMP_INOUT,
105678ef5fbdSqiujian 						TEEC_NONE,
105778ef5fbdSqiujian 						TEEC_NONE);
105878ef5fbdSqiujian 
105978ef5fbdSqiujian 	TeecResult = TEEC_InvokeCommand(&TeecSession,
106078ef5fbdSqiujian 					142,
106178ef5fbdSqiujian 					&TeecOperation,
106278ef5fbdSqiujian 					&ErrorOrigin);
106378ef5fbdSqiujian 	if (TeecResult == TEEC_SUCCESS)
106478ef5fbdSqiujian 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
106578ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem0);
106678ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem1);
106778ef5fbdSqiujian 	TEEC_CloseSession(&TeecSession);
106878ef5fbdSqiujian 	TEEC_FinalizeContext(&TeecContext);
106978ef5fbdSqiujian 	debug("read_from_keymaster end\n");
107078ef5fbdSqiujian 
107178ef5fbdSqiujian 	return TeecResult;
107278ef5fbdSqiujian }
107378ef5fbdSqiujian 
1074ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
1075ae8ec5e1SHisping Lin 		uint32_t filename_size,
1076ae8ec5e1SHisping Lin 		uint8_t *data,
1077ae8ec5e1SHisping Lin 		uint32_t data_size)
1078ae8ec5e1SHisping Lin {
1079ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
1080ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
1081ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
1082ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
1083ae8ec5e1SHisping Lin 
1084ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1085ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1086ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1087ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
10883251364cSHisping Lin 	struct blk_desc *dev_desc;
10893251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
10906651d4c0SJason Zhu 	if (!dev_desc) {
10916651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
10926651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
10936651d4c0SJason Zhu 	}
1094ae8ec5e1SHisping Lin 
1095ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
1096ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
1097ae8ec5e1SHisping Lin 
1098ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1099ae8ec5e1SHisping Lin 
11003251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
11013251364cSHisping Lin 						TEEC_NONE,
11023251364cSHisping Lin 						TEEC_NONE,
11033251364cSHisping Lin 						TEEC_NONE);
11043251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
11053251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
11063251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
11073251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
11083251364cSHisping Lin #endif
11093251364cSHisping Lin 
1110ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1111ae8ec5e1SHisping Lin 				&TeecSession,
1112ae8ec5e1SHisping Lin 				TeecUuid,
1113ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
1114ae8ec5e1SHisping Lin 				NULL,
11153251364cSHisping Lin 				&TeecOperation,
1116ae8ec5e1SHisping Lin 				&ErrorOrigin);
1117ae8ec5e1SHisping Lin 
1118ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1119ae8ec5e1SHisping Lin 
1120ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
1121ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
1122ae8ec5e1SHisping Lin 
1123ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1124ae8ec5e1SHisping Lin 
1125ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
1126ae8ec5e1SHisping Lin 
1127ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1128ae8ec5e1SHisping Lin 
1129ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
1130ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
1131ae8ec5e1SHisping Lin 
1132ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1133ae8ec5e1SHisping Lin 
1134ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
1135ae8ec5e1SHisping Lin 
1136ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1137ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1138ae8ec5e1SHisping Lin 
1139ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1140ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1141ae8ec5e1SHisping Lin 
1142ae8ec5e1SHisping Lin 
1143ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1144ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1145ae8ec5e1SHisping Lin 						TEEC_NONE,
1146ae8ec5e1SHisping Lin 						TEEC_NONE);
1147ae8ec5e1SHisping Lin 
1148ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11491f25ada2SHisping Lin 					141,
1150ae8ec5e1SHisping Lin 					&TeecOperation,
1151ae8ec5e1SHisping Lin 					&ErrorOrigin);
1152ae8ec5e1SHisping Lin 
1153ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1154ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1155ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
115646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
115778ef5fbdSqiujian 	debug("write_to_keymaster end\n");
1158ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
1159ae8ec5e1SHisping Lin 
1160ae8ec5e1SHisping Lin 	return TeecResult;
1161ae8ec5e1SHisping Lin }
11626ef445a4SHisping Lin 
11636ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
11646ef445a4SHisping Lin {
11656ef445a4SHisping Lin 	TEEC_Result TeecResult;
11666ef445a4SHisping Lin 	TEEC_Context TeecContext;
11676ef445a4SHisping Lin 	TEEC_Session TeecSession;
11686ef445a4SHisping Lin 	uint32_t ErrorOrigin;
11696ef445a4SHisping Lin 
11706ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11716ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11726ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11736ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
11746ef445a4SHisping Lin 
11756ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
11766ef445a4SHisping Lin 
11776ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
11786ef445a4SHisping Lin 
11796ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11806ef445a4SHisping Lin 				&TeecSession,
11816ef445a4SHisping Lin 				TeecUuid,
11826ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
11836ef445a4SHisping Lin 				NULL,
11846ef445a4SHisping Lin 				NULL,
11856ef445a4SHisping Lin 				&ErrorOrigin);
11866ef445a4SHisping Lin 
11876ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11886ef445a4SHisping Lin 
11896ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
11906ef445a4SHisping Lin 	SharedMem0.flags = 0;
11916ef445a4SHisping Lin 
11926ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
11936ef445a4SHisping Lin 
11946ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11956ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11966ef445a4SHisping Lin 
11976ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
11986ef445a4SHisping Lin 						TEEC_NONE,
11996ef445a4SHisping Lin 						TEEC_NONE,
12006ef445a4SHisping Lin 						TEEC_NONE);
12016ef445a4SHisping Lin 
12026ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12036ef445a4SHisping Lin 					0,
12046ef445a4SHisping Lin 					&TeecOperation,
12056ef445a4SHisping Lin 					&ErrorOrigin);
12066ef445a4SHisping Lin 
12076ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
12086ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
12096ef445a4SHisping Lin 
12106ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12116ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
12126ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12136ef445a4SHisping Lin 
12146ef445a4SHisping Lin 	return TeecResult;
12156ef445a4SHisping Lin }
12166ef445a4SHisping Lin 
12176ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
12186ef445a4SHisping Lin {
12196ef445a4SHisping Lin 	TEEC_Result TeecResult;
12206ef445a4SHisping Lin 	TEEC_Context TeecContext;
12216ef445a4SHisping Lin 	TEEC_Session TeecSession;
12226ef445a4SHisping Lin 	uint32_t ErrorOrigin;
12236ef445a4SHisping Lin 
12246ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
12256ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
12266ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
12276ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
12286ef445a4SHisping Lin 
12296ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
12306ef445a4SHisping Lin 
12316ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
12326ef445a4SHisping Lin 
12336ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
12346ef445a4SHisping Lin 				&TeecSession,
12356ef445a4SHisping Lin 				TeecUuid,
12366ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
12376ef445a4SHisping Lin 				NULL,
12386ef445a4SHisping Lin 				NULL,
12396ef445a4SHisping Lin 				&ErrorOrigin);
12406ef445a4SHisping Lin 
12416ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
12426ef445a4SHisping Lin 
12436ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
12446ef445a4SHisping Lin 	SharedMem0.flags = 0;
12456ef445a4SHisping Lin 
12466ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
12476ef445a4SHisping Lin 
12486ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
12496ef445a4SHisping Lin 
12506ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12516ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12526ef445a4SHisping Lin 
12536ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
12546ef445a4SHisping Lin 						TEEC_NONE,
12556ef445a4SHisping Lin 						TEEC_NONE,
12566ef445a4SHisping Lin 						TEEC_NONE);
12576ef445a4SHisping Lin 
12586ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12596ef445a4SHisping Lin 					1,
12606ef445a4SHisping Lin 					&TeecOperation,
12616ef445a4SHisping Lin 					&ErrorOrigin);
12626ef445a4SHisping Lin 
12636ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12646ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
12656ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12666ef445a4SHisping Lin 
12676ef445a4SHisping Lin 	return TeecResult;
12686ef445a4SHisping Lin }
126916539616SHisping Lin 
127016539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
127116539616SHisping Lin {
127216539616SHisping Lin 	TEEC_Result TeecResult;
127316539616SHisping Lin 	TEEC_Context TeecContext;
127416539616SHisping Lin 	TEEC_Session TeecSession;
127516539616SHisping Lin 	uint32_t ErrorOrigin;
127616539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
127716539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
127816539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
127916539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
128016539616SHisping Lin 
128116539616SHisping Lin 	OpteeClientApiLibInitialize();
128216539616SHisping Lin 
128316539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
128416539616SHisping Lin 
128516539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
128616539616SHisping Lin 				&TeecSession,
128716539616SHisping Lin 				TeecUuid,
128816539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
128916539616SHisping Lin 				NULL,
129016539616SHisping Lin 				NULL,
129116539616SHisping Lin 				&ErrorOrigin);
129216539616SHisping Lin 
129316539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
129416539616SHisping Lin 						TEEC_NONE,
129516539616SHisping Lin 						TEEC_NONE,
129616539616SHisping Lin 						TEEC_NONE);
129716539616SHisping Lin 
129816539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
129916539616SHisping Lin 					2,
130016539616SHisping Lin 					&TeecOperation,
130116539616SHisping Lin 					&ErrorOrigin);
130216539616SHisping Lin 
130316539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
130416539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
130516539616SHisping Lin 
130616539616SHisping Lin 	return TeecResult;
130716539616SHisping Lin }
130816539616SHisping Lin 
130916539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
131016539616SHisping Lin {
131116539616SHisping Lin 	TEEC_Result TeecResult;
131216539616SHisping Lin 	TEEC_Context TeecContext;
131316539616SHisping Lin 	TEEC_Session TeecSession;
131416539616SHisping Lin 	uint32_t ErrorOrigin;
131516539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
131616539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
131716539616SHisping Lin 
131816539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
131916539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
132016539616SHisping Lin 
132116539616SHisping Lin 	OpteeClientApiLibInitialize();
132216539616SHisping Lin 
132316539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
132416539616SHisping Lin 
132516539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
132616539616SHisping Lin 				&TeecSession,
132716539616SHisping Lin 				TeecUuid,
132816539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
132916539616SHisping Lin 				NULL,
133016539616SHisping Lin 				NULL,
133116539616SHisping Lin 				&ErrorOrigin);
133216539616SHisping Lin 
133316539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
133416539616SHisping Lin 						TEEC_NONE,
133516539616SHisping Lin 						TEEC_NONE,
133616539616SHisping Lin 						TEEC_NONE);
133716539616SHisping Lin 
133816539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
133916539616SHisping Lin 					2,
134016539616SHisping Lin 					&TeecOperation,
134116539616SHisping Lin 					&ErrorOrigin);
134216539616SHisping Lin 
134316539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
134416539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
134516539616SHisping Lin 
134616539616SHisping Lin 	return TeecResult;
134716539616SHisping Lin }
134816539616SHisping Lin 
134916539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
135016539616SHisping Lin {
135116539616SHisping Lin 	TEEC_Result res;
135216539616SHisping Lin 	res = notify_optee_rpmb_ta();
135316539616SHisping Lin 	res |= notify_optee_efuse_ta();
135416539616SHisping Lin 	return res;
135516539616SHisping Lin }
13562cd27853SHisping Lin 
13572cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
13582cd27853SHisping Lin {
13592cd27853SHisping Lin 	TEEC_Result TeecResult;
13602cd27853SHisping Lin 	TEEC_Context TeecContext;
13612cd27853SHisping Lin 	TEEC_Session TeecSession;
13622cd27853SHisping Lin 	uint32_t ErrorOrigin;
13632cd27853SHisping Lin 
13642cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
13652cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
13662cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13672cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
13682cd27853SHisping Lin 
13692cd27853SHisping Lin 	OpteeClientApiLibInitialize();
13702cd27853SHisping Lin 
13712cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
13722cd27853SHisping Lin 
13732cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
13742cd27853SHisping Lin 				&TeecSession,
13752cd27853SHisping Lin 				TeecUuid,
13762cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
13772cd27853SHisping Lin 				NULL,
13782cd27853SHisping Lin 				NULL,
13792cd27853SHisping Lin 				&ErrorOrigin);
13802cd27853SHisping Lin 
13812cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
13822cd27853SHisping Lin 
13832cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
13842cd27853SHisping Lin 	SharedMem0.flags = 0;
13852cd27853SHisping Lin 
13862cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
13872cd27853SHisping Lin 
13882cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13892cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13902cd27853SHisping Lin 
13912cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
13922cd27853SHisping Lin 						TEEC_NONE,
13932cd27853SHisping Lin 						TEEC_NONE,
13942cd27853SHisping Lin 						TEEC_NONE);
13952cd27853SHisping Lin 
13962cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13972cd27853SHisping Lin 					3,
13982cd27853SHisping Lin 					&TeecOperation,
13992cd27853SHisping Lin 					&ErrorOrigin);
14002cd27853SHisping Lin 
14012cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
14022cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
14032cd27853SHisping Lin 
14042cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
14052cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
14062cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14072cd27853SHisping Lin 
14082cd27853SHisping Lin 	return TeecResult;
14092cd27853SHisping Lin }
14102cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
14112cd27853SHisping Lin {
14122cd27853SHisping Lin 	TEEC_Result TeecResult;
14132cd27853SHisping Lin 	TEEC_Context TeecContext;
14142cd27853SHisping Lin 	TEEC_Session TeecSession;
14152cd27853SHisping Lin 	uint32_t ErrorOrigin;
14162cd27853SHisping Lin 
14172cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
14182cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
14192cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
14202cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
14212cd27853SHisping Lin 
14222cd27853SHisping Lin 	OpteeClientApiLibInitialize();
14232cd27853SHisping Lin 
14242cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
14252cd27853SHisping Lin 
14262cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
14272cd27853SHisping Lin 				&TeecSession,
14282cd27853SHisping Lin 				TeecUuid,
14292cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
14302cd27853SHisping Lin 				NULL,
14312cd27853SHisping Lin 				NULL,
14322cd27853SHisping Lin 				&ErrorOrigin);
14332cd27853SHisping Lin 
14342cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
14352cd27853SHisping Lin 
14362cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
14372cd27853SHisping Lin 	SharedMem0.flags = 0;
14382cd27853SHisping Lin 
14392cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
14402cd27853SHisping Lin 
14412cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
14422cd27853SHisping Lin 
14432cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
14442cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
14452cd27853SHisping Lin 
14462cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
14472cd27853SHisping Lin 						TEEC_NONE,
14482cd27853SHisping Lin 						TEEC_NONE,
14492cd27853SHisping Lin 						TEEC_NONE);
14502cd27853SHisping Lin 
14512cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14522cd27853SHisping Lin 					4,
14532cd27853SHisping Lin 					&TeecOperation,
14542cd27853SHisping Lin 					&ErrorOrigin);
14552cd27853SHisping Lin 
14562cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
14572cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
14582cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14592cd27853SHisping Lin 
14602cd27853SHisping Lin 	return TeecResult;
14612cd27853SHisping Lin }
1462095e2a82SHisping Lin 
1463468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1464468df3b2SHisping Lin {
1465468df3b2SHisping Lin 	TEEC_Result TeecResult;
1466468df3b2SHisping Lin 	TEEC_Context TeecContext;
1467468df3b2SHisping Lin 	TEEC_Session TeecSession;
1468468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1469468df3b2SHisping Lin 	uint32_t bootflag;
1470468df3b2SHisping Lin 
1471468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1472468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1473468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1474468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1475468df3b2SHisping Lin 
1476468df3b2SHisping Lin 	OpteeClientApiLibInitialize();
1477468df3b2SHisping Lin 
1478468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1479468df3b2SHisping Lin 
1480468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1481468df3b2SHisping Lin 				&TeecSession,
1482468df3b2SHisping Lin 				TeecUuid,
1483468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1484468df3b2SHisping Lin 				NULL,
1485468df3b2SHisping Lin 				NULL,
1486468df3b2SHisping Lin 				&ErrorOrigin);
1487468df3b2SHisping Lin 
1488468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1489468df3b2SHisping Lin 
1490468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1491468df3b2SHisping Lin 	SharedMem0.flags = 0;
1492468df3b2SHisping Lin 
1493468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1494468df3b2SHisping Lin 
1495468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1496468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1497468df3b2SHisping Lin 
1498468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1499468df3b2SHisping Lin 						TEEC_NONE,
1500468df3b2SHisping Lin 						TEEC_NONE,
1501468df3b2SHisping Lin 						TEEC_NONE);
1502468df3b2SHisping Lin 
1503468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1504468df3b2SHisping Lin 					5,
1505468df3b2SHisping Lin 					&TeecOperation,
1506468df3b2SHisping Lin 					&ErrorOrigin);
1507468df3b2SHisping Lin 
1508468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1509468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
1510468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1511468df3b2SHisping Lin 			*flag = 1;
1512468df3b2SHisping Lin 	}
1513468df3b2SHisping Lin 
1514468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1515468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1516468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1517468df3b2SHisping Lin 
1518468df3b2SHisping Lin 	return TeecResult;
1519468df3b2SHisping Lin }
1520468df3b2SHisping Lin 
1521095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1522095e2a82SHisping Lin {
1523095e2a82SHisping Lin 	TEEC_Result TeecResult;
1524095e2a82SHisping Lin 	TEEC_Context TeecContext;
1525095e2a82SHisping Lin 	TEEC_Session TeecSession;
1526095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1527095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1528095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1529095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1530095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
15313251364cSHisping Lin 	struct blk_desc *dev_desc;
15323251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15336651d4c0SJason Zhu 	if (!dev_desc) {
15346651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15356651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15366651d4c0SJason Zhu 	}
1537095e2a82SHisping Lin 
1538095e2a82SHisping Lin 	debug("testmm start\n");
1539095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1540095e2a82SHisping Lin 
1541095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1542095e2a82SHisping Lin 
15433251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15443251364cSHisping Lin 						TEEC_NONE,
15453251364cSHisping Lin 						TEEC_NONE,
15463251364cSHisping Lin 						TEEC_NONE);
15473251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
15483251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
15493251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15503251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15513251364cSHisping Lin #endif
15523251364cSHisping Lin 
1553095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1554095e2a82SHisping Lin 				&TeecSession,
1555095e2a82SHisping Lin 				TeecUuid,
1556095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1557095e2a82SHisping Lin 				NULL,
15583251364cSHisping Lin 				&TeecOperation,
1559095e2a82SHisping Lin 				&ErrorOrigin);
1560095e2a82SHisping Lin 
1561095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1562095e2a82SHisping Lin 
1563095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1564095e2a82SHisping Lin 	SharedMem0.flags = 0;
1565095e2a82SHisping Lin 
1566095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1567095e2a82SHisping Lin 
1568095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1569095e2a82SHisping Lin 
1570095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1571095e2a82SHisping Lin 
1572095e2a82SHisping Lin 	SharedMem1.size = 1;
1573095e2a82SHisping Lin 	SharedMem1.flags = 0;
1574095e2a82SHisping Lin 
1575095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1576095e2a82SHisping Lin 
1577095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1578095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1579095e2a82SHisping Lin 
1580095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1581095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1582095e2a82SHisping Lin 
1583095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1584095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1585095e2a82SHisping Lin 						TEEC_NONE,
1586095e2a82SHisping Lin 						TEEC_NONE);
1587095e2a82SHisping Lin 
1588095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1589095e2a82SHisping Lin 					142,
1590095e2a82SHisping Lin 					&TeecOperation,
1591095e2a82SHisping Lin 					&ErrorOrigin);
1592095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1593095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1594095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1595095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1596095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1597095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1598095e2a82SHisping Lin 	debug("testmm end\n");
1599095e2a82SHisping Lin 
1600095e2a82SHisping Lin 	return TeecResult;
1601095e2a82SHisping Lin }
1602095e2a82SHisping Lin 
1603095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1604095e2a82SHisping Lin {
1605095e2a82SHisping Lin 	TEEC_Result TeecResult;
1606095e2a82SHisping Lin 	TEEC_Context TeecContext;
1607095e2a82SHisping Lin 	TEEC_Session TeecSession;
1608095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1609095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1610095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1611095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1612095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
16133251364cSHisping Lin 	struct blk_desc *dev_desc;
16143251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16156651d4c0SJason Zhu 	if (!dev_desc) {
16166651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
16176651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
16186651d4c0SJason Zhu 	}
1619095e2a82SHisping Lin 
1620095e2a82SHisping Lin 	debug("testmm start\n");
1621095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1622095e2a82SHisping Lin 
1623095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1624095e2a82SHisping Lin 
16253251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16263251364cSHisping Lin 						TEEC_NONE,
16273251364cSHisping Lin 						TEEC_NONE,
16283251364cSHisping Lin 						TEEC_NONE);
16293251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16303251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16313251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16323251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16333251364cSHisping Lin #endif
16343251364cSHisping Lin 
1635095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1636095e2a82SHisping Lin 				&TeecSession,
1637095e2a82SHisping Lin 				TeecUuid,
1638095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1639095e2a82SHisping Lin 				NULL,
16403251364cSHisping Lin 				&TeecOperation,
1641095e2a82SHisping Lin 				&ErrorOrigin);
1642095e2a82SHisping Lin 
1643095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1644095e2a82SHisping Lin 
1645095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1646095e2a82SHisping Lin 	SharedMem0.flags = 0;
1647095e2a82SHisping Lin 
1648095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1649095e2a82SHisping Lin 
1650095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1651095e2a82SHisping Lin 
1652095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1653095e2a82SHisping Lin 
1654095e2a82SHisping Lin 	SharedMem1.size = 1;
1655095e2a82SHisping Lin 	SharedMem1.flags = 0;
1656095e2a82SHisping Lin 
1657095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1658095e2a82SHisping Lin 
1659095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1660095e2a82SHisping Lin 
1661095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1662095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1663095e2a82SHisping Lin 
1664095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1665095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1666095e2a82SHisping Lin 
1667095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1668095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1669095e2a82SHisping Lin 						TEEC_NONE,
1670095e2a82SHisping Lin 						TEEC_NONE);
1671095e2a82SHisping Lin 
1672095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1673095e2a82SHisping Lin 					141,
1674095e2a82SHisping Lin 					&TeecOperation,
1675095e2a82SHisping Lin 					&ErrorOrigin);
1676095e2a82SHisping Lin 
1677095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1678095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1679095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1680095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1681095e2a82SHisping Lin 	debug("testmm end\n");
1682095e2a82SHisping Lin 
1683095e2a82SHisping Lin 	return TeecResult;
1684095e2a82SHisping Lin }
16854aa61755SAndy Ye 
16864aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
16874aa61755SAndy Ye {
16884aa61755SAndy Ye 	TEEC_Result TeecResult;
16894aa61755SAndy Ye 	TEEC_Context TeecContext;
16904aa61755SAndy Ye 	TEEC_Session TeecSession;
16914aa61755SAndy Ye 	uint32_t ErrorOrigin;
16924aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16934aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16944aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16954aa61755SAndy Ye 				}
16964aa61755SAndy Ye 			     };
16974aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16984aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16993251364cSHisping Lin 	struct blk_desc *dev_desc;
17003251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17016651d4c0SJason Zhu 	if (!dev_desc) {
17026651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17036651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17046651d4c0SJason Zhu 	}
17054aa61755SAndy Ye 
17064aa61755SAndy Ye 	OpteeClientApiLibInitialize();
17074aa61755SAndy Ye 
17084aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
17094aa61755SAndy Ye 
17103251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17113251364cSHisping Lin 						TEEC_NONE,
17123251364cSHisping Lin 						TEEC_NONE,
17133251364cSHisping Lin 						TEEC_NONE);
17143251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
17153251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
17163251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17173251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17183251364cSHisping Lin #endif
17193251364cSHisping Lin 
17204aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17214aa61755SAndy Ye 				      &TeecSession,
17224aa61755SAndy Ye 				      TeecUuid,
17234aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17244aa61755SAndy Ye 				      NULL,
17253251364cSHisping Lin 					&TeecOperation,
17264aa61755SAndy Ye 				      &ErrorOrigin);
17274aa61755SAndy Ye 
17284aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17294aa61755SAndy Ye 
17304aa61755SAndy Ye 	SharedMem0.size = *dh_size;
17314aa61755SAndy Ye 	SharedMem0.flags = 0;
17324aa61755SAndy Ye 
17334aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17344aa61755SAndy Ye 
17354aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17364aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17374aa61755SAndy Ye 
17384aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17394aa61755SAndy Ye 						    TEEC_NONE,
17404aa61755SAndy Ye 						    TEEC_NONE,
17414aa61755SAndy Ye 						    TEEC_NONE);
17424aa61755SAndy Ye 
17434aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17444aa61755SAndy Ye 					143,
17454aa61755SAndy Ye 					&TeecOperation,
17464aa61755SAndy Ye 					&ErrorOrigin);
17474aa61755SAndy Ye 
17484aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
17494aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
17504aa61755SAndy Ye 
17514aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17524aa61755SAndy Ye 
17534aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
17544aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
17554aa61755SAndy Ye 
17564aa61755SAndy Ye 	return TeecResult;
17574aa61755SAndy Ye }
17584aa61755SAndy Ye 
17594aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
17604aa61755SAndy Ye {
17614aa61755SAndy Ye 	TEEC_Result TeecResult;
17624aa61755SAndy Ye 	TEEC_Context TeecContext;
17634aa61755SAndy Ye 	TEEC_Session TeecSession;
17644aa61755SAndy Ye 	uint32_t ErrorOrigin;
17654aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17664aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17674aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17684aa61755SAndy Ye 				}
17694aa61755SAndy Ye 			     };
17704aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17714aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17723251364cSHisping Lin 	struct blk_desc *dev_desc;
17733251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17746651d4c0SJason Zhu 	if (!dev_desc) {
17756651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17766651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17776651d4c0SJason Zhu 	}
17784aa61755SAndy Ye 
17794aa61755SAndy Ye 	OpteeClientApiLibInitialize();
17804aa61755SAndy Ye 
17814aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
17824aa61755SAndy Ye 
17833251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17843251364cSHisping Lin 						TEEC_NONE,
17853251364cSHisping Lin 						TEEC_NONE,
17863251364cSHisping Lin 						TEEC_NONE);
17873251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
17883251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
17893251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17903251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17913251364cSHisping Lin #endif
17923251364cSHisping Lin 
17934aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17944aa61755SAndy Ye 				      &TeecSession,
17954aa61755SAndy Ye 				      TeecUuid,
17964aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17974aa61755SAndy Ye 				      NULL,
17983251364cSHisping Lin 					&TeecOperation,
17994aa61755SAndy Ye 				      &ErrorOrigin);
18004aa61755SAndy Ye 
18014aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
18024aa61755SAndy Ye 
18034aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
18044aa61755SAndy Ye 	SharedMem0.flags = 0;
18054aa61755SAndy Ye 
18064aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
18074aa61755SAndy Ye 
18084aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18094aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18104aa61755SAndy Ye 
18114aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
18124aa61755SAndy Ye 						    TEEC_NONE,
18134aa61755SAndy Ye 						    TEEC_NONE,
18144aa61755SAndy Ye 						    TEEC_NONE);
18154aa61755SAndy Ye 
18164aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18174aa61755SAndy Ye 					144,
18184aa61755SAndy Ye 					&TeecOperation,
18194aa61755SAndy Ye 					&ErrorOrigin);
18204aa61755SAndy Ye 
18214aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
18224aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
18234aa61755SAndy Ye 
18244aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18254aa61755SAndy Ye 
18264aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
18274aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
18284aa61755SAndy Ye 
18294aa61755SAndy Ye 	return TeecResult;
18304aa61755SAndy Ye }
18314aa61755SAndy Ye 
18324aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
18334aa61755SAndy Ye 			      uint32_t *operation_size,
18344aa61755SAndy Ye 			      uint8_t *out,
18354aa61755SAndy Ye 			      uint32_t *out_len)
18364aa61755SAndy Ye {
18374aa61755SAndy Ye 	TEEC_Result TeecResult;
18384aa61755SAndy Ye 	TEEC_Context TeecContext;
18394aa61755SAndy Ye 	TEEC_Session TeecSession;
18404aa61755SAndy Ye 	uint32_t ErrorOrigin;
18414aa61755SAndy Ye 
18424aa61755SAndy Ye 	OpteeClientApiLibInitialize();
18434aa61755SAndy Ye 
18444aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18454aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18464aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
18474aa61755SAndy Ye 				}
18484aa61755SAndy Ye 			     };
18494aa61755SAndy Ye 
18504aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
18514aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
18523251364cSHisping Lin 	struct blk_desc *dev_desc;
18533251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
18546651d4c0SJason Zhu 	if (!dev_desc) {
18556651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
18566651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
18576651d4c0SJason Zhu 	}
18584aa61755SAndy Ye 
18594aa61755SAndy Ye 	OpteeClientApiLibInitialize();
18604aa61755SAndy Ye 
18614aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
18624aa61755SAndy Ye 
18633251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
18643251364cSHisping Lin 						TEEC_NONE,
18653251364cSHisping Lin 						TEEC_NONE,
18663251364cSHisping Lin 						TEEC_NONE);
18673251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
18683251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
18693251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
18703251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
18713251364cSHisping Lin #endif
18723251364cSHisping Lin 
18734aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
18744aa61755SAndy Ye 				      &TeecSession,
18754aa61755SAndy Ye 				      TeecUuid,
18764aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
18774aa61755SAndy Ye 				      NULL,
18783251364cSHisping Lin 					&TeecOperation,
18794aa61755SAndy Ye 				      &ErrorOrigin);
18804aa61755SAndy Ye 
18814aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
18824aa61755SAndy Ye 
18834aa61755SAndy Ye 	SharedMem0.size = *operation_size;
18844aa61755SAndy Ye 	SharedMem0.flags = 0;
18854aa61755SAndy Ye 
18864aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
18874aa61755SAndy Ye 
18884aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
18894aa61755SAndy Ye 
18904aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18914aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18924aa61755SAndy Ye 
18934aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
18944aa61755SAndy Ye 
18954aa61755SAndy Ye 	SharedMem1.size = *out_len;
18964aa61755SAndy Ye 	SharedMem1.flags = 0;
18974aa61755SAndy Ye 
18984aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
18994aa61755SAndy Ye 
19004aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
19014aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
19024aa61755SAndy Ye 
19034aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
19044aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
19054aa61755SAndy Ye 						    TEEC_NONE,
19064aa61755SAndy Ye 						    TEEC_NONE);
19074aa61755SAndy Ye 
19084aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
19094aa61755SAndy Ye 					145,
19104aa61755SAndy Ye 					&TeecOperation,
19114aa61755SAndy Ye 					&ErrorOrigin);
19124aa61755SAndy Ye 
19134aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
19144aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
19154aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
19164aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
19174aa61755SAndy Ye 
19184aa61755SAndy Ye 	return TeecResult;
19194aa61755SAndy Ye }
19204aa61755SAndy Ye 
19214aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
19224aa61755SAndy Ye {
19234aa61755SAndy Ye 	TEEC_Result TeecResult;
19244aa61755SAndy Ye 	TEEC_Context TeecContext;
19254aa61755SAndy Ye 	TEEC_Session TeecSession;
19264aa61755SAndy Ye 	uint32_t ErrorOrigin;
19274aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
19284aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
19294aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
19304aa61755SAndy Ye 				}
19314aa61755SAndy Ye 			     };
19324aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
19334aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
19343251364cSHisping Lin 	struct blk_desc *dev_desc;
19353251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
19366651d4c0SJason Zhu 	if (!dev_desc) {
19376651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
19386651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
19396651d4c0SJason Zhu 	}
19404aa61755SAndy Ye 
19414aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
19424aa61755SAndy Ye 
19433251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
19443251364cSHisping Lin 						TEEC_NONE,
19453251364cSHisping Lin 						TEEC_NONE,
19463251364cSHisping Lin 						TEEC_NONE);
19473251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
19483251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
19493251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
19503251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
19513251364cSHisping Lin #endif
19523251364cSHisping Lin 
19534aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
19544aa61755SAndy Ye 					&TeecSession,
19554aa61755SAndy Ye 					TeecUuid,
19564aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
19574aa61755SAndy Ye 					NULL,
19583251364cSHisping Lin 					&TeecOperation,
19594aa61755SAndy Ye 					&ErrorOrigin);
19604aa61755SAndy Ye 
19614aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
19624aa61755SAndy Ye 
19634aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
19644aa61755SAndy Ye 	SharedMem0.flags = 0;
19654aa61755SAndy Ye 
19664aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
19674aa61755SAndy Ye 
19684aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
19694aa61755SAndy Ye 
19704aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
19714aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
19724aa61755SAndy Ye 
19734aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
19744aa61755SAndy Ye 						    TEEC_NONE,
19754aa61755SAndy Ye 						    TEEC_NONE,
19764aa61755SAndy Ye 						    TEEC_NONE);
19774aa61755SAndy Ye 
19784aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
19794aa61755SAndy Ye 					146,
19804aa61755SAndy Ye 					&TeecOperation,
19814aa61755SAndy Ye 					&ErrorOrigin);
19824aa61755SAndy Ye 
19834aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
19844aa61755SAndy Ye 
19854aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
19864aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
19874aa61755SAndy Ye 
19884aa61755SAndy Ye 	return TeecResult;
19894aa61755SAndy Ye }
199078ef5fbdSqiujian 
199178ef5fbdSqiujian TEEC_Result trusty_write_oem_unlock(uint8_t unlock)
199278ef5fbdSqiujian {
199378ef5fbdSqiujian 	char *file = "oem.unlock";
199478ef5fbdSqiujian 	TEEC_Result ret;
199578ef5fbdSqiujian 
199678ef5fbdSqiujian 	ret = write_to_keymaster((uint8_t *)file, strlen(file),
199778ef5fbdSqiujian 		(uint8_t *)&unlock, 1);
199878ef5fbdSqiujian 	return ret;
199978ef5fbdSqiujian }
200078ef5fbdSqiujian 
200178ef5fbdSqiujian TEEC_Result trusty_read_oem_unlock(uint8_t *unlock)
200278ef5fbdSqiujian {
200378ef5fbdSqiujian 	char *file = "oem.unlock";
200478ef5fbdSqiujian 	TEEC_Result ret;
200578ef5fbdSqiujian 
200678ef5fbdSqiujian 	ret = read_from_keymaster((uint8_t *)file, strlen(file),
200778ef5fbdSqiujian 		unlock, 1);
200878ef5fbdSqiujian 
200978ef5fbdSqiujian 	if (ret == TEE_ERROR_ITEM_NOT_FOUND) {
201078ef5fbdSqiujian 		debug("init oem unlock status 0");
201178ef5fbdSqiujian 		ret = trusty_write_oem_unlock(0);
201278ef5fbdSqiujian 	}
201378ef5fbdSqiujian 
201478ef5fbdSqiujian 	return ret;
201578ef5fbdSqiujian }
2016