xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 1e8c0e44aa2958d63eda2f36fa1ecb4472abcad0)
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>
14*1e8c0e44STony Xu #include <attestation_key.h>
15a7df4868Stony.xu 
16a7df4868Stony.xu #define	BOOT_FROM_EMMC	(1 << 1)
17f18b06fbSTony Xu #define	WIDEVINE_TAG	"KBOX"
18f18b06fbSTony Xu #define	ATTESTATION_TAG	"ATTE"
19a7df4868Stony.xu 
20a7df4868Stony.xu uint32_t rk_send_keybox_to_ta(uint8_t *filename, uint32_t filename_size,
21a7df4868Stony.xu 			      TEEC_UUID uuid,
22a7df4868Stony.xu 			      uint8_t *key, uint32_t key_size,
23a7df4868Stony.xu 			      uint8_t *data, uint32_t data_size)
24a7df4868Stony.xu {
25a7df4868Stony.xu 	TEEC_Result TeecResult;
26a7df4868Stony.xu 	TEEC_Context TeecContext;
27a7df4868Stony.xu 	TEEC_Session TeecSession;
28a7df4868Stony.xu 	uint32_t ErrorOrigin;
29a7df4868Stony.xu 
30a7df4868Stony.xu 	TEEC_UUID *TeecUuid = &uuid;
31a7df4868Stony.xu 	TEEC_Operation TeecOperation = {0};
32a7df4868Stony.xu 
33a7df4868Stony.xu 	struct blk_desc *dev_desc;
34a7df4868Stony.xu 
35a7df4868Stony.xu 	dev_desc = rockchip_get_bootdev();
36a7df4868Stony.xu 	if (!dev_desc) {
37a7df4868Stony.xu 		printf("%s: dev_desc is NULL!\n", __func__);
38a7df4868Stony.xu 		return -TEEC_ERROR_GENERIC;
39a7df4868Stony.xu 	}
40a7df4868Stony.xu 
41a7df4868Stony.xu 	OpteeClientApiLibInitialize();
42a7df4868Stony.xu 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
43a7df4868Stony.xu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
44a7df4868Stony.xu 						    TEEC_NONE,
45a7df4868Stony.xu 						    TEEC_NONE,
46a7df4868Stony.xu 						    TEEC_NONE);
47a7df4868Stony.xu 
48a7df4868Stony.xu 	/* 0 nand or emmc "security" partition , 1 rpmb */
49a7df4868Stony.xu 	TeecOperation.params[0].value.a =
50a7df4868Stony.xu 		(dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
51a7df4868Stony.xu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
52a7df4868Stony.xu 	TeecOperation.params[0].value.a = 0;
53a7df4868Stony.xu #endif
54a7df4868Stony.xu 	TeecResult = TEEC_OpenSession(&TeecContext,
55a7df4868Stony.xu 				      &TeecSession,
56a7df4868Stony.xu 				      TeecUuid,
57a7df4868Stony.xu 				      TEEC_LOGIN_PUBLIC,
58a7df4868Stony.xu 				      NULL,
59a7df4868Stony.xu 				      &TeecOperation,
60a7df4868Stony.xu 				      &ErrorOrigin);
61a7df4868Stony.xu 
62a7df4868Stony.xu 	TEEC_SharedMemory SharedMem0 = {0};
63a7df4868Stony.xu 
64a7df4868Stony.xu 	SharedMem0.size = filename_size;
65a7df4868Stony.xu 	SharedMem0.flags = 0;
66a7df4868Stony.xu 
67a7df4868Stony.xu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
68a7df4868Stony.xu 
69a7df4868Stony.xu 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
70a7df4868Stony.xu 
71a7df4868Stony.xu 	TEEC_SharedMemory SharedMem1 = {0};
72a7df4868Stony.xu 
73a7df4868Stony.xu 	SharedMem1.size = key_size;
74a7df4868Stony.xu 	SharedMem1.flags = 0;
75a7df4868Stony.xu 
76a7df4868Stony.xu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
77a7df4868Stony.xu 
78a7df4868Stony.xu 	memcpy(SharedMem1.buffer, key, SharedMem1.size);
79a7df4868Stony.xu 
80a7df4868Stony.xu 	TEEC_SharedMemory SharedMem2 = {0};
81a7df4868Stony.xu 
82a7df4868Stony.xu 	SharedMem2.size = data_size;
83a7df4868Stony.xu 	SharedMem2.flags = 0;
84a7df4868Stony.xu 
85a7df4868Stony.xu 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem2);
86a7df4868Stony.xu 
87a7df4868Stony.xu 	memcpy(SharedMem2.buffer, data, SharedMem2.size);
88a7df4868Stony.xu 
89a7df4868Stony.xu 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
90a7df4868Stony.xu 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
91a7df4868Stony.xu 
92a7df4868Stony.xu 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
93a7df4868Stony.xu 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
94a7df4868Stony.xu 
95a7df4868Stony.xu 	TeecOperation.params[2].tmpref.buffer = SharedMem2.buffer;
96a7df4868Stony.xu 	TeecOperation.params[2].tmpref.size = SharedMem2.size;
97a7df4868Stony.xu 
98a7df4868Stony.xu 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
99a7df4868Stony.xu 						    TEEC_MEMREF_TEMP_INPUT,
100a7df4868Stony.xu 						    TEEC_MEMREF_TEMP_INOUT,
101a7df4868Stony.xu 						    TEEC_NONE);
102a7df4868Stony.xu 
103a7df4868Stony.xu 	printf("check: does keybox exised in secure storage...\n");
104a7df4868Stony.xu 	TeecResult = TEEC_InvokeCommand(&TeecSession,
105a7df4868Stony.xu 					122,
106a7df4868Stony.xu 					&TeecOperation,
107a7df4868Stony.xu 					&ErrorOrigin);
108a7df4868Stony.xu 	if (TeecResult != TEEC_SUCCESS) {
109a7df4868Stony.xu 		printf("no keybox in secure storage, write keybox to secure storage\n");
110a7df4868Stony.xu 		TeecResult = TEEC_InvokeCommand(&TeecSession,
111a7df4868Stony.xu 						121,
112a7df4868Stony.xu 						&TeecOperation,
113a7df4868Stony.xu 						&ErrorOrigin);
114a7df4868Stony.xu 		if (TeecResult != TEEC_SUCCESS) {
115a7df4868Stony.xu 			printf("send data to TA failed with code 0x%x\n", TeecResult);
116a7df4868Stony.xu 		} else {
117a7df4868Stony.xu 			printf("send data to TA success with code 0x%x\n", TeecResult);
118a7df4868Stony.xu 		}
119a7df4868Stony.xu 	}
120a7df4868Stony.xu 	TEEC_ReleaseSharedMemory(&SharedMem0);
121a7df4868Stony.xu 	TEEC_ReleaseSharedMemory(&SharedMem1);
122a7df4868Stony.xu 	TEEC_ReleaseSharedMemory(&SharedMem2);
123a7df4868Stony.xu 
124a7df4868Stony.xu 	TEEC_CloseSession(&TeecSession);
125a7df4868Stony.xu 	TEEC_FinalizeContext(&TeecContext);
126a7df4868Stony.xu 
127a7df4868Stony.xu 	return TeecResult;
128a7df4868Stony.xu }
129a7df4868Stony.xu 
130a7df4868Stony.xu int write_keybox_to_secure_storage(uint8_t *uboot_data, uint32_t len)
131a7df4868Stony.xu {
132a7df4868Stony.xu 	uint32_t key_size;
133a7df4868Stony.xu 	uint32_t data_size;
134f18b06fbSTony Xu 	uint32_t object_id;
135f18b06fbSTony Xu 	int rc = 0;
136a7df4868Stony.xu 
137f18b06fbSTony Xu 	if (memcmp(uboot_data, WIDEVINE_TAG, 4) == 0) {
138f18b06fbSTony Xu 		/* widevine keybox */
139*1e8c0e44STony Xu 		TEEC_Result ret;
140*1e8c0e44STony Xu 
141a7df4868Stony.xu 		TEEC_UUID widevine_uuid = { 0xc11fe8ac, 0xb997, 0x48cf,
142a7df4868Stony.xu 			{ 0xa2, 0x8d, 0xe2, 0xa5, 0x5e, 0x52, 0x40, 0xef} };
143f18b06fbSTony Xu 		object_id = 101;
144f18b06fbSTony Xu 
145f18b06fbSTony Xu 		key_size = *(uboot_data + 4);
146f18b06fbSTony Xu 		data_size = *(uboot_data + 8);
147f18b06fbSTony Xu 
148f18b06fbSTony Xu 		ret = rk_send_keybox_to_ta((uint8_t *)&object_id,
149f18b06fbSTony Xu 					   sizeof(uint32_t),
150f18b06fbSTony Xu 					   widevine_uuid,
151f18b06fbSTony Xu 					   uboot_data + 12,
152f18b06fbSTony Xu 					   key_size,
153f18b06fbSTony Xu 					   uboot_data + 12 + key_size,
154f18b06fbSTony Xu 					   data_size);
155f18b06fbSTony Xu 		if (ret == TEEC_SUCCESS) {
156f18b06fbSTony Xu 			rc = 0;
157f18b06fbSTony Xu 			printf("write widevine keybox to secure storage success\n");
158a7df4868Stony.xu 		} else {
159f18b06fbSTony Xu 			rc = -EIO;
160f18b06fbSTony Xu 			printf("write widevine keybox to secure storage fail\n");
161f18b06fbSTony Xu 		}
162f18b06fbSTony Xu 	} else if (memcmp(uboot_data, ATTESTATION_TAG, 4) == 0) {
163f18b06fbSTony Xu 		/* attestation key */
164*1e8c0e44STony Xu 		atap_result ret;
165f18b06fbSTony Xu 
166*1e8c0e44STony Xu 		ret = write_attestation_key_to_secure_storage(uboot_data, len);
167*1e8c0e44STony Xu 		if (ret == ATAP_RESULT_OK) {
168*1e8c0e44STony Xu 			rc = 0;
169*1e8c0e44STony Xu 			printf("write attestation key to secure storage success\n");
170*1e8c0e44STony Xu 		} else {
171*1e8c0e44STony Xu 			rc = -EIO;
172*1e8c0e44STony Xu 			printf("write attestation key to secure storage fail\n");
173a7df4868Stony.xu 		}
174*1e8c0e44STony Xu 	}
175f18b06fbSTony Xu 	return rc;
176a7df4868Stony.xu }
177ae8ec5e1SHisping Lin 
178ae8ec5e1SHisping Lin void test_optee(void)
179ae8ec5e1SHisping Lin {
180ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
181ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
182ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
183ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
184a7df4868Stony.xu 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, \
185ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
186ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
187ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1883251364cSHisping Lin 	struct blk_desc *dev_desc;
1893251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1906651d4c0SJason Zhu 	if (!dev_desc) {
1916651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1926651d4c0SJason Zhu 		return;
1936651d4c0SJason Zhu 	}
194ae8ec5e1SHisping Lin 
195ae8ec5e1SHisping Lin 	debug("testmm start\n");
196ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
197ae8ec5e1SHisping Lin 
198ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
199ae8ec5e1SHisping Lin 
2003251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2013251364cSHisping Lin 						TEEC_NONE,
2023251364cSHisping Lin 						TEEC_NONE,
2033251364cSHisping Lin 						TEEC_NONE);
2043251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2053251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
2063251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
2073251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
2083251364cSHisping Lin #endif
2093251364cSHisping Lin 
210ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
211ae8ec5e1SHisping Lin 				&TeecSession,
212ae8ec5e1SHisping Lin 				TeecUuid,
213ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
214ae8ec5e1SHisping Lin 				NULL,
2153251364cSHisping Lin 				&TeecOperation,
216ae8ec5e1SHisping Lin 				&ErrorOrigin);
217ae8ec5e1SHisping Lin 
218ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
219ae8ec5e1SHisping Lin 
220ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
221ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
222ae8ec5e1SHisping Lin 
223ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
224ae8ec5e1SHisping Lin 
225ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
226ae8ec5e1SHisping Lin 
227ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
228ae8ec5e1SHisping Lin 
229ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
230ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
231ae8ec5e1SHisping Lin 
232ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
233ae8ec5e1SHisping Lin 
234ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
235ae8ec5e1SHisping Lin 
236ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
237ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
238ae8ec5e1SHisping Lin 
239ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
240ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
241ae8ec5e1SHisping Lin 
242ae8ec5e1SHisping Lin 
243ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
244ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
245ae8ec5e1SHisping Lin 						TEEC_NONE,
246ae8ec5e1SHisping Lin 						TEEC_NONE);
247ae8ec5e1SHisping Lin 
248ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
249ae8ec5e1SHisping Lin 					1,
250ae8ec5e1SHisping Lin 					&TeecOperation,
251ae8ec5e1SHisping Lin 					&ErrorOrigin);
252ae8ec5e1SHisping Lin 
253ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
254ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
255ae8ec5e1SHisping Lin 
256ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
257ae8ec5e1SHisping Lin 
25846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
259ae8ec5e1SHisping Lin 
260ae8ec5e1SHisping Lin 	debug("testmm end\n");
261ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
262ae8ec5e1SHisping Lin }
263ae8ec5e1SHisping Lin 
264ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
265ae8ec5e1SHisping Lin {
266ae8ec5e1SHisping Lin 	if (in > 9)
267ae8ec5e1SHisping Lin 		return in + 55;
268ae8ec5e1SHisping Lin 	else
269ae8ec5e1SHisping Lin 		return in + 48;
270ae8ec5e1SHisping Lin }
271ae8ec5e1SHisping Lin 
272ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
273ae8ec5e1SHisping Lin {
274ae8ec5e1SHisping Lin 	uint32_t i = 0;
275ae8ec5e1SHisping Lin 
276ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
277ae8ec5e1SHisping Lin 		return 0;
278ae8ec5e1SHisping Lin 
279ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
280ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
281ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
282ae8ec5e1SHisping Lin 	}
283ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
284ae8ec5e1SHisping Lin 
285ae8ec5e1SHisping Lin 	return blen * 2;
286ae8ec5e1SHisping Lin }
287ae8ec5e1SHisping Lin 
288ae8ec5e1SHisping Lin 
289ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
290ae8ec5e1SHisping Lin {
291ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
292ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
293ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
294ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
295ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
296ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
297ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
298ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
299ae8ec5e1SHisping Lin 	uint8_t hs[9];
300ae8ec5e1SHisping Lin 
3013251364cSHisping Lin 	struct blk_desc *dev_desc;
3023251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
3036651d4c0SJason Zhu 	if (!dev_desc) {
3046651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
3056651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
3066651d4c0SJason Zhu 	}
3073251364cSHisping Lin 
308ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
309ae8ec5e1SHisping Lin 	debug("testmm start\n");
310ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
311ae8ec5e1SHisping Lin 
312ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
313ae8ec5e1SHisping Lin 
3143251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
3153251364cSHisping Lin 						TEEC_NONE,
3163251364cSHisping Lin 						TEEC_NONE,
3173251364cSHisping Lin 						TEEC_NONE);
3183251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
3193251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
3203251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
3213251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
3223251364cSHisping Lin #endif
3233251364cSHisping Lin 
324ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
325ae8ec5e1SHisping Lin 				&TeecSession,
326ae8ec5e1SHisping Lin 				TeecUuid,
327ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
328ae8ec5e1SHisping Lin 				NULL,
3293251364cSHisping Lin 				&TeecOperation,
330f303baf0SHisping Lin 
331ae8ec5e1SHisping Lin 				&ErrorOrigin);
332ae8ec5e1SHisping Lin 
333ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
334ae8ec5e1SHisping Lin 
335ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
336ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
337ae8ec5e1SHisping Lin 
338ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
339ae8ec5e1SHisping Lin 
340ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
341ae8ec5e1SHisping Lin 
342ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
343ae8ec5e1SHisping Lin 
344ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
345ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
346ae8ec5e1SHisping Lin 
347ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
348ae8ec5e1SHisping Lin 
349ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
350ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
351ae8ec5e1SHisping Lin 
352ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
353ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
354ae8ec5e1SHisping Lin 
355ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
356ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
357ae8ec5e1SHisping Lin 						TEEC_NONE,
358ae8ec5e1SHisping Lin 						TEEC_NONE);
359ae8ec5e1SHisping Lin 
360ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
361ae8ec5e1SHisping Lin 					0,
362ae8ec5e1SHisping Lin 					&TeecOperation,
363ae8ec5e1SHisping Lin 					&ErrorOrigin);
36446b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
365ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
366ae8ec5e1SHisping Lin 
367ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
368ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
369ae8ec5e1SHisping Lin 
370ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
371ae8ec5e1SHisping Lin 
37246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
373ae8ec5e1SHisping Lin 
374ae8ec5e1SHisping Lin 	debug("testmm end\n");
375ae8ec5e1SHisping Lin 	return TeecResult;
376ae8ec5e1SHisping Lin }
377ae8ec5e1SHisping Lin 
378ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
379ae8ec5e1SHisping Lin {
380ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
381ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
382ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
383ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
384ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
385ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
386ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
387ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
388ae8ec5e1SHisping Lin 	uint8_t hs[9];
3893251364cSHisping Lin 	struct blk_desc *dev_desc;
3903251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
3916651d4c0SJason Zhu 	if (!dev_desc) {
3926651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
3936651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
3946651d4c0SJason Zhu 	}
3953251364cSHisping Lin 
396ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
397ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
398ae8ec5e1SHisping Lin 
399ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
400ae8ec5e1SHisping Lin 
4013251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4023251364cSHisping Lin 						TEEC_NONE,
4033251364cSHisping Lin 						TEEC_NONE,
4043251364cSHisping Lin 						TEEC_NONE);
4053251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
4063251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
4073251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4083251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4093251364cSHisping Lin #endif
4103251364cSHisping Lin 
411ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
412ae8ec5e1SHisping Lin 				&TeecSession,
413ae8ec5e1SHisping Lin 				TeecUuid,
414ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
415ae8ec5e1SHisping Lin 				NULL,
4163251364cSHisping Lin 				&TeecOperation,
417ae8ec5e1SHisping Lin 				&ErrorOrigin);
418ae8ec5e1SHisping Lin 
419ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
420ae8ec5e1SHisping Lin 
421ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
422ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
423ae8ec5e1SHisping Lin 
424ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
425ae8ec5e1SHisping Lin 
426ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
427ae8ec5e1SHisping Lin 
428ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
429ae8ec5e1SHisping Lin 
430ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
431ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
432ae8ec5e1SHisping Lin 
433ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
434ae8ec5e1SHisping Lin 
435ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
436ae8ec5e1SHisping Lin 
437ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
438ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
439ae8ec5e1SHisping Lin 
440ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
441ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
442ae8ec5e1SHisping Lin 
443ae8ec5e1SHisping Lin 
444ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
445ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
446ae8ec5e1SHisping Lin 						TEEC_NONE,
447ae8ec5e1SHisping Lin 						TEEC_NONE);
448ae8ec5e1SHisping Lin 
449ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
450ae8ec5e1SHisping Lin 					1,
451ae8ec5e1SHisping Lin 					&TeecOperation,
452ae8ec5e1SHisping Lin 					&ErrorOrigin);
453ae8ec5e1SHisping Lin 
454ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
455ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
456ae8ec5e1SHisping Lin 
457ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
458ae8ec5e1SHisping Lin 
45946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
460ae8ec5e1SHisping Lin 
461ae8ec5e1SHisping Lin 	debug("testmm end\n");
462ae8ec5e1SHisping Lin 
463ae8ec5e1SHisping Lin 	return TeecResult;
464ae8ec5e1SHisping Lin }
465ae8ec5e1SHisping Lin 
466ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
467ae8ec5e1SHisping Lin {
468ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
469ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
470ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
471ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
47299830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
47399830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
474ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
475ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
4763251364cSHisping Lin 	struct blk_desc *dev_desc;
4773251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
4786651d4c0SJason Zhu 	if (!dev_desc) {
4796651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
4806651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
4816651d4c0SJason Zhu 	}
482ae8ec5e1SHisping Lin 
483ae8ec5e1SHisping Lin 	debug("testmm start\n");
484ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
485ae8ec5e1SHisping Lin 
486ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
487ae8ec5e1SHisping Lin 
4883251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
4893251364cSHisping Lin 						TEEC_NONE,
4903251364cSHisping Lin 						TEEC_NONE,
4913251364cSHisping Lin 						TEEC_NONE);
4923251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
4933251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
4943251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
4953251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
4963251364cSHisping Lin #endif
4973251364cSHisping Lin 
498ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
499ae8ec5e1SHisping Lin 				&TeecSession,
500ae8ec5e1SHisping Lin 				TeecUuid,
501ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
502ae8ec5e1SHisping Lin 				NULL,
5033251364cSHisping Lin 				&TeecOperation,
504ae8ec5e1SHisping Lin 				&ErrorOrigin);
505ae8ec5e1SHisping Lin 
506ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
507ae8ec5e1SHisping Lin 
508ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
509ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
510ae8ec5e1SHisping Lin 
511ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
512ae8ec5e1SHisping Lin 
513ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
514ae8ec5e1SHisping Lin 
515ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
516ae8ec5e1SHisping Lin 
517ae8ec5e1SHisping Lin 	SharedMem1.size = size;
518ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
519ae8ec5e1SHisping Lin 
520ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
521ae8ec5e1SHisping Lin 
522ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
523ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
524ae8ec5e1SHisping Lin 
525ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
526ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
527ae8ec5e1SHisping Lin 
528ae8ec5e1SHisping Lin 
529ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
530ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
531ae8ec5e1SHisping Lin 						TEEC_NONE,
532ae8ec5e1SHisping Lin 						TEEC_NONE);
533ae8ec5e1SHisping Lin 
534ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
53599830019SHisping Lin 					0,
536ae8ec5e1SHisping Lin 					&TeecOperation,
537ae8ec5e1SHisping Lin 					&ErrorOrigin);
53846b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
539ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
540ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
541ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
542ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
54346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
544ae8ec5e1SHisping Lin 	debug("testmm end\n");
545ae8ec5e1SHisping Lin 
546ae8ec5e1SHisping Lin 	return TeecResult;
547ae8ec5e1SHisping Lin }
548ae8ec5e1SHisping Lin 
549ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
550ae8ec5e1SHisping Lin {
551ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
552ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
553ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
554ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
55599830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
55699830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
557ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
558ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
5593251364cSHisping Lin 	struct blk_desc *dev_desc;
5603251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
5616651d4c0SJason Zhu 	if (!dev_desc) {
5626651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
5636651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
5646651d4c0SJason Zhu 	}
565ae8ec5e1SHisping Lin 
566ae8ec5e1SHisping Lin 	debug("testmm start\n");
567ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
568ae8ec5e1SHisping Lin 
569ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
570ae8ec5e1SHisping Lin 
5713251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
5723251364cSHisping Lin 						TEEC_NONE,
5733251364cSHisping Lin 						TEEC_NONE,
5743251364cSHisping Lin 						TEEC_NONE);
5753251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
5763251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
5773251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
5783251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
5793251364cSHisping Lin #endif
5803251364cSHisping Lin 
581ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
582ae8ec5e1SHisping Lin 				&TeecSession,
583ae8ec5e1SHisping Lin 				TeecUuid,
584ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
585ae8ec5e1SHisping Lin 				NULL,
5863251364cSHisping Lin 				&TeecOperation,
587ae8ec5e1SHisping Lin 				&ErrorOrigin);
588ae8ec5e1SHisping Lin 
589ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
590ae8ec5e1SHisping Lin 
591ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
592ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
593ae8ec5e1SHisping Lin 
594ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
595ae8ec5e1SHisping Lin 
596ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
597ae8ec5e1SHisping Lin 
598ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
599ae8ec5e1SHisping Lin 
600ae8ec5e1SHisping Lin 	SharedMem1.size = size;
601ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
602ae8ec5e1SHisping Lin 
603ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
604ae8ec5e1SHisping Lin 
605ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
606ae8ec5e1SHisping Lin 
607ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
608ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
609ae8ec5e1SHisping Lin 
610ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
611ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
612ae8ec5e1SHisping Lin 
613ae8ec5e1SHisping Lin 
614ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
615ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
616ae8ec5e1SHisping Lin 						TEEC_NONE,
617ae8ec5e1SHisping Lin 						TEEC_NONE);
618ae8ec5e1SHisping Lin 
619ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
62099830019SHisping Lin 					1,
621ae8ec5e1SHisping Lin 					&TeecOperation,
622ae8ec5e1SHisping Lin 					&ErrorOrigin);
623ae8ec5e1SHisping Lin 
624ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
625ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
626ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
62746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
628ae8ec5e1SHisping Lin 	debug("testmm end\n");
629ae8ec5e1SHisping Lin 
630ae8ec5e1SHisping Lin 	return TeecResult;
631ae8ec5e1SHisping Lin }
632ae8ec5e1SHisping Lin 
633ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
634ae8ec5e1SHisping Lin {
635ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
636ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
637ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
638ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
639ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
640ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
641ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
642ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
6433251364cSHisping Lin 	struct blk_desc *dev_desc;
6443251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
6456651d4c0SJason Zhu 	if (!dev_desc) {
6466651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
6476651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
6486651d4c0SJason Zhu 	}
649ae8ec5e1SHisping Lin 
650ae8ec5e1SHisping Lin 	debug("testmm start\n");
651ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
652ae8ec5e1SHisping Lin 
653ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
654ae8ec5e1SHisping Lin 
6553251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6563251364cSHisping Lin 						TEEC_NONE,
6573251364cSHisping Lin 						TEEC_NONE,
6583251364cSHisping Lin 						TEEC_NONE);
6593251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
6603251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
6613251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6623251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6633251364cSHisping Lin #endif
664ae8ec5e1SHisping Lin 
665ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
666ae8ec5e1SHisping Lin 				&TeecSession,
667ae8ec5e1SHisping Lin 				TeecUuid,
668ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
669ae8ec5e1SHisping Lin 				NULL,
6703251364cSHisping Lin 				&TeecOperation,
671ae8ec5e1SHisping Lin 				&ErrorOrigin);
672ae8ec5e1SHisping Lin 
673ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
674ae8ec5e1SHisping Lin 
675ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
676ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
677ae8ec5e1SHisping Lin 
678ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
679ae8ec5e1SHisping Lin 
680ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
681ae8ec5e1SHisping Lin 
682ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
683ae8ec5e1SHisping Lin 
684ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
685ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
686ae8ec5e1SHisping Lin 
687ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
688ae8ec5e1SHisping Lin 
689ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
690ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
691ae8ec5e1SHisping Lin 
692ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
693ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
694ae8ec5e1SHisping Lin 
695ae8ec5e1SHisping Lin 
696ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
697ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
698ae8ec5e1SHisping Lin 						TEEC_NONE,
699ae8ec5e1SHisping Lin 						TEEC_NONE);
700ae8ec5e1SHisping Lin 
701ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
702ae8ec5e1SHisping Lin 					0,
703ae8ec5e1SHisping Lin 					&TeecOperation,
704ae8ec5e1SHisping Lin 					&ErrorOrigin);
70546b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
706ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
707ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
708ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
709ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
71046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
711ae8ec5e1SHisping Lin 	debug("testmm end\n");
712ae8ec5e1SHisping Lin 
713ae8ec5e1SHisping Lin 	return TeecResult;
714ae8ec5e1SHisping Lin }
715ae8ec5e1SHisping Lin 
716ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
717ae8ec5e1SHisping Lin {
718ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
719ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
720ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
721ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
722ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
723ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
724ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
725ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
7263251364cSHisping Lin 	struct blk_desc *dev_desc;
7273251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7286651d4c0SJason Zhu 	if (!dev_desc) {
7296651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7306651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7316651d4c0SJason Zhu 	}
732ae8ec5e1SHisping Lin 
733ae8ec5e1SHisping Lin 	debug("testmm start\n");
734ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
735ae8ec5e1SHisping Lin 
736ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
737ae8ec5e1SHisping Lin 
7383251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7393251364cSHisping Lin 						TEEC_NONE,
7403251364cSHisping Lin 						TEEC_NONE,
7413251364cSHisping Lin 						TEEC_NONE);
7423251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
7433251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
7443251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7453251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7463251364cSHisping Lin #endif
7473251364cSHisping Lin 
748ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
749ae8ec5e1SHisping Lin 				&TeecSession,
750ae8ec5e1SHisping Lin 				TeecUuid,
751ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
752ae8ec5e1SHisping Lin 				NULL,
7533251364cSHisping Lin 				&TeecOperation,
754ae8ec5e1SHisping Lin 				&ErrorOrigin);
755ae8ec5e1SHisping Lin 
756ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
757ae8ec5e1SHisping Lin 
758ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
759ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
760ae8ec5e1SHisping Lin 
761ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
762ae8ec5e1SHisping Lin 
763ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
764ae8ec5e1SHisping Lin 
765ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
766ae8ec5e1SHisping Lin 
767ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
768ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
769ae8ec5e1SHisping Lin 
770ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
771ae8ec5e1SHisping Lin 
772ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
773ae8ec5e1SHisping Lin 
774ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
775ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
776ae8ec5e1SHisping Lin 
777ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
778ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
779ae8ec5e1SHisping Lin 
780ae8ec5e1SHisping Lin 
781ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
782ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
783ae8ec5e1SHisping Lin 						TEEC_NONE,
784ae8ec5e1SHisping Lin 						TEEC_NONE);
785ae8ec5e1SHisping Lin 
786ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
787ae8ec5e1SHisping Lin 					1,
788ae8ec5e1SHisping Lin 					&TeecOperation,
789ae8ec5e1SHisping Lin 					&ErrorOrigin);
790ae8ec5e1SHisping Lin 
791ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
792ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
793ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
79446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
795ae8ec5e1SHisping Lin 	debug("testmm end\n");
796ae8ec5e1SHisping Lin 
797ae8ec5e1SHisping Lin 	return TeecResult;
798ae8ec5e1SHisping Lin }
799ae8ec5e1SHisping Lin 
800ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
801ae8ec5e1SHisping Lin {
802ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
803ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
804ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
805ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
806ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
807ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
808ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
809ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
8103251364cSHisping Lin 	struct blk_desc *dev_desc;
8113251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8126651d4c0SJason Zhu 	if (!dev_desc) {
8136651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8146651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8156651d4c0SJason Zhu 	}
816ae8ec5e1SHisping Lin 
817ae8ec5e1SHisping Lin 	debug("testmm start\n");
818ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
819ae8ec5e1SHisping Lin 
820ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
821ae8ec5e1SHisping Lin 
8223251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8233251364cSHisping Lin 						TEEC_NONE,
8243251364cSHisping Lin 						TEEC_NONE,
8253251364cSHisping Lin 						TEEC_NONE);
8263251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
8273251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
8283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8293251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8303251364cSHisping Lin #endif
831ae8ec5e1SHisping Lin 
832ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
833ae8ec5e1SHisping Lin 				&TeecSession,
834ae8ec5e1SHisping Lin 				TeecUuid,
835ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
836ae8ec5e1SHisping Lin 				NULL,
8373251364cSHisping Lin 				&TeecOperation,
838ae8ec5e1SHisping Lin 				&ErrorOrigin);
839ae8ec5e1SHisping Lin 
840ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
841ae8ec5e1SHisping Lin 
842ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
843ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
844ae8ec5e1SHisping Lin 
845ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
846ae8ec5e1SHisping Lin 
847ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
848ae8ec5e1SHisping Lin 
849ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
850ae8ec5e1SHisping Lin 
851ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
852ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
853ae8ec5e1SHisping Lin 
854ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
855ae8ec5e1SHisping Lin 
856ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
857ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
858ae8ec5e1SHisping Lin 
859ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
860ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
861ae8ec5e1SHisping Lin 
862ae8ec5e1SHisping Lin 
863ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
864ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
865ae8ec5e1SHisping Lin 						TEEC_NONE,
866ae8ec5e1SHisping Lin 						TEEC_NONE);
867ae8ec5e1SHisping Lin 
868ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
869ae8ec5e1SHisping Lin 					0,
870ae8ec5e1SHisping Lin 					&TeecOperation,
871ae8ec5e1SHisping Lin 					&ErrorOrigin);
87246b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
873ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
874ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
875ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
876ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
87746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
878ae8ec5e1SHisping Lin 	debug("testmm end\n");
879ae8ec5e1SHisping Lin 
880ae8ec5e1SHisping Lin 	return TeecResult;
881ae8ec5e1SHisping Lin }
882ae8ec5e1SHisping Lin 
883ae8ec5e1SHisping Lin 
884ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
885ae8ec5e1SHisping Lin {
886ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
887ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
888ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
889ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
890ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
891ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
892ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
893ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
8943251364cSHisping Lin 	struct blk_desc *dev_desc;
8953251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8966651d4c0SJason Zhu 	if (!dev_desc) {
8976651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8986651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8996651d4c0SJason Zhu 	}
900ae8ec5e1SHisping Lin 
901ae8ec5e1SHisping Lin 	debug("testmm start\n");
902ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
903ae8ec5e1SHisping Lin 
904ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
905ae8ec5e1SHisping Lin 
9063251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9073251364cSHisping Lin 						TEEC_NONE,
9083251364cSHisping Lin 						TEEC_NONE,
9093251364cSHisping Lin 						TEEC_NONE);
9103251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
9113251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
9123251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9133251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9143251364cSHisping Lin #endif
9153251364cSHisping Lin 
916ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
917ae8ec5e1SHisping Lin 				&TeecSession,
918ae8ec5e1SHisping Lin 				TeecUuid,
919ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
920ae8ec5e1SHisping Lin 				NULL,
9213251364cSHisping Lin 				&TeecOperation,
922ae8ec5e1SHisping Lin 				&ErrorOrigin);
923ae8ec5e1SHisping Lin 
924ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
925ae8ec5e1SHisping Lin 
926ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
927ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
928ae8ec5e1SHisping Lin 
929ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
930ae8ec5e1SHisping Lin 
931ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
932ae8ec5e1SHisping Lin 
933ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
934ae8ec5e1SHisping Lin 
935ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
936ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
937ae8ec5e1SHisping Lin 
938ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
939ae8ec5e1SHisping Lin 
940ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
941ae8ec5e1SHisping Lin 
942ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
943ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
944ae8ec5e1SHisping Lin 
945ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
946ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
947ae8ec5e1SHisping Lin 
948ae8ec5e1SHisping Lin 
949ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
950ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
951ae8ec5e1SHisping Lin 						TEEC_NONE,
952ae8ec5e1SHisping Lin 						TEEC_NONE);
953ae8ec5e1SHisping Lin 
954ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
955ae8ec5e1SHisping Lin 					1,
956ae8ec5e1SHisping Lin 					&TeecOperation,
957ae8ec5e1SHisping Lin 					&ErrorOrigin);
958ae8ec5e1SHisping Lin 
959ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
960ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
961ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
96246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
963ae8ec5e1SHisping Lin 	debug("testmm end\n");
964ae8ec5e1SHisping Lin 
965ae8ec5e1SHisping Lin 	return TeecResult;
966ae8ec5e1SHisping Lin }
967ae8ec5e1SHisping Lin 
96878ef5fbdSqiujian TEEC_Result read_from_keymaster(uint8_t *filename,
96978ef5fbdSqiujian 		uint32_t filename_size,
97078ef5fbdSqiujian 		uint8_t *data,
97178ef5fbdSqiujian 		uint32_t size)
97278ef5fbdSqiujian {
97378ef5fbdSqiujian 	TEEC_Result TeecResult;
97478ef5fbdSqiujian 	TEEC_Context TeecContext;
97578ef5fbdSqiujian 	TEEC_Session TeecSession;
97678ef5fbdSqiujian 	uint32_t ErrorOrigin;
97799830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
97899830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
97978ef5fbdSqiujian 	TEEC_UUID *TeecUuid = &tempuuid;
98078ef5fbdSqiujian 	TEEC_Operation TeecOperation = {0};
98178ef5fbdSqiujian 	struct blk_desc *dev_desc;
98278ef5fbdSqiujian 	dev_desc = rockchip_get_bootdev();
9836651d4c0SJason Zhu 	if (!dev_desc) {
9846651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
9856651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
9866651d4c0SJason Zhu 	}
98778ef5fbdSqiujian 
98878ef5fbdSqiujian 	debug("read_from_keymaster start\n");
98978ef5fbdSqiujian 	OpteeClientApiLibInitialize();
99078ef5fbdSqiujian 
99178ef5fbdSqiujian 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
99278ef5fbdSqiujian 
99378ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
99478ef5fbdSqiujian 						TEEC_NONE,
99578ef5fbdSqiujian 						TEEC_NONE,
99678ef5fbdSqiujian 						TEEC_NONE);
99778ef5fbdSqiujian 	/*0 nand or emmc "security" partition , 1 rpmb*/
99878ef5fbdSqiujian 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
99978ef5fbdSqiujian #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
100078ef5fbdSqiujian 	TeecOperation.params[0].value.a = 0;
100178ef5fbdSqiujian #endif
100278ef5fbdSqiujian 
100378ef5fbdSqiujian 	TeecResult = TEEC_OpenSession(&TeecContext,
100478ef5fbdSqiujian 				&TeecSession,
100578ef5fbdSqiujian 				TeecUuid,
100678ef5fbdSqiujian 				TEEC_LOGIN_PUBLIC,
100778ef5fbdSqiujian 				NULL,
100878ef5fbdSqiujian 				&TeecOperation,
100978ef5fbdSqiujian 				&ErrorOrigin);
101078ef5fbdSqiujian 
101178ef5fbdSqiujian 	TEEC_SharedMemory SharedMem0 = {0};
101278ef5fbdSqiujian 
101378ef5fbdSqiujian 	SharedMem0.size = filename_size;
101478ef5fbdSqiujian 	SharedMem0.flags = 0;
101578ef5fbdSqiujian 
101678ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
101778ef5fbdSqiujian 
101878ef5fbdSqiujian 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
101978ef5fbdSqiujian 
102078ef5fbdSqiujian 	TEEC_SharedMemory SharedMem1 = {0};
102178ef5fbdSqiujian 
102278ef5fbdSqiujian 	SharedMem1.size = size;
102378ef5fbdSqiujian 	SharedMem1.flags = 0;
102478ef5fbdSqiujian 
102578ef5fbdSqiujian 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
102678ef5fbdSqiujian 
102778ef5fbdSqiujian 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
102878ef5fbdSqiujian 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
102978ef5fbdSqiujian 
103078ef5fbdSqiujian 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
103178ef5fbdSqiujian 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
103278ef5fbdSqiujian 
103378ef5fbdSqiujian 
103478ef5fbdSqiujian 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
103578ef5fbdSqiujian 						TEEC_MEMREF_TEMP_INOUT,
103678ef5fbdSqiujian 						TEEC_NONE,
103778ef5fbdSqiujian 						TEEC_NONE);
103878ef5fbdSqiujian 
103978ef5fbdSqiujian 	TeecResult = TEEC_InvokeCommand(&TeecSession,
104099830019SHisping Lin 					0,
104178ef5fbdSqiujian 					&TeecOperation,
104278ef5fbdSqiujian 					&ErrorOrigin);
104378ef5fbdSqiujian 	if (TeecResult == TEEC_SUCCESS)
104478ef5fbdSqiujian 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
104578ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem0);
104678ef5fbdSqiujian 	TEEC_ReleaseSharedMemory(&SharedMem1);
104778ef5fbdSqiujian 	TEEC_CloseSession(&TeecSession);
104878ef5fbdSqiujian 	TEEC_FinalizeContext(&TeecContext);
104978ef5fbdSqiujian 	debug("read_from_keymaster end\n");
105078ef5fbdSqiujian 
105178ef5fbdSqiujian 	return TeecResult;
105278ef5fbdSqiujian }
105378ef5fbdSqiujian 
1054ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
1055ae8ec5e1SHisping Lin 		uint32_t filename_size,
1056ae8ec5e1SHisping Lin 		uint8_t *data,
1057ae8ec5e1SHisping Lin 		uint32_t data_size)
1058ae8ec5e1SHisping Lin {
1059ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
1060ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
1061ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
1062ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
106399830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
106499830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
1065ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1066ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
10673251364cSHisping Lin 	struct blk_desc *dev_desc;
10683251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
10696651d4c0SJason Zhu 	if (!dev_desc) {
10706651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
10716651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
10726651d4c0SJason Zhu 	}
1073ae8ec5e1SHisping Lin 
1074ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
1075ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
1076ae8ec5e1SHisping Lin 
1077ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1078ae8ec5e1SHisping Lin 
10793251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
10803251364cSHisping Lin 						TEEC_NONE,
10813251364cSHisping Lin 						TEEC_NONE,
10823251364cSHisping Lin 						TEEC_NONE);
10833251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
10843251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
10853251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
10863251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
10873251364cSHisping Lin #endif
10883251364cSHisping Lin 
1089ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1090ae8ec5e1SHisping Lin 				&TeecSession,
1091ae8ec5e1SHisping Lin 				TeecUuid,
1092ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
1093ae8ec5e1SHisping Lin 				NULL,
10943251364cSHisping Lin 				&TeecOperation,
1095ae8ec5e1SHisping Lin 				&ErrorOrigin);
1096ae8ec5e1SHisping Lin 
1097ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1098ae8ec5e1SHisping Lin 
1099ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
1100ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
1101ae8ec5e1SHisping Lin 
1102ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1103ae8ec5e1SHisping Lin 
1104ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
1105ae8ec5e1SHisping Lin 
1106ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1107ae8ec5e1SHisping Lin 
1108ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
1109ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
1110ae8ec5e1SHisping Lin 
1111ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1112ae8ec5e1SHisping Lin 
1113ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
1114ae8ec5e1SHisping Lin 
1115ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1116ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1117ae8ec5e1SHisping Lin 
1118ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1119ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1120ae8ec5e1SHisping Lin 
1121ae8ec5e1SHisping Lin 
1122ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1123ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1124ae8ec5e1SHisping Lin 						TEEC_NONE,
1125ae8ec5e1SHisping Lin 						TEEC_NONE);
1126ae8ec5e1SHisping Lin 
1127ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
112899830019SHisping Lin 					1,
1129ae8ec5e1SHisping Lin 					&TeecOperation,
1130ae8ec5e1SHisping Lin 					&ErrorOrigin);
1131ae8ec5e1SHisping Lin 
1132ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1133ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1134ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
113546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
113678ef5fbdSqiujian 	debug("write_to_keymaster end\n");
1137ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
1138ae8ec5e1SHisping Lin 
1139ae8ec5e1SHisping Lin 	return TeecResult;
1140ae8ec5e1SHisping Lin }
11416ef445a4SHisping Lin 
11426ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
11436ef445a4SHisping Lin {
11446ef445a4SHisping Lin 	TEEC_Result TeecResult;
11456ef445a4SHisping Lin 	TEEC_Context TeecContext;
11466ef445a4SHisping Lin 	TEEC_Session TeecSession;
11476ef445a4SHisping Lin 	uint32_t ErrorOrigin;
11486ef445a4SHisping Lin 
11496ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
11506ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
11516ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
11526ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
11536ef445a4SHisping Lin 
11546ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
11556ef445a4SHisping Lin 
11566ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
11576ef445a4SHisping Lin 
11586ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
11596ef445a4SHisping Lin 				&TeecSession,
11606ef445a4SHisping Lin 				TeecUuid,
11616ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
11626ef445a4SHisping Lin 				NULL,
11636ef445a4SHisping Lin 				NULL,
11646ef445a4SHisping Lin 				&ErrorOrigin);
11656ef445a4SHisping Lin 
11666ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
11676ef445a4SHisping Lin 
11686ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
11696ef445a4SHisping Lin 	SharedMem0.flags = 0;
11706ef445a4SHisping Lin 
11716ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
11726ef445a4SHisping Lin 
11736ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11746ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11756ef445a4SHisping Lin 
11766ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
11776ef445a4SHisping Lin 						TEEC_NONE,
11786ef445a4SHisping Lin 						TEEC_NONE,
11796ef445a4SHisping Lin 						TEEC_NONE);
11806ef445a4SHisping Lin 
11816ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11826ef445a4SHisping Lin 					0,
11836ef445a4SHisping Lin 					&TeecOperation,
11846ef445a4SHisping Lin 					&ErrorOrigin);
11856ef445a4SHisping Lin 
11866ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
11876ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
11886ef445a4SHisping Lin 
11896ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
11906ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
11916ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11926ef445a4SHisping Lin 
11936ef445a4SHisping Lin 	return TeecResult;
11946ef445a4SHisping Lin }
11956ef445a4SHisping Lin 
11966ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
11976ef445a4SHisping Lin {
11986ef445a4SHisping Lin 	TEEC_Result TeecResult;
11996ef445a4SHisping Lin 	TEEC_Context TeecContext;
12006ef445a4SHisping Lin 	TEEC_Session TeecSession;
12016ef445a4SHisping Lin 	uint32_t ErrorOrigin;
12026ef445a4SHisping Lin 
12036ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
12046ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
12056ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
12066ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
12076ef445a4SHisping Lin 
12086ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
12096ef445a4SHisping Lin 
12106ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
12116ef445a4SHisping Lin 
12126ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
12136ef445a4SHisping Lin 				&TeecSession,
12146ef445a4SHisping Lin 				TeecUuid,
12156ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
12166ef445a4SHisping Lin 				NULL,
12176ef445a4SHisping Lin 				NULL,
12186ef445a4SHisping Lin 				&ErrorOrigin);
12196ef445a4SHisping Lin 
12206ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
12216ef445a4SHisping Lin 
12226ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
12236ef445a4SHisping Lin 	SharedMem0.flags = 0;
12246ef445a4SHisping Lin 
12256ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
12266ef445a4SHisping Lin 
12276ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
12286ef445a4SHisping Lin 
12296ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12306ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12316ef445a4SHisping Lin 
12326ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
12336ef445a4SHisping Lin 						TEEC_NONE,
12346ef445a4SHisping Lin 						TEEC_NONE,
12356ef445a4SHisping Lin 						TEEC_NONE);
12366ef445a4SHisping Lin 
12376ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12386ef445a4SHisping Lin 					1,
12396ef445a4SHisping Lin 					&TeecOperation,
12406ef445a4SHisping Lin 					&ErrorOrigin);
12416ef445a4SHisping Lin 
12426ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
12436ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
12446ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12456ef445a4SHisping Lin 
12466ef445a4SHisping Lin 	return TeecResult;
12476ef445a4SHisping Lin }
124816539616SHisping Lin 
124916539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
125016539616SHisping Lin {
125116539616SHisping Lin 	TEEC_Result TeecResult;
125216539616SHisping Lin 	TEEC_Context TeecContext;
125316539616SHisping Lin 	TEEC_Session TeecSession;
125416539616SHisping Lin 	uint32_t ErrorOrigin;
125516539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
125616539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
125716539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
125816539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
125916539616SHisping Lin 
126016539616SHisping Lin 	OpteeClientApiLibInitialize();
126116539616SHisping Lin 
126216539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
126316539616SHisping Lin 
126416539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
126516539616SHisping Lin 				&TeecSession,
126616539616SHisping Lin 				TeecUuid,
126716539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
126816539616SHisping Lin 				NULL,
126916539616SHisping Lin 				NULL,
127016539616SHisping Lin 				&ErrorOrigin);
127116539616SHisping Lin 
127216539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
127316539616SHisping Lin 						TEEC_NONE,
127416539616SHisping Lin 						TEEC_NONE,
127516539616SHisping Lin 						TEEC_NONE);
127616539616SHisping Lin 
127716539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
127816539616SHisping Lin 					2,
127916539616SHisping Lin 					&TeecOperation,
128016539616SHisping Lin 					&ErrorOrigin);
128116539616SHisping Lin 
128216539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
128316539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
128416539616SHisping Lin 
128516539616SHisping Lin 	return TeecResult;
128616539616SHisping Lin }
128716539616SHisping Lin 
128816539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
128916539616SHisping Lin {
129016539616SHisping Lin 	TEEC_Result TeecResult;
129116539616SHisping Lin 	TEEC_Context TeecContext;
129216539616SHisping Lin 	TEEC_Session TeecSession;
129316539616SHisping Lin 	uint32_t ErrorOrigin;
129416539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
129516539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
129616539616SHisping Lin 
129716539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
129816539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
129916539616SHisping Lin 
130016539616SHisping Lin 	OpteeClientApiLibInitialize();
130116539616SHisping Lin 
130216539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
130316539616SHisping Lin 
130416539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
130516539616SHisping Lin 				&TeecSession,
130616539616SHisping Lin 				TeecUuid,
130716539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
130816539616SHisping Lin 				NULL,
130916539616SHisping Lin 				NULL,
131016539616SHisping Lin 				&ErrorOrigin);
131116539616SHisping Lin 
131216539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
131316539616SHisping Lin 						TEEC_NONE,
131416539616SHisping Lin 						TEEC_NONE,
131516539616SHisping Lin 						TEEC_NONE);
131616539616SHisping Lin 
131716539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
131816539616SHisping Lin 					2,
131916539616SHisping Lin 					&TeecOperation,
132016539616SHisping Lin 					&ErrorOrigin);
132116539616SHisping Lin 
132216539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
132316539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
132416539616SHisping Lin 
132516539616SHisping Lin 	return TeecResult;
132616539616SHisping Lin }
132716539616SHisping Lin 
132816539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
132916539616SHisping Lin {
133016539616SHisping Lin 	TEEC_Result res;
133116539616SHisping Lin 	res = notify_optee_rpmb_ta();
133216539616SHisping Lin 	res |= notify_optee_efuse_ta();
133316539616SHisping Lin 	return res;
133416539616SHisping Lin }
13352cd27853SHisping Lin 
13362cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
13372cd27853SHisping Lin {
13382cd27853SHisping Lin 	TEEC_Result TeecResult;
13392cd27853SHisping Lin 	TEEC_Context TeecContext;
13402cd27853SHisping Lin 	TEEC_Session TeecSession;
13412cd27853SHisping Lin 	uint32_t ErrorOrigin;
13422cd27853SHisping Lin 
13432cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
13442cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
13452cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13462cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
13472cd27853SHisping Lin 
13482cd27853SHisping Lin 	OpteeClientApiLibInitialize();
13492cd27853SHisping Lin 
13502cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
13512cd27853SHisping Lin 
13522cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
13532cd27853SHisping Lin 				&TeecSession,
13542cd27853SHisping Lin 				TeecUuid,
13552cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
13562cd27853SHisping Lin 				NULL,
13572cd27853SHisping Lin 				NULL,
13582cd27853SHisping Lin 				&ErrorOrigin);
13592cd27853SHisping Lin 
13602cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
13612cd27853SHisping Lin 
13622cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
13632cd27853SHisping Lin 	SharedMem0.flags = 0;
13642cd27853SHisping Lin 
13652cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
13662cd27853SHisping Lin 
13672cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13682cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13692cd27853SHisping Lin 
13702cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
13712cd27853SHisping Lin 						TEEC_NONE,
13722cd27853SHisping Lin 						TEEC_NONE,
13732cd27853SHisping Lin 						TEEC_NONE);
13742cd27853SHisping Lin 
13752cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13762cd27853SHisping Lin 					3,
13772cd27853SHisping Lin 					&TeecOperation,
13782cd27853SHisping Lin 					&ErrorOrigin);
13792cd27853SHisping Lin 
13802cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
13812cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
13822cd27853SHisping Lin 
13832cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
13842cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
13852cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
13862cd27853SHisping Lin 
13872cd27853SHisping Lin 	return TeecResult;
13882cd27853SHisping Lin }
13892cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
13902cd27853SHisping Lin {
13912cd27853SHisping Lin 	TEEC_Result TeecResult;
13922cd27853SHisping Lin 	TEEC_Context TeecContext;
13932cd27853SHisping Lin 	TEEC_Session TeecSession;
13942cd27853SHisping Lin 	uint32_t ErrorOrigin;
13952cd27853SHisping Lin 
13962cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
13972cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
13982cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13992cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
14002cd27853SHisping Lin 
14012cd27853SHisping Lin 	OpteeClientApiLibInitialize();
14022cd27853SHisping Lin 
14032cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
14042cd27853SHisping Lin 
14052cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
14062cd27853SHisping Lin 				&TeecSession,
14072cd27853SHisping Lin 				TeecUuid,
14082cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
14092cd27853SHisping Lin 				NULL,
14102cd27853SHisping Lin 				NULL,
14112cd27853SHisping Lin 				&ErrorOrigin);
14122cd27853SHisping Lin 
14132cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
14142cd27853SHisping Lin 
14152cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
14162cd27853SHisping Lin 	SharedMem0.flags = 0;
14172cd27853SHisping Lin 
14182cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
14192cd27853SHisping Lin 
14202cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
14212cd27853SHisping Lin 
14222cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
14232cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
14242cd27853SHisping Lin 
14252cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
14262cd27853SHisping Lin 						TEEC_NONE,
14272cd27853SHisping Lin 						TEEC_NONE,
14282cd27853SHisping Lin 						TEEC_NONE);
14292cd27853SHisping Lin 
14302cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14312cd27853SHisping Lin 					4,
14322cd27853SHisping Lin 					&TeecOperation,
14332cd27853SHisping Lin 					&ErrorOrigin);
14342cd27853SHisping Lin 
14352cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
14362cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
14372cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14382cd27853SHisping Lin 
14392cd27853SHisping Lin 	return TeecResult;
14402cd27853SHisping Lin }
1441095e2a82SHisping Lin 
1442468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1443468df3b2SHisping Lin {
1444468df3b2SHisping Lin 	TEEC_Result TeecResult;
1445468df3b2SHisping Lin 	TEEC_Context TeecContext;
1446468df3b2SHisping Lin 	TEEC_Session TeecSession;
1447468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1448468df3b2SHisping Lin 	uint32_t bootflag;
1449468df3b2SHisping Lin 
1450468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1451468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1452468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1453468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1454468df3b2SHisping Lin 
1455468df3b2SHisping Lin 	OpteeClientApiLibInitialize();
1456468df3b2SHisping Lin 
1457468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1458468df3b2SHisping Lin 
1459468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1460468df3b2SHisping Lin 				&TeecSession,
1461468df3b2SHisping Lin 				TeecUuid,
1462468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1463468df3b2SHisping Lin 				NULL,
1464468df3b2SHisping Lin 				NULL,
1465468df3b2SHisping Lin 				&ErrorOrigin);
1466468df3b2SHisping Lin 
1467468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1468468df3b2SHisping Lin 
1469468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1470468df3b2SHisping Lin 	SharedMem0.flags = 0;
1471468df3b2SHisping Lin 
1472468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1473468df3b2SHisping Lin 
1474468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1475468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1476468df3b2SHisping Lin 
1477468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1478468df3b2SHisping Lin 						TEEC_NONE,
1479468df3b2SHisping Lin 						TEEC_NONE,
1480468df3b2SHisping Lin 						TEEC_NONE);
1481468df3b2SHisping Lin 
1482468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1483468df3b2SHisping Lin 					5,
1484468df3b2SHisping Lin 					&TeecOperation,
1485468df3b2SHisping Lin 					&ErrorOrigin);
1486468df3b2SHisping Lin 
1487468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1488468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
1489468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1490468df3b2SHisping Lin 			*flag = 1;
1491468df3b2SHisping Lin 	}
1492468df3b2SHisping Lin 
1493468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1494468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1495468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1496468df3b2SHisping Lin 
1497468df3b2SHisping Lin 	return TeecResult;
1498468df3b2SHisping Lin }
1499468df3b2SHisping Lin 
1500095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1501095e2a82SHisping Lin {
1502095e2a82SHisping Lin 	TEEC_Result TeecResult;
1503095e2a82SHisping Lin 	TEEC_Context TeecContext;
1504095e2a82SHisping Lin 	TEEC_Session TeecSession;
1505095e2a82SHisping Lin 	uint32_t ErrorOrigin;
150699830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
150799830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
1508095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1509095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
15103251364cSHisping Lin 	struct blk_desc *dev_desc;
15113251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15126651d4c0SJason Zhu 	if (!dev_desc) {
15136651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15146651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15156651d4c0SJason Zhu 	}
1516095e2a82SHisping Lin 
1517095e2a82SHisping Lin 	debug("testmm start\n");
1518095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1519095e2a82SHisping Lin 
1520095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1521095e2a82SHisping Lin 
15223251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15233251364cSHisping Lin 						TEEC_NONE,
15243251364cSHisping Lin 						TEEC_NONE,
15253251364cSHisping Lin 						TEEC_NONE);
15263251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
15273251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
15283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15293251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15303251364cSHisping Lin #endif
15313251364cSHisping Lin 
1532095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1533095e2a82SHisping Lin 				&TeecSession,
1534095e2a82SHisping Lin 				TeecUuid,
1535095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1536095e2a82SHisping Lin 				NULL,
15373251364cSHisping Lin 				&TeecOperation,
1538095e2a82SHisping Lin 				&ErrorOrigin);
1539095e2a82SHisping Lin 
1540095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1541095e2a82SHisping Lin 
1542095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1543095e2a82SHisping Lin 	SharedMem0.flags = 0;
1544095e2a82SHisping Lin 
1545095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1546095e2a82SHisping Lin 
1547095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1548095e2a82SHisping Lin 
1549095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1550095e2a82SHisping Lin 
1551095e2a82SHisping Lin 	SharedMem1.size = 1;
1552095e2a82SHisping Lin 	SharedMem1.flags = 0;
1553095e2a82SHisping Lin 
1554095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1555095e2a82SHisping Lin 
1556095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1557095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1558095e2a82SHisping Lin 
1559095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1560095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1561095e2a82SHisping Lin 
1562095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1563095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1564095e2a82SHisping Lin 						TEEC_NONE,
1565095e2a82SHisping Lin 						TEEC_NONE);
1566095e2a82SHisping Lin 
1567095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
156899830019SHisping Lin 					0,
1569095e2a82SHisping Lin 					&TeecOperation,
1570095e2a82SHisping Lin 					&ErrorOrigin);
1571095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1572095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1573095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1574095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1575095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1576095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1577095e2a82SHisping Lin 	debug("testmm end\n");
1578095e2a82SHisping Lin 
1579095e2a82SHisping Lin 	return TeecResult;
1580095e2a82SHisping Lin }
1581095e2a82SHisping Lin 
1582095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1583095e2a82SHisping Lin {
1584095e2a82SHisping Lin 	TEEC_Result TeecResult;
1585095e2a82SHisping Lin 	TEEC_Context TeecContext;
1586095e2a82SHisping Lin 	TEEC_Session TeecSession;
1587095e2a82SHisping Lin 	uint32_t ErrorOrigin;
158899830019SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
158999830019SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
1590095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1591095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
15923251364cSHisping Lin 	struct blk_desc *dev_desc;
15933251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15946651d4c0SJason Zhu 	if (!dev_desc) {
15956651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15966651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15976651d4c0SJason Zhu 	}
1598095e2a82SHisping Lin 
1599095e2a82SHisping Lin 	debug("testmm start\n");
1600095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1601095e2a82SHisping Lin 
1602095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1603095e2a82SHisping Lin 
16043251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16053251364cSHisping Lin 						TEEC_NONE,
16063251364cSHisping Lin 						TEEC_NONE,
16073251364cSHisping Lin 						TEEC_NONE);
16083251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16093251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16113251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16123251364cSHisping Lin #endif
16133251364cSHisping Lin 
1614095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1615095e2a82SHisping Lin 				&TeecSession,
1616095e2a82SHisping Lin 				TeecUuid,
1617095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1618095e2a82SHisping Lin 				NULL,
16193251364cSHisping Lin 				&TeecOperation,
1620095e2a82SHisping Lin 				&ErrorOrigin);
1621095e2a82SHisping Lin 
1622095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1623095e2a82SHisping Lin 
1624095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1625095e2a82SHisping Lin 	SharedMem0.flags = 0;
1626095e2a82SHisping Lin 
1627095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1628095e2a82SHisping Lin 
1629095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1630095e2a82SHisping Lin 
1631095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1632095e2a82SHisping Lin 
1633095e2a82SHisping Lin 	SharedMem1.size = 1;
1634095e2a82SHisping Lin 	SharedMem1.flags = 0;
1635095e2a82SHisping Lin 
1636095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1637095e2a82SHisping Lin 
1638095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1639095e2a82SHisping Lin 
1640095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1641095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1642095e2a82SHisping Lin 
1643095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1644095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1645095e2a82SHisping Lin 
1646095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1647095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1648095e2a82SHisping Lin 						TEEC_NONE,
1649095e2a82SHisping Lin 						TEEC_NONE);
1650095e2a82SHisping Lin 
1651095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
165299830019SHisping Lin 					1,
1653095e2a82SHisping Lin 					&TeecOperation,
1654095e2a82SHisping Lin 					&ErrorOrigin);
1655095e2a82SHisping Lin 
1656095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1657095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1658095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1659095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1660095e2a82SHisping Lin 	debug("testmm end\n");
1661095e2a82SHisping Lin 
1662095e2a82SHisping Lin 	return TeecResult;
1663095e2a82SHisping Lin }
16644aa61755SAndy Ye 
16654aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
16664aa61755SAndy Ye {
16674aa61755SAndy Ye 	TEEC_Result TeecResult;
16684aa61755SAndy Ye 	TEEC_Context TeecContext;
16694aa61755SAndy Ye 	TEEC_Session TeecSession;
16704aa61755SAndy Ye 	uint32_t ErrorOrigin;
16714aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16724aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16734aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16744aa61755SAndy Ye 				}
16754aa61755SAndy Ye 			     };
16764aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16774aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16783251364cSHisping Lin 	struct blk_desc *dev_desc;
16793251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16806651d4c0SJason Zhu 	if (!dev_desc) {
16816651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
16826651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
16836651d4c0SJason Zhu 	}
16844aa61755SAndy Ye 
16854aa61755SAndy Ye 	OpteeClientApiLibInitialize();
16864aa61755SAndy Ye 
16874aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16884aa61755SAndy Ye 
16893251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16903251364cSHisping Lin 						TEEC_NONE,
16913251364cSHisping Lin 						TEEC_NONE,
16923251364cSHisping Lin 						TEEC_NONE);
16933251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
16943251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
16953251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16963251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16973251364cSHisping Lin #endif
16983251364cSHisping Lin 
16994aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17004aa61755SAndy Ye 				      &TeecSession,
17014aa61755SAndy Ye 				      TeecUuid,
17024aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17034aa61755SAndy Ye 				      NULL,
17043251364cSHisping Lin 					&TeecOperation,
17054aa61755SAndy Ye 				      &ErrorOrigin);
17064aa61755SAndy Ye 
17074aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17084aa61755SAndy Ye 
17094aa61755SAndy Ye 	SharedMem0.size = *dh_size;
17104aa61755SAndy Ye 	SharedMem0.flags = 0;
17114aa61755SAndy Ye 
17124aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17134aa61755SAndy Ye 
17144aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17154aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17164aa61755SAndy Ye 
17174aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17184aa61755SAndy Ye 						    TEEC_NONE,
17194aa61755SAndy Ye 						    TEEC_NONE,
17204aa61755SAndy Ye 						    TEEC_NONE);
17214aa61755SAndy Ye 
17224aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17234aa61755SAndy Ye 					143,
17244aa61755SAndy Ye 					&TeecOperation,
17254aa61755SAndy Ye 					&ErrorOrigin);
17264aa61755SAndy Ye 
17274aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
17284aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
17294aa61755SAndy Ye 
17304aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17314aa61755SAndy Ye 
17324aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
17334aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
17344aa61755SAndy Ye 
17354aa61755SAndy Ye 	return TeecResult;
17364aa61755SAndy Ye }
17374aa61755SAndy Ye 
17384aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
17394aa61755SAndy Ye {
17404aa61755SAndy Ye 	TEEC_Result TeecResult;
17414aa61755SAndy Ye 	TEEC_Context TeecContext;
17424aa61755SAndy Ye 	TEEC_Session TeecSession;
17434aa61755SAndy Ye 	uint32_t ErrorOrigin;
17444aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17454aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17464aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17474aa61755SAndy Ye 				}
17484aa61755SAndy Ye 			     };
17494aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17504aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17513251364cSHisping Lin 	struct blk_desc *dev_desc;
17523251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17536651d4c0SJason Zhu 	if (!dev_desc) {
17546651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17556651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17566651d4c0SJason Zhu 	}
17574aa61755SAndy Ye 
17584aa61755SAndy Ye 	OpteeClientApiLibInitialize();
17594aa61755SAndy Ye 
17604aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
17614aa61755SAndy Ye 
17623251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17633251364cSHisping Lin 						TEEC_NONE,
17643251364cSHisping Lin 						TEEC_NONE,
17653251364cSHisping Lin 						TEEC_NONE);
17663251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
17673251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
17683251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17693251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17703251364cSHisping Lin #endif
17713251364cSHisping Lin 
17724aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17734aa61755SAndy Ye 				      &TeecSession,
17744aa61755SAndy Ye 				      TeecUuid,
17754aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17764aa61755SAndy Ye 				      NULL,
17773251364cSHisping Lin 					&TeecOperation,
17784aa61755SAndy Ye 				      &ErrorOrigin);
17794aa61755SAndy Ye 
17804aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17814aa61755SAndy Ye 
17824aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
17834aa61755SAndy Ye 	SharedMem0.flags = 0;
17844aa61755SAndy Ye 
17854aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17864aa61755SAndy Ye 
17874aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17884aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17894aa61755SAndy Ye 
17904aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17914aa61755SAndy Ye 						    TEEC_NONE,
17924aa61755SAndy Ye 						    TEEC_NONE,
17934aa61755SAndy Ye 						    TEEC_NONE);
17944aa61755SAndy Ye 
17954aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17964aa61755SAndy Ye 					144,
17974aa61755SAndy Ye 					&TeecOperation,
17984aa61755SAndy Ye 					&ErrorOrigin);
17994aa61755SAndy Ye 
18004aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
18014aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
18024aa61755SAndy Ye 
18034aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18044aa61755SAndy Ye 
18054aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
18064aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
18074aa61755SAndy Ye 
18084aa61755SAndy Ye 	return TeecResult;
18094aa61755SAndy Ye }
18104aa61755SAndy Ye 
18114aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
18124aa61755SAndy Ye 			      uint32_t *operation_size,
18134aa61755SAndy Ye 			      uint8_t *out,
18144aa61755SAndy Ye 			      uint32_t *out_len)
18154aa61755SAndy Ye {
18164aa61755SAndy Ye 	TEEC_Result TeecResult;
18174aa61755SAndy Ye 	TEEC_Context TeecContext;
18184aa61755SAndy Ye 	TEEC_Session TeecSession;
18194aa61755SAndy Ye 	uint32_t ErrorOrigin;
18204aa61755SAndy Ye 
18214aa61755SAndy Ye 	OpteeClientApiLibInitialize();
18224aa61755SAndy Ye 
18234aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18244aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18254aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
18264aa61755SAndy Ye 				}
18274aa61755SAndy Ye 			     };
18284aa61755SAndy Ye 
18294aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
18304aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
18313251364cSHisping Lin 	struct blk_desc *dev_desc;
18323251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
18336651d4c0SJason Zhu 	if (!dev_desc) {
18346651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
18356651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
18366651d4c0SJason Zhu 	}
18374aa61755SAndy Ye 
18384aa61755SAndy Ye 	OpteeClientApiLibInitialize();
18394aa61755SAndy Ye 
18404aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
18414aa61755SAndy Ye 
18423251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
18433251364cSHisping Lin 						TEEC_NONE,
18443251364cSHisping Lin 						TEEC_NONE,
18453251364cSHisping Lin 						TEEC_NONE);
18463251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
18473251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
18483251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
18493251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
18503251364cSHisping Lin #endif
18513251364cSHisping Lin 
18524aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
18534aa61755SAndy Ye 				      &TeecSession,
18544aa61755SAndy Ye 				      TeecUuid,
18554aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
18564aa61755SAndy Ye 				      NULL,
18573251364cSHisping Lin 					&TeecOperation,
18584aa61755SAndy Ye 				      &ErrorOrigin);
18594aa61755SAndy Ye 
18604aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
18614aa61755SAndy Ye 
18624aa61755SAndy Ye 	SharedMem0.size = *operation_size;
18634aa61755SAndy Ye 	SharedMem0.flags = 0;
18644aa61755SAndy Ye 
18654aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
18664aa61755SAndy Ye 
18674aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
18684aa61755SAndy Ye 
18694aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18704aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18714aa61755SAndy Ye 
18724aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
18734aa61755SAndy Ye 
18744aa61755SAndy Ye 	SharedMem1.size = *out_len;
18754aa61755SAndy Ye 	SharedMem1.flags = 0;
18764aa61755SAndy Ye 
18774aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
18784aa61755SAndy Ye 
18794aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
18804aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
18814aa61755SAndy Ye 
18824aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
18834aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
18844aa61755SAndy Ye 						    TEEC_NONE,
18854aa61755SAndy Ye 						    TEEC_NONE);
18864aa61755SAndy Ye 
18874aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18884aa61755SAndy Ye 					145,
18894aa61755SAndy Ye 					&TeecOperation,
18904aa61755SAndy Ye 					&ErrorOrigin);
18914aa61755SAndy Ye 
18924aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
18934aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
18944aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18954aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
18964aa61755SAndy Ye 
18974aa61755SAndy Ye 	return TeecResult;
18984aa61755SAndy Ye }
18994aa61755SAndy Ye 
19004aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
19014aa61755SAndy Ye {
19024aa61755SAndy Ye 	TEEC_Result TeecResult;
19034aa61755SAndy Ye 	TEEC_Context TeecContext;
19044aa61755SAndy Ye 	TEEC_Session TeecSession;
19054aa61755SAndy Ye 	uint32_t ErrorOrigin;
19064aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
19074aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
19084aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
19094aa61755SAndy Ye 				}
19104aa61755SAndy Ye 			     };
19114aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
19124aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
19133251364cSHisping Lin 	struct blk_desc *dev_desc;
19143251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
19156651d4c0SJason Zhu 	if (!dev_desc) {
19166651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
19176651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
19186651d4c0SJason Zhu 	}
19194aa61755SAndy Ye 
19204aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
19214aa61755SAndy Ye 
19223251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
19233251364cSHisping Lin 						TEEC_NONE,
19243251364cSHisping Lin 						TEEC_NONE,
19253251364cSHisping Lin 						TEEC_NONE);
19263251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
19273251364cSHisping Lin 	TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
19283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
19293251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
19303251364cSHisping Lin #endif
19313251364cSHisping Lin 
19324aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
19334aa61755SAndy Ye 					&TeecSession,
19344aa61755SAndy Ye 					TeecUuid,
19354aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
19364aa61755SAndy Ye 					NULL,
19373251364cSHisping Lin 					&TeecOperation,
19384aa61755SAndy Ye 					&ErrorOrigin);
19394aa61755SAndy Ye 
19404aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
19414aa61755SAndy Ye 
19424aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
19434aa61755SAndy Ye 	SharedMem0.flags = 0;
19444aa61755SAndy Ye 
19454aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
19464aa61755SAndy Ye 
19474aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
19484aa61755SAndy Ye 
19494aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
19504aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
19514aa61755SAndy Ye 
19524aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
19534aa61755SAndy Ye 						    TEEC_NONE,
19544aa61755SAndy Ye 						    TEEC_NONE,
19554aa61755SAndy Ye 						    TEEC_NONE);
19564aa61755SAndy Ye 
19574aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
19584aa61755SAndy Ye 					146,
19594aa61755SAndy Ye 					&TeecOperation,
19604aa61755SAndy Ye 					&ErrorOrigin);
19614aa61755SAndy Ye 
19624aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
19634aa61755SAndy Ye 
19644aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
19654aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
19664aa61755SAndy Ye 
19674aa61755SAndy Ye 	return TeecResult;
19684aa61755SAndy Ye }
196978ef5fbdSqiujian 
197078ef5fbdSqiujian TEEC_Result trusty_write_oem_unlock(uint8_t unlock)
197178ef5fbdSqiujian {
197278ef5fbdSqiujian 	char *file = "oem.unlock";
197378ef5fbdSqiujian 	TEEC_Result ret;
197478ef5fbdSqiujian 
197578ef5fbdSqiujian 	ret = write_to_keymaster((uint8_t *)file, strlen(file),
197678ef5fbdSqiujian 		(uint8_t *)&unlock, 1);
197778ef5fbdSqiujian 	return ret;
197878ef5fbdSqiujian }
197978ef5fbdSqiujian 
198078ef5fbdSqiujian TEEC_Result trusty_read_oem_unlock(uint8_t *unlock)
198178ef5fbdSqiujian {
198278ef5fbdSqiujian 	char *file = "oem.unlock";
198378ef5fbdSqiujian 	TEEC_Result ret;
198478ef5fbdSqiujian 
198578ef5fbdSqiujian 	ret = read_from_keymaster((uint8_t *)file, strlen(file),
198678ef5fbdSqiujian 		unlock, 1);
198778ef5fbdSqiujian 
198878ef5fbdSqiujian 	if (ret == TEE_ERROR_ITEM_NOT_FOUND) {
198978ef5fbdSqiujian 		debug("init oem unlock status 0");
199078ef5fbdSqiujian 		ret = trusty_write_oem_unlock(0);
199178ef5fbdSqiujian 	}
199278ef5fbdSqiujian 
199378ef5fbdSqiujian 	return ret;
199478ef5fbdSqiujian }
1995