xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 1ac64e8a779022d78d6ab5682dc31104a26aee29)
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>
9bb1ba6acSHisping Lin #include <optee_include/OpteeClientInterface.h>
10ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h>
11ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h>
1278ef5fbdSqiujian #include <optee_include/tee_api_defines.h>
133251364cSHisping Lin #include <boot_rkimg.h>
14a7df4868Stony.xu #include <stdlib.h>
151e8c0e44STony Xu #include <attestation_key.h>
16a7df4868Stony.xu 
17a7df4868Stony.xu #define	BOOT_FROM_EMMC	(1 << 1)
18c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH		0
19c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH	1
20c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP		2
21c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH		3
22c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH		4
23c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG		5
241ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY	9
25fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG	10
26f39d4289SHisping Lin #define STORAGE_CMD_WRITE_OEM_HUK		11
27d5913350SHisping Lin #define STORAGE_CMD_WRITE_OEM_NS_OTP		12
28d5913350SHisping Lin #define STORAGE_CMD_READ_OEM_NS_OTP		13
2990e849a0Sxb.wang #define STORAGE_CMD_WRITE_OEM_OTP_KEY		14
30a405238aSHisping Lin #define STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK	15
319deb34f6SHisping Lin #define STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN	16
3210f41197SHisping Lin #define STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN	20
33a828eba9SHisping Lin #define STORAGE_CMD_WRITE_OEM_HDCP_KEY	21
34e8bc2655SHisping Lin #define STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN	22
35bfd9cea4SHisping Lin #define STORAGE_CMD_SET_OEM_HDCP_KEY_MASK	23
36*1ac64e8aSHisping Lin #define STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA	24
37ae8ec5e1SHisping Lin 
382f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER	0x00000002
39fc3694d6Sxb.wang 
40fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID	{ 0x0cacdb5d, 0x4fea, 0x466c, \
41fc3694d6Sxb.wang 		{ 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } }
42fc3694d6Sxb.wang 
43ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
44ae8ec5e1SHisping Lin {
45ae8ec5e1SHisping Lin 	if (in > 9)
46ae8ec5e1SHisping Lin 		return in + 55;
47ae8ec5e1SHisping Lin 	else
48ae8ec5e1SHisping Lin 		return in + 48;
49ae8ec5e1SHisping Lin }
50ae8ec5e1SHisping Lin 
51c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
52ae8ec5e1SHisping Lin {
53ae8ec5e1SHisping Lin 	uint32_t i = 0;
54ae8ec5e1SHisping Lin 
55ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
56ae8ec5e1SHisping Lin 		return 0;
57ae8ec5e1SHisping Lin 
58ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
59ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
60ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
61ae8ec5e1SHisping Lin 	}
62ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
63ae8ec5e1SHisping Lin 
64ae8ec5e1SHisping Lin 	return blen * 2;
65ae8ec5e1SHisping Lin }
66ae8ec5e1SHisping Lin 
672f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size)
682f8c34bdSxb.wang {
692f8c34bdSxb.wang 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
702f8c34bdSxb.wang 	ulong aligned_input, aligned_len;
712f8c34bdSxb.wang 
722f8c34bdSxb.wang 	if (!addr || !size)
732f8c34bdSxb.wang 		return;
742f8c34bdSxb.wang 
752f8c34bdSxb.wang 	/* Must flush dcache before crypto DMA fetch data region */
762f8c34bdSxb.wang 	aligned_input = round_down(addr, alignment);
772f8c34bdSxb.wang 	aligned_len = round_up(size + (addr - aligned_input), alignment);
782f8c34bdSxb.wang 	flush_cache(aligned_input, aligned_len);
792f8c34bdSxb.wang }
802f8c34bdSxb.wang 
81a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
82a900eef3SHisping Lin {
83a900eef3SHisping Lin 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
84a900eef3SHisping Lin 	ulong aligned_input, aligned_len;
85a900eef3SHisping Lin 
86a900eef3SHisping Lin 	if (!addr || !size)
87a900eef3SHisping Lin 		return;
88a900eef3SHisping Lin 
89a900eef3SHisping Lin 	/* Must invalidate dcache after crypto DMA write data region */
90a900eef3SHisping Lin 	aligned_input = round_down(addr, alignment);
91a900eef3SHisping Lin 	aligned_len = round_up(size + (addr - aligned_input), alignment);
92a900eef3SHisping Lin 	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
93a900eef3SHisping Lin }
94a900eef3SHisping Lin 
95c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
96c7de5349SHisping Lin 						uint32_t filename_size,
97c7de5349SHisping Lin 						uint8_t *data,
98c7de5349SHisping Lin 						uint32_t data_size)
99ae8ec5e1SHisping Lin {
100ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
101ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
102ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
103ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
104ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
105ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
106ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
107ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1083251364cSHisping Lin 	struct blk_desc *dev_desc;
1093251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1106651d4c0SJason Zhu 	if (!dev_desc) {
1116651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1126651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1136651d4c0SJason Zhu 	}
1143251364cSHisping Lin 
115f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
116f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
117f4e1db95SHisping Lin 		return TeecResult;
118ae8ec5e1SHisping Lin 
119ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
120f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
121f4e1db95SHisping Lin 		return TeecResult;
122ae8ec5e1SHisping Lin 
1233251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1243251364cSHisping Lin 						    TEEC_NONE,
1253251364cSHisping Lin 						    TEEC_NONE,
1263251364cSHisping Lin 						    TEEC_NONE);
1273251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
128b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
129b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
130b9a7e756SHisping Lin 	else
131b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1323251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1333251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1343251364cSHisping Lin #endif
1353251364cSHisping Lin 
136ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
137ae8ec5e1SHisping Lin 				&TeecSession,
138ae8ec5e1SHisping Lin 				TeecUuid,
139ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
140ae8ec5e1SHisping Lin 				NULL,
1413251364cSHisping Lin 				&TeecOperation,
142ae8ec5e1SHisping Lin 				&ErrorOrigin);
143f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
144f4e1db95SHisping Lin 		return TeecResult;
145ae8ec5e1SHisping Lin 
146ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
147ae8ec5e1SHisping Lin 
148c7de5349SHisping Lin 	SharedMem0.size = filename_size;
149ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
150ae8ec5e1SHisping Lin 
151ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
152f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
153f4e1db95SHisping Lin 		goto exit;
154ae8ec5e1SHisping Lin 
155c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
156ae8ec5e1SHisping Lin 
157ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
158ae8ec5e1SHisping Lin 
159c7de5349SHisping Lin 	SharedMem1.size = data_size;
160c7de5349SHisping Lin 	SharedMem1.flags = 0;
161c7de5349SHisping Lin 
162c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
163c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
164c7de5349SHisping Lin 		goto exit;
165c7de5349SHisping Lin 
166c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
167c7de5349SHisping Lin 
168c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
169c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
170c7de5349SHisping Lin 
171c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
172c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
173c7de5349SHisping Lin 
174c7de5349SHisping Lin 
175c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
176c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
177c7de5349SHisping Lin 						TEEC_NONE,
178c7de5349SHisping Lin 						TEEC_NONE);
179c7de5349SHisping Lin 
180c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
181c7de5349SHisping Lin 					1,
182c7de5349SHisping Lin 					&TeecOperation,
183c7de5349SHisping Lin 					&ErrorOrigin);
184c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
185c7de5349SHisping Lin 		goto exit;
186c7de5349SHisping Lin exit:
187c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
188c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
189c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
190c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
191c7de5349SHisping Lin 
192c7de5349SHisping Lin 	return TeecResult;
193c7de5349SHisping Lin }
194c7de5349SHisping Lin 
195c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
196c7de5349SHisping Lin 					       uint32_t filename_size,
197c7de5349SHisping Lin 					       uint8_t *data,
198c7de5349SHisping Lin 					       uint32_t data_size)
199c7de5349SHisping Lin {
200c7de5349SHisping Lin 	TEEC_Result TeecResult;
201c7de5349SHisping Lin 	TEEC_Context TeecContext;
202c7de5349SHisping Lin 	TEEC_Session TeecSession;
203c7de5349SHisping Lin 	uint32_t ErrorOrigin;
204c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
205c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
206c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
207c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
208c7de5349SHisping Lin 
209c7de5349SHisping Lin 	struct blk_desc *dev_desc;
210c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
211c7de5349SHisping Lin 	if (!dev_desc) {
212c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
213c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
214c7de5349SHisping Lin 	}
215c7de5349SHisping Lin 
216c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
217c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
218c7de5349SHisping Lin 		return TeecResult;
219c7de5349SHisping Lin 
220c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
221c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
222c7de5349SHisping Lin 		return TeecResult;
223c7de5349SHisping Lin 
224c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
225c7de5349SHisping Lin 						TEEC_NONE,
226c7de5349SHisping Lin 						TEEC_NONE,
227c7de5349SHisping Lin 						TEEC_NONE);
228c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
229c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
230c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
231c7de5349SHisping Lin 	else
232c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
233c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
234c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
235c7de5349SHisping Lin #endif
236c7de5349SHisping Lin 
237c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
238c7de5349SHisping Lin 				&TeecSession,
239c7de5349SHisping Lin 				TeecUuid,
240c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
241c7de5349SHisping Lin 				NULL,
242c7de5349SHisping Lin 				&TeecOperation,
243c7de5349SHisping Lin 				&ErrorOrigin);
244c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
245c7de5349SHisping Lin 		return TeecResult;
246c7de5349SHisping Lin 
247c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
248c7de5349SHisping Lin 
249c7de5349SHisping Lin 	SharedMem0.size = filename_size;
250c7de5349SHisping Lin 	SharedMem0.flags = 0;
251c7de5349SHisping Lin 
252c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
253c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
254c7de5349SHisping Lin 		goto exit;
255c7de5349SHisping Lin 
256c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
257c7de5349SHisping Lin 
258c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
259c7de5349SHisping Lin 
260c7de5349SHisping Lin 	SharedMem1.size = data_size;
261ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
262ae8ec5e1SHisping Lin 
263ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
264f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
265f4e1db95SHisping Lin 		goto exit;
266ae8ec5e1SHisping Lin 
267ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
268ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
269ae8ec5e1SHisping Lin 
270ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
271ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
274ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
275ae8ec5e1SHisping Lin 						TEEC_NONE,
276ae8ec5e1SHisping Lin 						TEEC_NONE);
277ae8ec5e1SHisping Lin 
278ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
279ae8ec5e1SHisping Lin 					0,
280ae8ec5e1SHisping Lin 					&TeecOperation,
281ae8ec5e1SHisping Lin 					&ErrorOrigin);
28246b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
283c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
284f4e1db95SHisping Lin exit:
285ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
286ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
287ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
28846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
289ae8ec5e1SHisping Lin 
290ae8ec5e1SHisping Lin 	return TeecResult;
291ae8ec5e1SHisping Lin }
292ae8ec5e1SHisping Lin 
293c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
294c7de5349SHisping Lin {
295c7de5349SHisping Lin 	TEEC_Result TeecResult;
296c7de5349SHisping Lin 	TEEC_Context TeecContext;
297c7de5349SHisping Lin 	TEEC_Session TeecSession;
298c7de5349SHisping Lin 	uint32_t ErrorOrigin;
299c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
300c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
301c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
302c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
303c7de5349SHisping Lin 
304c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
305c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
306c7de5349SHisping Lin 		return TeecResult;
307c7de5349SHisping Lin 
308c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
309c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
310c7de5349SHisping Lin 		return TeecResult;
311c7de5349SHisping Lin 
312c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
313c7de5349SHisping Lin 				&TeecSession,
314c7de5349SHisping Lin 				TeecUuid,
315c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
316c7de5349SHisping Lin 				NULL,
317c7de5349SHisping Lin 				NULL,
318c7de5349SHisping Lin 				&ErrorOrigin);
319c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
320c7de5349SHisping Lin 		return TeecResult;
321c7de5349SHisping Lin 
322c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
323c7de5349SHisping Lin 						    TEEC_NONE,
324c7de5349SHisping Lin 						    TEEC_NONE,
325c7de5349SHisping Lin 						    TEEC_NONE);
326c7de5349SHisping Lin 
327c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
328c7de5349SHisping Lin 					2,
329c7de5349SHisping Lin 					&TeecOperation,
330c7de5349SHisping Lin 					&ErrorOrigin);
331c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
332c7de5349SHisping Lin 		goto exit;
333c7de5349SHisping Lin exit:
334c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
335c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
336c7de5349SHisping Lin 
337c7de5349SHisping Lin 	return TeecResult;
338c7de5349SHisping Lin }
339c7de5349SHisping Lin 
34034f2e8f6SHisping Lin static void trusty_notify_always_use_security(void)
34134f2e8f6SHisping Lin {
34234f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION)
34334f2e8f6SHisping Lin 	TEEC_Result TeecResult;
34434f2e8f6SHisping Lin 	TEEC_Context TeecContext;
34534f2e8f6SHisping Lin 	TEEC_Session TeecSession;
34634f2e8f6SHisping Lin 	uint32_t ErrorOrigin;
34734f2e8f6SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
34834f2e8f6SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
34934f2e8f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
35034f2e8f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
35134f2e8f6SHisping Lin 
35234f2e8f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
35334f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
35434f2e8f6SHisping Lin 		return;
35534f2e8f6SHisping Lin 
35634f2e8f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
35734f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
35834f2e8f6SHisping Lin 		return;
35934f2e8f6SHisping Lin 
36034f2e8f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
36134f2e8f6SHisping Lin 				&TeecSession,
36234f2e8f6SHisping Lin 				TeecUuid,
36334f2e8f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
36434f2e8f6SHisping Lin 				NULL,
36534f2e8f6SHisping Lin 				NULL,
36634f2e8f6SHisping Lin 				&ErrorOrigin);
36734f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
36834f2e8f6SHisping Lin 		return;
36934f2e8f6SHisping Lin 
37034f2e8f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
37134f2e8f6SHisping Lin 						    TEEC_NONE,
37234f2e8f6SHisping Lin 						    TEEC_NONE,
37334f2e8f6SHisping Lin 						    TEEC_NONE);
37434f2e8f6SHisping Lin 
37534f2e8f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
37634f2e8f6SHisping Lin 					9,
37734f2e8f6SHisping Lin 					&TeecOperation,
37834f2e8f6SHisping Lin 					&ErrorOrigin);
37934f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
38034f2e8f6SHisping Lin 		debug("notify always use security fail! please update optee!");
38134f2e8f6SHisping Lin 
38234f2e8f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
38334f2e8f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
38434f2e8f6SHisping Lin 
38534f2e8f6SHisping Lin 	return;
38634f2e8f6SHisping Lin #endif
38734f2e8f6SHisping Lin }
38834f2e8f6SHisping Lin 
389c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
390c7de5349SHisping Lin {
391c7de5349SHisping Lin 	char hs[9];
392c7de5349SHisping Lin 
393c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
394c7de5349SHisping Lin 
395c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
396c7de5349SHisping Lin }
397c7de5349SHisping Lin 
398ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
399ae8ec5e1SHisping Lin {
400c7de5349SHisping Lin 	char hs[9];
4013251364cSHisping Lin 
402c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
403ae8ec5e1SHisping Lin 
404c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
405ae8ec5e1SHisping Lin }
406ae8ec5e1SHisping Lin 
407ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
408ae8ec5e1SHisping Lin {
409c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
410c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
411ae8ec5e1SHisping Lin }
412ae8ec5e1SHisping Lin 
413ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
414ae8ec5e1SHisping Lin {
415c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
416c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
4176651d4c0SJason Zhu }
418ae8ec5e1SHisping Lin 
419c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
420c7de5349SHisping Lin {
421c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
422c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
423c7de5349SHisping Lin }
424ae8ec5e1SHisping Lin 
425c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
426c7de5349SHisping Lin {
427c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
428c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
429ae8ec5e1SHisping Lin }
430ae8ec5e1SHisping Lin 
431564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
432564654ebSJason Zhu 					      uint32_t size)
433564654ebSJason Zhu {
434c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
435c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
436564654ebSJason Zhu }
437564654ebSJason Zhu 
438564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
439564654ebSJason Zhu 					       uint32_t size)
440564654ebSJason Zhu {
441c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
442c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
443564654ebSJason Zhu }
444564654ebSJason Zhu 
445ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
446ae8ec5e1SHisping Lin {
447c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
448c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
449ae8ec5e1SHisping Lin }
450ae8ec5e1SHisping Lin 
451ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
452ae8ec5e1SHisping Lin {
453c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
454c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
455ae8ec5e1SHisping Lin }
456ae8ec5e1SHisping Lin 
457ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
458ae8ec5e1SHisping Lin {
459c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
460c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
461c7de5349SHisping Lin }
462c7de5349SHisping Lin 
463c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
464c7de5349SHisping Lin {
465c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
466c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
467c7de5349SHisping Lin }
468c7de5349SHisping Lin 
469c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
470c7de5349SHisping Lin {
471ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
472ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
473ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
474ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
475c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
476c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
477c7de5349SHisping Lin 
478ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
479ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
480ae8ec5e1SHisping Lin 
481f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
482f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
483f4e1db95SHisping Lin 		return TeecResult;
484ae8ec5e1SHisping Lin 
485ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
486f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
487f4e1db95SHisping Lin 		return TeecResult;
488ae8ec5e1SHisping Lin 
489ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
490ae8ec5e1SHisping Lin 				      &TeecSession,
491ae8ec5e1SHisping Lin 				      TeecUuid,
492ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
493ae8ec5e1SHisping Lin 				      NULL,
494c7de5349SHisping Lin 				      NULL,
495ae8ec5e1SHisping Lin 				      &ErrorOrigin);
496f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
497f4e1db95SHisping Lin 		return TeecResult;
498ae8ec5e1SHisping Lin 
499c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
500c7de5349SHisping Lin 						    TEEC_NONE,
501ae8ec5e1SHisping Lin 						    TEEC_NONE,
502ae8ec5e1SHisping Lin 						    TEEC_NONE);
503ae8ec5e1SHisping Lin 
504ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
505c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
506ae8ec5e1SHisping Lin 					&TeecOperation,
507ae8ec5e1SHisping Lin 					&ErrorOrigin);
508c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
509c7de5349SHisping Lin 		goto exit;
510f4e1db95SHisping Lin exit:
511ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
51246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
513ae8ec5e1SHisping Lin 
514ae8ec5e1SHisping Lin 	return TeecResult;
515ae8ec5e1SHisping Lin }
516ae8ec5e1SHisping Lin 
517c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
518c7de5349SHisping Lin 						   uint8_t is_write,
519c7de5349SHisping Lin 						   uint32_t *buf,
520c7de5349SHisping Lin 						   uint32_t length)
521ae8ec5e1SHisping Lin {
522ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
523ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
524ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
525ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
526c7de5349SHisping Lin 
527c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
528c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
529ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
530ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
531ae8ec5e1SHisping Lin 
532f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
533f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
534f4e1db95SHisping Lin 		return TeecResult;
535ae8ec5e1SHisping Lin 
536ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
537f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
538f4e1db95SHisping Lin 		return TeecResult;
539ae8ec5e1SHisping Lin 
540ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
541ae8ec5e1SHisping Lin 				&TeecSession,
542ae8ec5e1SHisping Lin 				TeecUuid,
543ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
544ae8ec5e1SHisping Lin 				NULL,
545c7de5349SHisping Lin 				NULL,
546ae8ec5e1SHisping Lin 				&ErrorOrigin);
547f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
548f4e1db95SHisping Lin 		return TeecResult;
549ae8ec5e1SHisping Lin 
550ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
551ae8ec5e1SHisping Lin 
552c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
553ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
554ae8ec5e1SHisping Lin 
555ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
556f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
557f4e1db95SHisping Lin 		goto exit;
558ae8ec5e1SHisping Lin 
559ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
560ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
561ae8ec5e1SHisping Lin 
562c7de5349SHisping Lin 	if (is_write) {
563c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
564ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
565c7de5349SHisping Lin 							    TEEC_NONE,
566ae8ec5e1SHisping Lin 							    TEEC_NONE,
567ae8ec5e1SHisping Lin 							    TEEC_NONE);
568ae8ec5e1SHisping Lin 
569c7de5349SHisping Lin 	} else {
570c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
571c7de5349SHisping Lin 							    TEEC_NONE,
572c7de5349SHisping Lin 							    TEEC_NONE,
573c7de5349SHisping Lin 							    TEEC_NONE);
574c7de5349SHisping Lin 	}
575c7de5349SHisping Lin 
576ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
577c7de5349SHisping Lin 					cmd,
578ae8ec5e1SHisping Lin 					&TeecOperation,
579ae8ec5e1SHisping Lin 					&ErrorOrigin);
580f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
581f4e1db95SHisping Lin 		goto exit;
582c7de5349SHisping Lin 
583c7de5349SHisping Lin 	if (!is_write)
584c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
585c7de5349SHisping Lin 
586f4e1db95SHisping Lin exit:
587ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
588ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
58946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
590ae8ec5e1SHisping Lin 
591ae8ec5e1SHisping Lin 	return TeecResult;
592ae8ec5e1SHisping Lin }
593ae8ec5e1SHisping Lin 
5946ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5956ef445a4SHisping Lin {
596c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
597c7de5349SHisping Lin 						  false, buf, length);
5986ef445a4SHisping Lin }
5996ef445a4SHisping Lin 
6006ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
6016ef445a4SHisping Lin {
602c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
603c7de5349SHisping Lin 						  true, buf, length);
60416539616SHisping Lin }
60516539616SHisping Lin 
60616539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
60716539616SHisping Lin {
60816539616SHisping Lin 	TEEC_Result res;
609c7de5349SHisping Lin 
610c7de5349SHisping Lin 	res = trusty_base_end_security_data();
611c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
61216539616SHisping Lin 	return res;
61316539616SHisping Lin }
6142cd27853SHisping Lin 
6152cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
6162cd27853SHisping Lin {
617c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
618c7de5349SHisping Lin 						  false, buf, length);
6192cd27853SHisping Lin }
620c7de5349SHisping Lin 
6212cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
6222cd27853SHisping Lin {
623c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
624c7de5349SHisping Lin 						  true, buf, length);
6252cd27853SHisping Lin }
626095e2a82SHisping Lin 
627468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
628468df3b2SHisping Lin {
629468df3b2SHisping Lin 	uint32_t bootflag;
630c7de5349SHisping Lin 	TEEC_Result TeecResult;
631468df3b2SHisping Lin 
632f07e1686SHisping Lin 	*flag = 0;
633f07e1686SHisping Lin 
634c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
635c7de5349SHisping Lin 							false, &bootflag, 1);
636468df3b2SHisping Lin 
637468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
6380202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
6390202ee8aSHisping Lin 		if (bootflag == 0x00000001)
6400202ee8aSHisping Lin 			*flag = 1;
6410202ee8aSHisping Lin #else
642468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
643468df3b2SHisping Lin 			*flag = 1;
6440202ee8aSHisping Lin #endif
645468df3b2SHisping Lin 	}
646095e2a82SHisping Lin 	return TeecResult;
647095e2a82SHisping Lin }
6484aa61755SAndy Ye 
6491ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
6501ef63c75SHisping Lin {
6511ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
6521ef63c75SHisping Lin 						  true, buf, length);
6531ef63c75SHisping Lin }
6541ef63c75SHisping Lin 
65510f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value)
65610f41197SHisping Lin {
65710f41197SHisping Lin 	TEEC_Result TeecResult;
65810f41197SHisping Lin 	TEEC_Context TeecContext;
65910f41197SHisping Lin 	TEEC_Session TeecSession;
66010f41197SHisping Lin 	uint32_t ErrorOrigin;
66110f41197SHisping Lin 
66210f41197SHisping Lin 	*value = 0;
66310f41197SHisping Lin 
66410f41197SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
66510f41197SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
66610f41197SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
66710f41197SHisping Lin 	TEEC_Operation TeecOperation = {0};
66810f41197SHisping Lin 
66910f41197SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
67010f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
67110f41197SHisping Lin 		return TeecResult;
67210f41197SHisping Lin 
67310f41197SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
67410f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
67510f41197SHisping Lin 		return TeecResult;
67610f41197SHisping Lin 
67710f41197SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
67810f41197SHisping Lin 				&TeecSession,
67910f41197SHisping Lin 				TeecUuid,
68010f41197SHisping Lin 				TEEC_LOGIN_PUBLIC,
68110f41197SHisping Lin 				NULL,
68210f41197SHisping Lin 				NULL,
68310f41197SHisping Lin 				&ErrorOrigin);
68410f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
68510f41197SHisping Lin 		return TeecResult;
68610f41197SHisping Lin 
68710f41197SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
68810f41197SHisping Lin 						    TEEC_NONE,
68910f41197SHisping Lin 						    TEEC_NONE,
69010f41197SHisping Lin 						    TEEC_NONE);
69110f41197SHisping Lin 
69210f41197SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
69310f41197SHisping Lin 					STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN,
69410f41197SHisping Lin 					&TeecOperation,
69510f41197SHisping Lin 					&ErrorOrigin);
69610f41197SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
69710f41197SHisping Lin 		*value = TeecOperation.params[0].value.a;
69810f41197SHisping Lin 
69910f41197SHisping Lin 	TEEC_CloseSession(&TeecSession);
70010f41197SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
70110f41197SHisping Lin 
70210f41197SHisping Lin 	return TeecResult;
70310f41197SHisping Lin }
70410f41197SHisping Lin 
705*1ac64e8aSHisping Lin uint32_t trusty_write_oem_encrypt_data(uint32_t *buf, uint32_t length)
706*1ac64e8aSHisping Lin {
707*1ac64e8aSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA,
708*1ac64e8aSHisping Lin 						  true, buf, length);
709*1ac64e8aSHisping Lin }
710*1ac64e8aSHisping Lin 
711fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
712fbf29bfbSHisping Lin {
713fbf29bfbSHisping Lin 	uint32_t levelflag;
714fbf29bfbSHisping Lin 
715fbf29bfbSHisping Lin 	levelflag = flag;
716fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
717fbf29bfbSHisping Lin 						  true, &levelflag, 1);
718fbf29bfbSHisping Lin }
719fbf29bfbSHisping Lin 
720f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
721f39d4289SHisping Lin {
722f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
723f39d4289SHisping Lin 						  true, buf, length);
724f39d4289SHisping Lin }
725f39d4289SHisping Lin 
72634f2e8f6SHisping Lin static void trusty_select_security_level(void)
7277504da74SHisping Lin {
7287504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
7297504da74SHisping Lin 	TEEC_Result TeecResult;
7307504da74SHisping Lin 
7317504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
7327504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
7337504da74SHisping Lin 		run_command("download", 0);
7347504da74SHisping Lin 		return;
7357504da74SHisping Lin 	}
7367504da74SHisping Lin 
7377504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
7387504da74SHisping Lin 		debug("optee select security level success!");
7397504da74SHisping Lin 	else
7407504da74SHisping Lin 		panic("optee select security level fail!");
7417504da74SHisping Lin 
7427504da74SHisping Lin 	return;
7437504da74SHisping Lin #endif
7447504da74SHisping Lin }
7457504da74SHisping Lin 
74651ac7005SHisping Lin void optee_client_init(void)
74751ac7005SHisping Lin {
74851ac7005SHisping Lin 	trusty_select_security_level();
74934f2e8f6SHisping Lin 	trusty_notify_always_use_security();
75051ac7005SHisping Lin }
75151ac7005SHisping Lin 
752d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
753d5913350SHisping Lin {
754d5913350SHisping Lin 	TEEC_Result TeecResult;
755d5913350SHisping Lin 	TEEC_Context TeecContext;
756d5913350SHisping Lin 	TEEC_Session TeecSession;
757d5913350SHisping Lin 	uint32_t ErrorOrigin;
758d5913350SHisping Lin 
759d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
760d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
761d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
762d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
763d5913350SHisping Lin 
764d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
765d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
766d5913350SHisping Lin 		return TeecResult;
767d5913350SHisping Lin 
768d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
769d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
770d5913350SHisping Lin 		return TeecResult;
771d5913350SHisping Lin 
772d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
773d5913350SHisping Lin 				&TeecSession,
774d5913350SHisping Lin 				TeecUuid,
775d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
776d5913350SHisping Lin 				NULL,
777d5913350SHisping Lin 				NULL,
778d5913350SHisping Lin 				&ErrorOrigin);
779d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
780d5913350SHisping Lin 		return TeecResult;
781d5913350SHisping Lin 
782d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
783d5913350SHisping Lin 
784d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
785d5913350SHisping Lin 
786d5913350SHisping Lin 	SharedMem.size = byte_len;
787d5913350SHisping Lin 	SharedMem.flags = 0;
788d5913350SHisping Lin 
789d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
790d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
791d5913350SHisping Lin 		goto exit;
792d5913350SHisping Lin 
793d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
794d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
795d5913350SHisping Lin 
796d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
797d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
798d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
799d5913350SHisping Lin 						    TEEC_NONE,
800d5913350SHisping Lin 						    TEEC_NONE);
801d5913350SHisping Lin 
802d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
803d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
804d5913350SHisping Lin 					&TeecOperation,
805d5913350SHisping Lin 					&ErrorOrigin);
806d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
807d5913350SHisping Lin 		goto exit;
808d5913350SHisping Lin 
809d5913350SHisping Lin exit:
810d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
811d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
812d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
813d5913350SHisping Lin 
814d5913350SHisping Lin 	return TeecResult;
815d5913350SHisping Lin }
816d5913350SHisping Lin 
817d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
818d5913350SHisping Lin {
819d5913350SHisping Lin 	TEEC_Result TeecResult;
820d5913350SHisping Lin 	TEEC_Context TeecContext;
821d5913350SHisping Lin 	TEEC_Session TeecSession;
822d5913350SHisping Lin 	uint32_t ErrorOrigin;
823d5913350SHisping Lin 
824d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
825d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
826d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
827d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
828d5913350SHisping Lin 
829d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
830d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
831d5913350SHisping Lin 		return TeecResult;
832d5913350SHisping Lin 
833d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
834d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
835d5913350SHisping Lin 		return TeecResult;
836d5913350SHisping Lin 
837d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
838d5913350SHisping Lin 				&TeecSession,
839d5913350SHisping Lin 				TeecUuid,
840d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
841d5913350SHisping Lin 				NULL,
842d5913350SHisping Lin 				NULL,
843d5913350SHisping Lin 				&ErrorOrigin);
844d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
845d5913350SHisping Lin 		return TeecResult;
846d5913350SHisping Lin 
847d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
848d5913350SHisping Lin 
849d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
850d5913350SHisping Lin 
851d5913350SHisping Lin 	SharedMem.size = byte_len;
852d5913350SHisping Lin 	SharedMem.flags = 0;
853d5913350SHisping Lin 
854d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
855d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
856d5913350SHisping Lin 		goto exit;
857d5913350SHisping Lin 
858d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
859d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
860d5913350SHisping Lin 
861d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
862d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
863d5913350SHisping Lin 						    TEEC_NONE,
864d5913350SHisping Lin 						    TEEC_NONE);
865d5913350SHisping Lin 
866d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
867d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
868d5913350SHisping Lin 					&TeecOperation,
869d5913350SHisping Lin 					&ErrorOrigin);
870d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
871d5913350SHisping Lin 		goto exit;
872d5913350SHisping Lin 
873d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
874d5913350SHisping Lin 
875d5913350SHisping Lin exit:
876d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
877d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
878d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
879d5913350SHisping Lin 
880d5913350SHisping Lin 	return TeecResult;
881d5913350SHisping Lin }
882d5913350SHisping Lin 
88390e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,
884bb1ba6acSHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
885bb1ba6acSHisping Lin {
886bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
887bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
888bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
889bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
890bb1ba6acSHisping Lin 
891bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
892bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
893bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
894bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
895bb1ba6acSHisping Lin 
896bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
897bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
898bb1ba6acSHisping Lin 		return TeecResult;
899bb1ba6acSHisping Lin 
900bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
901bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
902bb1ba6acSHisping Lin 		return TeecResult;
903bb1ba6acSHisping Lin 
904bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
905bb1ba6acSHisping Lin 				&TeecSession,
906bb1ba6acSHisping Lin 				TeecUuid,
907bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
908bb1ba6acSHisping Lin 				NULL,
909bb1ba6acSHisping Lin 				NULL,
910bb1ba6acSHisping Lin 				&ErrorOrigin);
911bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
912bb1ba6acSHisping Lin 		return TeecResult;
913bb1ba6acSHisping Lin 
914bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
915bb1ba6acSHisping Lin 
916bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
917bb1ba6acSHisping Lin 
918bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
919bb1ba6acSHisping Lin 	SharedMem.flags = 0;
920bb1ba6acSHisping Lin 
921bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
922bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
923bb1ba6acSHisping Lin 		goto exit;
924bb1ba6acSHisping Lin 
925bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
926bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
927bb1ba6acSHisping Lin 
928bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
929bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
930bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
931bb1ba6acSHisping Lin 						    TEEC_NONE,
932bb1ba6acSHisping Lin 						    TEEC_NONE);
933bb1ba6acSHisping Lin 
934bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
93590e849a0Sxb.wang 					STORAGE_CMD_WRITE_OEM_OTP_KEY,
936bb1ba6acSHisping Lin 					&TeecOperation,
937bb1ba6acSHisping Lin 					&ErrorOrigin);
938bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
939bb1ba6acSHisping Lin 		goto exit;
940bb1ba6acSHisping Lin 
941bb1ba6acSHisping Lin exit:
942bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
943bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
944bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
945bb1ba6acSHisping Lin 
946bb1ba6acSHisping Lin 	return TeecResult;
947bb1ba6acSHisping Lin }
948bb1ba6acSHisping Lin 
9499deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value)
9509deb34f6SHisping Lin {
9519deb34f6SHisping Lin 	TEEC_Result TeecResult;
9529deb34f6SHisping Lin 	TEEC_Context TeecContext;
9539deb34f6SHisping Lin 	TEEC_Session TeecSession;
9549deb34f6SHisping Lin 	uint32_t ErrorOrigin;
9559deb34f6SHisping Lin 
9569deb34f6SHisping Lin 	*value = 0xFF;
9579deb34f6SHisping Lin 
9589deb34f6SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
9599deb34f6SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9609deb34f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9619deb34f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
9629deb34f6SHisping Lin 
9639deb34f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
9649deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9659deb34f6SHisping Lin 		return TeecResult;
9669deb34f6SHisping Lin 
9679deb34f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9689deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9699deb34f6SHisping Lin 		return TeecResult;
9709deb34f6SHisping Lin 
9719deb34f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9729deb34f6SHisping Lin 				&TeecSession,
9739deb34f6SHisping Lin 				TeecUuid,
9749deb34f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
9759deb34f6SHisping Lin 				NULL,
9769deb34f6SHisping Lin 				NULL,
9779deb34f6SHisping Lin 				&ErrorOrigin);
9789deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9799deb34f6SHisping Lin 		return TeecResult;
9809deb34f6SHisping Lin 
9819deb34f6SHisping Lin 	TeecOperation.params[0].value.a = key_id;
9829deb34f6SHisping Lin 
9839deb34f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
9849deb34f6SHisping Lin 						    TEEC_NONE,
9859deb34f6SHisping Lin 						    TEEC_NONE,
9869deb34f6SHisping Lin 						    TEEC_NONE);
9879deb34f6SHisping Lin 
9889deb34f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9899deb34f6SHisping Lin 					STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN,
9909deb34f6SHisping Lin 					&TeecOperation,
9919deb34f6SHisping Lin 					&ErrorOrigin);
9929deb34f6SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
9939deb34f6SHisping Lin 		*value = TeecOperation.params[0].value.b;
9949deb34f6SHisping Lin 
9959deb34f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
9969deb34f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9979deb34f6SHisping Lin 
9989deb34f6SHisping Lin 	return TeecResult;
9999deb34f6SHisping Lin }
10009deb34f6SHisping Lin 
100190e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)
1002a405238aSHisping Lin {
1003a405238aSHisping Lin 	TEEC_Result TeecResult;
1004a405238aSHisping Lin 	TEEC_Context TeecContext;
1005a405238aSHisping Lin 	TEEC_Session TeecSession;
1006a405238aSHisping Lin 	uint32_t ErrorOrigin;
1007a405238aSHisping Lin 
1008a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1009a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1010a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1011a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
1012a405238aSHisping Lin 
1013a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1014a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1015a405238aSHisping Lin 		return TeecResult;
1016a405238aSHisping Lin 
1017a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1018a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1019a405238aSHisping Lin 		return TeecResult;
1020a405238aSHisping Lin 
1021a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1022a405238aSHisping Lin 				&TeecSession,
1023a405238aSHisping Lin 				TeecUuid,
1024a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
1025a405238aSHisping Lin 				NULL,
1026a405238aSHisping Lin 				NULL,
1027a405238aSHisping Lin 				&ErrorOrigin);
1028a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1029a405238aSHisping Lin 		return TeecResult;
1030a405238aSHisping Lin 
1031a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
1032a405238aSHisping Lin 
1033a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1034a405238aSHisping Lin 						    TEEC_NONE,
1035a405238aSHisping Lin 						    TEEC_NONE,
1036a405238aSHisping Lin 						    TEEC_NONE);
1037a405238aSHisping Lin 
1038a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1039a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
1040a405238aSHisping Lin 					&TeecOperation,
1041a405238aSHisping Lin 					&ErrorOrigin);
1042a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1043a405238aSHisping Lin 		goto exit;
1044a405238aSHisping Lin 
1045a405238aSHisping Lin exit:
1046a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
1047a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1048a405238aSHisping Lin 
1049a405238aSHisping Lin 	return TeecResult;
1050a405238aSHisping Lin }
1051a405238aSHisping Lin 
10522f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config,
10532f8c34bdSxb.wang 				   uint32_t src_phys_addr, uint32_t dst_phys_addr,
10542f8c34bdSxb.wang 				   uint32_t len)
1055fc3694d6Sxb.wang {
1056fc3694d6Sxb.wang 	TEEC_Result TeecResult;
1057fc3694d6Sxb.wang 	TEEC_Context TeecContext;
1058fc3694d6Sxb.wang 	TEEC_Session TeecSession;
1059fc3694d6Sxb.wang 	TEEC_Operation TeecOperation = {0};
1060fc3694d6Sxb.wang 	uint32_t ErrorOrigin;
1061fc3694d6Sxb.wang 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
1062fc3694d6Sxb.wang 	TEEC_SharedMemory SharedMem_config = {0};
1063fc3694d6Sxb.wang 
10642f8c34bdSxb.wang 	if (key_id != RK_OEM_OTP_KEY0 &&
10652f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY1 &&
10662f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY2 &&
10672f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY3 &&
10682f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY_FW)
1069fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1070fc3694d6Sxb.wang 
10712f8c34bdSxb.wang 	if (!config)
1072fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1073fc3694d6Sxb.wang 
1074fc3694d6Sxb.wang 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
1075fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1076fc3694d6Sxb.wang 
1077fc3694d6Sxb.wang 	if (config->mode >= RK_CIPHER_MODE_XTS)
1078fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1079fc3694d6Sxb.wang 
1080fc3694d6Sxb.wang 	if (config->operation != RK_MODE_ENCRYPT &&
1081fc3694d6Sxb.wang 	    config->operation != RK_MODE_DECRYPT)
1082fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1083fc3694d6Sxb.wang 
1084fc3694d6Sxb.wang 	if (config->key_len != 16 &&
1085fc3694d6Sxb.wang 	    config->key_len != 24 &&
1086fc3694d6Sxb.wang 	    config->key_len != 32)
1087fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1088fc3694d6Sxb.wang 
10892f8c34bdSxb.wang 	if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16)
10902f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10912f8c34bdSxb.wang 
10922f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126)
10932f8c34bdSxb.wang 	if (config->key_len == 24)
10942f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10952f8c34bdSxb.wang #endif
10962f8c34bdSxb.wang 
1097fc3694d6Sxb.wang 	if (len % AES_BLOCK_SIZE ||
1098fc3694d6Sxb.wang 	    len == 0)
1099fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1100fc3694d6Sxb.wang 
11012f8c34bdSxb.wang 	if (!src_phys_addr || !dst_phys_addr)
11022f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11032f8c34bdSxb.wang 
1104fc3694d6Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
1105fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1106fc3694d6Sxb.wang 		return TeecResult;
1107fc3694d6Sxb.wang 
1108fc3694d6Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1109fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1110fc3694d6Sxb.wang 		return TeecResult;
1111fc3694d6Sxb.wang 
1112fc3694d6Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
1113fc3694d6Sxb.wang 				      &TeecSession,
1114fc3694d6Sxb.wang 				      &uuid,
1115fc3694d6Sxb.wang 				      TEEC_LOGIN_PUBLIC,
1116fc3694d6Sxb.wang 				      NULL,
1117fc3694d6Sxb.wang 				      NULL,
1118fc3694d6Sxb.wang 				      &ErrorOrigin);
1119fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1120fc3694d6Sxb.wang 		goto exit;
1121fc3694d6Sxb.wang 
1122fc3694d6Sxb.wang 	SharedMem_config.size = sizeof(rk_cipher_config);
1123fc3694d6Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
1124fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1125fc3694d6Sxb.wang 		goto exit;
1126fc3694d6Sxb.wang 
1127fc3694d6Sxb.wang 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
1128fc3694d6Sxb.wang 	TeecOperation.params[0].value.a       = key_id;
1129fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
1130fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
11312f8c34bdSxb.wang 	TeecOperation.params[2].value.a       = src_phys_addr;
11322f8c34bdSxb.wang 	TeecOperation.params[2].value.b       = len;
11332f8c34bdSxb.wang 	TeecOperation.params[3].value.a       = dst_phys_addr;
1134fc3694d6Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1135fc3694d6Sxb.wang 						    TEEC_MEMREF_TEMP_INPUT,
11362f8c34bdSxb.wang 						    TEEC_VALUE_INPUT,
11372f8c34bdSxb.wang 						    TEEC_VALUE_INPUT);
11382f8c34bdSxb.wang 
11392f8c34bdSxb.wang 	crypto_flush_cacheline(src_phys_addr, len);
11402f8c34bdSxb.wang 	crypto_flush_cacheline(dst_phys_addr, len);
11412f8c34bdSxb.wang 
1142fc3694d6Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11432f8c34bdSxb.wang 					CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER,
1144fc3694d6Sxb.wang 					&TeecOperation,
1145fc3694d6Sxb.wang 					&ErrorOrigin);
1146fc3694d6Sxb.wang 
1147a900eef3SHisping Lin 	crypto_invalidate_cacheline(dst_phys_addr, len);
1148a900eef3SHisping Lin 
1149fc3694d6Sxb.wang exit:
1150fc3694d6Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem_config);
1151fc3694d6Sxb.wang 	TEEC_CloseSession(&TeecSession);
1152fc3694d6Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
1153fc3694d6Sxb.wang 	return TeecResult;
1154fc3694d6Sxb.wang }
1155fc3694d6Sxb.wang 
1156a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id,
1157a828eba9SHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
1158a828eba9SHisping Lin {
1159a828eba9SHisping Lin 	TEEC_Result TeecResult;
1160a828eba9SHisping Lin 	TEEC_Context TeecContext;
1161a828eba9SHisping Lin 	TEEC_Session TeecSession;
1162a828eba9SHisping Lin 	uint32_t ErrorOrigin;
1163a828eba9SHisping Lin 
1164a828eba9SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1165a828eba9SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1166a828eba9SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1167a828eba9SHisping Lin 	TEEC_Operation TeecOperation = {0};
1168a828eba9SHisping Lin 
1169a828eba9SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1170a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1171a828eba9SHisping Lin 		return TeecResult;
1172a828eba9SHisping Lin 
1173a828eba9SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1174a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1175a828eba9SHisping Lin 		return TeecResult;
1176a828eba9SHisping Lin 
1177a828eba9SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1178a828eba9SHisping Lin 				&TeecSession,
1179a828eba9SHisping Lin 				TeecUuid,
1180a828eba9SHisping Lin 				TEEC_LOGIN_PUBLIC,
1181a828eba9SHisping Lin 				NULL,
1182a828eba9SHisping Lin 				NULL,
1183a828eba9SHisping Lin 				&ErrorOrigin);
1184a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1185a828eba9SHisping Lin 		return TeecResult;
1186a828eba9SHisping Lin 
1187a828eba9SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1188a828eba9SHisping Lin 
1189a828eba9SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1190a828eba9SHisping Lin 
1191a828eba9SHisping Lin 	SharedMem.size = byte_len;
1192a828eba9SHisping Lin 	SharedMem.flags = 0;
1193a828eba9SHisping Lin 
1194a828eba9SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1195a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1196a828eba9SHisping Lin 		goto exit;
1197a828eba9SHisping Lin 
1198a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1199a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1200a828eba9SHisping Lin 
1201a828eba9SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1202a828eba9SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1203a828eba9SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1204a828eba9SHisping Lin 						    TEEC_NONE,
1205a828eba9SHisping Lin 						    TEEC_NONE);
1206a828eba9SHisping Lin 
1207a828eba9SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1208a828eba9SHisping Lin 					STORAGE_CMD_WRITE_OEM_HDCP_KEY,
1209a828eba9SHisping Lin 					&TeecOperation,
1210a828eba9SHisping Lin 					&ErrorOrigin);
1211a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1212a828eba9SHisping Lin 		goto exit;
1213a828eba9SHisping Lin 
1214a828eba9SHisping Lin exit:
1215a828eba9SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1216a828eba9SHisping Lin 	TEEC_CloseSession(&TeecSession);
1217a828eba9SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1218a828eba9SHisping Lin 
1219a828eba9SHisping Lin 	return TeecResult;
1220a828eba9SHisping Lin }
1221a828eba9SHisping Lin 
1222e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value)
1223e8bc2655SHisping Lin {
1224e8bc2655SHisping Lin 	TEEC_Result TeecResult;
1225e8bc2655SHisping Lin 	TEEC_Context TeecContext;
1226e8bc2655SHisping Lin 	TEEC_Session TeecSession;
1227e8bc2655SHisping Lin 	uint32_t ErrorOrigin;
1228e8bc2655SHisping Lin 
1229e8bc2655SHisping Lin 	*value = 0xFF;
1230e8bc2655SHisping Lin 
1231e8bc2655SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1232e8bc2655SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1233e8bc2655SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1234e8bc2655SHisping Lin 	TEEC_Operation TeecOperation = {0};
1235e8bc2655SHisping Lin 
1236e8bc2655SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1237e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1238e8bc2655SHisping Lin 		return TeecResult;
1239e8bc2655SHisping Lin 
1240e8bc2655SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1241e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1242e8bc2655SHisping Lin 		return TeecResult;
1243e8bc2655SHisping Lin 
1244e8bc2655SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1245e8bc2655SHisping Lin 				&TeecSession,
1246e8bc2655SHisping Lin 				TeecUuid,
1247e8bc2655SHisping Lin 				TEEC_LOGIN_PUBLIC,
1248e8bc2655SHisping Lin 				NULL,
1249e8bc2655SHisping Lin 				NULL,
1250e8bc2655SHisping Lin 				&ErrorOrigin);
1251e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1252e8bc2655SHisping Lin 		return TeecResult;
1253e8bc2655SHisping Lin 
1254e8bc2655SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1255e8bc2655SHisping Lin 
1256e8bc2655SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1257e8bc2655SHisping Lin 						    TEEC_NONE,
1258e8bc2655SHisping Lin 						    TEEC_NONE,
1259e8bc2655SHisping Lin 						    TEEC_NONE);
1260e8bc2655SHisping Lin 
1261e8bc2655SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1262e8bc2655SHisping Lin 					STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN,
1263e8bc2655SHisping Lin 					&TeecOperation,
1264e8bc2655SHisping Lin 					&ErrorOrigin);
1265e8bc2655SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1266e8bc2655SHisping Lin 		*value = TeecOperation.params[0].value.b;
1267e8bc2655SHisping Lin 
1268e8bc2655SHisping Lin 	TEEC_CloseSession(&TeecSession);
1269e8bc2655SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1270e8bc2655SHisping Lin 
1271e8bc2655SHisping Lin 	return TeecResult;
1272e8bc2655SHisping Lin }
1273e8bc2655SHisping Lin 
1274bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id)
1275bfd9cea4SHisping Lin {
1276bfd9cea4SHisping Lin 	TEEC_Result TeecResult;
1277bfd9cea4SHisping Lin 	TEEC_Context TeecContext;
1278bfd9cea4SHisping Lin 	TEEC_Session TeecSession;
1279bfd9cea4SHisping Lin 	uint32_t ErrorOrigin;
1280bfd9cea4SHisping Lin 
1281bfd9cea4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1282bfd9cea4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1283bfd9cea4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1284bfd9cea4SHisping Lin 	TEEC_Operation TeecOperation = {0};
1285bfd9cea4SHisping Lin 
1286bfd9cea4SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1287bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1288bfd9cea4SHisping Lin 		return TeecResult;
1289bfd9cea4SHisping Lin 
1290bfd9cea4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1291bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1292bfd9cea4SHisping Lin 		return TeecResult;
1293bfd9cea4SHisping Lin 
1294bfd9cea4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1295bfd9cea4SHisping Lin 				&TeecSession,
1296bfd9cea4SHisping Lin 				TeecUuid,
1297bfd9cea4SHisping Lin 				TEEC_LOGIN_PUBLIC,
1298bfd9cea4SHisping Lin 				NULL,
1299bfd9cea4SHisping Lin 				NULL,
1300bfd9cea4SHisping Lin 				&ErrorOrigin);
1301bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1302bfd9cea4SHisping Lin 		return TeecResult;
1303bfd9cea4SHisping Lin 
1304bfd9cea4SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1305bfd9cea4SHisping Lin 
1306bfd9cea4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1307bfd9cea4SHisping Lin 						    TEEC_NONE,
1308bfd9cea4SHisping Lin 						    TEEC_NONE,
1309bfd9cea4SHisping Lin 						    TEEC_NONE);
1310bfd9cea4SHisping Lin 
1311bfd9cea4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1312bfd9cea4SHisping Lin 					STORAGE_CMD_SET_OEM_HDCP_KEY_MASK,
1313bfd9cea4SHisping Lin 					&TeecOperation,
1314bfd9cea4SHisping Lin 					&ErrorOrigin);
1315bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1316bfd9cea4SHisping Lin 		goto exit;
1317bfd9cea4SHisping Lin 
1318bfd9cea4SHisping Lin exit:
1319bfd9cea4SHisping Lin 	TEEC_CloseSession(&TeecSession);
1320bfd9cea4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1321bfd9cea4SHisping Lin 
1322bfd9cea4SHisping Lin 	return TeecResult;
1323bfd9cea4SHisping Lin }
1324bfd9cea4SHisping Lin 
13254d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void)
13264d4c5043SHisping Lin {
13274d4c5043SHisping Lin 	TEEC_Result TeecResult;
13284d4c5043SHisping Lin 	TEEC_Context TeecContext;
13294d4c5043SHisping Lin 	TEEC_Session TeecSession;
13304d4c5043SHisping Lin 	uint32_t ErrorOrigin;
13314d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
13324d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
13334d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13344d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
13354d4c5043SHisping Lin 	const uint8_t transfer_inout[] = "Transfer data test.";
13364d4c5043SHisping Lin 
13374d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
13384d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13394d4c5043SHisping Lin 		return TeecResult;
13404d4c5043SHisping Lin 
13414d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
13424d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13434d4c5043SHisping Lin 		return TeecResult;
13444d4c5043SHisping Lin 
13454d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
13464d4c5043SHisping Lin 						TEEC_NONE,
13474d4c5043SHisping Lin 						TEEC_NONE,
13484d4c5043SHisping Lin 						TEEC_NONE);
13494d4c5043SHisping Lin 
13504d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
13514d4c5043SHisping Lin 				&TeecSession,
13524d4c5043SHisping Lin 				TeecUuid,
13534d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
13544d4c5043SHisping Lin 				NULL,
13554d4c5043SHisping Lin 				&TeecOperation,
13564d4c5043SHisping Lin 				&ErrorOrigin);
13574d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13584d4c5043SHisping Lin 		return TeecResult;
13594d4c5043SHisping Lin 
13604d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
13614d4c5043SHisping Lin 
13624d4c5043SHisping Lin 	SharedMem0.size = sizeof(transfer_inout);
13634d4c5043SHisping Lin 	SharedMem0.flags = 0;
13644d4c5043SHisping Lin 
13654d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
13664d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13674d4c5043SHisping Lin 		goto exit;
13684d4c5043SHisping Lin 
13694d4c5043SHisping Lin 	memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size);
13704d4c5043SHisping Lin 
13714d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
13724d4c5043SHisping Lin 
13734d4c5043SHisping Lin 	SharedMem1.size = sizeof(transfer_inout);
13744d4c5043SHisping Lin 	SharedMem1.flags = 0;
13754d4c5043SHisping Lin 
13764d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
13774d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13784d4c5043SHisping Lin 		goto exit;
13794d4c5043SHisping Lin 
13804d4c5043SHisping Lin 	TeecOperation.params[0].value.a = 66;
13814d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer;
13824d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem0.size;
13834d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer;
13844d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.size = SharedMem1.size;
13854d4c5043SHisping Lin 
13864d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
13874d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_INPUT,
13884d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_OUTPUT,
13894d4c5043SHisping Lin 						TEEC_NONE);
13904d4c5043SHisping Lin 
13914d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13924d4c5043SHisping Lin 					102,
13934d4c5043SHisping Lin 					&TeecOperation,
13944d4c5043SHisping Lin 					&ErrorOrigin);
13954d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13964d4c5043SHisping Lin 		goto exit;
13974d4c5043SHisping Lin 
13984d4c5043SHisping Lin 	//Check the result
13994d4c5043SHisping Lin 	if (TeecOperation.params[0].value.a == 66 + 1 &&
14004d4c5043SHisping Lin 	    TeecOperation.params[0].value.b == TeecOperation.params[0].value.a)
14014d4c5043SHisping Lin 		printf("test value : Pass!\n");
14024d4c5043SHisping Lin 	else
14034d4c5043SHisping Lin 		printf("test value : Fail! (mismatch values)\n");
14044d4c5043SHisping Lin 
14054d4c5043SHisping Lin 	if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0)
14064d4c5043SHisping Lin 		printf("test buffer : Pass!\n");
14074d4c5043SHisping Lin 	else
14084d4c5043SHisping Lin 		printf("test buffer : Fail! (mismatch buffer)\n");
14094d4c5043SHisping Lin 
14104d4c5043SHisping Lin exit:
14114d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
14124d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
14134d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
14144d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14154d4c5043SHisping Lin 
14164d4c5043SHisping Lin 	return TeecResult;
14174d4c5043SHisping Lin }
14184d4c5043SHisping Lin 
14194d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void)
14204d4c5043SHisping Lin {
14214d4c5043SHisping Lin 	TEEC_Result TeecResult;
14224d4c5043SHisping Lin 	TEEC_Context TeecContext;
14234d4c5043SHisping Lin 	TEEC_Session TeecSession;
14244d4c5043SHisping Lin 	uint32_t ErrorOrigin;
14254d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
14264d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
14274d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
14284d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
14294d4c5043SHisping Lin 
14304d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
14314d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14324d4c5043SHisping Lin 		return TeecResult;
14334d4c5043SHisping Lin 
14344d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
14354d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14364d4c5043SHisping Lin 		return TeecResult;
14374d4c5043SHisping Lin 
14384d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
14394d4c5043SHisping Lin 						TEEC_NONE,
14404d4c5043SHisping Lin 						TEEC_NONE,
14414d4c5043SHisping Lin 						TEEC_NONE);
14424d4c5043SHisping Lin 
14434d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
14444d4c5043SHisping Lin 				&TeecSession,
14454d4c5043SHisping Lin 				TeecUuid,
14464d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
14474d4c5043SHisping Lin 				NULL,
14484d4c5043SHisping Lin 				&TeecOperation,
14494d4c5043SHisping Lin 				&ErrorOrigin);
14504d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14514d4c5043SHisping Lin 		return TeecResult;
14524d4c5043SHisping Lin 
14534d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
14544d4c5043SHisping Lin 						TEEC_NONE,
14554d4c5043SHisping Lin 						TEEC_NONE,
14564d4c5043SHisping Lin 						TEEC_NONE);
14574d4c5043SHisping Lin 
14584d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14594d4c5043SHisping Lin 					103,
14604d4c5043SHisping Lin 					&TeecOperation,
14614d4c5043SHisping Lin 					&ErrorOrigin);
14624d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14634d4c5043SHisping Lin 		goto exit;
14644d4c5043SHisping Lin 
14654d4c5043SHisping Lin exit:
14664d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
14674d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14684d4c5043SHisping Lin 
14694d4c5043SHisping Lin 	return TeecResult;
14704d4c5043SHisping Lin }
14714d4c5043SHisping Lin 
14724aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
14734aa61755SAndy Ye {
14744aa61755SAndy Ye 	TEEC_Result TeecResult;
14754aa61755SAndy Ye 	TEEC_Context TeecContext;
14764aa61755SAndy Ye 	TEEC_Session TeecSession;
14774aa61755SAndy Ye 	uint32_t ErrorOrigin;
14784aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
14794aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
14804aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
14814aa61755SAndy Ye 				}
14824aa61755SAndy Ye 			     };
14834aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
14844aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
14853251364cSHisping Lin 	struct blk_desc *dev_desc;
14863251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
14876651d4c0SJason Zhu 	if (!dev_desc) {
14886651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
14896651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
14906651d4c0SJason Zhu 	}
14914aa61755SAndy Ye 
1492f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1493f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1494f4e1db95SHisping Lin 		return TeecResult;
14954aa61755SAndy Ye 
14964aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1497f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1498f4e1db95SHisping Lin 		return TeecResult;
14994aa61755SAndy Ye 
15003251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15013251364cSHisping Lin 						TEEC_NONE,
15023251364cSHisping Lin 						TEEC_NONE,
15033251364cSHisping Lin 						TEEC_NONE);
15043251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1505b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1506b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1507b9a7e756SHisping Lin 	else
1508b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1509b9a7e756SHisping Lin 
15103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15113251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15123251364cSHisping Lin #endif
15133251364cSHisping Lin 
15144aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15154aa61755SAndy Ye 				      &TeecSession,
15164aa61755SAndy Ye 				      TeecUuid,
15174aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15184aa61755SAndy Ye 				      NULL,
15193251364cSHisping Lin 					&TeecOperation,
15204aa61755SAndy Ye 				      &ErrorOrigin);
1521f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1522f4e1db95SHisping Lin 		return TeecResult;
15234aa61755SAndy Ye 
15244aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
15254aa61755SAndy Ye 
15264aa61755SAndy Ye 	SharedMem0.size = *dh_size;
15274aa61755SAndy Ye 	SharedMem0.flags = 0;
15284aa61755SAndy Ye 
15294aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1530f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1531f4e1db95SHisping Lin 		goto exit;
15324aa61755SAndy Ye 
15334aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
15344aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
15354aa61755SAndy Ye 
15364aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
15374aa61755SAndy Ye 						    TEEC_NONE,
15384aa61755SAndy Ye 						    TEEC_NONE,
15394aa61755SAndy Ye 						    TEEC_NONE);
15404aa61755SAndy Ye 
15414aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
15424aa61755SAndy Ye 					143,
15434aa61755SAndy Ye 					&TeecOperation,
15444aa61755SAndy Ye 					&ErrorOrigin);
1545f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1546f4e1db95SHisping Lin 		goto exit;
15474aa61755SAndy Ye 
15484aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
15494aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1550f4e1db95SHisping Lin exit:
15514aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
15524aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1553f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
15544aa61755SAndy Ye 
15554aa61755SAndy Ye 	return TeecResult;
15564aa61755SAndy Ye }
15574aa61755SAndy Ye 
15584aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
15594aa61755SAndy Ye {
15604aa61755SAndy Ye 	TEEC_Result TeecResult;
15614aa61755SAndy Ye 	TEEC_Context TeecContext;
15624aa61755SAndy Ye 	TEEC_Session TeecSession;
15634aa61755SAndy Ye 	uint32_t ErrorOrigin;
15644aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15654aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15664aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15674aa61755SAndy Ye 				}
15684aa61755SAndy Ye 			     };
15694aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15704aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
15713251364cSHisping Lin 	struct blk_desc *dev_desc;
15723251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15736651d4c0SJason Zhu 	if (!dev_desc) {
15746651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15756651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15766651d4c0SJason Zhu 	}
15774aa61755SAndy Ye 
1578f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1579f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1580f4e1db95SHisping Lin 		return TeecResult;
15814aa61755SAndy Ye 
15824aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1583f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1584f4e1db95SHisping Lin 		return TeecResult;
15854aa61755SAndy Ye 
15863251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15873251364cSHisping Lin 						TEEC_NONE,
15883251364cSHisping Lin 						TEEC_NONE,
15893251364cSHisping Lin 						TEEC_NONE);
15903251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1591b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1592b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1593b9a7e756SHisping Lin 	else
1594b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1595b9a7e756SHisping Lin 
15963251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15973251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15983251364cSHisping Lin #endif
15993251364cSHisping Lin 
16004aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16014aa61755SAndy Ye 				      &TeecSession,
16024aa61755SAndy Ye 				      TeecUuid,
16034aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16044aa61755SAndy Ye 				      NULL,
16053251364cSHisping Lin 					&TeecOperation,
16064aa61755SAndy Ye 				      &ErrorOrigin);
1607f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1608f4e1db95SHisping Lin 		return TeecResult;
16094aa61755SAndy Ye 
16104aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16114aa61755SAndy Ye 
16124aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
16134aa61755SAndy Ye 	SharedMem0.flags = 0;
16144aa61755SAndy Ye 
16154aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1616f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1617f4e1db95SHisping Lin 		goto exit;
16184aa61755SAndy Ye 
16194aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
16204aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
16214aa61755SAndy Ye 
16224aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
16234aa61755SAndy Ye 						    TEEC_NONE,
16244aa61755SAndy Ye 						    TEEC_NONE,
16254aa61755SAndy Ye 						    TEEC_NONE);
16264aa61755SAndy Ye 
16274aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16284aa61755SAndy Ye 					144,
16294aa61755SAndy Ye 					&TeecOperation,
16304aa61755SAndy Ye 					&ErrorOrigin);
1631f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1632f4e1db95SHisping Lin 		goto exit;
16334aa61755SAndy Ye 
16344aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
16354aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1636f4e1db95SHisping Lin exit:
16374aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
16384aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1639f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
16404aa61755SAndy Ye 
16414aa61755SAndy Ye 	return TeecResult;
16424aa61755SAndy Ye }
16434aa61755SAndy Ye 
16444aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
16454aa61755SAndy Ye 			      uint32_t *operation_size,
16464aa61755SAndy Ye 			      uint8_t *out,
16474aa61755SAndy Ye 			      uint32_t *out_len)
16484aa61755SAndy Ye {
16494aa61755SAndy Ye 	TEEC_Result TeecResult;
16504aa61755SAndy Ye 	TEEC_Context TeecContext;
16514aa61755SAndy Ye 	TEEC_Session TeecSession;
16524aa61755SAndy Ye 	uint32_t ErrorOrigin;
16534aa61755SAndy Ye 
16544aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16554aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16564aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16574aa61755SAndy Ye 				}
16584aa61755SAndy Ye 			     };
16594aa61755SAndy Ye 
16604aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16614aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16623251364cSHisping Lin 	struct blk_desc *dev_desc;
16633251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16646651d4c0SJason Zhu 	if (!dev_desc) {
16656651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
16666651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
16676651d4c0SJason Zhu 	}
16684aa61755SAndy Ye 
1669f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1670f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1671f4e1db95SHisping Lin 		return TeecResult;
16724aa61755SAndy Ye 
16734aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1674f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1675f4e1db95SHisping Lin 		return TeecResult;
16764aa61755SAndy Ye 
16773251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16783251364cSHisping Lin 						TEEC_NONE,
16793251364cSHisping Lin 						TEEC_NONE,
16803251364cSHisping Lin 						TEEC_NONE);
16813251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1682b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1683b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1684b9a7e756SHisping Lin 	else
1685b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1686b9a7e756SHisping Lin 
16873251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16883251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16893251364cSHisping Lin #endif
16903251364cSHisping Lin 
16914aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16924aa61755SAndy Ye 				      &TeecSession,
16934aa61755SAndy Ye 				      TeecUuid,
16944aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16954aa61755SAndy Ye 				      NULL,
16963251364cSHisping Lin 					&TeecOperation,
16974aa61755SAndy Ye 				      &ErrorOrigin);
1698f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1699f4e1db95SHisping Lin 		return TeecResult;
17004aa61755SAndy Ye 
17014aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17024aa61755SAndy Ye 
17034aa61755SAndy Ye 	SharedMem0.size = *operation_size;
17044aa61755SAndy Ye 	SharedMem0.flags = 0;
17054aa61755SAndy Ye 
17064aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1707f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1708f4e1db95SHisping Lin 		goto exit;
17094aa61755SAndy Ye 
17104aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
17114aa61755SAndy Ye 
17124aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17134aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17144aa61755SAndy Ye 
17154aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
17164aa61755SAndy Ye 
17174aa61755SAndy Ye 	SharedMem1.size = *out_len;
17184aa61755SAndy Ye 	SharedMem1.flags = 0;
17194aa61755SAndy Ye 
17204aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1721f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1722f4e1db95SHisping Lin 		goto exit;
17234aa61755SAndy Ye 
17244aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
17254aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
17264aa61755SAndy Ye 
17274aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17284aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
17294aa61755SAndy Ye 						    TEEC_NONE,
17304aa61755SAndy Ye 						    TEEC_NONE);
17314aa61755SAndy Ye 
17324aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17334aa61755SAndy Ye 					145,
17344aa61755SAndy Ye 					&TeecOperation,
17354aa61755SAndy Ye 					&ErrorOrigin);
1736f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1737f4e1db95SHisping Lin 		goto exit;
17384aa61755SAndy Ye 
17394aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
17404aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1741f4e1db95SHisping Lin exit:
17424aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17434aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1744f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1745f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
17464aa61755SAndy Ye 
17474aa61755SAndy Ye 	return TeecResult;
17484aa61755SAndy Ye }
17494aa61755SAndy Ye 
17504aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
17514aa61755SAndy Ye {
17524aa61755SAndy Ye 	TEEC_Result TeecResult;
17534aa61755SAndy Ye 	TEEC_Context TeecContext;
17544aa61755SAndy Ye 	TEEC_Session TeecSession;
17554aa61755SAndy Ye 	uint32_t ErrorOrigin;
17564aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17574aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17584aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17594aa61755SAndy Ye 				}
17604aa61755SAndy Ye 			     };
17614aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17624aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17633251364cSHisping Lin 	struct blk_desc *dev_desc;
17643251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17656651d4c0SJason Zhu 	if (!dev_desc) {
17666651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17676651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17686651d4c0SJason Zhu 	}
1769f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1770f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1771f4e1db95SHisping Lin 		return TeecResult;
17724aa61755SAndy Ye 
17734aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1774f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1775f4e1db95SHisping Lin 		return TeecResult;
17764aa61755SAndy Ye 
17773251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17783251364cSHisping Lin 						TEEC_NONE,
17793251364cSHisping Lin 						TEEC_NONE,
17803251364cSHisping Lin 						TEEC_NONE);
17813251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1782b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1783b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1784b9a7e756SHisping Lin 	else
1785b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1786b9a7e756SHisping Lin 
17873251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17883251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17893251364cSHisping Lin #endif
17903251364cSHisping Lin 
17914aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17924aa61755SAndy Ye 					&TeecSession,
17934aa61755SAndy Ye 					TeecUuid,
17944aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
17954aa61755SAndy Ye 					NULL,
17963251364cSHisping Lin 					&TeecOperation,
17974aa61755SAndy Ye 					&ErrorOrigin);
1798f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1799f4e1db95SHisping Lin 		return TeecResult;
18004aa61755SAndy Ye 
18014aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
18024aa61755SAndy Ye 
18034aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
18044aa61755SAndy Ye 	SharedMem0.flags = 0;
18054aa61755SAndy Ye 
18064aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1807f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1808f4e1db95SHisping Lin 		goto exit;
18094aa61755SAndy Ye 
18104aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
18114aa61755SAndy Ye 
18124aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18134aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18144aa61755SAndy Ye 
18154aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
18164aa61755SAndy Ye 						    TEEC_NONE,
18174aa61755SAndy Ye 						    TEEC_NONE,
18184aa61755SAndy Ye 						    TEEC_NONE);
18194aa61755SAndy Ye 
18204aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18214aa61755SAndy Ye 					146,
18224aa61755SAndy Ye 					&TeecOperation,
18234aa61755SAndy Ye 					&ErrorOrigin);
1824f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1825f4e1db95SHisping Lin 		goto exit;
1826f4e1db95SHisping Lin exit:
18274aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18284aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1829f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18304aa61755SAndy Ye 
18314aa61755SAndy Ye 	return TeecResult;
18324aa61755SAndy Ye }
1833