xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 10f41197f4676838c0dc4ad8a094d2995e8514ec)
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
32*10f41197SHisping Lin #define STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN	20
33ae8ec5e1SHisping Lin 
342f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER	0x00000002
35fc3694d6Sxb.wang 
36fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID	{ 0x0cacdb5d, 0x4fea, 0x466c, \
37fc3694d6Sxb.wang 		{ 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } }
38fc3694d6Sxb.wang 
39ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
40ae8ec5e1SHisping Lin {
41ae8ec5e1SHisping Lin 	if (in > 9)
42ae8ec5e1SHisping Lin 		return in + 55;
43ae8ec5e1SHisping Lin 	else
44ae8ec5e1SHisping Lin 		return in + 48;
45ae8ec5e1SHisping Lin }
46ae8ec5e1SHisping Lin 
47c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
48ae8ec5e1SHisping Lin {
49ae8ec5e1SHisping Lin 	uint32_t i = 0;
50ae8ec5e1SHisping Lin 
51ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
52ae8ec5e1SHisping Lin 		return 0;
53ae8ec5e1SHisping Lin 
54ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
55ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
56ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
57ae8ec5e1SHisping Lin 	}
58ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
59ae8ec5e1SHisping Lin 
60ae8ec5e1SHisping Lin 	return blen * 2;
61ae8ec5e1SHisping Lin }
62ae8ec5e1SHisping Lin 
632f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size)
642f8c34bdSxb.wang {
652f8c34bdSxb.wang 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
662f8c34bdSxb.wang 	ulong aligned_input, aligned_len;
672f8c34bdSxb.wang 
682f8c34bdSxb.wang 	if (!addr || !size)
692f8c34bdSxb.wang 		return;
702f8c34bdSxb.wang 
712f8c34bdSxb.wang 	/* Must flush dcache before crypto DMA fetch data region */
722f8c34bdSxb.wang 	aligned_input = round_down(addr, alignment);
732f8c34bdSxb.wang 	aligned_len = round_up(size + (addr - aligned_input), alignment);
742f8c34bdSxb.wang 	flush_cache(aligned_input, aligned_len);
752f8c34bdSxb.wang }
762f8c34bdSxb.wang 
77a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
78a900eef3SHisping Lin {
79a900eef3SHisping Lin 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
80a900eef3SHisping Lin 	ulong aligned_input, aligned_len;
81a900eef3SHisping Lin 
82a900eef3SHisping Lin 	if (!addr || !size)
83a900eef3SHisping Lin 		return;
84a900eef3SHisping Lin 
85a900eef3SHisping Lin 	/* Must invalidate dcache after crypto DMA write data region */
86a900eef3SHisping Lin 	aligned_input = round_down(addr, alignment);
87a900eef3SHisping Lin 	aligned_len = round_up(size + (addr - aligned_input), alignment);
88a900eef3SHisping Lin 	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
89a900eef3SHisping Lin }
90a900eef3SHisping Lin 
91c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
92c7de5349SHisping Lin 						uint32_t filename_size,
93c7de5349SHisping Lin 						uint8_t *data,
94c7de5349SHisping Lin 						uint32_t data_size)
95ae8ec5e1SHisping Lin {
96ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
97ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
98ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
99ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
100ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
101ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
102ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
103ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1043251364cSHisping Lin 	struct blk_desc *dev_desc;
1053251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1066651d4c0SJason Zhu 	if (!dev_desc) {
1076651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1086651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1096651d4c0SJason Zhu 	}
1103251364cSHisping Lin 
111f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
112f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
113f4e1db95SHisping Lin 		return TeecResult;
114ae8ec5e1SHisping Lin 
115ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
116f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
117f4e1db95SHisping Lin 		return TeecResult;
118ae8ec5e1SHisping Lin 
1193251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1203251364cSHisping Lin 						    TEEC_NONE,
1213251364cSHisping Lin 						    TEEC_NONE,
1223251364cSHisping Lin 						    TEEC_NONE);
1233251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
124b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
125b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
126b9a7e756SHisping Lin 	else
127b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1293251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1303251364cSHisping Lin #endif
1313251364cSHisping Lin 
132ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
133ae8ec5e1SHisping Lin 				&TeecSession,
134ae8ec5e1SHisping Lin 				TeecUuid,
135ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
136ae8ec5e1SHisping Lin 				NULL,
1373251364cSHisping Lin 				&TeecOperation,
138ae8ec5e1SHisping Lin 				&ErrorOrigin);
139f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
140f4e1db95SHisping Lin 		return TeecResult;
141ae8ec5e1SHisping Lin 
142ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
143ae8ec5e1SHisping Lin 
144c7de5349SHisping Lin 	SharedMem0.size = filename_size;
145ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
146ae8ec5e1SHisping Lin 
147ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
148f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
149f4e1db95SHisping Lin 		goto exit;
150ae8ec5e1SHisping Lin 
151c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
152ae8ec5e1SHisping Lin 
153ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
154ae8ec5e1SHisping Lin 
155c7de5349SHisping Lin 	SharedMem1.size = data_size;
156c7de5349SHisping Lin 	SharedMem1.flags = 0;
157c7de5349SHisping Lin 
158c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
159c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
160c7de5349SHisping Lin 		goto exit;
161c7de5349SHisping Lin 
162c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
163c7de5349SHisping Lin 
164c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
165c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
166c7de5349SHisping Lin 
167c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
168c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
169c7de5349SHisping Lin 
170c7de5349SHisping Lin 
171c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
172c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
173c7de5349SHisping Lin 						TEEC_NONE,
174c7de5349SHisping Lin 						TEEC_NONE);
175c7de5349SHisping Lin 
176c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
177c7de5349SHisping Lin 					1,
178c7de5349SHisping Lin 					&TeecOperation,
179c7de5349SHisping Lin 					&ErrorOrigin);
180c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
181c7de5349SHisping Lin 		goto exit;
182c7de5349SHisping Lin exit:
183c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
184c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
185c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
186c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
187c7de5349SHisping Lin 
188c7de5349SHisping Lin 	return TeecResult;
189c7de5349SHisping Lin }
190c7de5349SHisping Lin 
191c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
192c7de5349SHisping Lin 					       uint32_t filename_size,
193c7de5349SHisping Lin 					       uint8_t *data,
194c7de5349SHisping Lin 					       uint32_t data_size)
195c7de5349SHisping Lin {
196c7de5349SHisping Lin 	TEEC_Result TeecResult;
197c7de5349SHisping Lin 	TEEC_Context TeecContext;
198c7de5349SHisping Lin 	TEEC_Session TeecSession;
199c7de5349SHisping Lin 	uint32_t ErrorOrigin;
200c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
201c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
202c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
203c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
204c7de5349SHisping Lin 
205c7de5349SHisping Lin 	struct blk_desc *dev_desc;
206c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
207c7de5349SHisping Lin 	if (!dev_desc) {
208c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
209c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
210c7de5349SHisping Lin 	}
211c7de5349SHisping Lin 
212c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
213c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
214c7de5349SHisping Lin 		return TeecResult;
215c7de5349SHisping Lin 
216c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
217c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
218c7de5349SHisping Lin 		return TeecResult;
219c7de5349SHisping Lin 
220c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
221c7de5349SHisping Lin 						TEEC_NONE,
222c7de5349SHisping Lin 						TEEC_NONE,
223c7de5349SHisping Lin 						TEEC_NONE);
224c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
225c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
226c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
227c7de5349SHisping Lin 	else
228c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
229c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
230c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
231c7de5349SHisping Lin #endif
232c7de5349SHisping Lin 
233c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
234c7de5349SHisping Lin 				&TeecSession,
235c7de5349SHisping Lin 				TeecUuid,
236c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
237c7de5349SHisping Lin 				NULL,
238c7de5349SHisping Lin 				&TeecOperation,
239c7de5349SHisping Lin 				&ErrorOrigin);
240c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
241c7de5349SHisping Lin 		return TeecResult;
242c7de5349SHisping Lin 
243c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
244c7de5349SHisping Lin 
245c7de5349SHisping Lin 	SharedMem0.size = filename_size;
246c7de5349SHisping Lin 	SharedMem0.flags = 0;
247c7de5349SHisping Lin 
248c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
249c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
250c7de5349SHisping Lin 		goto exit;
251c7de5349SHisping Lin 
252c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
253c7de5349SHisping Lin 
254c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
255c7de5349SHisping Lin 
256c7de5349SHisping Lin 	SharedMem1.size = data_size;
257ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
258ae8ec5e1SHisping Lin 
259ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
260f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
261f4e1db95SHisping Lin 		goto exit;
262ae8ec5e1SHisping Lin 
263ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
264ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
265ae8ec5e1SHisping Lin 
266ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
267ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
268ae8ec5e1SHisping Lin 
269ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
270ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
271ae8ec5e1SHisping Lin 						TEEC_NONE,
272ae8ec5e1SHisping Lin 						TEEC_NONE);
273ae8ec5e1SHisping Lin 
274ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
275ae8ec5e1SHisping Lin 					0,
276ae8ec5e1SHisping Lin 					&TeecOperation,
277ae8ec5e1SHisping Lin 					&ErrorOrigin);
27846b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
279c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
280f4e1db95SHisping Lin exit:
281ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
282ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
283ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
28446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
285ae8ec5e1SHisping Lin 
286ae8ec5e1SHisping Lin 	return TeecResult;
287ae8ec5e1SHisping Lin }
288ae8ec5e1SHisping Lin 
289c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
290c7de5349SHisping Lin {
291c7de5349SHisping Lin 	TEEC_Result TeecResult;
292c7de5349SHisping Lin 	TEEC_Context TeecContext;
293c7de5349SHisping Lin 	TEEC_Session TeecSession;
294c7de5349SHisping Lin 	uint32_t ErrorOrigin;
295c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
296c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
297c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
298c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
299c7de5349SHisping Lin 
300c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
301c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
302c7de5349SHisping Lin 		return TeecResult;
303c7de5349SHisping Lin 
304c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
305c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
306c7de5349SHisping Lin 		return TeecResult;
307c7de5349SHisping Lin 
308c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
309c7de5349SHisping Lin 				&TeecSession,
310c7de5349SHisping Lin 				TeecUuid,
311c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
312c7de5349SHisping Lin 				NULL,
313c7de5349SHisping Lin 				NULL,
314c7de5349SHisping Lin 				&ErrorOrigin);
315c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
316c7de5349SHisping Lin 		return TeecResult;
317c7de5349SHisping Lin 
318c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
319c7de5349SHisping Lin 						    TEEC_NONE,
320c7de5349SHisping Lin 						    TEEC_NONE,
321c7de5349SHisping Lin 						    TEEC_NONE);
322c7de5349SHisping Lin 
323c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
324c7de5349SHisping Lin 					2,
325c7de5349SHisping Lin 					&TeecOperation,
326c7de5349SHisping Lin 					&ErrorOrigin);
327c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
328c7de5349SHisping Lin 		goto exit;
329c7de5349SHisping Lin exit:
330c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
331c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
332c7de5349SHisping Lin 
333c7de5349SHisping Lin 	return TeecResult;
334c7de5349SHisping Lin }
335c7de5349SHisping Lin 
33634f2e8f6SHisping Lin static void trusty_notify_always_use_security(void)
33734f2e8f6SHisping Lin {
33834f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION)
33934f2e8f6SHisping Lin 	TEEC_Result TeecResult;
34034f2e8f6SHisping Lin 	TEEC_Context TeecContext;
34134f2e8f6SHisping Lin 	TEEC_Session TeecSession;
34234f2e8f6SHisping Lin 	uint32_t ErrorOrigin;
34334f2e8f6SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
34434f2e8f6SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
34534f2e8f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
34634f2e8f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
34734f2e8f6SHisping Lin 
34834f2e8f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
34934f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
35034f2e8f6SHisping Lin 		return;
35134f2e8f6SHisping Lin 
35234f2e8f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
35334f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
35434f2e8f6SHisping Lin 		return;
35534f2e8f6SHisping Lin 
35634f2e8f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
35734f2e8f6SHisping Lin 				&TeecSession,
35834f2e8f6SHisping Lin 				TeecUuid,
35934f2e8f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
36034f2e8f6SHisping Lin 				NULL,
36134f2e8f6SHisping Lin 				NULL,
36234f2e8f6SHisping Lin 				&ErrorOrigin);
36334f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
36434f2e8f6SHisping Lin 		return;
36534f2e8f6SHisping Lin 
36634f2e8f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
36734f2e8f6SHisping Lin 						    TEEC_NONE,
36834f2e8f6SHisping Lin 						    TEEC_NONE,
36934f2e8f6SHisping Lin 						    TEEC_NONE);
37034f2e8f6SHisping Lin 
37134f2e8f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
37234f2e8f6SHisping Lin 					9,
37334f2e8f6SHisping Lin 					&TeecOperation,
37434f2e8f6SHisping Lin 					&ErrorOrigin);
37534f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
37634f2e8f6SHisping Lin 		debug("notify always use security fail! please update optee!");
37734f2e8f6SHisping Lin 
37834f2e8f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
37934f2e8f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
38034f2e8f6SHisping Lin 
38134f2e8f6SHisping Lin 	return;
38234f2e8f6SHisping Lin #endif
38334f2e8f6SHisping Lin }
38434f2e8f6SHisping Lin 
385c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
386c7de5349SHisping Lin {
387c7de5349SHisping Lin 	char hs[9];
388c7de5349SHisping Lin 
389c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
390c7de5349SHisping Lin 
391c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
392c7de5349SHisping Lin }
393c7de5349SHisping Lin 
394ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
395ae8ec5e1SHisping Lin {
396c7de5349SHisping Lin 	char hs[9];
3973251364cSHisping Lin 
398c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
399ae8ec5e1SHisping Lin 
400c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
401ae8ec5e1SHisping Lin }
402ae8ec5e1SHisping Lin 
403ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
404ae8ec5e1SHisping Lin {
405c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
406c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
407ae8ec5e1SHisping Lin }
408ae8ec5e1SHisping Lin 
409ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
410ae8ec5e1SHisping Lin {
411c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
412c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
4136651d4c0SJason Zhu }
414ae8ec5e1SHisping Lin 
415c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
416c7de5349SHisping Lin {
417c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
418c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
419c7de5349SHisping Lin }
420ae8ec5e1SHisping Lin 
421c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
422c7de5349SHisping Lin {
423c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
424c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
425ae8ec5e1SHisping Lin }
426ae8ec5e1SHisping Lin 
427564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
428564654ebSJason Zhu 					      uint32_t size)
429564654ebSJason Zhu {
430c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
431c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
432564654ebSJason Zhu }
433564654ebSJason Zhu 
434564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
435564654ebSJason Zhu 					       uint32_t size)
436564654ebSJason Zhu {
437c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
438c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
439564654ebSJason Zhu }
440564654ebSJason Zhu 
441ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
442ae8ec5e1SHisping Lin {
443c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
444c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
445ae8ec5e1SHisping Lin }
446ae8ec5e1SHisping Lin 
447ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
448ae8ec5e1SHisping Lin {
449c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
450c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
451ae8ec5e1SHisping Lin }
452ae8ec5e1SHisping Lin 
453ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
454ae8ec5e1SHisping Lin {
455c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
456c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
457c7de5349SHisping Lin }
458c7de5349SHisping Lin 
459c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
460c7de5349SHisping Lin {
461c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
462c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
463c7de5349SHisping Lin }
464c7de5349SHisping Lin 
465c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
466c7de5349SHisping Lin {
467ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
468ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
469ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
470ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
471c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
472c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
473c7de5349SHisping Lin 
474ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
475ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
476ae8ec5e1SHisping Lin 
477f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
478f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
479f4e1db95SHisping Lin 		return TeecResult;
480ae8ec5e1SHisping Lin 
481ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
482f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
483f4e1db95SHisping Lin 		return TeecResult;
484ae8ec5e1SHisping Lin 
485ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
486ae8ec5e1SHisping Lin 				      &TeecSession,
487ae8ec5e1SHisping Lin 				      TeecUuid,
488ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
489ae8ec5e1SHisping Lin 				      NULL,
490c7de5349SHisping Lin 				      NULL,
491ae8ec5e1SHisping Lin 				      &ErrorOrigin);
492f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
493f4e1db95SHisping Lin 		return TeecResult;
494ae8ec5e1SHisping Lin 
495c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
496c7de5349SHisping Lin 						    TEEC_NONE,
497ae8ec5e1SHisping Lin 						    TEEC_NONE,
498ae8ec5e1SHisping Lin 						    TEEC_NONE);
499ae8ec5e1SHisping Lin 
500ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
501c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
502ae8ec5e1SHisping Lin 					&TeecOperation,
503ae8ec5e1SHisping Lin 					&ErrorOrigin);
504c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
505c7de5349SHisping Lin 		goto exit;
506f4e1db95SHisping Lin exit:
507ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
50846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
509ae8ec5e1SHisping Lin 
510ae8ec5e1SHisping Lin 	return TeecResult;
511ae8ec5e1SHisping Lin }
512ae8ec5e1SHisping Lin 
513c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
514c7de5349SHisping Lin 						   uint8_t is_write,
515c7de5349SHisping Lin 						   uint32_t *buf,
516c7de5349SHisping Lin 						   uint32_t length)
517ae8ec5e1SHisping Lin {
518ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
519ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
520ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
521ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
522c7de5349SHisping Lin 
523c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
524c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
525ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
526ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
527ae8ec5e1SHisping Lin 
528f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
529f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
530f4e1db95SHisping Lin 		return TeecResult;
531ae8ec5e1SHisping Lin 
532ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
533f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
534f4e1db95SHisping Lin 		return TeecResult;
535ae8ec5e1SHisping Lin 
536ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
537ae8ec5e1SHisping Lin 				&TeecSession,
538ae8ec5e1SHisping Lin 				TeecUuid,
539ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
540ae8ec5e1SHisping Lin 				NULL,
541c7de5349SHisping Lin 				NULL,
542ae8ec5e1SHisping Lin 				&ErrorOrigin);
543f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
544f4e1db95SHisping Lin 		return TeecResult;
545ae8ec5e1SHisping Lin 
546ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
547ae8ec5e1SHisping Lin 
548c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
549ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
550ae8ec5e1SHisping Lin 
551ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
552f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
553f4e1db95SHisping Lin 		goto exit;
554ae8ec5e1SHisping Lin 
555ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
556ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
557ae8ec5e1SHisping Lin 
558c7de5349SHisping Lin 	if (is_write) {
559c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
560ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
561c7de5349SHisping Lin 							    TEEC_NONE,
562ae8ec5e1SHisping Lin 							    TEEC_NONE,
563ae8ec5e1SHisping Lin 							    TEEC_NONE);
564ae8ec5e1SHisping Lin 
565c7de5349SHisping Lin 	} else {
566c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
567c7de5349SHisping Lin 							    TEEC_NONE,
568c7de5349SHisping Lin 							    TEEC_NONE,
569c7de5349SHisping Lin 							    TEEC_NONE);
570c7de5349SHisping Lin 	}
571c7de5349SHisping Lin 
572ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
573c7de5349SHisping Lin 					cmd,
574ae8ec5e1SHisping Lin 					&TeecOperation,
575ae8ec5e1SHisping Lin 					&ErrorOrigin);
576f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
577f4e1db95SHisping Lin 		goto exit;
578c7de5349SHisping Lin 
579c7de5349SHisping Lin 	if (!is_write)
580c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
581c7de5349SHisping Lin 
582f4e1db95SHisping Lin exit:
583ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
584ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
58546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
586ae8ec5e1SHisping Lin 
587ae8ec5e1SHisping Lin 	return TeecResult;
588ae8ec5e1SHisping Lin }
589ae8ec5e1SHisping Lin 
5906ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5916ef445a4SHisping Lin {
592c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
593c7de5349SHisping Lin 						  false, buf, length);
5946ef445a4SHisping Lin }
5956ef445a4SHisping Lin 
5966ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5976ef445a4SHisping Lin {
598c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
599c7de5349SHisping Lin 						  true, buf, length);
60016539616SHisping Lin }
60116539616SHisping Lin 
60216539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
60316539616SHisping Lin {
60416539616SHisping Lin 	TEEC_Result res;
605c7de5349SHisping Lin 
606c7de5349SHisping Lin 	res = trusty_base_end_security_data();
607c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
60816539616SHisping Lin 	return res;
60916539616SHisping Lin }
6102cd27853SHisping Lin 
6112cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
6122cd27853SHisping Lin {
613c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
614c7de5349SHisping Lin 						  false, buf, length);
6152cd27853SHisping Lin }
616c7de5349SHisping Lin 
6172cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
6182cd27853SHisping Lin {
619c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
620c7de5349SHisping Lin 						  true, buf, length);
6212cd27853SHisping Lin }
622095e2a82SHisping Lin 
623468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
624468df3b2SHisping Lin {
625468df3b2SHisping Lin 	uint32_t bootflag;
626c7de5349SHisping Lin 	TEEC_Result TeecResult;
627468df3b2SHisping Lin 
628f07e1686SHisping Lin 	*flag = 0;
629f07e1686SHisping Lin 
630c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
631c7de5349SHisping Lin 							false, &bootflag, 1);
632468df3b2SHisping Lin 
633468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
6340202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
6350202ee8aSHisping Lin 		if (bootflag == 0x00000001)
6360202ee8aSHisping Lin 			*flag = 1;
6370202ee8aSHisping Lin #else
638468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
639468df3b2SHisping Lin 			*flag = 1;
6400202ee8aSHisping Lin #endif
641468df3b2SHisping Lin 	}
642095e2a82SHisping Lin 	return TeecResult;
643095e2a82SHisping Lin }
6444aa61755SAndy Ye 
6451ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
6461ef63c75SHisping Lin {
6471ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
6481ef63c75SHisping Lin 						  true, buf, length);
6491ef63c75SHisping Lin }
6501ef63c75SHisping Lin 
651*10f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value)
652*10f41197SHisping Lin {
653*10f41197SHisping Lin 	TEEC_Result TeecResult;
654*10f41197SHisping Lin 	TEEC_Context TeecContext;
655*10f41197SHisping Lin 	TEEC_Session TeecSession;
656*10f41197SHisping Lin 	uint32_t ErrorOrigin;
657*10f41197SHisping Lin 
658*10f41197SHisping Lin 	*value = 0;
659*10f41197SHisping Lin 
660*10f41197SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
661*10f41197SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
662*10f41197SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
663*10f41197SHisping Lin 	TEEC_Operation TeecOperation = {0};
664*10f41197SHisping Lin 
665*10f41197SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
666*10f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
667*10f41197SHisping Lin 		return TeecResult;
668*10f41197SHisping Lin 
669*10f41197SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
670*10f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
671*10f41197SHisping Lin 		return TeecResult;
672*10f41197SHisping Lin 
673*10f41197SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
674*10f41197SHisping Lin 				&TeecSession,
675*10f41197SHisping Lin 				TeecUuid,
676*10f41197SHisping Lin 				TEEC_LOGIN_PUBLIC,
677*10f41197SHisping Lin 				NULL,
678*10f41197SHisping Lin 				NULL,
679*10f41197SHisping Lin 				&ErrorOrigin);
680*10f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
681*10f41197SHisping Lin 		return TeecResult;
682*10f41197SHisping Lin 
683*10f41197SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
684*10f41197SHisping Lin 						    TEEC_NONE,
685*10f41197SHisping Lin 						    TEEC_NONE,
686*10f41197SHisping Lin 						    TEEC_NONE);
687*10f41197SHisping Lin 
688*10f41197SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
689*10f41197SHisping Lin 					STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN,
690*10f41197SHisping Lin 					&TeecOperation,
691*10f41197SHisping Lin 					&ErrorOrigin);
692*10f41197SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
693*10f41197SHisping Lin 		*value = TeecOperation.params[0].value.a;
694*10f41197SHisping Lin 
695*10f41197SHisping Lin 	TEEC_CloseSession(&TeecSession);
696*10f41197SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
697*10f41197SHisping Lin 
698*10f41197SHisping Lin 	return TeecResult;
699*10f41197SHisping Lin }
700*10f41197SHisping Lin 
701fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
702fbf29bfbSHisping Lin {
703fbf29bfbSHisping Lin 	uint32_t levelflag;
704fbf29bfbSHisping Lin 
705fbf29bfbSHisping Lin 	levelflag = flag;
706fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
707fbf29bfbSHisping Lin 						  true, &levelflag, 1);
708fbf29bfbSHisping Lin }
709fbf29bfbSHisping Lin 
710f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
711f39d4289SHisping Lin {
712f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
713f39d4289SHisping Lin 						  true, buf, length);
714f39d4289SHisping Lin }
715f39d4289SHisping Lin 
71634f2e8f6SHisping Lin static void trusty_select_security_level(void)
7177504da74SHisping Lin {
7187504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
7197504da74SHisping Lin 	TEEC_Result TeecResult;
7207504da74SHisping Lin 
7217504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
7227504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
7237504da74SHisping Lin 		run_command("download", 0);
7247504da74SHisping Lin 		return;
7257504da74SHisping Lin 	}
7267504da74SHisping Lin 
7277504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
7287504da74SHisping Lin 		debug("optee select security level success!");
7297504da74SHisping Lin 	else
7307504da74SHisping Lin 		panic("optee select security level fail!");
7317504da74SHisping Lin 
7327504da74SHisping Lin 	return;
7337504da74SHisping Lin #endif
7347504da74SHisping Lin }
7357504da74SHisping Lin 
73651ac7005SHisping Lin void optee_client_init(void)
73751ac7005SHisping Lin {
73851ac7005SHisping Lin 	trusty_select_security_level();
73934f2e8f6SHisping Lin 	trusty_notify_always_use_security();
74051ac7005SHisping Lin }
74151ac7005SHisping Lin 
742d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
743d5913350SHisping Lin {
744d5913350SHisping Lin 	TEEC_Result TeecResult;
745d5913350SHisping Lin 	TEEC_Context TeecContext;
746d5913350SHisping Lin 	TEEC_Session TeecSession;
747d5913350SHisping Lin 	uint32_t ErrorOrigin;
748d5913350SHisping Lin 
749d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
750d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
751d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
752d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
753d5913350SHisping Lin 
754d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
755d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
756d5913350SHisping Lin 		return TeecResult;
757d5913350SHisping Lin 
758d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
759d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
760d5913350SHisping Lin 		return TeecResult;
761d5913350SHisping Lin 
762d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
763d5913350SHisping Lin 				&TeecSession,
764d5913350SHisping Lin 				TeecUuid,
765d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
766d5913350SHisping Lin 				NULL,
767d5913350SHisping Lin 				NULL,
768d5913350SHisping Lin 				&ErrorOrigin);
769d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
770d5913350SHisping Lin 		return TeecResult;
771d5913350SHisping Lin 
772d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
773d5913350SHisping Lin 
774d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
775d5913350SHisping Lin 
776d5913350SHisping Lin 	SharedMem.size = byte_len;
777d5913350SHisping Lin 	SharedMem.flags = 0;
778d5913350SHisping Lin 
779d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
780d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
781d5913350SHisping Lin 		goto exit;
782d5913350SHisping Lin 
783d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
784d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
785d5913350SHisping Lin 
786d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
787d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
788d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
789d5913350SHisping Lin 						    TEEC_NONE,
790d5913350SHisping Lin 						    TEEC_NONE);
791d5913350SHisping Lin 
792d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
793d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
794d5913350SHisping Lin 					&TeecOperation,
795d5913350SHisping Lin 					&ErrorOrigin);
796d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
797d5913350SHisping Lin 		goto exit;
798d5913350SHisping Lin 
799d5913350SHisping Lin exit:
800d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
801d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
802d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
803d5913350SHisping Lin 
804d5913350SHisping Lin 	return TeecResult;
805d5913350SHisping Lin }
806d5913350SHisping Lin 
807d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
808d5913350SHisping Lin {
809d5913350SHisping Lin 	TEEC_Result TeecResult;
810d5913350SHisping Lin 	TEEC_Context TeecContext;
811d5913350SHisping Lin 	TEEC_Session TeecSession;
812d5913350SHisping Lin 	uint32_t ErrorOrigin;
813d5913350SHisping Lin 
814d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
815d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
816d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
817d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
818d5913350SHisping Lin 
819d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
820d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
821d5913350SHisping Lin 		return TeecResult;
822d5913350SHisping Lin 
823d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
824d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
825d5913350SHisping Lin 		return TeecResult;
826d5913350SHisping Lin 
827d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
828d5913350SHisping Lin 				&TeecSession,
829d5913350SHisping Lin 				TeecUuid,
830d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
831d5913350SHisping Lin 				NULL,
832d5913350SHisping Lin 				NULL,
833d5913350SHisping Lin 				&ErrorOrigin);
834d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
835d5913350SHisping Lin 		return TeecResult;
836d5913350SHisping Lin 
837d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
838d5913350SHisping Lin 
839d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
840d5913350SHisping Lin 
841d5913350SHisping Lin 	SharedMem.size = byte_len;
842d5913350SHisping Lin 	SharedMem.flags = 0;
843d5913350SHisping Lin 
844d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
845d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
846d5913350SHisping Lin 		goto exit;
847d5913350SHisping Lin 
848d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
849d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
850d5913350SHisping Lin 
851d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
852d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
853d5913350SHisping Lin 						    TEEC_NONE,
854d5913350SHisping Lin 						    TEEC_NONE);
855d5913350SHisping Lin 
856d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
857d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
858d5913350SHisping Lin 					&TeecOperation,
859d5913350SHisping Lin 					&ErrorOrigin);
860d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
861d5913350SHisping Lin 		goto exit;
862d5913350SHisping Lin 
863d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
864d5913350SHisping Lin 
865d5913350SHisping Lin exit:
866d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
867d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
868d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
869d5913350SHisping Lin 
870d5913350SHisping Lin 	return TeecResult;
871d5913350SHisping Lin }
872d5913350SHisping Lin 
87390e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,
874bb1ba6acSHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
875bb1ba6acSHisping Lin {
876bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
877bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
878bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
879bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
880bb1ba6acSHisping Lin 
881bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
882bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
883bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
884bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
885bb1ba6acSHisping Lin 
886bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
887bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
888bb1ba6acSHisping Lin 		return TeecResult;
889bb1ba6acSHisping Lin 
890bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
891bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
892bb1ba6acSHisping Lin 		return TeecResult;
893bb1ba6acSHisping Lin 
894bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
895bb1ba6acSHisping Lin 				&TeecSession,
896bb1ba6acSHisping Lin 				TeecUuid,
897bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
898bb1ba6acSHisping Lin 				NULL,
899bb1ba6acSHisping Lin 				NULL,
900bb1ba6acSHisping Lin 				&ErrorOrigin);
901bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
902bb1ba6acSHisping Lin 		return TeecResult;
903bb1ba6acSHisping Lin 
904bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
905bb1ba6acSHisping Lin 
906bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
907bb1ba6acSHisping Lin 
908bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
909bb1ba6acSHisping Lin 	SharedMem.flags = 0;
910bb1ba6acSHisping Lin 
911bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
912bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
913bb1ba6acSHisping Lin 		goto exit;
914bb1ba6acSHisping Lin 
915bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
916bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
917bb1ba6acSHisping Lin 
918bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
919bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
920bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
921bb1ba6acSHisping Lin 						    TEEC_NONE,
922bb1ba6acSHisping Lin 						    TEEC_NONE);
923bb1ba6acSHisping Lin 
924bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
92590e849a0Sxb.wang 					STORAGE_CMD_WRITE_OEM_OTP_KEY,
926bb1ba6acSHisping Lin 					&TeecOperation,
927bb1ba6acSHisping Lin 					&ErrorOrigin);
928bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
929bb1ba6acSHisping Lin 		goto exit;
930bb1ba6acSHisping Lin 
931bb1ba6acSHisping Lin exit:
932bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
933bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
934bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
935bb1ba6acSHisping Lin 
936bb1ba6acSHisping Lin 	return TeecResult;
937bb1ba6acSHisping Lin }
938bb1ba6acSHisping Lin 
9399deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value)
9409deb34f6SHisping Lin {
9419deb34f6SHisping Lin 	TEEC_Result TeecResult;
9429deb34f6SHisping Lin 	TEEC_Context TeecContext;
9439deb34f6SHisping Lin 	TEEC_Session TeecSession;
9449deb34f6SHisping Lin 	uint32_t ErrorOrigin;
9459deb34f6SHisping Lin 
9469deb34f6SHisping Lin 	*value = 0xFF;
9479deb34f6SHisping Lin 
9489deb34f6SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
9499deb34f6SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9509deb34f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9519deb34f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
9529deb34f6SHisping Lin 
9539deb34f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
9549deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9559deb34f6SHisping Lin 		return TeecResult;
9569deb34f6SHisping Lin 
9579deb34f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9589deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9599deb34f6SHisping Lin 		return TeecResult;
9609deb34f6SHisping Lin 
9619deb34f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9629deb34f6SHisping Lin 				&TeecSession,
9639deb34f6SHisping Lin 				TeecUuid,
9649deb34f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
9659deb34f6SHisping Lin 				NULL,
9669deb34f6SHisping Lin 				NULL,
9679deb34f6SHisping Lin 				&ErrorOrigin);
9689deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9699deb34f6SHisping Lin 		return TeecResult;
9709deb34f6SHisping Lin 
9719deb34f6SHisping Lin 	TeecOperation.params[0].value.a = key_id;
9729deb34f6SHisping Lin 
9739deb34f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
9749deb34f6SHisping Lin 						    TEEC_NONE,
9759deb34f6SHisping Lin 						    TEEC_NONE,
9769deb34f6SHisping Lin 						    TEEC_NONE);
9779deb34f6SHisping Lin 
9789deb34f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9799deb34f6SHisping Lin 					STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN,
9809deb34f6SHisping Lin 					&TeecOperation,
9819deb34f6SHisping Lin 					&ErrorOrigin);
9829deb34f6SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
9839deb34f6SHisping Lin 		*value = TeecOperation.params[0].value.b;
9849deb34f6SHisping Lin 
9859deb34f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
9869deb34f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9879deb34f6SHisping Lin 
9889deb34f6SHisping Lin 	return TeecResult;
9899deb34f6SHisping Lin }
9909deb34f6SHisping Lin 
99190e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)
992a405238aSHisping Lin {
993a405238aSHisping Lin 	TEEC_Result TeecResult;
994a405238aSHisping Lin 	TEEC_Context TeecContext;
995a405238aSHisping Lin 	TEEC_Session TeecSession;
996a405238aSHisping Lin 	uint32_t ErrorOrigin;
997a405238aSHisping Lin 
998a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
999a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1000a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1001a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
1002a405238aSHisping Lin 
1003a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1004a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1005a405238aSHisping Lin 		return TeecResult;
1006a405238aSHisping Lin 
1007a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1008a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1009a405238aSHisping Lin 		return TeecResult;
1010a405238aSHisping Lin 
1011a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1012a405238aSHisping Lin 				&TeecSession,
1013a405238aSHisping Lin 				TeecUuid,
1014a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
1015a405238aSHisping Lin 				NULL,
1016a405238aSHisping Lin 				NULL,
1017a405238aSHisping Lin 				&ErrorOrigin);
1018a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1019a405238aSHisping Lin 		return TeecResult;
1020a405238aSHisping Lin 
1021a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
1022a405238aSHisping Lin 
1023a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1024a405238aSHisping Lin 						    TEEC_NONE,
1025a405238aSHisping Lin 						    TEEC_NONE,
1026a405238aSHisping Lin 						    TEEC_NONE);
1027a405238aSHisping Lin 
1028a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1029a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
1030a405238aSHisping Lin 					&TeecOperation,
1031a405238aSHisping Lin 					&ErrorOrigin);
1032a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1033a405238aSHisping Lin 		goto exit;
1034a405238aSHisping Lin 
1035a405238aSHisping Lin exit:
1036a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
1037a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1038a405238aSHisping Lin 
1039a405238aSHisping Lin 	return TeecResult;
1040a405238aSHisping Lin }
1041a405238aSHisping Lin 
10422f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config,
10432f8c34bdSxb.wang 				   uint32_t src_phys_addr, uint32_t dst_phys_addr,
10442f8c34bdSxb.wang 				   uint32_t len)
1045fc3694d6Sxb.wang {
1046fc3694d6Sxb.wang 	TEEC_Result TeecResult;
1047fc3694d6Sxb.wang 	TEEC_Context TeecContext;
1048fc3694d6Sxb.wang 	TEEC_Session TeecSession;
1049fc3694d6Sxb.wang 	TEEC_Operation TeecOperation = {0};
1050fc3694d6Sxb.wang 	uint32_t ErrorOrigin;
1051fc3694d6Sxb.wang 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
1052fc3694d6Sxb.wang 	TEEC_SharedMemory SharedMem_config = {0};
1053fc3694d6Sxb.wang 
10542f8c34bdSxb.wang 	if (key_id != RK_OEM_OTP_KEY0 &&
10552f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY1 &&
10562f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY2 &&
10572f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY3 &&
10582f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY_FW)
1059fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1060fc3694d6Sxb.wang 
10612f8c34bdSxb.wang 	if (!config)
1062fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1063fc3694d6Sxb.wang 
1064fc3694d6Sxb.wang 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
1065fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1066fc3694d6Sxb.wang 
1067fc3694d6Sxb.wang 	if (config->mode >= RK_CIPHER_MODE_XTS)
1068fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1069fc3694d6Sxb.wang 
1070fc3694d6Sxb.wang 	if (config->operation != RK_MODE_ENCRYPT &&
1071fc3694d6Sxb.wang 	    config->operation != RK_MODE_DECRYPT)
1072fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1073fc3694d6Sxb.wang 
1074fc3694d6Sxb.wang 	if (config->key_len != 16 &&
1075fc3694d6Sxb.wang 	    config->key_len != 24 &&
1076fc3694d6Sxb.wang 	    config->key_len != 32)
1077fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1078fc3694d6Sxb.wang 
10792f8c34bdSxb.wang 	if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16)
10802f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10812f8c34bdSxb.wang 
10822f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126)
10832f8c34bdSxb.wang 	if (config->key_len == 24)
10842f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10852f8c34bdSxb.wang #endif
10862f8c34bdSxb.wang 
1087fc3694d6Sxb.wang 	if (len % AES_BLOCK_SIZE ||
1088fc3694d6Sxb.wang 	    len == 0)
1089fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1090fc3694d6Sxb.wang 
10912f8c34bdSxb.wang 	if (!src_phys_addr || !dst_phys_addr)
10922f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10932f8c34bdSxb.wang 
1094fc3694d6Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
1095fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1096fc3694d6Sxb.wang 		return TeecResult;
1097fc3694d6Sxb.wang 
1098fc3694d6Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1099fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1100fc3694d6Sxb.wang 		return TeecResult;
1101fc3694d6Sxb.wang 
1102fc3694d6Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
1103fc3694d6Sxb.wang 				      &TeecSession,
1104fc3694d6Sxb.wang 				      &uuid,
1105fc3694d6Sxb.wang 				      TEEC_LOGIN_PUBLIC,
1106fc3694d6Sxb.wang 				      NULL,
1107fc3694d6Sxb.wang 				      NULL,
1108fc3694d6Sxb.wang 				      &ErrorOrigin);
1109fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1110fc3694d6Sxb.wang 		goto exit;
1111fc3694d6Sxb.wang 
1112fc3694d6Sxb.wang 	SharedMem_config.size = sizeof(rk_cipher_config);
1113fc3694d6Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
1114fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1115fc3694d6Sxb.wang 		goto exit;
1116fc3694d6Sxb.wang 
1117fc3694d6Sxb.wang 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
1118fc3694d6Sxb.wang 	TeecOperation.params[0].value.a       = key_id;
1119fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
1120fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
11212f8c34bdSxb.wang 	TeecOperation.params[2].value.a       = src_phys_addr;
11222f8c34bdSxb.wang 	TeecOperation.params[2].value.b       = len;
11232f8c34bdSxb.wang 	TeecOperation.params[3].value.a       = dst_phys_addr;
1124fc3694d6Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1125fc3694d6Sxb.wang 						    TEEC_MEMREF_TEMP_INPUT,
11262f8c34bdSxb.wang 						    TEEC_VALUE_INPUT,
11272f8c34bdSxb.wang 						    TEEC_VALUE_INPUT);
11282f8c34bdSxb.wang 
11292f8c34bdSxb.wang 	crypto_flush_cacheline(src_phys_addr, len);
11302f8c34bdSxb.wang 	crypto_flush_cacheline(dst_phys_addr, len);
11312f8c34bdSxb.wang 
1132fc3694d6Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11332f8c34bdSxb.wang 					CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER,
1134fc3694d6Sxb.wang 					&TeecOperation,
1135fc3694d6Sxb.wang 					&ErrorOrigin);
1136fc3694d6Sxb.wang 
1137a900eef3SHisping Lin 	crypto_invalidate_cacheline(dst_phys_addr, len);
1138a900eef3SHisping Lin 
1139fc3694d6Sxb.wang exit:
1140fc3694d6Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem_config);
1141fc3694d6Sxb.wang 	TEEC_CloseSession(&TeecSession);
1142fc3694d6Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
1143fc3694d6Sxb.wang 	return TeecResult;
1144fc3694d6Sxb.wang }
1145fc3694d6Sxb.wang 
11464aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
11474aa61755SAndy Ye {
11484aa61755SAndy Ye 	TEEC_Result TeecResult;
11494aa61755SAndy Ye 	TEEC_Context TeecContext;
11504aa61755SAndy Ye 	TEEC_Session TeecSession;
11514aa61755SAndy Ye 	uint32_t ErrorOrigin;
11524aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
11534aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
11544aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
11554aa61755SAndy Ye 				}
11564aa61755SAndy Ye 			     };
11574aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
11584aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
11593251364cSHisping Lin 	struct blk_desc *dev_desc;
11603251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
11616651d4c0SJason Zhu 	if (!dev_desc) {
11626651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
11636651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
11646651d4c0SJason Zhu 	}
11654aa61755SAndy Ye 
1166f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1167f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1168f4e1db95SHisping Lin 		return TeecResult;
11694aa61755SAndy Ye 
11704aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1171f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1172f4e1db95SHisping Lin 		return TeecResult;
11734aa61755SAndy Ye 
11743251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
11753251364cSHisping Lin 						TEEC_NONE,
11763251364cSHisping Lin 						TEEC_NONE,
11773251364cSHisping Lin 						TEEC_NONE);
11783251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1179b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1180b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1181b9a7e756SHisping Lin 	else
1182b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1183b9a7e756SHisping Lin 
11843251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
11853251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
11863251364cSHisping Lin #endif
11873251364cSHisping Lin 
11884aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
11894aa61755SAndy Ye 				      &TeecSession,
11904aa61755SAndy Ye 				      TeecUuid,
11914aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
11924aa61755SAndy Ye 				      NULL,
11933251364cSHisping Lin 					&TeecOperation,
11944aa61755SAndy Ye 				      &ErrorOrigin);
1195f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1196f4e1db95SHisping Lin 		return TeecResult;
11974aa61755SAndy Ye 
11984aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
11994aa61755SAndy Ye 
12004aa61755SAndy Ye 	SharedMem0.size = *dh_size;
12014aa61755SAndy Ye 	SharedMem0.flags = 0;
12024aa61755SAndy Ye 
12034aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1204f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1205f4e1db95SHisping Lin 		goto exit;
12064aa61755SAndy Ye 
12074aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12084aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12094aa61755SAndy Ye 
12104aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
12114aa61755SAndy Ye 						    TEEC_NONE,
12124aa61755SAndy Ye 						    TEEC_NONE,
12134aa61755SAndy Ye 						    TEEC_NONE);
12144aa61755SAndy Ye 
12154aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12164aa61755SAndy Ye 					143,
12174aa61755SAndy Ye 					&TeecOperation,
12184aa61755SAndy Ye 					&ErrorOrigin);
1219f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1220f4e1db95SHisping Lin 		goto exit;
12214aa61755SAndy Ye 
12224aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
12234aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1224f4e1db95SHisping Lin exit:
12254aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
12264aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1227f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12284aa61755SAndy Ye 
12294aa61755SAndy Ye 	return TeecResult;
12304aa61755SAndy Ye }
12314aa61755SAndy Ye 
12324aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
12334aa61755SAndy Ye {
12344aa61755SAndy Ye 	TEEC_Result TeecResult;
12354aa61755SAndy Ye 	TEEC_Context TeecContext;
12364aa61755SAndy Ye 	TEEC_Session TeecSession;
12374aa61755SAndy Ye 	uint32_t ErrorOrigin;
12384aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
12394aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
12404aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
12414aa61755SAndy Ye 				}
12424aa61755SAndy Ye 			     };
12434aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
12444aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
12453251364cSHisping Lin 	struct blk_desc *dev_desc;
12463251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
12476651d4c0SJason Zhu 	if (!dev_desc) {
12486651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
12496651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
12506651d4c0SJason Zhu 	}
12514aa61755SAndy Ye 
1252f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1253f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1254f4e1db95SHisping Lin 		return TeecResult;
12554aa61755SAndy Ye 
12564aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1257f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1258f4e1db95SHisping Lin 		return TeecResult;
12594aa61755SAndy Ye 
12603251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
12613251364cSHisping Lin 						TEEC_NONE,
12623251364cSHisping Lin 						TEEC_NONE,
12633251364cSHisping Lin 						TEEC_NONE);
12643251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1265b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1266b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1267b9a7e756SHisping Lin 	else
1268b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1269b9a7e756SHisping Lin 
12703251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
12713251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
12723251364cSHisping Lin #endif
12733251364cSHisping Lin 
12744aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
12754aa61755SAndy Ye 				      &TeecSession,
12764aa61755SAndy Ye 				      TeecUuid,
12774aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
12784aa61755SAndy Ye 				      NULL,
12793251364cSHisping Lin 					&TeecOperation,
12804aa61755SAndy Ye 				      &ErrorOrigin);
1281f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1282f4e1db95SHisping Lin 		return TeecResult;
12834aa61755SAndy Ye 
12844aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
12854aa61755SAndy Ye 
12864aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
12874aa61755SAndy Ye 	SharedMem0.flags = 0;
12884aa61755SAndy Ye 
12894aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1290f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1291f4e1db95SHisping Lin 		goto exit;
12924aa61755SAndy Ye 
12934aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12944aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12954aa61755SAndy Ye 
12964aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
12974aa61755SAndy Ye 						    TEEC_NONE,
12984aa61755SAndy Ye 						    TEEC_NONE,
12994aa61755SAndy Ye 						    TEEC_NONE);
13004aa61755SAndy Ye 
13014aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13024aa61755SAndy Ye 					144,
13034aa61755SAndy Ye 					&TeecOperation,
13044aa61755SAndy Ye 					&ErrorOrigin);
1305f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1306f4e1db95SHisping Lin 		goto exit;
13074aa61755SAndy Ye 
13084aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
13094aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1310f4e1db95SHisping Lin exit:
13114aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
13124aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1313f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
13144aa61755SAndy Ye 
13154aa61755SAndy Ye 	return TeecResult;
13164aa61755SAndy Ye }
13174aa61755SAndy Ye 
13184aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
13194aa61755SAndy Ye 			      uint32_t *operation_size,
13204aa61755SAndy Ye 			      uint8_t *out,
13214aa61755SAndy Ye 			      uint32_t *out_len)
13224aa61755SAndy Ye {
13234aa61755SAndy Ye 	TEEC_Result TeecResult;
13244aa61755SAndy Ye 	TEEC_Context TeecContext;
13254aa61755SAndy Ye 	TEEC_Session TeecSession;
13264aa61755SAndy Ye 	uint32_t ErrorOrigin;
13274aa61755SAndy Ye 
13284aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
13294aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
13304aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
13314aa61755SAndy Ye 				}
13324aa61755SAndy Ye 			     };
13334aa61755SAndy Ye 
13344aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
13354aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
13363251364cSHisping Lin 	struct blk_desc *dev_desc;
13373251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
13386651d4c0SJason Zhu 	if (!dev_desc) {
13396651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
13406651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
13416651d4c0SJason Zhu 	}
13424aa61755SAndy Ye 
1343f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1344f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1345f4e1db95SHisping Lin 		return TeecResult;
13464aa61755SAndy Ye 
13474aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1348f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1349f4e1db95SHisping Lin 		return TeecResult;
13504aa61755SAndy Ye 
13513251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
13523251364cSHisping Lin 						TEEC_NONE,
13533251364cSHisping Lin 						TEEC_NONE,
13543251364cSHisping Lin 						TEEC_NONE);
13553251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1356b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1357b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1358b9a7e756SHisping Lin 	else
1359b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1360b9a7e756SHisping Lin 
13613251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
13623251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
13633251364cSHisping Lin #endif
13643251364cSHisping Lin 
13654aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
13664aa61755SAndy Ye 				      &TeecSession,
13674aa61755SAndy Ye 				      TeecUuid,
13684aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
13694aa61755SAndy Ye 				      NULL,
13703251364cSHisping Lin 					&TeecOperation,
13714aa61755SAndy Ye 				      &ErrorOrigin);
1372f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1373f4e1db95SHisping Lin 		return TeecResult;
13744aa61755SAndy Ye 
13754aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
13764aa61755SAndy Ye 
13774aa61755SAndy Ye 	SharedMem0.size = *operation_size;
13784aa61755SAndy Ye 	SharedMem0.flags = 0;
13794aa61755SAndy Ye 
13804aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1381f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1382f4e1db95SHisping Lin 		goto exit;
13834aa61755SAndy Ye 
13844aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
13854aa61755SAndy Ye 
13864aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13874aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13884aa61755SAndy Ye 
13894aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
13904aa61755SAndy Ye 
13914aa61755SAndy Ye 	SharedMem1.size = *out_len;
13924aa61755SAndy Ye 	SharedMem1.flags = 0;
13934aa61755SAndy Ye 
13944aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1395f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1396f4e1db95SHisping Lin 		goto exit;
13974aa61755SAndy Ye 
13984aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
13994aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
14004aa61755SAndy Ye 
14014aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
14024aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
14034aa61755SAndy Ye 						    TEEC_NONE,
14044aa61755SAndy Ye 						    TEEC_NONE);
14054aa61755SAndy Ye 
14064aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14074aa61755SAndy Ye 					145,
14084aa61755SAndy Ye 					&TeecOperation,
14094aa61755SAndy Ye 					&ErrorOrigin);
1410f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1411f4e1db95SHisping Lin 		goto exit;
14124aa61755SAndy Ye 
14134aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
14144aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1415f4e1db95SHisping Lin exit:
14164aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
14174aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1418f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1419f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14204aa61755SAndy Ye 
14214aa61755SAndy Ye 	return TeecResult;
14224aa61755SAndy Ye }
14234aa61755SAndy Ye 
14244aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
14254aa61755SAndy Ye {
14264aa61755SAndy Ye 	TEEC_Result TeecResult;
14274aa61755SAndy Ye 	TEEC_Context TeecContext;
14284aa61755SAndy Ye 	TEEC_Session TeecSession;
14294aa61755SAndy Ye 	uint32_t ErrorOrigin;
14304aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
14314aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
14324aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
14334aa61755SAndy Ye 				}
14344aa61755SAndy Ye 			     };
14354aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
14364aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
14373251364cSHisping Lin 	struct blk_desc *dev_desc;
14383251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
14396651d4c0SJason Zhu 	if (!dev_desc) {
14406651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
14416651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
14426651d4c0SJason Zhu 	}
1443f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1444f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1445f4e1db95SHisping Lin 		return TeecResult;
14464aa61755SAndy Ye 
14474aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1448f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1449f4e1db95SHisping Lin 		return TeecResult;
14504aa61755SAndy Ye 
14513251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
14523251364cSHisping Lin 						TEEC_NONE,
14533251364cSHisping Lin 						TEEC_NONE,
14543251364cSHisping Lin 						TEEC_NONE);
14553251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1456b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1457b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1458b9a7e756SHisping Lin 	else
1459b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1460b9a7e756SHisping Lin 
14613251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
14623251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
14633251364cSHisping Lin #endif
14643251364cSHisping Lin 
14654aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
14664aa61755SAndy Ye 					&TeecSession,
14674aa61755SAndy Ye 					TeecUuid,
14684aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
14694aa61755SAndy Ye 					NULL,
14703251364cSHisping Lin 					&TeecOperation,
14714aa61755SAndy Ye 					&ErrorOrigin);
1472f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1473f4e1db95SHisping Lin 		return TeecResult;
14744aa61755SAndy Ye 
14754aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
14764aa61755SAndy Ye 
14774aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
14784aa61755SAndy Ye 	SharedMem0.flags = 0;
14794aa61755SAndy Ye 
14804aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1481f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1482f4e1db95SHisping Lin 		goto exit;
14834aa61755SAndy Ye 
14844aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
14854aa61755SAndy Ye 
14864aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
14874aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
14884aa61755SAndy Ye 
14894aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
14904aa61755SAndy Ye 						    TEEC_NONE,
14914aa61755SAndy Ye 						    TEEC_NONE,
14924aa61755SAndy Ye 						    TEEC_NONE);
14934aa61755SAndy Ye 
14944aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14954aa61755SAndy Ye 					146,
14964aa61755SAndy Ye 					&TeecOperation,
14974aa61755SAndy Ye 					&ErrorOrigin);
1498f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1499f4e1db95SHisping Lin 		goto exit;
1500f4e1db95SHisping Lin exit:
15014aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
15024aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1503f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
15044aa61755SAndy Ye 
15054aa61755SAndy Ye 	return TeecResult;
15064aa61755SAndy Ye }
1507