xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision f18b06fb49ee7a4d1fbc876e72d427ee23b0c31b)
1ae8ec5e1SHisping Lin /*
2ae8ec5e1SHisping Lin  * Copyright 2017, Rockchip Electronics Co., Ltd
3ae8ec5e1SHisping Lin  * hisping lin, <hisping.lin@rock-chips.com>
4ae8ec5e1SHisping Lin  *
5ae8ec5e1SHisping Lin  * SPDX-License-Identifier:	GPL-2.0+
6ae8ec5e1SHisping Lin  */
7ae8ec5e1SHisping Lin 
8ae8ec5e1SHisping Lin #include <common.h>
9ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h>
10ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h>
1178ef5fbdSqiujian #include <optee_include/tee_api_defines.h>
123251364cSHisping Lin #include <boot_rkimg.h>
13a7df4868Stony.xu #include <stdlib.h>
14a7df4868Stony.xu 
15a7df4868Stony.xu #define	BOOT_FROM_EMMC	(1 << 1)
16*f18b06fbSTony Xu #define	WIDEVINE_TAG	"KBOX"
17*f18b06fbSTony Xu #define	ATTESTATION_TAG	"ATTE"
18a7df4868Stony.xu 
19a7df4868Stony.xu uint32_t rk_send_keybox_to_ta(uint8_t *filename, uint32_t filename_size,
20a7df4868Stony.xu 			      TEEC_UUID uuid,
21a7df4868Stony.xu 			      uint8_t *key, uint32_t key_size,
22a7df4868Stony.xu 			      uint8_t *data, uint32_t data_size)
23a7df4868Stony.xu {
24a7df4868Stony.xu 	TEEC_Result TeecResult;
25a7df4868Stony.xu 	TEEC_Context TeecContext;
26a7df4868Stony.xu 	TEEC_Session TeecSession;
27a7df4868Stony.xu 	uint32_t ErrorOrigin;
28a7df4868Stony.xu 
29a7df4868Stony.xu 	TEEC_UUID *TeecUuid = &uuid;
30a7df4868Stony.xu 	TEEC_Operation TeecOperation = {0};
31a7df4868Stony.xu 
32a7df4868Stony.xu 	struct blk_desc *dev_desc;
33a7df4868Stony.xu 
34a7df4868Stony.xu 	dev_desc = rockchip_get_bootdev();
35a7df4868Stony.xu 	if (!dev_desc) {
36a7df4868Stony.xu 		printf("%s: dev_desc is NULL!\n", __func__);
37a7df4868Stony.xu 		return -TEEC_ERROR_GENERIC;
38a7df4868Stony.xu 	}
39a7df4868Stony.xu 
40a7df4868Stony.xu 	OpteeClientApiLibInitialize();
41a7df4868Stony.xu 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
42a7df4868Stony.xu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
43a7df4868Stony.xu 						    TEEC_NONE,
44a7df4868Stony.xu 						    TEEC_NONE,
45a7df4868Stony.xu 						    TEEC_NONE);
46a7df4868Stony.xu 
47a7df4868Stony.xu 	/* 0 nand or emmc "security" partition , 1 rpmb */
48a7df4868Stony.xu 	TeecOperation.params[0].value.a =
49a7df4868Stony.xu 		(dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
50a7df4868Stony.xu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
51a7df4868Stony.xu 	TeecOperation.params[0].value.a = 0;
52a7df4868Stony.xu #endif
53a7df4868Stony.xu 	TeecResult = TEEC_OpenSession(&TeecContext,
54a7df4868Stony.xu 				      &TeecSession,
55a7df4868Stony.xu 				      TeecUuid,
56a7df4868Stony.xu 				      TEEC_LOGIN_PUBLIC,
57a7df4868Stony.xu 				      NULL,
58a7df4868Stony.xu 				      &TeecOperation,
59a7df4868Stony.xu 				      &ErrorOrigin);
60a7df4868Stony.xu 
61a7df4868Stony.xu 	TEEC_SharedMemory SharedMem0 = {0};
62a7df4868Stony.xu 
63a7df4868Stony.xu 	SharedMem0.size = filename_size;
64a7df4868Stony.xu 	SharedMem0.flags = 0;
65a7df4868Stony.xu 
66a7df4868Stony.xu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
67a7df4868Stony.xu 
68a7df4868Stony.xu 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
69a7df4868Stony.xu 
70a7df4868Stony.xu 	TEEC_SharedMemory SharedMem1 = {0};
71a7df4868Stony.xu 
72a7df4868Stony.xu 	SharedMem1.size = key_size;
73a7df4868Stony.xu 	SharedMem1.flags = 0;
74a7df4868Stony.xu 
75a7df4868Stony.xu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
76a7df4868Stony.xu 
77a7df4868Stony.xu 	memcpy(SharedMem1.buffer, key, SharedMem1.size);
78a7df4868Stony.xu 
79a7df4868Stony.xu 	TEEC_SharedMemory SharedMem2 = {0};
80a7df4868Stony.xu 
81a7df4868Stony.xu 	SharedMem2.size = data_size;
82a7df4868Stony.xu 	SharedMem2.flags = 0;
83a7df4868Stony.xu 
84a7df4868Stony.xu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem2);
85a7df4868Stony.xu 
86a7df4868Stony.xu 	memcpy(SharedMem2.buffer, data, SharedMem2.size);
87a7df4868Stony.xu 
88a7df4868Stony.xu 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
89a7df4868Stony.xu 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
90a7df4868Stony.xu 
91a7df4868Stony.xu 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
92a7df4868Stony.xu 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
93a7df4868Stony.xu 
94a7df4868Stony.xu 	TeecOperation.params[2].tmpref.buffer = SharedMem2.buffer;
95a7df4868Stony.xu 	TeecOperation.params[2].tmpref.size = SharedMem2.size;
96a7df4868Stony.xu 
97a7df4868Stony.xu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
98a7df4868Stony.xu 						    TEEC_MEMREF_TEMP_INPUT,
99a7df4868Stony.xu 						    TEEC_MEMREF_TEMP_INOUT,
100a7df4868Stony.xu 						    TEEC_NONE);
101a7df4868Stony.xu 
102a7df4868Stony.xu 	printf("check: does keybox exised in secure storage...\n");
103a7df4868Stony.xu 	TeecResult = TEEC_InvokeCommand(&TeecSession,
104a7df4868Stony.xu 					122,
105a7df4868Stony.xu 					&TeecOperation,
106a7df4868Stony.xu 					&ErrorOrigin);
107a7df4868Stony.xu 	if (TeecResult != TEEC_SUCCESS) {
108a7df4868Stony.xu 		printf("no keybox in secure storage, write keybox to secure storage\n");
109a7df4868Stony.xu 		TeecResult = TEEC_InvokeCommand(&TeecSession,
110a7df4868Stony.xu 						121,
111a7df4868Stony.xu 						&TeecOperation,
112a7df4868Stony.xu 						&ErrorOrigin);
113a7df4868Stony.xu 		if (TeecResult != TEEC_SUCCESS) {
114a7df4868Stony.xu 			printf("send data to TA failed with code 0x%x\n", TeecResult);
115a7df4868Stony.xu 		} else {
116a7df4868Stony.xu 			printf("send data to TA success with code 0x%x\n", TeecResult);
117a7df4868Stony.xu 		}
118a7df4868Stony.xu 	}
119a7df4868Stony.xu 	TEEC_ReleaseSharedMemory(&SharedMem0);
120a7df4868Stony.xu 	TEEC_ReleaseSharedMemory(&SharedMem1);
121a7df4868Stony.xu 	TEEC_ReleaseSharedMemory(&SharedMem2);
122a7df4868Stony.xu 
123a7df4868Stony.xu 	TEEC_CloseSession(&TeecSession);
124a7df4868Stony.xu 	TEEC_FinalizeContext(&TeecContext);
125a7df4868Stony.xu 
126a7df4868Stony.xu 	return TeecResult;
127a7df4868Stony.xu }
128a7df4868Stony.xu 
129a7df4868Stony.xu int write_keybox_to_secure_storage(uint8_t *uboot_data, uint32_t len)
130a7df4868Stony.xu {
131a7df4868Stony.xu 	uint32_t key_size;
132a7df4868Stony.xu 	uint32_t data_size;
133*f18b06fbSTony Xu 	uint32_t object_id;
134*f18b06fbSTony Xu 	TEEC_Result ret;
135*f18b06fbSTony Xu 	int rc = 0;
136a7df4868Stony.xu 
137*f18b06fbSTony Xu 	if (memcmp(uboot_data, WIDEVINE_TAG, 4) == 0) {
138*f18b06fbSTony Xu 		/* widevine keybox */
139a7df4868Stony.xu 		TEEC_UUID widevine_uuid = { 0xc11fe8ac, 0xb997, 0x48cf,
140a7df4868Stony.xu 			{ 0xa2, 0x8d, 0xe2, 0xa5, 0x5e, 0x52, 0x40, 0xef} };
141*f18b06fbSTony Xu 		object_id = 101;
142*f18b06fbSTony Xu 
143*f18b06fbSTony Xu 		key_size = *(uboot_data + 4);
144*f18b06fbSTony Xu 		data_size = *(uboot_data + 8);
145*f18b06fbSTony Xu 
146*f18b06fbSTony Xu 		ret = rk_send_keybox_to_ta((uint8_t *)&object_id,
147*f18b06fbSTony Xu 					   sizeof(uint32_t),
148*f18b06fbSTony Xu 					   widevine_uuid,
149*f18b06fbSTony Xu 					   uboot_data + 12,
150*f18b06fbSTony Xu 					   key_size,
151*f18b06fbSTony Xu 					   uboot_data + 12 + key_size,
152*f18b06fbSTony Xu 					   data_size);
153*f18b06fbSTony Xu 		if (ret == TEEC_SUCCESS) {
154*f18b06fbSTony Xu 			rc = 0;
155*f18b06fbSTony Xu 			printf("write widevine keybox to secure storage success\n");
156a7df4868Stony.xu 		} else {
157*f18b06fbSTony Xu 			rc = -EIO;
158*f18b06fbSTony Xu 			printf("write widevine keybox to secure storage fail\n");
159*f18b06fbSTony Xu 		}
160*f18b06fbSTony Xu 	} else if (memcmp(uboot_data, ATTESTATION_TAG, 4) == 0) {
161*f18b06fbSTony Xu 		/* attestation key */
162*f18b06fbSTony Xu 
163a7df4868Stony.xu 	}
164a7df4868Stony.xu 
165*f18b06fbSTony Xu 	return rc;
166a7df4868Stony.xu }
167ae8ec5e1SHisping Lin 
168ae8ec5e1SHisping Lin void test_optee(void)
169ae8ec5e1SHisping Lin {
170ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
171ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
172ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
173ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
174a7df4868Stony.xu 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, \
175ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
176ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
177ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1783251364cSHisping Lin 	struct blk_desc *dev_desc;
1793251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1806651d4c0SJason Zhu 	if (!dev_desc) {
1816651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1826651d4c0SJason Zhu 		return;
1836651d4c0SJason Zhu 	}
184ae8ec5e1SHisping Lin 
185ae8ec5e1SHisping Lin 	debug("testmm start\n");
186ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
187ae8ec5e1SHisping Lin 
188ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
189ae8ec5e1SHisping Lin 
1903251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1913251364cSHisping Lin 						TEEC_NONE,
1923251364cSHisping Lin 						TEEC_NONE,
1933251364cSHisping Lin 						TEEC_NONE);
1943251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1953251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
1963251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1973251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1983251364cSHisping Lin #endif
1993251364cSHisping Lin 
200ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
201ae8ec5e1SHisping Lin 				&TeecSession,
202ae8ec5e1SHisping Lin 				TeecUuid,
203ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
204ae8ec5e1SHisping Lin 				NULL,
2053251364cSHisping Lin 				&TeecOperation,
206ae8ec5e1SHisping Lin 				&ErrorOrigin);
207ae8ec5e1SHisping Lin 
208ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
209ae8ec5e1SHisping Lin 
210ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
211ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
212ae8ec5e1SHisping Lin 
213ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
214ae8ec5e1SHisping Lin 
215ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
216ae8ec5e1SHisping Lin 
217ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
218ae8ec5e1SHisping Lin 
219ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
220ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
221ae8ec5e1SHisping Lin 
222ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
223ae8ec5e1SHisping Lin 
224ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
225ae8ec5e1SHisping Lin 
226ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
227ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
228ae8ec5e1SHisping Lin 
229ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
230ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
231ae8ec5e1SHisping Lin 
232ae8ec5e1SHisping Lin 
233ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
234ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
235ae8ec5e1SHisping Lin 						TEEC_NONE,
236ae8ec5e1SHisping Lin 						TEEC_NONE);
237ae8ec5e1SHisping Lin 
238ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
239ae8ec5e1SHisping Lin 					1,
240ae8ec5e1SHisping Lin 					&TeecOperation,
241ae8ec5e1SHisping Lin 					&ErrorOrigin);
242ae8ec5e1SHisping Lin 
243ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
244ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
245ae8ec5e1SHisping Lin 
246ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
247ae8ec5e1SHisping Lin 
24846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
249ae8ec5e1SHisping Lin 
250ae8ec5e1SHisping Lin 	debug("testmm end\n");
251ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
252ae8ec5e1SHisping Lin }
253ae8ec5e1SHisping Lin 
254ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
255ae8ec5e1SHisping Lin {
256ae8ec5e1SHisping Lin 	if (in > 9)
257ae8ec5e1SHisping Lin 		return in + 55;
258ae8ec5e1SHisping Lin 	else
259ae8ec5e1SHisping Lin 		return in + 48;
260ae8ec5e1SHisping Lin }
261ae8ec5e1SHisping Lin 
262ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
263ae8ec5e1SHisping Lin {
264ae8ec5e1SHisping Lin 	uint32_t i = 0;
265ae8ec5e1SHisping Lin 
266ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
267ae8ec5e1SHisping Lin 		return 0;
268ae8ec5e1SHisping Lin 
269ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
270ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
271ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
272ae8ec5e1SHisping Lin 	}
273ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
274ae8ec5e1SHisping Lin 
275ae8ec5e1SHisping Lin 	return blen * 2;
276ae8ec5e1SHisping Lin }
277ae8ec5e1SHisping Lin 
278ae8ec5e1SHisping Lin 
279ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
280ae8ec5e1SHisping Lin {
281ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
282ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
283ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
284ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
285ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
286ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
287ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
288ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
289ae8ec5e1SHisping Lin 	uint8_t hs[9];
290ae8ec5e1SHisping Lin 
2913251364cSHisping Lin 	struct blk_desc *dev_desc;
2923251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
2936651d4c0SJason Zhu 	if (!dev_desc) {
2946651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
2956651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
2966651d4c0SJason Zhu 	}
2973251364cSHisping Lin 
298ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
299ae8ec5e1SHisping Lin 	debug("testmm start\n");
300ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
301ae8ec5e1SHisping Lin 
302ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
303ae8ec5e1SHisping Lin 
3043251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3053251364cSHisping Lin 						TEEC_NONE,
3063251364cSHisping Lin 						TEEC_NONE,
3073251364cSHisping Lin 						TEEC_NONE);
3083251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
3093251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
3103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3113251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3123251364cSHisping Lin #endif
3133251364cSHisping Lin 
314ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
315ae8ec5e1SHisping Lin 				&TeecSession,
316ae8ec5e1SHisping Lin 				TeecUuid,
317ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
318ae8ec5e1SHisping Lin 				NULL,
3193251364cSHisping Lin 				&TeecOperation,
320f303baf0SHisping Lin 
321ae8ec5e1SHisping Lin 				&ErrorOrigin);
322ae8ec5e1SHisping Lin 
323ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
324ae8ec5e1SHisping Lin 
325ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
326ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
327ae8ec5e1SHisping Lin 
328ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
329ae8ec5e1SHisping Lin 
330ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
331ae8ec5e1SHisping Lin 
332ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
333ae8ec5e1SHisping Lin 
334ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
335ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
336ae8ec5e1SHisping Lin 
337ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
338ae8ec5e1SHisping Lin 
339ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
340ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
341ae8ec5e1SHisping Lin 
342ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
343ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
344ae8ec5e1SHisping Lin 
345ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
346ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
347ae8ec5e1SHisping Lin 						TEEC_NONE,
348ae8ec5e1SHisping Lin 						TEEC_NONE);
349ae8ec5e1SHisping Lin 
350ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
351ae8ec5e1SHisping Lin 					0,
352ae8ec5e1SHisping Lin 					&TeecOperation,
353ae8ec5e1SHisping Lin 					&ErrorOrigin);
35446b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
355ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
356ae8ec5e1SHisping Lin 
357ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
358ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
359ae8ec5e1SHisping Lin 
360ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
361ae8ec5e1SHisping Lin 
36246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
363ae8ec5e1SHisping Lin 
364ae8ec5e1SHisping Lin 	debug("testmm end\n");
365ae8ec5e1SHisping Lin 	return TeecResult;
366ae8ec5e1SHisping Lin }
367ae8ec5e1SHisping Lin 
368ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
369ae8ec5e1SHisping Lin {
370ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
371ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
372ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
373ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
374ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
375ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
376ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
377ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
378ae8ec5e1SHisping Lin 	uint8_t hs[9];
3793251364cSHisping Lin 	struct blk_desc *dev_desc;
3803251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
3816651d4c0SJason Zhu 	if (!dev_desc) {
3826651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
3836651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
3846651d4c0SJason Zhu 	}
3853251364cSHisping Lin 
386ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
387ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
388ae8ec5e1SHisping Lin 
389ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
390ae8ec5e1SHisping Lin 
3913251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3923251364cSHisping Lin 						TEEC_NONE,
3933251364cSHisping Lin 						TEEC_NONE,
3943251364cSHisping Lin 						TEEC_NONE);
3953251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
3963251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
3973251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3983251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3993251364cSHisping Lin #endif
4003251364cSHisping Lin 
401ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
402ae8ec5e1SHisping Lin 				&TeecSession,
403ae8ec5e1SHisping Lin 				TeecUuid,
404ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
405ae8ec5e1SHisping Lin 				NULL,
4063251364cSHisping Lin 				&TeecOperation,
407ae8ec5e1SHisping Lin 				&ErrorOrigin);
408ae8ec5e1SHisping Lin 
409ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
410ae8ec5e1SHisping Lin 
411ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
412ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
413ae8ec5e1SHisping Lin 
414ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
415ae8ec5e1SHisping Lin 
416ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
417ae8ec5e1SHisping Lin 
418ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
419ae8ec5e1SHisping Lin 
420ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
421ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
422ae8ec5e1SHisping Lin 
423ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
424ae8ec5e1SHisping Lin 
425ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
426ae8ec5e1SHisping Lin 
427ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
428ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
429ae8ec5e1SHisping Lin 
430ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
431ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
432ae8ec5e1SHisping Lin 
433ae8ec5e1SHisping Lin 
434ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
435ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
436ae8ec5e1SHisping Lin 						TEEC_NONE,
437ae8ec5e1SHisping Lin 						TEEC_NONE);
438ae8ec5e1SHisping Lin 
439ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
440ae8ec5e1SHisping Lin 					1,
441ae8ec5e1SHisping Lin 					&TeecOperation,
442ae8ec5e1SHisping Lin 					&ErrorOrigin);
443ae8ec5e1SHisping Lin 
444ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
445ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
446ae8ec5e1SHisping Lin 
447ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
448ae8ec5e1SHisping Lin 
44946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
450ae8ec5e1SHisping Lin 
451ae8ec5e1SHisping Lin 	debug("testmm end\n");
452ae8ec5e1SHisping Lin 
453ae8ec5e1SHisping Lin 	return TeecResult;
454ae8ec5e1SHisping Lin }
455ae8ec5e1SHisping Lin 
456ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
457ae8ec5e1SHisping Lin {
458ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
459ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
460ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
461ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
46246b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
46346b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
464ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
465ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
4663251364cSHisping Lin 	struct blk_desc *dev_desc;
4673251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
4686651d4c0SJason Zhu 	if (!dev_desc) {
4696651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
4706651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
4716651d4c0SJason Zhu 	}
472ae8ec5e1SHisping Lin 
473ae8ec5e1SHisping Lin 	debug("testmm start\n");
474ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
475ae8ec5e1SHisping Lin 
476ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
477ae8ec5e1SHisping Lin 
4783251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4793251364cSHisping Lin 						TEEC_NONE,
4803251364cSHisping Lin 						TEEC_NONE,
4813251364cSHisping Lin 						TEEC_NONE);
4823251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
4833251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
4843251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4853251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4863251364cSHisping Lin #endif
4873251364cSHisping Lin 
488ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
489ae8ec5e1SHisping Lin 				&TeecSession,
490ae8ec5e1SHisping Lin 				TeecUuid,
491ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
492ae8ec5e1SHisping Lin 				NULL,
4933251364cSHisping Lin 				&TeecOperation,
494ae8ec5e1SHisping Lin 				&ErrorOrigin);
495ae8ec5e1SHisping Lin 
496ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
497ae8ec5e1SHisping Lin 
498ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
499ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
500ae8ec5e1SHisping Lin 
501ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
502ae8ec5e1SHisping Lin 
503ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
504ae8ec5e1SHisping Lin 
505ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
506ae8ec5e1SHisping Lin 
507ae8ec5e1SHisping Lin 	SharedMem1.size = size;
508ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
509ae8ec5e1SHisping Lin 
510ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
511ae8ec5e1SHisping Lin 
512ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
513ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
514ae8ec5e1SHisping Lin 
515ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
516ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
517ae8ec5e1SHisping Lin 
518ae8ec5e1SHisping Lin 
519ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
520ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
521ae8ec5e1SHisping Lin 						TEEC_NONE,
522ae8ec5e1SHisping Lin 						TEEC_NONE);
523ae8ec5e1SHisping Lin 
524ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
52546b2a054SHisping Lin 					142,
526ae8ec5e1SHisping Lin 					&TeecOperation,
527ae8ec5e1SHisping Lin 					&ErrorOrigin);
52846b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
529ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
530ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
531ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
532ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
53346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
534ae8ec5e1SHisping Lin 	debug("testmm end\n");
535ae8ec5e1SHisping Lin 
536ae8ec5e1SHisping Lin 	return TeecResult;
537ae8ec5e1SHisping Lin }
538ae8ec5e1SHisping Lin 
539ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
540ae8ec5e1SHisping Lin {
541ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
542ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
543ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
544ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
54546b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
54646b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
547ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
548ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
5493251364cSHisping Lin 	struct blk_desc *dev_desc;
5503251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
5516651d4c0SJason Zhu 	if (!dev_desc) {
5526651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
5536651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
5546651d4c0SJason Zhu 	}
555ae8ec5e1SHisping Lin 
556ae8ec5e1SHisping Lin 	debug("testmm start\n");
557ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
558ae8ec5e1SHisping Lin 
559ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
560ae8ec5e1SHisping Lin 
5613251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
5623251364cSHisping Lin 						TEEC_NONE,
5633251364cSHisping Lin 						TEEC_NONE,
5643251364cSHisping Lin 						TEEC_NONE);
5653251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
5663251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
5673251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
5683251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
5693251364cSHisping Lin #endif
5703251364cSHisping Lin 
571ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
572ae8ec5e1SHisping Lin 				&TeecSession,
573ae8ec5e1SHisping Lin 				TeecUuid,
574ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
575ae8ec5e1SHisping Lin 				NULL,
5763251364cSHisping Lin 				&TeecOperation,
577ae8ec5e1SHisping Lin 				&ErrorOrigin);
578ae8ec5e1SHisping Lin 
579ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
580ae8ec5e1SHisping Lin 
581ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
582ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
583ae8ec5e1SHisping Lin 
584ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
585ae8ec5e1SHisping Lin 
586ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
587ae8ec5e1SHisping Lin 
588ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
589ae8ec5e1SHisping Lin 
590ae8ec5e1SHisping Lin 	SharedMem1.size = size;
591ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
592ae8ec5e1SHisping Lin 
593ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
594ae8ec5e1SHisping Lin 
595ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
596ae8ec5e1SHisping Lin 
597ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
598ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
599ae8ec5e1SHisping Lin 
600ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
601ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
602ae8ec5e1SHisping Lin 
603ae8ec5e1SHisping Lin 
604ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
605ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
606ae8ec5e1SHisping Lin 						TEEC_NONE,
607ae8ec5e1SHisping Lin 						TEEC_NONE);
608ae8ec5e1SHisping Lin 
609ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
61046b2a054SHisping Lin 					141,
611ae8ec5e1SHisping Lin 					&TeecOperation,
612ae8ec5e1SHisping Lin 					&ErrorOrigin);
613ae8ec5e1SHisping Lin 
614ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
615ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
616ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
61746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
618ae8ec5e1SHisping Lin 	debug("testmm end\n");
619ae8ec5e1SHisping Lin 
620ae8ec5e1SHisping Lin 	return TeecResult;
621ae8ec5e1SHisping Lin }
622ae8ec5e1SHisping Lin 
623ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
624ae8ec5e1SHisping Lin {
625ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
626ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
627ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
628ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
629ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
630ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
631ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
632ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
6333251364cSHisping Lin 	struct blk_desc *dev_desc;
6343251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
6356651d4c0SJason Zhu 	if (!dev_desc) {
6366651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
6376651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
6386651d4c0SJason Zhu 	}
639ae8ec5e1SHisping Lin 
640ae8ec5e1SHisping Lin 	debug("testmm start\n");
641ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
642ae8ec5e1SHisping Lin 
643ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
644ae8ec5e1SHisping Lin 
6453251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6463251364cSHisping Lin 						TEEC_NONE,
6473251364cSHisping Lin 						TEEC_NONE,
6483251364cSHisping Lin 						TEEC_NONE);
6493251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
6503251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
6513251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6523251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6533251364cSHisping Lin #endif
654ae8ec5e1SHisping Lin 
655ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
656ae8ec5e1SHisping Lin 				&TeecSession,
657ae8ec5e1SHisping Lin 				TeecUuid,
658ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
659ae8ec5e1SHisping Lin 				NULL,
6603251364cSHisping Lin 				&TeecOperation,
661ae8ec5e1SHisping Lin 				&ErrorOrigin);
662ae8ec5e1SHisping Lin 
663ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
664ae8ec5e1SHisping Lin 
665ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
666ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
667ae8ec5e1SHisping Lin 
668ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
669ae8ec5e1SHisping Lin 
670ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
671ae8ec5e1SHisping Lin 
672ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
673ae8ec5e1SHisping Lin 
674ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
675ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
676ae8ec5e1SHisping Lin 
677ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
678ae8ec5e1SHisping Lin 
679ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
680ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
681ae8ec5e1SHisping Lin 
682ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
683ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
684ae8ec5e1SHisping Lin 
685ae8ec5e1SHisping Lin 
686ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
687ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
688ae8ec5e1SHisping Lin 						TEEC_NONE,
689ae8ec5e1SHisping Lin 						TEEC_NONE);
690ae8ec5e1SHisping Lin 
691ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
692ae8ec5e1SHisping Lin 					0,
693ae8ec5e1SHisping Lin 					&TeecOperation,
694ae8ec5e1SHisping Lin 					&ErrorOrigin);
69546b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
696ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
697ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
698ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
699ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
70046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
701ae8ec5e1SHisping Lin 	debug("testmm end\n");
702ae8ec5e1SHisping Lin 
703ae8ec5e1SHisping Lin 	return TeecResult;
704ae8ec5e1SHisping Lin }
705ae8ec5e1SHisping Lin 
706ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
707ae8ec5e1SHisping Lin {
708ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
709ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
710ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
711ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
712ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
713ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
714ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
715ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
7163251364cSHisping Lin 	struct blk_desc *dev_desc;
7173251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7186651d4c0SJason Zhu 	if (!dev_desc) {
7196651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7206651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7216651d4c0SJason Zhu 	}
722ae8ec5e1SHisping Lin 
723ae8ec5e1SHisping Lin 	debug("testmm start\n");
724ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
725ae8ec5e1SHisping Lin 
726ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
727ae8ec5e1SHisping Lin 
7283251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7293251364cSHisping Lin 						TEEC_NONE,
7303251364cSHisping Lin 						TEEC_NONE,
7313251364cSHisping Lin 						TEEC_NONE);
7323251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
7333251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
7343251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7353251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7363251364cSHisping Lin #endif
7373251364cSHisping Lin 
738ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
739ae8ec5e1SHisping Lin 				&TeecSession,
740ae8ec5e1SHisping Lin 				TeecUuid,
741ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
742ae8ec5e1SHisping Lin 				NULL,
7433251364cSHisping Lin 				&TeecOperation,
744ae8ec5e1SHisping Lin 				&ErrorOrigin);
745ae8ec5e1SHisping Lin 
746ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
747ae8ec5e1SHisping Lin 
748ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
749ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
750ae8ec5e1SHisping Lin 
751ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
752ae8ec5e1SHisping Lin 
753ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
754ae8ec5e1SHisping Lin 
755ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
756ae8ec5e1SHisping Lin 
757ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
758ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
759ae8ec5e1SHisping Lin 
760ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
761ae8ec5e1SHisping Lin 
762ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
763ae8ec5e1SHisping Lin 
764ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
765ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
766ae8ec5e1SHisping Lin 
767ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
768ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
769ae8ec5e1SHisping Lin 
770ae8ec5e1SHisping Lin 
771ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
772ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
773ae8ec5e1SHisping Lin 						TEEC_NONE,
774ae8ec5e1SHisping Lin 						TEEC_NONE);
775ae8ec5e1SHisping Lin 
776ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
777ae8ec5e1SHisping Lin 					1,
778ae8ec5e1SHisping Lin 					&TeecOperation,
779ae8ec5e1SHisping Lin 					&ErrorOrigin);
780ae8ec5e1SHisping Lin 
781ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
782ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
783ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
78446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
785ae8ec5e1SHisping Lin 	debug("testmm end\n");
786ae8ec5e1SHisping Lin 
787ae8ec5e1SHisping Lin 	return TeecResult;
788ae8ec5e1SHisping Lin }
789ae8ec5e1SHisping Lin 
790ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
791ae8ec5e1SHisping Lin {
792ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
793ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
794ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
795ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
796ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
797ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
798ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
799ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
8003251364cSHisping Lin 	struct blk_desc *dev_desc;
8013251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8026651d4c0SJason Zhu 	if (!dev_desc) {
8036651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8046651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8056651d4c0SJason Zhu 	}
806ae8ec5e1SHisping Lin 
807ae8ec5e1SHisping Lin 	debug("testmm start\n");
808ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
809ae8ec5e1SHisping Lin 
810ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
811ae8ec5e1SHisping Lin 
8123251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8133251364cSHisping Lin 						TEEC_NONE,
8143251364cSHisping Lin 						TEEC_NONE,
8153251364cSHisping Lin 						TEEC_NONE);
8163251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
8173251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
8183251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8193251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8203251364cSHisping Lin #endif
821ae8ec5e1SHisping Lin 
822ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
823ae8ec5e1SHisping Lin 				&TeecSession,
824ae8ec5e1SHisping Lin 				TeecUuid,
825ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
826ae8ec5e1SHisping Lin 				NULL,
8273251364cSHisping Lin 				&TeecOperation,
828ae8ec5e1SHisping Lin 				&ErrorOrigin);
829ae8ec5e1SHisping Lin 
830ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
831ae8ec5e1SHisping Lin 
832ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
833ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
834ae8ec5e1SHisping Lin 
835ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
836ae8ec5e1SHisping Lin 
837ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
838ae8ec5e1SHisping Lin 
839ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
840ae8ec5e1SHisping Lin 
841ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
842ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
843ae8ec5e1SHisping Lin 
844ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
845ae8ec5e1SHisping Lin 
846ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
847ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
848ae8ec5e1SHisping Lin 
849ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
850ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
851ae8ec5e1SHisping Lin 
852ae8ec5e1SHisping Lin 
853ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
854ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
855ae8ec5e1SHisping Lin 						TEEC_NONE,
856ae8ec5e1SHisping Lin 						TEEC_NONE);
857ae8ec5e1SHisping Lin 
858ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
859ae8ec5e1SHisping Lin 					0,
860ae8ec5e1SHisping Lin 					&TeecOperation,
861ae8ec5e1SHisping Lin 					&ErrorOrigin);
86246b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
863ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
864ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
865ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
866ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
86746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
868ae8ec5e1SHisping Lin 	debug("testmm end\n");
869ae8ec5e1SHisping Lin 
870ae8ec5e1SHisping Lin 	return TeecResult;
871ae8ec5e1SHisping Lin }
872ae8ec5e1SHisping Lin 
873ae8ec5e1SHisping Lin 
874ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
875ae8ec5e1SHisping Lin {
876ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
877ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
878ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
879ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
880ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
881ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
882ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
883ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
8843251364cSHisping Lin 	struct blk_desc *dev_desc;
8853251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8866651d4c0SJason Zhu 	if (!dev_desc) {
8876651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8886651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8896651d4c0SJason Zhu 	}
890ae8ec5e1SHisping Lin 
891ae8ec5e1SHisping Lin 	debug("testmm start\n");
892ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
893ae8ec5e1SHisping Lin 
894ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
895ae8ec5e1SHisping Lin 
8963251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8973251364cSHisping Lin 						TEEC_NONE,
8983251364cSHisping Lin 						TEEC_NONE,
8993251364cSHisping Lin 						TEEC_NONE);
9003251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
9013251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
9023251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9033251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9043251364cSHisping Lin #endif
9053251364cSHisping Lin 
906ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
907ae8ec5e1SHisping Lin 				&TeecSession,
908ae8ec5e1SHisping Lin 				TeecUuid,
909ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
910ae8ec5e1SHisping Lin 				NULL,
9113251364cSHisping Lin 				&TeecOperation,
912ae8ec5e1SHisping Lin 				&ErrorOrigin);
913ae8ec5e1SHisping Lin 
914ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
915ae8ec5e1SHisping Lin 
916ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
917ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
918ae8ec5e1SHisping Lin 
919ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
920ae8ec5e1SHisping Lin 
921ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
922ae8ec5e1SHisping Lin 
923ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
924ae8ec5e1SHisping Lin 
925ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
926ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
927ae8ec5e1SHisping Lin 
928ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
929ae8ec5e1SHisping Lin 
930ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
931ae8ec5e1SHisping Lin 
932ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
933ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
934ae8ec5e1SHisping Lin 
935ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
936ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
937ae8ec5e1SHisping Lin 
938ae8ec5e1SHisping Lin 
939ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
940ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
941ae8ec5e1SHisping Lin 						TEEC_NONE,
942ae8ec5e1SHisping Lin 						TEEC_NONE);
943ae8ec5e1SHisping Lin 
944ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
945ae8ec5e1SHisping Lin 					1,
946ae8ec5e1SHisping Lin 					&TeecOperation,
947ae8ec5e1SHisping Lin 					&ErrorOrigin);
948ae8ec5e1SHisping Lin 
949ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
950ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
951ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
95246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
953ae8ec5e1SHisping Lin 	debug("testmm end\n");
954ae8ec5e1SHisping Lin 
955ae8ec5e1SHisping Lin 	return TeecResult;
956ae8ec5e1SHisping Lin }
957ae8ec5e1SHisping Lin 
95878ef5fbdSqiujian TEEC_Result read_from_keymaster(uint8_t *filename,
95978ef5fbdSqiujian 		uint32_t filename_size,
96078ef5fbdSqiujian 		uint8_t *data,
96178ef5fbdSqiujian 		uint32_t size)
96278ef5fbdSqiujian {
96378ef5fbdSqiujian 	TEEC_Result TeecResult;
96478ef5fbdSqiujian 	TEEC_Context TeecContext;
96578ef5fbdSqiujian 	TEEC_Session TeecSession;
96678ef5fbdSqiujian 	uint32_t ErrorOrigin;
96778ef5fbdSqiujian 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
96878ef5fbdSqiujian 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
96978ef5fbdSqiujian 	TEEC_UUID *TeecUuid = &tempuuid;
97078ef5fbdSqiujian 	TEEC_Operation TeecOperation = {0};
97178ef5fbdSqiujian 	struct blk_desc *dev_desc;
97278ef5fbdSqiujian 	dev_desc = rockchip_get_bootdev();
9736651d4c0SJason Zhu 	if (!dev_desc) {
9746651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
9756651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
9766651d4c0SJason Zhu 	}
97778ef5fbdSqiujian 
97878ef5fbdSqiujian 	debug("read_from_keymaster start\n");
97978ef5fbdSqiujian 	OpteeClientApiLibInitialize();
98078ef5fbdSqiujian 
98178ef5fbdSqiujian 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
98278ef5fbdSqiujian 
98378ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
98478ef5fbdSqiujian 						TEEC_NONE,
98578ef5fbdSqiujian 						TEEC_NONE,
98678ef5fbdSqiujian 						TEEC_NONE);
98778ef5fbdSqiujian 	/*0 nand or emmc "security" partition , 1 rpmb*/
98878ef5fbdSqiujian 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
98978ef5fbdSqiujian #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
99078ef5fbdSqiujian 	TeecOperation.params[0].value.a = 0;
99178ef5fbdSqiujian #endif
99278ef5fbdSqiujian 
99378ef5fbdSqiujian 	TeecResult = TEEC_OpenSession(&TeecContext,
99478ef5fbdSqiujian 				&TeecSession,
99578ef5fbdSqiujian 				TeecUuid,
99678ef5fbdSqiujian 				TEEC_LOGIN_PUBLIC,
99778ef5fbdSqiujian 				NULL,
99878ef5fbdSqiujian 				&TeecOperation,
99978ef5fbdSqiujian 				&ErrorOrigin);
100078ef5fbdSqiujian 
100178ef5fbdSqiujian 	TEEC_SharedMemory SharedMem0 = {0};
100278ef5fbdSqiujian 
100378ef5fbdSqiujian 	SharedMem0.size = filename_size;
100478ef5fbdSqiujian 	SharedMem0.flags = 0;
100578ef5fbdSqiujian 
100678ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
100778ef5fbdSqiujian 
100878ef5fbdSqiujian 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
100978ef5fbdSqiujian 
101078ef5fbdSqiujian 	TEEC_SharedMemory SharedMem1 = {0};
101178ef5fbdSqiujian 
101278ef5fbdSqiujian 	SharedMem1.size = size;
101378ef5fbdSqiujian 	SharedMem1.flags = 0;
101478ef5fbdSqiujian 
101578ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
101678ef5fbdSqiujian 
101778ef5fbdSqiujian 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
101878ef5fbdSqiujian 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
101978ef5fbdSqiujian 
102078ef5fbdSqiujian 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
102178ef5fbdSqiujian 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
102278ef5fbdSqiujian 
102378ef5fbdSqiujian 
102478ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
102578ef5fbdSqiujian 						TEEC_MEMREF_TEMP_INOUT,
102678ef5fbdSqiujian 						TEEC_NONE,
102778ef5fbdSqiujian 						TEEC_NONE);
102878ef5fbdSqiujian 
102978ef5fbdSqiujian 	TeecResult = TEEC_InvokeCommand(&TeecSession,
103078ef5fbdSqiujian 					142,
103178ef5fbdSqiujian 					&TeecOperation,
103278ef5fbdSqiujian 					&ErrorOrigin);
103378ef5fbdSqiujian 	if (TeecResult == TEEC_SUCCESS)
103478ef5fbdSqiujian 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
103578ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem0);
103678ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem1);
103778ef5fbdSqiujian 	TEEC_CloseSession(&TeecSession);
103878ef5fbdSqiujian 	TEEC_FinalizeContext(&TeecContext);
103978ef5fbdSqiujian 	debug("read_from_keymaster end\n");
104078ef5fbdSqiujian 
104178ef5fbdSqiujian 	return TeecResult;
104278ef5fbdSqiujian }
104378ef5fbdSqiujian 
1044ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
1045ae8ec5e1SHisping Lin 		uint32_t filename_size,
1046ae8ec5e1SHisping Lin 		uint8_t *data,
1047ae8ec5e1SHisping Lin 		uint32_t data_size)
1048ae8ec5e1SHisping Lin {
1049ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
1050ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
1051ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
1052ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
1053ae8ec5e1SHisping Lin 
1054ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1055ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1056ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1057ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
10583251364cSHisping Lin 	struct blk_desc *dev_desc;
10593251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
10606651d4c0SJason Zhu 	if (!dev_desc) {
10616651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
10626651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
10636651d4c0SJason Zhu 	}
1064ae8ec5e1SHisping Lin 
1065ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
1066ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
1067ae8ec5e1SHisping Lin 
1068ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1069ae8ec5e1SHisping Lin 
10703251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
10713251364cSHisping Lin 						TEEC_NONE,
10723251364cSHisping Lin 						TEEC_NONE,
10733251364cSHisping Lin 						TEEC_NONE);
10743251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
10753251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
10763251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
10773251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
10783251364cSHisping Lin #endif
10793251364cSHisping Lin 
1080ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1081ae8ec5e1SHisping Lin 				&TeecSession,
1082ae8ec5e1SHisping Lin 				TeecUuid,
1083ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
1084ae8ec5e1SHisping Lin 				NULL,
10853251364cSHisping Lin 				&TeecOperation,
1086ae8ec5e1SHisping Lin 				&ErrorOrigin);
1087ae8ec5e1SHisping Lin 
1088ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1089ae8ec5e1SHisping Lin 
1090ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
1091ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
1092ae8ec5e1SHisping Lin 
1093ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1094ae8ec5e1SHisping Lin 
1095ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
1096ae8ec5e1SHisping Lin 
1097ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1098ae8ec5e1SHisping Lin 
1099ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
1100ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
1101ae8ec5e1SHisping Lin 
1102ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1103ae8ec5e1SHisping Lin 
1104ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
1105ae8ec5e1SHisping Lin 
1106ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1107ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1108ae8ec5e1SHisping Lin 
1109ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1110ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1111ae8ec5e1SHisping Lin 
1112ae8ec5e1SHisping Lin 
1113ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1114ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1115ae8ec5e1SHisping Lin 						TEEC_NONE,
1116ae8ec5e1SHisping Lin 						TEEC_NONE);
1117ae8ec5e1SHisping Lin 
1118ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11191f25ada2SHisping Lin 					141,
1120ae8ec5e1SHisping Lin 					&TeecOperation,
1121ae8ec5e1SHisping Lin 					&ErrorOrigin);
1122ae8ec5e1SHisping Lin 
1123ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1124ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1125ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
112646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
112778ef5fbdSqiujian 	debug("write_to_keymaster end\n");
1128ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
1129ae8ec5e1SHisping Lin 
1130ae8ec5e1SHisping Lin 	return TeecResult;
1131ae8ec5e1SHisping Lin }
11326ef445a4SHisping Lin 
11336ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
11346ef445a4SHisping Lin {
11356ef445a4SHisping Lin 	TEEC_Result TeecResult;
11366ef445a4SHisping Lin 	TEEC_Context TeecContext;
11376ef445a4SHisping Lin 	TEEC_Session TeecSession;
11386ef445a4SHisping Lin 	uint32_t ErrorOrigin;
11396ef445a4SHisping Lin 
11406ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11416ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11426ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11436ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
11446ef445a4SHisping Lin 
11456ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
11466ef445a4SHisping Lin 
11476ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
11486ef445a4SHisping Lin 
11496ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11506ef445a4SHisping Lin 				&TeecSession,
11516ef445a4SHisping Lin 				TeecUuid,
11526ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
11536ef445a4SHisping Lin 				NULL,
11546ef445a4SHisping Lin 				NULL,
11556ef445a4SHisping Lin 				&ErrorOrigin);
11566ef445a4SHisping Lin 
11576ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11586ef445a4SHisping Lin 
11596ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
11606ef445a4SHisping Lin 	SharedMem0.flags = 0;
11616ef445a4SHisping Lin 
11626ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
11636ef445a4SHisping Lin 
11646ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11656ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11666ef445a4SHisping Lin 
11676ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
11686ef445a4SHisping Lin 						TEEC_NONE,
11696ef445a4SHisping Lin 						TEEC_NONE,
11706ef445a4SHisping Lin 						TEEC_NONE);
11716ef445a4SHisping Lin 
11726ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11736ef445a4SHisping Lin 					0,
11746ef445a4SHisping Lin 					&TeecOperation,
11756ef445a4SHisping Lin 					&ErrorOrigin);
11766ef445a4SHisping Lin 
11776ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
11786ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
11796ef445a4SHisping Lin 
11806ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
11816ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
11826ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11836ef445a4SHisping Lin 
11846ef445a4SHisping Lin 	return TeecResult;
11856ef445a4SHisping Lin }
11866ef445a4SHisping Lin 
11876ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
11886ef445a4SHisping Lin {
11896ef445a4SHisping Lin 	TEEC_Result TeecResult;
11906ef445a4SHisping Lin 	TEEC_Context TeecContext;
11916ef445a4SHisping Lin 	TEEC_Session TeecSession;
11926ef445a4SHisping Lin 	uint32_t ErrorOrigin;
11936ef445a4SHisping Lin 
11946ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11956ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11966ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11976ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
11986ef445a4SHisping Lin 
11996ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
12006ef445a4SHisping Lin 
12016ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
12026ef445a4SHisping Lin 
12036ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
12046ef445a4SHisping Lin 				&TeecSession,
12056ef445a4SHisping Lin 				TeecUuid,
12066ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
12076ef445a4SHisping Lin 				NULL,
12086ef445a4SHisping Lin 				NULL,
12096ef445a4SHisping Lin 				&ErrorOrigin);
12106ef445a4SHisping Lin 
12116ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
12126ef445a4SHisping Lin 
12136ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
12146ef445a4SHisping Lin 	SharedMem0.flags = 0;
12156ef445a4SHisping Lin 
12166ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
12176ef445a4SHisping Lin 
12186ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
12196ef445a4SHisping Lin 
12206ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12216ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12226ef445a4SHisping Lin 
12236ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
12246ef445a4SHisping Lin 						TEEC_NONE,
12256ef445a4SHisping Lin 						TEEC_NONE,
12266ef445a4SHisping Lin 						TEEC_NONE);
12276ef445a4SHisping Lin 
12286ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12296ef445a4SHisping Lin 					1,
12306ef445a4SHisping Lin 					&TeecOperation,
12316ef445a4SHisping Lin 					&ErrorOrigin);
12326ef445a4SHisping Lin 
12336ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12346ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
12356ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12366ef445a4SHisping Lin 
12376ef445a4SHisping Lin 	return TeecResult;
12386ef445a4SHisping Lin }
123916539616SHisping Lin 
124016539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
124116539616SHisping Lin {
124216539616SHisping Lin 	TEEC_Result TeecResult;
124316539616SHisping Lin 	TEEC_Context TeecContext;
124416539616SHisping Lin 	TEEC_Session TeecSession;
124516539616SHisping Lin 	uint32_t ErrorOrigin;
124616539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
124716539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
124816539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
124916539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
125016539616SHisping Lin 
125116539616SHisping Lin 	OpteeClientApiLibInitialize();
125216539616SHisping Lin 
125316539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
125416539616SHisping Lin 
125516539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
125616539616SHisping Lin 				&TeecSession,
125716539616SHisping Lin 				TeecUuid,
125816539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
125916539616SHisping Lin 				NULL,
126016539616SHisping Lin 				NULL,
126116539616SHisping Lin 				&ErrorOrigin);
126216539616SHisping Lin 
126316539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
126416539616SHisping Lin 						TEEC_NONE,
126516539616SHisping Lin 						TEEC_NONE,
126616539616SHisping Lin 						TEEC_NONE);
126716539616SHisping Lin 
126816539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
126916539616SHisping Lin 					2,
127016539616SHisping Lin 					&TeecOperation,
127116539616SHisping Lin 					&ErrorOrigin);
127216539616SHisping Lin 
127316539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
127416539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
127516539616SHisping Lin 
127616539616SHisping Lin 	return TeecResult;
127716539616SHisping Lin }
127816539616SHisping Lin 
127916539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
128016539616SHisping Lin {
128116539616SHisping Lin 	TEEC_Result TeecResult;
128216539616SHisping Lin 	TEEC_Context TeecContext;
128316539616SHisping Lin 	TEEC_Session TeecSession;
128416539616SHisping Lin 	uint32_t ErrorOrigin;
128516539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
128616539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
128716539616SHisping Lin 
128816539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
128916539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
129016539616SHisping Lin 
129116539616SHisping Lin 	OpteeClientApiLibInitialize();
129216539616SHisping Lin 
129316539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
129416539616SHisping Lin 
129516539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
129616539616SHisping Lin 				&TeecSession,
129716539616SHisping Lin 				TeecUuid,
129816539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
129916539616SHisping Lin 				NULL,
130016539616SHisping Lin 				NULL,
130116539616SHisping Lin 				&ErrorOrigin);
130216539616SHisping Lin 
130316539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
130416539616SHisping Lin 						TEEC_NONE,
130516539616SHisping Lin 						TEEC_NONE,
130616539616SHisping Lin 						TEEC_NONE);
130716539616SHisping Lin 
130816539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
130916539616SHisping Lin 					2,
131016539616SHisping Lin 					&TeecOperation,
131116539616SHisping Lin 					&ErrorOrigin);
131216539616SHisping Lin 
131316539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
131416539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
131516539616SHisping Lin 
131616539616SHisping Lin 	return TeecResult;
131716539616SHisping Lin }
131816539616SHisping Lin 
131916539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
132016539616SHisping Lin {
132116539616SHisping Lin 	TEEC_Result res;
132216539616SHisping Lin 	res = notify_optee_rpmb_ta();
132316539616SHisping Lin 	res |= notify_optee_efuse_ta();
132416539616SHisping Lin 	return res;
132516539616SHisping Lin }
13262cd27853SHisping Lin 
13272cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
13282cd27853SHisping Lin {
13292cd27853SHisping Lin 	TEEC_Result TeecResult;
13302cd27853SHisping Lin 	TEEC_Context TeecContext;
13312cd27853SHisping Lin 	TEEC_Session TeecSession;
13322cd27853SHisping Lin 	uint32_t ErrorOrigin;
13332cd27853SHisping Lin 
13342cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
13352cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
13362cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13372cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
13382cd27853SHisping Lin 
13392cd27853SHisping Lin 	OpteeClientApiLibInitialize();
13402cd27853SHisping Lin 
13412cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
13422cd27853SHisping Lin 
13432cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
13442cd27853SHisping Lin 				&TeecSession,
13452cd27853SHisping Lin 				TeecUuid,
13462cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
13472cd27853SHisping Lin 				NULL,
13482cd27853SHisping Lin 				NULL,
13492cd27853SHisping Lin 				&ErrorOrigin);
13502cd27853SHisping Lin 
13512cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
13522cd27853SHisping Lin 
13532cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
13542cd27853SHisping Lin 	SharedMem0.flags = 0;
13552cd27853SHisping Lin 
13562cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
13572cd27853SHisping Lin 
13582cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13592cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13602cd27853SHisping Lin 
13612cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
13622cd27853SHisping Lin 						TEEC_NONE,
13632cd27853SHisping Lin 						TEEC_NONE,
13642cd27853SHisping Lin 						TEEC_NONE);
13652cd27853SHisping Lin 
13662cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13672cd27853SHisping Lin 					3,
13682cd27853SHisping Lin 					&TeecOperation,
13692cd27853SHisping Lin 					&ErrorOrigin);
13702cd27853SHisping Lin 
13712cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
13722cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
13732cd27853SHisping Lin 
13742cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
13752cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
13762cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
13772cd27853SHisping Lin 
13782cd27853SHisping Lin 	return TeecResult;
13792cd27853SHisping Lin }
13802cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
13812cd27853SHisping Lin {
13822cd27853SHisping Lin 	TEEC_Result TeecResult;
13832cd27853SHisping Lin 	TEEC_Context TeecContext;
13842cd27853SHisping Lin 	TEEC_Session TeecSession;
13852cd27853SHisping Lin 	uint32_t ErrorOrigin;
13862cd27853SHisping Lin 
13872cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
13882cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
13892cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13902cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
13912cd27853SHisping Lin 
13922cd27853SHisping Lin 	OpteeClientApiLibInitialize();
13932cd27853SHisping Lin 
13942cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
13952cd27853SHisping Lin 
13962cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
13972cd27853SHisping Lin 				&TeecSession,
13982cd27853SHisping Lin 				TeecUuid,
13992cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
14002cd27853SHisping Lin 				NULL,
14012cd27853SHisping Lin 				NULL,
14022cd27853SHisping Lin 				&ErrorOrigin);
14032cd27853SHisping Lin 
14042cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
14052cd27853SHisping Lin 
14062cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
14072cd27853SHisping Lin 	SharedMem0.flags = 0;
14082cd27853SHisping Lin 
14092cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
14102cd27853SHisping Lin 
14112cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
14122cd27853SHisping Lin 
14132cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
14142cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
14152cd27853SHisping Lin 
14162cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
14172cd27853SHisping Lin 						TEEC_NONE,
14182cd27853SHisping Lin 						TEEC_NONE,
14192cd27853SHisping Lin 						TEEC_NONE);
14202cd27853SHisping Lin 
14212cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14222cd27853SHisping Lin 					4,
14232cd27853SHisping Lin 					&TeecOperation,
14242cd27853SHisping Lin 					&ErrorOrigin);
14252cd27853SHisping Lin 
14262cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
14272cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
14282cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14292cd27853SHisping Lin 
14302cd27853SHisping Lin 	return TeecResult;
14312cd27853SHisping Lin }
1432095e2a82SHisping Lin 
1433468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1434468df3b2SHisping Lin {
1435468df3b2SHisping Lin 	TEEC_Result TeecResult;
1436468df3b2SHisping Lin 	TEEC_Context TeecContext;
1437468df3b2SHisping Lin 	TEEC_Session TeecSession;
1438468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1439468df3b2SHisping Lin 	uint32_t bootflag;
1440468df3b2SHisping Lin 
1441468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1442468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1443468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1444468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1445468df3b2SHisping Lin 
1446468df3b2SHisping Lin 	OpteeClientApiLibInitialize();
1447468df3b2SHisping Lin 
1448468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1449468df3b2SHisping Lin 
1450468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1451468df3b2SHisping Lin 				&TeecSession,
1452468df3b2SHisping Lin 				TeecUuid,
1453468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1454468df3b2SHisping Lin 				NULL,
1455468df3b2SHisping Lin 				NULL,
1456468df3b2SHisping Lin 				&ErrorOrigin);
1457468df3b2SHisping Lin 
1458468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1459468df3b2SHisping Lin 
1460468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1461468df3b2SHisping Lin 	SharedMem0.flags = 0;
1462468df3b2SHisping Lin 
1463468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1464468df3b2SHisping Lin 
1465468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1466468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1467468df3b2SHisping Lin 
1468468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1469468df3b2SHisping Lin 						TEEC_NONE,
1470468df3b2SHisping Lin 						TEEC_NONE,
1471468df3b2SHisping Lin 						TEEC_NONE);
1472468df3b2SHisping Lin 
1473468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1474468df3b2SHisping Lin 					5,
1475468df3b2SHisping Lin 					&TeecOperation,
1476468df3b2SHisping Lin 					&ErrorOrigin);
1477468df3b2SHisping Lin 
1478468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1479468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
1480468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1481468df3b2SHisping Lin 			*flag = 1;
1482468df3b2SHisping Lin 	}
1483468df3b2SHisping Lin 
1484468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1485468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1486468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1487468df3b2SHisping Lin 
1488468df3b2SHisping Lin 	return TeecResult;
1489468df3b2SHisping Lin }
1490468df3b2SHisping Lin 
1491095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1492095e2a82SHisping Lin {
1493095e2a82SHisping Lin 	TEEC_Result TeecResult;
1494095e2a82SHisping Lin 	TEEC_Context TeecContext;
1495095e2a82SHisping Lin 	TEEC_Session TeecSession;
1496095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1497095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1498095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1499095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1500095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
15013251364cSHisping Lin 	struct blk_desc *dev_desc;
15023251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15036651d4c0SJason Zhu 	if (!dev_desc) {
15046651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15056651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15066651d4c0SJason Zhu 	}
1507095e2a82SHisping Lin 
1508095e2a82SHisping Lin 	debug("testmm start\n");
1509095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1510095e2a82SHisping Lin 
1511095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1512095e2a82SHisping Lin 
15133251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15143251364cSHisping Lin 						TEEC_NONE,
15153251364cSHisping Lin 						TEEC_NONE,
15163251364cSHisping Lin 						TEEC_NONE);
15173251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
15183251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
15193251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15203251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15213251364cSHisping Lin #endif
15223251364cSHisping Lin 
1523095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1524095e2a82SHisping Lin 				&TeecSession,
1525095e2a82SHisping Lin 				TeecUuid,
1526095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1527095e2a82SHisping Lin 				NULL,
15283251364cSHisping Lin 				&TeecOperation,
1529095e2a82SHisping Lin 				&ErrorOrigin);
1530095e2a82SHisping Lin 
1531095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1532095e2a82SHisping Lin 
1533095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1534095e2a82SHisping Lin 	SharedMem0.flags = 0;
1535095e2a82SHisping Lin 
1536095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1537095e2a82SHisping Lin 
1538095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1539095e2a82SHisping Lin 
1540095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1541095e2a82SHisping Lin 
1542095e2a82SHisping Lin 	SharedMem1.size = 1;
1543095e2a82SHisping Lin 	SharedMem1.flags = 0;
1544095e2a82SHisping Lin 
1545095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1546095e2a82SHisping Lin 
1547095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1548095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1549095e2a82SHisping Lin 
1550095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1551095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1552095e2a82SHisping Lin 
1553095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1554095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1555095e2a82SHisping Lin 						TEEC_NONE,
1556095e2a82SHisping Lin 						TEEC_NONE);
1557095e2a82SHisping Lin 
1558095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1559095e2a82SHisping Lin 					142,
1560095e2a82SHisping Lin 					&TeecOperation,
1561095e2a82SHisping Lin 					&ErrorOrigin);
1562095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1563095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1564095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1565095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1566095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1567095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1568095e2a82SHisping Lin 	debug("testmm end\n");
1569095e2a82SHisping Lin 
1570095e2a82SHisping Lin 	return TeecResult;
1571095e2a82SHisping Lin }
1572095e2a82SHisping Lin 
1573095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1574095e2a82SHisping Lin {
1575095e2a82SHisping Lin 	TEEC_Result TeecResult;
1576095e2a82SHisping Lin 	TEEC_Context TeecContext;
1577095e2a82SHisping Lin 	TEEC_Session TeecSession;
1578095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1579095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1580095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1581095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1582095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
15833251364cSHisping Lin 	struct blk_desc *dev_desc;
15843251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15856651d4c0SJason Zhu 	if (!dev_desc) {
15866651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15876651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15886651d4c0SJason Zhu 	}
1589095e2a82SHisping Lin 
1590095e2a82SHisping Lin 	debug("testmm start\n");
1591095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1592095e2a82SHisping Lin 
1593095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1594095e2a82SHisping Lin 
15953251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15963251364cSHisping Lin 						TEEC_NONE,
15973251364cSHisping Lin 						TEEC_NONE,
15983251364cSHisping Lin 						TEEC_NONE);
15993251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16003251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16013251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16023251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16033251364cSHisping Lin #endif
16043251364cSHisping Lin 
1605095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1606095e2a82SHisping Lin 				&TeecSession,
1607095e2a82SHisping Lin 				TeecUuid,
1608095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1609095e2a82SHisping Lin 				NULL,
16103251364cSHisping Lin 				&TeecOperation,
1611095e2a82SHisping Lin 				&ErrorOrigin);
1612095e2a82SHisping Lin 
1613095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1614095e2a82SHisping Lin 
1615095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1616095e2a82SHisping Lin 	SharedMem0.flags = 0;
1617095e2a82SHisping Lin 
1618095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1619095e2a82SHisping Lin 
1620095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1621095e2a82SHisping Lin 
1622095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1623095e2a82SHisping Lin 
1624095e2a82SHisping Lin 	SharedMem1.size = 1;
1625095e2a82SHisping Lin 	SharedMem1.flags = 0;
1626095e2a82SHisping Lin 
1627095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1628095e2a82SHisping Lin 
1629095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1630095e2a82SHisping Lin 
1631095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1632095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1633095e2a82SHisping Lin 
1634095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1635095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1636095e2a82SHisping Lin 
1637095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1638095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1639095e2a82SHisping Lin 						TEEC_NONE,
1640095e2a82SHisping Lin 						TEEC_NONE);
1641095e2a82SHisping Lin 
1642095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1643095e2a82SHisping Lin 					141,
1644095e2a82SHisping Lin 					&TeecOperation,
1645095e2a82SHisping Lin 					&ErrorOrigin);
1646095e2a82SHisping Lin 
1647095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1648095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1649095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1650095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1651095e2a82SHisping Lin 	debug("testmm end\n");
1652095e2a82SHisping Lin 
1653095e2a82SHisping Lin 	return TeecResult;
1654095e2a82SHisping Lin }
16554aa61755SAndy Ye 
16564aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
16574aa61755SAndy Ye {
16584aa61755SAndy Ye 	TEEC_Result TeecResult;
16594aa61755SAndy Ye 	TEEC_Context TeecContext;
16604aa61755SAndy Ye 	TEEC_Session TeecSession;
16614aa61755SAndy Ye 	uint32_t ErrorOrigin;
16624aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16634aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16644aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16654aa61755SAndy Ye 				}
16664aa61755SAndy Ye 			     };
16674aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16684aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16693251364cSHisping Lin 	struct blk_desc *dev_desc;
16703251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16716651d4c0SJason Zhu 	if (!dev_desc) {
16726651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
16736651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
16746651d4c0SJason Zhu 	}
16754aa61755SAndy Ye 
16764aa61755SAndy Ye 	OpteeClientApiLibInitialize();
16774aa61755SAndy Ye 
16784aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16794aa61755SAndy Ye 
16803251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16813251364cSHisping Lin 						TEEC_NONE,
16823251364cSHisping Lin 						TEEC_NONE,
16833251364cSHisping Lin 						TEEC_NONE);
16843251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16853251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16863251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16873251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16883251364cSHisping Lin #endif
16893251364cSHisping Lin 
16904aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16914aa61755SAndy Ye 				      &TeecSession,
16924aa61755SAndy Ye 				      TeecUuid,
16934aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16944aa61755SAndy Ye 				      NULL,
16953251364cSHisping Lin 					&TeecOperation,
16964aa61755SAndy Ye 				      &ErrorOrigin);
16974aa61755SAndy Ye 
16984aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16994aa61755SAndy Ye 
17004aa61755SAndy Ye 	SharedMem0.size = *dh_size;
17014aa61755SAndy Ye 	SharedMem0.flags = 0;
17024aa61755SAndy Ye 
17034aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17044aa61755SAndy Ye 
17054aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17064aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17074aa61755SAndy Ye 
17084aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17094aa61755SAndy Ye 						    TEEC_NONE,
17104aa61755SAndy Ye 						    TEEC_NONE,
17114aa61755SAndy Ye 						    TEEC_NONE);
17124aa61755SAndy Ye 
17134aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17144aa61755SAndy Ye 					143,
17154aa61755SAndy Ye 					&TeecOperation,
17164aa61755SAndy Ye 					&ErrorOrigin);
17174aa61755SAndy Ye 
17184aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
17194aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
17204aa61755SAndy Ye 
17214aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17224aa61755SAndy Ye 
17234aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
17244aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
17254aa61755SAndy Ye 
17264aa61755SAndy Ye 	return TeecResult;
17274aa61755SAndy Ye }
17284aa61755SAndy Ye 
17294aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
17304aa61755SAndy Ye {
17314aa61755SAndy Ye 	TEEC_Result TeecResult;
17324aa61755SAndy Ye 	TEEC_Context TeecContext;
17334aa61755SAndy Ye 	TEEC_Session TeecSession;
17344aa61755SAndy Ye 	uint32_t ErrorOrigin;
17354aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17364aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17374aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17384aa61755SAndy Ye 				}
17394aa61755SAndy Ye 			     };
17404aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17414aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17423251364cSHisping Lin 	struct blk_desc *dev_desc;
17433251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17446651d4c0SJason Zhu 	if (!dev_desc) {
17456651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17466651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17476651d4c0SJason Zhu 	}
17484aa61755SAndy Ye 
17494aa61755SAndy Ye 	OpteeClientApiLibInitialize();
17504aa61755SAndy Ye 
17514aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
17524aa61755SAndy Ye 
17533251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17543251364cSHisping Lin 						TEEC_NONE,
17553251364cSHisping Lin 						TEEC_NONE,
17563251364cSHisping Lin 						TEEC_NONE);
17573251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
17583251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
17593251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17603251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17613251364cSHisping Lin #endif
17623251364cSHisping Lin 
17634aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17644aa61755SAndy Ye 				      &TeecSession,
17654aa61755SAndy Ye 				      TeecUuid,
17664aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17674aa61755SAndy Ye 				      NULL,
17683251364cSHisping Lin 					&TeecOperation,
17694aa61755SAndy Ye 				      &ErrorOrigin);
17704aa61755SAndy Ye 
17714aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17724aa61755SAndy Ye 
17734aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
17744aa61755SAndy Ye 	SharedMem0.flags = 0;
17754aa61755SAndy Ye 
17764aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17774aa61755SAndy Ye 
17784aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17794aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17804aa61755SAndy Ye 
17814aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17824aa61755SAndy Ye 						    TEEC_NONE,
17834aa61755SAndy Ye 						    TEEC_NONE,
17844aa61755SAndy Ye 						    TEEC_NONE);
17854aa61755SAndy Ye 
17864aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17874aa61755SAndy Ye 					144,
17884aa61755SAndy Ye 					&TeecOperation,
17894aa61755SAndy Ye 					&ErrorOrigin);
17904aa61755SAndy Ye 
17914aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
17924aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
17934aa61755SAndy Ye 
17944aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17954aa61755SAndy Ye 
17964aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
17974aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
17984aa61755SAndy Ye 
17994aa61755SAndy Ye 	return TeecResult;
18004aa61755SAndy Ye }
18014aa61755SAndy Ye 
18024aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
18034aa61755SAndy Ye 			      uint32_t *operation_size,
18044aa61755SAndy Ye 			      uint8_t *out,
18054aa61755SAndy Ye 			      uint32_t *out_len)
18064aa61755SAndy Ye {
18074aa61755SAndy Ye 	TEEC_Result TeecResult;
18084aa61755SAndy Ye 	TEEC_Context TeecContext;
18094aa61755SAndy Ye 	TEEC_Session TeecSession;
18104aa61755SAndy Ye 	uint32_t ErrorOrigin;
18114aa61755SAndy Ye 
18124aa61755SAndy Ye 	OpteeClientApiLibInitialize();
18134aa61755SAndy Ye 
18144aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18154aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18164aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
18174aa61755SAndy Ye 				}
18184aa61755SAndy Ye 			     };
18194aa61755SAndy Ye 
18204aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
18214aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
18223251364cSHisping Lin 	struct blk_desc *dev_desc;
18233251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
18246651d4c0SJason Zhu 	if (!dev_desc) {
18256651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
18266651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
18276651d4c0SJason Zhu 	}
18284aa61755SAndy Ye 
18294aa61755SAndy Ye 	OpteeClientApiLibInitialize();
18304aa61755SAndy Ye 
18314aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
18324aa61755SAndy Ye 
18333251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
18343251364cSHisping Lin 						TEEC_NONE,
18353251364cSHisping Lin 						TEEC_NONE,
18363251364cSHisping Lin 						TEEC_NONE);
18373251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
18383251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
18393251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
18403251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
18413251364cSHisping Lin #endif
18423251364cSHisping Lin 
18434aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
18444aa61755SAndy Ye 				      &TeecSession,
18454aa61755SAndy Ye 				      TeecUuid,
18464aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
18474aa61755SAndy Ye 				      NULL,
18483251364cSHisping Lin 					&TeecOperation,
18494aa61755SAndy Ye 				      &ErrorOrigin);
18504aa61755SAndy Ye 
18514aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
18524aa61755SAndy Ye 
18534aa61755SAndy Ye 	SharedMem0.size = *operation_size;
18544aa61755SAndy Ye 	SharedMem0.flags = 0;
18554aa61755SAndy Ye 
18564aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
18574aa61755SAndy Ye 
18584aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
18594aa61755SAndy Ye 
18604aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18614aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18624aa61755SAndy Ye 
18634aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
18644aa61755SAndy Ye 
18654aa61755SAndy Ye 	SharedMem1.size = *out_len;
18664aa61755SAndy Ye 	SharedMem1.flags = 0;
18674aa61755SAndy Ye 
18684aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
18694aa61755SAndy Ye 
18704aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
18714aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
18724aa61755SAndy Ye 
18734aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
18744aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
18754aa61755SAndy Ye 						    TEEC_NONE,
18764aa61755SAndy Ye 						    TEEC_NONE);
18774aa61755SAndy Ye 
18784aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18794aa61755SAndy Ye 					145,
18804aa61755SAndy Ye 					&TeecOperation,
18814aa61755SAndy Ye 					&ErrorOrigin);
18824aa61755SAndy Ye 
18834aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
18844aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
18854aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18864aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
18874aa61755SAndy Ye 
18884aa61755SAndy Ye 	return TeecResult;
18894aa61755SAndy Ye }
18904aa61755SAndy Ye 
18914aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
18924aa61755SAndy Ye {
18934aa61755SAndy Ye 	TEEC_Result TeecResult;
18944aa61755SAndy Ye 	TEEC_Context TeecContext;
18954aa61755SAndy Ye 	TEEC_Session TeecSession;
18964aa61755SAndy Ye 	uint32_t ErrorOrigin;
18974aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18984aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18994aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
19004aa61755SAndy Ye 				}
19014aa61755SAndy Ye 			     };
19024aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
19034aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
19043251364cSHisping Lin 	struct blk_desc *dev_desc;
19053251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
19066651d4c0SJason Zhu 	if (!dev_desc) {
19076651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
19086651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
19096651d4c0SJason Zhu 	}
19104aa61755SAndy Ye 
19114aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
19124aa61755SAndy Ye 
19133251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
19143251364cSHisping Lin 						TEEC_NONE,
19153251364cSHisping Lin 						TEEC_NONE,
19163251364cSHisping Lin 						TEEC_NONE);
19173251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
19183251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
19193251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
19203251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
19213251364cSHisping Lin #endif
19223251364cSHisping Lin 
19234aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
19244aa61755SAndy Ye 					&TeecSession,
19254aa61755SAndy Ye 					TeecUuid,
19264aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
19274aa61755SAndy Ye 					NULL,
19283251364cSHisping Lin 					&TeecOperation,
19294aa61755SAndy Ye 					&ErrorOrigin);
19304aa61755SAndy Ye 
19314aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
19324aa61755SAndy Ye 
19334aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
19344aa61755SAndy Ye 	SharedMem0.flags = 0;
19354aa61755SAndy Ye 
19364aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
19374aa61755SAndy Ye 
19384aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
19394aa61755SAndy Ye 
19404aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
19414aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
19424aa61755SAndy Ye 
19434aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
19444aa61755SAndy Ye 						    TEEC_NONE,
19454aa61755SAndy Ye 						    TEEC_NONE,
19464aa61755SAndy Ye 						    TEEC_NONE);
19474aa61755SAndy Ye 
19484aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
19494aa61755SAndy Ye 					146,
19504aa61755SAndy Ye 					&TeecOperation,
19514aa61755SAndy Ye 					&ErrorOrigin);
19524aa61755SAndy Ye 
19534aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
19544aa61755SAndy Ye 
19554aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
19564aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
19574aa61755SAndy Ye 
19584aa61755SAndy Ye 	return TeecResult;
19594aa61755SAndy Ye }
196078ef5fbdSqiujian 
196178ef5fbdSqiujian TEEC_Result trusty_write_oem_unlock(uint8_t unlock)
196278ef5fbdSqiujian {
196378ef5fbdSqiujian 	char *file = "oem.unlock";
196478ef5fbdSqiujian 	TEEC_Result ret;
196578ef5fbdSqiujian 
196678ef5fbdSqiujian 	ret = write_to_keymaster((uint8_t *)file, strlen(file),
196778ef5fbdSqiujian 		(uint8_t *)&unlock, 1);
196878ef5fbdSqiujian 	return ret;
196978ef5fbdSqiujian }
197078ef5fbdSqiujian 
197178ef5fbdSqiujian TEEC_Result trusty_read_oem_unlock(uint8_t *unlock)
197278ef5fbdSqiujian {
197378ef5fbdSqiujian 	char *file = "oem.unlock";
197478ef5fbdSqiujian 	TEEC_Result ret;
197578ef5fbdSqiujian 
197678ef5fbdSqiujian 	ret = read_from_keymaster((uint8_t *)file, strlen(file),
197778ef5fbdSqiujian 		unlock, 1);
197878ef5fbdSqiujian 
197978ef5fbdSqiujian 	if (ret == TEE_ERROR_ITEM_NOT_FOUND) {
198078ef5fbdSqiujian 		debug("init oem unlock status 0");
198178ef5fbdSqiujian 		ret = trusty_write_oem_unlock(0);
198278ef5fbdSqiujian 	}
198378ef5fbdSqiujian 
198478ef5fbdSqiujian 	return ret;
198578ef5fbdSqiujian }
1986