xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 51ac700545874e81f58a07994e5a5c1f3f0a9c97)
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
32ae8ec5e1SHisping Lin 
332f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER	0x00000002
34fc3694d6Sxb.wang 
35fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID	{ 0x0cacdb5d, 0x4fea, 0x466c, \
36fc3694d6Sxb.wang 		{ 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } }
37fc3694d6Sxb.wang 
38ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
39ae8ec5e1SHisping Lin {
40ae8ec5e1SHisping Lin 	if (in > 9)
41ae8ec5e1SHisping Lin 		return in + 55;
42ae8ec5e1SHisping Lin 	else
43ae8ec5e1SHisping Lin 		return in + 48;
44ae8ec5e1SHisping Lin }
45ae8ec5e1SHisping Lin 
46c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
47ae8ec5e1SHisping Lin {
48ae8ec5e1SHisping Lin 	uint32_t i = 0;
49ae8ec5e1SHisping Lin 
50ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
51ae8ec5e1SHisping Lin 		return 0;
52ae8ec5e1SHisping Lin 
53ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
54ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
55ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
56ae8ec5e1SHisping Lin 	}
57ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
58ae8ec5e1SHisping Lin 
59ae8ec5e1SHisping Lin 	return blen * 2;
60ae8ec5e1SHisping Lin }
61ae8ec5e1SHisping Lin 
622f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size)
632f8c34bdSxb.wang {
642f8c34bdSxb.wang 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
652f8c34bdSxb.wang 	ulong aligned_input, aligned_len;
662f8c34bdSxb.wang 
672f8c34bdSxb.wang 	if (!addr || !size)
682f8c34bdSxb.wang 		return;
692f8c34bdSxb.wang 
702f8c34bdSxb.wang 	/* Must flush dcache before crypto DMA fetch data region */
712f8c34bdSxb.wang 	aligned_input = round_down(addr, alignment);
722f8c34bdSxb.wang 	aligned_len = round_up(size + (addr - aligned_input), alignment);
732f8c34bdSxb.wang 	flush_cache(aligned_input, aligned_len);
742f8c34bdSxb.wang }
752f8c34bdSxb.wang 
76a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
77a900eef3SHisping Lin {
78a900eef3SHisping Lin 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
79a900eef3SHisping Lin 	ulong aligned_input, aligned_len;
80a900eef3SHisping Lin 
81a900eef3SHisping Lin 	if (!addr || !size)
82a900eef3SHisping Lin 		return;
83a900eef3SHisping Lin 
84a900eef3SHisping Lin 	/* Must invalidate dcache after crypto DMA write data region */
85a900eef3SHisping Lin 	aligned_input = round_down(addr, alignment);
86a900eef3SHisping Lin 	aligned_len = round_up(size + (addr - aligned_input), alignment);
87a900eef3SHisping Lin 	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
88a900eef3SHisping Lin }
89a900eef3SHisping Lin 
90c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
91c7de5349SHisping Lin 						uint32_t filename_size,
92c7de5349SHisping Lin 						uint8_t *data,
93c7de5349SHisping Lin 						uint32_t data_size)
94ae8ec5e1SHisping Lin {
95ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
96ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
97ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
98ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
99ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
100ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
101ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
102ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1033251364cSHisping Lin 	struct blk_desc *dev_desc;
1043251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1056651d4c0SJason Zhu 	if (!dev_desc) {
1066651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1076651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1086651d4c0SJason Zhu 	}
1093251364cSHisping Lin 
110f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
111f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
112f4e1db95SHisping Lin 		return TeecResult;
113ae8ec5e1SHisping Lin 
114ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
115f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
116f4e1db95SHisping Lin 		return TeecResult;
117ae8ec5e1SHisping Lin 
1183251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1193251364cSHisping Lin 						    TEEC_NONE,
1203251364cSHisping Lin 						    TEEC_NONE,
1213251364cSHisping Lin 						    TEEC_NONE);
1223251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
123b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
124b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
125b9a7e756SHisping Lin 	else
126b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1273251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1283251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1293251364cSHisping Lin #endif
1303251364cSHisping Lin 
131ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
132ae8ec5e1SHisping Lin 				&TeecSession,
133ae8ec5e1SHisping Lin 				TeecUuid,
134ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
135ae8ec5e1SHisping Lin 				NULL,
1363251364cSHisping Lin 				&TeecOperation,
137ae8ec5e1SHisping Lin 				&ErrorOrigin);
138f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
139f4e1db95SHisping Lin 		return TeecResult;
140ae8ec5e1SHisping Lin 
141ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
142ae8ec5e1SHisping Lin 
143c7de5349SHisping Lin 	SharedMem0.size = filename_size;
144ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
145ae8ec5e1SHisping Lin 
146ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
147f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
148f4e1db95SHisping Lin 		goto exit;
149ae8ec5e1SHisping Lin 
150c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
151ae8ec5e1SHisping Lin 
152ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
153ae8ec5e1SHisping Lin 
154c7de5349SHisping Lin 	SharedMem1.size = data_size;
155c7de5349SHisping Lin 	SharedMem1.flags = 0;
156c7de5349SHisping Lin 
157c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
158c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
159c7de5349SHisping Lin 		goto exit;
160c7de5349SHisping Lin 
161c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
162c7de5349SHisping Lin 
163c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
164c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
165c7de5349SHisping Lin 
166c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
167c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
168c7de5349SHisping Lin 
169c7de5349SHisping Lin 
170c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
171c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
172c7de5349SHisping Lin 						TEEC_NONE,
173c7de5349SHisping Lin 						TEEC_NONE);
174c7de5349SHisping Lin 
175c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
176c7de5349SHisping Lin 					1,
177c7de5349SHisping Lin 					&TeecOperation,
178c7de5349SHisping Lin 					&ErrorOrigin);
179c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
180c7de5349SHisping Lin 		goto exit;
181c7de5349SHisping Lin exit:
182c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
183c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
184c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
185c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
186c7de5349SHisping Lin 
187c7de5349SHisping Lin 	return TeecResult;
188c7de5349SHisping Lin }
189c7de5349SHisping Lin 
190c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
191c7de5349SHisping Lin 					       uint32_t filename_size,
192c7de5349SHisping Lin 					       uint8_t *data,
193c7de5349SHisping Lin 					       uint32_t data_size)
194c7de5349SHisping Lin {
195c7de5349SHisping Lin 	TEEC_Result TeecResult;
196c7de5349SHisping Lin 	TEEC_Context TeecContext;
197c7de5349SHisping Lin 	TEEC_Session TeecSession;
198c7de5349SHisping Lin 	uint32_t ErrorOrigin;
199c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
200c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
201c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
202c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
203c7de5349SHisping Lin 
204c7de5349SHisping Lin 	struct blk_desc *dev_desc;
205c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
206c7de5349SHisping Lin 	if (!dev_desc) {
207c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
208c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
209c7de5349SHisping Lin 	}
210c7de5349SHisping Lin 
211c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
212c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
213c7de5349SHisping Lin 		return TeecResult;
214c7de5349SHisping Lin 
215c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
216c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
217c7de5349SHisping Lin 		return TeecResult;
218c7de5349SHisping Lin 
219c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
220c7de5349SHisping Lin 						TEEC_NONE,
221c7de5349SHisping Lin 						TEEC_NONE,
222c7de5349SHisping Lin 						TEEC_NONE);
223c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
224c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
225c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
226c7de5349SHisping Lin 	else
227c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
228c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
229c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
230c7de5349SHisping Lin #endif
231c7de5349SHisping Lin 
232c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
233c7de5349SHisping Lin 				&TeecSession,
234c7de5349SHisping Lin 				TeecUuid,
235c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
236c7de5349SHisping Lin 				NULL,
237c7de5349SHisping Lin 				&TeecOperation,
238c7de5349SHisping Lin 				&ErrorOrigin);
239c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
240c7de5349SHisping Lin 		return TeecResult;
241c7de5349SHisping Lin 
242c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
243c7de5349SHisping Lin 
244c7de5349SHisping Lin 	SharedMem0.size = filename_size;
245c7de5349SHisping Lin 	SharedMem0.flags = 0;
246c7de5349SHisping Lin 
247c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
248c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
249c7de5349SHisping Lin 		goto exit;
250c7de5349SHisping Lin 
251c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
252c7de5349SHisping Lin 
253c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
254c7de5349SHisping Lin 
255c7de5349SHisping Lin 	SharedMem1.size = data_size;
256ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
257ae8ec5e1SHisping Lin 
258ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
259f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
260f4e1db95SHisping Lin 		goto exit;
261ae8ec5e1SHisping Lin 
262ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
263ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
264ae8ec5e1SHisping Lin 
265ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
266ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
267ae8ec5e1SHisping Lin 
268ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
269ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
270ae8ec5e1SHisping Lin 						TEEC_NONE,
271ae8ec5e1SHisping Lin 						TEEC_NONE);
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
274ae8ec5e1SHisping Lin 					0,
275ae8ec5e1SHisping Lin 					&TeecOperation,
276ae8ec5e1SHisping Lin 					&ErrorOrigin);
27746b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
278c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
279f4e1db95SHisping Lin exit:
280ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
281ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
282ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
28346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
284ae8ec5e1SHisping Lin 
285ae8ec5e1SHisping Lin 	return TeecResult;
286ae8ec5e1SHisping Lin }
287ae8ec5e1SHisping Lin 
288c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
289c7de5349SHisping Lin {
290c7de5349SHisping Lin 	TEEC_Result TeecResult;
291c7de5349SHisping Lin 	TEEC_Context TeecContext;
292c7de5349SHisping Lin 	TEEC_Session TeecSession;
293c7de5349SHisping Lin 	uint32_t ErrorOrigin;
294c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
295c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
296c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
297c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
298c7de5349SHisping Lin 
299c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
300c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
301c7de5349SHisping Lin 		return TeecResult;
302c7de5349SHisping Lin 
303c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
304c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
305c7de5349SHisping Lin 		return TeecResult;
306c7de5349SHisping Lin 
307c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
308c7de5349SHisping Lin 				&TeecSession,
309c7de5349SHisping Lin 				TeecUuid,
310c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
311c7de5349SHisping Lin 				NULL,
312c7de5349SHisping Lin 				NULL,
313c7de5349SHisping Lin 				&ErrorOrigin);
314c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
315c7de5349SHisping Lin 		return TeecResult;
316c7de5349SHisping Lin 
317c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
318c7de5349SHisping Lin 						    TEEC_NONE,
319c7de5349SHisping Lin 						    TEEC_NONE,
320c7de5349SHisping Lin 						    TEEC_NONE);
321c7de5349SHisping Lin 
322c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
323c7de5349SHisping Lin 					2,
324c7de5349SHisping Lin 					&TeecOperation,
325c7de5349SHisping Lin 					&ErrorOrigin);
326c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
327c7de5349SHisping Lin 		goto exit;
328c7de5349SHisping Lin exit:
329c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
330c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
331c7de5349SHisping Lin 
332c7de5349SHisping Lin 	return TeecResult;
333c7de5349SHisping Lin }
334c7de5349SHisping Lin 
335c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
336c7de5349SHisping Lin {
337c7de5349SHisping Lin 	char hs[9];
338c7de5349SHisping Lin 
339c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
340c7de5349SHisping Lin 
341c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
342c7de5349SHisping Lin }
343c7de5349SHisping Lin 
344ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
345ae8ec5e1SHisping Lin {
346c7de5349SHisping Lin 	char hs[9];
3473251364cSHisping Lin 
348c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
349ae8ec5e1SHisping Lin 
350c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
351ae8ec5e1SHisping Lin }
352ae8ec5e1SHisping Lin 
353ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
354ae8ec5e1SHisping Lin {
355c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
356c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
357ae8ec5e1SHisping Lin }
358ae8ec5e1SHisping Lin 
359ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
360ae8ec5e1SHisping Lin {
361c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
362c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
3636651d4c0SJason Zhu }
364ae8ec5e1SHisping Lin 
365c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
366c7de5349SHisping Lin {
367c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
368c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
369c7de5349SHisping Lin }
370ae8ec5e1SHisping Lin 
371c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
372c7de5349SHisping Lin {
373c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
374c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
375ae8ec5e1SHisping Lin }
376ae8ec5e1SHisping Lin 
377564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
378564654ebSJason Zhu 					      uint32_t size)
379564654ebSJason Zhu {
380c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
381c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
382564654ebSJason Zhu }
383564654ebSJason Zhu 
384564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
385564654ebSJason Zhu 					       uint32_t size)
386564654ebSJason Zhu {
387c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
388c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
389564654ebSJason Zhu }
390564654ebSJason Zhu 
391ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
392ae8ec5e1SHisping Lin {
393c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
394c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
395ae8ec5e1SHisping Lin }
396ae8ec5e1SHisping Lin 
397ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
398ae8ec5e1SHisping Lin {
399c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
400c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
401ae8ec5e1SHisping Lin }
402ae8ec5e1SHisping Lin 
403ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
404ae8ec5e1SHisping Lin {
405c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
406c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
407c7de5349SHisping Lin }
408c7de5349SHisping Lin 
409c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
410c7de5349SHisping Lin {
411c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
412c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
413c7de5349SHisping Lin }
414c7de5349SHisping Lin 
415c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
416c7de5349SHisping Lin {
417ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
418ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
419ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
420ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
421c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
422c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
423c7de5349SHisping Lin 
424ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
425ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
426ae8ec5e1SHisping Lin 
427f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
428f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
429f4e1db95SHisping Lin 		return TeecResult;
430ae8ec5e1SHisping Lin 
431ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
432f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
433f4e1db95SHisping Lin 		return TeecResult;
434ae8ec5e1SHisping Lin 
435ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
436ae8ec5e1SHisping Lin 				      &TeecSession,
437ae8ec5e1SHisping Lin 				      TeecUuid,
438ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
439ae8ec5e1SHisping Lin 				      NULL,
440c7de5349SHisping Lin 				      NULL,
441ae8ec5e1SHisping Lin 				      &ErrorOrigin);
442f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
443f4e1db95SHisping Lin 		return TeecResult;
444ae8ec5e1SHisping Lin 
445c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
446c7de5349SHisping Lin 						    TEEC_NONE,
447ae8ec5e1SHisping Lin 						    TEEC_NONE,
448ae8ec5e1SHisping Lin 						    TEEC_NONE);
449ae8ec5e1SHisping Lin 
450ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
451c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
452ae8ec5e1SHisping Lin 					&TeecOperation,
453ae8ec5e1SHisping Lin 					&ErrorOrigin);
454c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
455c7de5349SHisping Lin 		goto exit;
456f4e1db95SHisping Lin exit:
457ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
45846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
459ae8ec5e1SHisping Lin 
460ae8ec5e1SHisping Lin 	return TeecResult;
461ae8ec5e1SHisping Lin }
462ae8ec5e1SHisping Lin 
463c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
464c7de5349SHisping Lin 						   uint8_t is_write,
465c7de5349SHisping Lin 						   uint32_t *buf,
466c7de5349SHisping Lin 						   uint32_t length)
467ae8ec5e1SHisping Lin {
468ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
469ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
470ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
471ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
472c7de5349SHisping Lin 
473c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
474c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
475ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
476ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
477ae8ec5e1SHisping Lin 
478f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
479f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
480f4e1db95SHisping Lin 		return TeecResult;
481ae8ec5e1SHisping Lin 
482ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
483f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
484f4e1db95SHisping Lin 		return TeecResult;
485ae8ec5e1SHisping Lin 
486ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
487ae8ec5e1SHisping Lin 				&TeecSession,
488ae8ec5e1SHisping Lin 				TeecUuid,
489ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
490ae8ec5e1SHisping Lin 				NULL,
491c7de5349SHisping Lin 				NULL,
492ae8ec5e1SHisping Lin 				&ErrorOrigin);
493f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
494f4e1db95SHisping Lin 		return TeecResult;
495ae8ec5e1SHisping Lin 
496ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
497ae8ec5e1SHisping Lin 
498c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
499ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
500ae8ec5e1SHisping Lin 
501ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
502f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
503f4e1db95SHisping Lin 		goto exit;
504ae8ec5e1SHisping Lin 
505ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
506ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
507ae8ec5e1SHisping Lin 
508c7de5349SHisping Lin 	if (is_write) {
509c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
510ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
511c7de5349SHisping Lin 							    TEEC_NONE,
512ae8ec5e1SHisping Lin 							    TEEC_NONE,
513ae8ec5e1SHisping Lin 							    TEEC_NONE);
514ae8ec5e1SHisping Lin 
515c7de5349SHisping Lin 	} else {
516c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
517c7de5349SHisping Lin 							    TEEC_NONE,
518c7de5349SHisping Lin 							    TEEC_NONE,
519c7de5349SHisping Lin 							    TEEC_NONE);
520c7de5349SHisping Lin 	}
521c7de5349SHisping Lin 
522ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
523c7de5349SHisping Lin 					cmd,
524ae8ec5e1SHisping Lin 					&TeecOperation,
525ae8ec5e1SHisping Lin 					&ErrorOrigin);
526f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
527f4e1db95SHisping Lin 		goto exit;
528c7de5349SHisping Lin 
529c7de5349SHisping Lin 	if (!is_write)
530c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
531c7de5349SHisping Lin 
532f4e1db95SHisping Lin exit:
533ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
534ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
53546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
536ae8ec5e1SHisping Lin 
537ae8ec5e1SHisping Lin 	return TeecResult;
538ae8ec5e1SHisping Lin }
539ae8ec5e1SHisping Lin 
5406ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5416ef445a4SHisping Lin {
542c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
543c7de5349SHisping Lin 						  false, buf, length);
5446ef445a4SHisping Lin }
5456ef445a4SHisping Lin 
5466ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5476ef445a4SHisping Lin {
548c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
549c7de5349SHisping Lin 						  true, buf, length);
55016539616SHisping Lin }
55116539616SHisping Lin 
55216539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
55316539616SHisping Lin {
55416539616SHisping Lin 	TEEC_Result res;
555c7de5349SHisping Lin 
556c7de5349SHisping Lin 	res = trusty_base_end_security_data();
557c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
55816539616SHisping Lin 	return res;
55916539616SHisping Lin }
5602cd27853SHisping Lin 
5612cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
5622cd27853SHisping Lin {
563c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
564c7de5349SHisping Lin 						  false, buf, length);
5652cd27853SHisping Lin }
566c7de5349SHisping Lin 
5672cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
5682cd27853SHisping Lin {
569c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
570c7de5349SHisping Lin 						  true, buf, length);
5712cd27853SHisping Lin }
572095e2a82SHisping Lin 
573468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
574468df3b2SHisping Lin {
575468df3b2SHisping Lin 	uint32_t bootflag;
576c7de5349SHisping Lin 	TEEC_Result TeecResult;
577468df3b2SHisping Lin 
578f07e1686SHisping Lin 	*flag = 0;
579f07e1686SHisping Lin 
580c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
581c7de5349SHisping Lin 							false, &bootflag, 1);
582468df3b2SHisping Lin 
583468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
5840202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
5850202ee8aSHisping Lin 		if (bootflag == 0x00000001)
5860202ee8aSHisping Lin 			*flag = 1;
5870202ee8aSHisping Lin #else
588468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
589468df3b2SHisping Lin 			*flag = 1;
5900202ee8aSHisping Lin #endif
591468df3b2SHisping Lin 	}
592095e2a82SHisping Lin 	return TeecResult;
593095e2a82SHisping Lin }
5944aa61755SAndy Ye 
5951ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
5961ef63c75SHisping Lin {
5971ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
5981ef63c75SHisping Lin 						  true, buf, length);
5991ef63c75SHisping Lin }
6001ef63c75SHisping Lin 
601fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
602fbf29bfbSHisping Lin {
603fbf29bfbSHisping Lin 	uint32_t levelflag;
604fbf29bfbSHisping Lin 
605fbf29bfbSHisping Lin 	levelflag = flag;
606fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
607fbf29bfbSHisping Lin 						  true, &levelflag, 1);
608fbf29bfbSHisping Lin }
609fbf29bfbSHisping Lin 
610f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
611f39d4289SHisping Lin {
612f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
613f39d4289SHisping Lin 						  true, buf, length);
614f39d4289SHisping Lin }
615f39d4289SHisping Lin 
6167504da74SHisping Lin void trusty_select_security_level(void)
6177504da74SHisping Lin {
6187504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
6197504da74SHisping Lin 	TEEC_Result TeecResult;
6207504da74SHisping Lin 
6217504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
6227504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
6237504da74SHisping Lin 		run_command("download", 0);
6247504da74SHisping Lin 		return;
6257504da74SHisping Lin 	}
6267504da74SHisping Lin 
6277504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
6287504da74SHisping Lin 		debug("optee select security level success!");
6297504da74SHisping Lin 	else
6307504da74SHisping Lin 		panic("optee select security level fail!");
6317504da74SHisping Lin 
6327504da74SHisping Lin 	return;
6337504da74SHisping Lin #endif
6347504da74SHisping Lin }
6357504da74SHisping Lin 
636*51ac7005SHisping Lin void optee_client_init(void)
637*51ac7005SHisping Lin {
638*51ac7005SHisping Lin 	trusty_select_security_level();
639*51ac7005SHisping Lin }
640*51ac7005SHisping Lin 
641d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
642d5913350SHisping Lin {
643d5913350SHisping Lin 	TEEC_Result TeecResult;
644d5913350SHisping Lin 	TEEC_Context TeecContext;
645d5913350SHisping Lin 	TEEC_Session TeecSession;
646d5913350SHisping Lin 	uint32_t ErrorOrigin;
647d5913350SHisping Lin 
648d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
649d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
650d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
651d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
652d5913350SHisping Lin 
653d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
654d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
655d5913350SHisping Lin 		return TeecResult;
656d5913350SHisping Lin 
657d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
658d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
659d5913350SHisping Lin 		return TeecResult;
660d5913350SHisping Lin 
661d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
662d5913350SHisping Lin 				&TeecSession,
663d5913350SHisping Lin 				TeecUuid,
664d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
665d5913350SHisping Lin 				NULL,
666d5913350SHisping Lin 				NULL,
667d5913350SHisping Lin 				&ErrorOrigin);
668d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
669d5913350SHisping Lin 		return TeecResult;
670d5913350SHisping Lin 
671d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
672d5913350SHisping Lin 
673d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
674d5913350SHisping Lin 
675d5913350SHisping Lin 	SharedMem.size = byte_len;
676d5913350SHisping Lin 	SharedMem.flags = 0;
677d5913350SHisping Lin 
678d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
679d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
680d5913350SHisping Lin 		goto exit;
681d5913350SHisping Lin 
682d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
683d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
684d5913350SHisping Lin 
685d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
686d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
687d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
688d5913350SHisping Lin 						    TEEC_NONE,
689d5913350SHisping Lin 						    TEEC_NONE);
690d5913350SHisping Lin 
691d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
692d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
693d5913350SHisping Lin 					&TeecOperation,
694d5913350SHisping Lin 					&ErrorOrigin);
695d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
696d5913350SHisping Lin 		goto exit;
697d5913350SHisping Lin 
698d5913350SHisping Lin exit:
699d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
700d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
701d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
702d5913350SHisping Lin 
703d5913350SHisping Lin 	return TeecResult;
704d5913350SHisping Lin }
705d5913350SHisping Lin 
706d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
707d5913350SHisping Lin {
708d5913350SHisping Lin 	TEEC_Result TeecResult;
709d5913350SHisping Lin 	TEEC_Context TeecContext;
710d5913350SHisping Lin 	TEEC_Session TeecSession;
711d5913350SHisping Lin 	uint32_t ErrorOrigin;
712d5913350SHisping Lin 
713d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
714d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
715d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
716d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
717d5913350SHisping Lin 
718d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
719d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
720d5913350SHisping Lin 		return TeecResult;
721d5913350SHisping Lin 
722d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
723d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
724d5913350SHisping Lin 		return TeecResult;
725d5913350SHisping Lin 
726d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
727d5913350SHisping Lin 				&TeecSession,
728d5913350SHisping Lin 				TeecUuid,
729d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
730d5913350SHisping Lin 				NULL,
731d5913350SHisping Lin 				NULL,
732d5913350SHisping Lin 				&ErrorOrigin);
733d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
734d5913350SHisping Lin 		return TeecResult;
735d5913350SHisping Lin 
736d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
737d5913350SHisping Lin 
738d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
739d5913350SHisping Lin 
740d5913350SHisping Lin 	SharedMem.size = byte_len;
741d5913350SHisping Lin 	SharedMem.flags = 0;
742d5913350SHisping Lin 
743d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
744d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
745d5913350SHisping Lin 		goto exit;
746d5913350SHisping Lin 
747d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
748d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
749d5913350SHisping Lin 
750d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
751d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
752d5913350SHisping Lin 						    TEEC_NONE,
753d5913350SHisping Lin 						    TEEC_NONE);
754d5913350SHisping Lin 
755d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
756d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
757d5913350SHisping Lin 					&TeecOperation,
758d5913350SHisping Lin 					&ErrorOrigin);
759d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
760d5913350SHisping Lin 		goto exit;
761d5913350SHisping Lin 
762d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
763d5913350SHisping Lin 
764d5913350SHisping Lin exit:
765d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
766d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
767d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
768d5913350SHisping Lin 
769d5913350SHisping Lin 	return TeecResult;
770d5913350SHisping Lin }
771d5913350SHisping Lin 
77290e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,
773bb1ba6acSHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
774bb1ba6acSHisping Lin {
775bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
776bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
777bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
778bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
779bb1ba6acSHisping Lin 
780bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
781bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
782bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
783bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
784bb1ba6acSHisping Lin 
785bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
786bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
787bb1ba6acSHisping Lin 		return TeecResult;
788bb1ba6acSHisping Lin 
789bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
790bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
791bb1ba6acSHisping Lin 		return TeecResult;
792bb1ba6acSHisping Lin 
793bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
794bb1ba6acSHisping Lin 				&TeecSession,
795bb1ba6acSHisping Lin 				TeecUuid,
796bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
797bb1ba6acSHisping Lin 				NULL,
798bb1ba6acSHisping Lin 				NULL,
799bb1ba6acSHisping Lin 				&ErrorOrigin);
800bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
801bb1ba6acSHisping Lin 		return TeecResult;
802bb1ba6acSHisping Lin 
803bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
804bb1ba6acSHisping Lin 
805bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
806bb1ba6acSHisping Lin 
807bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
808bb1ba6acSHisping Lin 	SharedMem.flags = 0;
809bb1ba6acSHisping Lin 
810bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
811bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
812bb1ba6acSHisping Lin 		goto exit;
813bb1ba6acSHisping Lin 
814bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
815bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
816bb1ba6acSHisping Lin 
817bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
818bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
819bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
820bb1ba6acSHisping Lin 						    TEEC_NONE,
821bb1ba6acSHisping Lin 						    TEEC_NONE);
822bb1ba6acSHisping Lin 
823bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
82490e849a0Sxb.wang 					STORAGE_CMD_WRITE_OEM_OTP_KEY,
825bb1ba6acSHisping Lin 					&TeecOperation,
826bb1ba6acSHisping Lin 					&ErrorOrigin);
827bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
828bb1ba6acSHisping Lin 		goto exit;
829bb1ba6acSHisping Lin 
830bb1ba6acSHisping Lin exit:
831bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
832bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
833bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
834bb1ba6acSHisping Lin 
835bb1ba6acSHisping Lin 	return TeecResult;
836bb1ba6acSHisping Lin }
837bb1ba6acSHisping Lin 
8389deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value)
8399deb34f6SHisping Lin {
8409deb34f6SHisping Lin 	TEEC_Result TeecResult;
8419deb34f6SHisping Lin 	TEEC_Context TeecContext;
8429deb34f6SHisping Lin 	TEEC_Session TeecSession;
8439deb34f6SHisping Lin 	uint32_t ErrorOrigin;
8449deb34f6SHisping Lin 
8459deb34f6SHisping Lin 	*value = 0xFF;
8469deb34f6SHisping Lin 
8479deb34f6SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
8489deb34f6SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
8499deb34f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
8509deb34f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
8519deb34f6SHisping Lin 
8529deb34f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
8539deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
8549deb34f6SHisping Lin 		return TeecResult;
8559deb34f6SHisping Lin 
8569deb34f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
8579deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
8589deb34f6SHisping Lin 		return TeecResult;
8599deb34f6SHisping Lin 
8609deb34f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
8619deb34f6SHisping Lin 				&TeecSession,
8629deb34f6SHisping Lin 				TeecUuid,
8639deb34f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
8649deb34f6SHisping Lin 				NULL,
8659deb34f6SHisping Lin 				NULL,
8669deb34f6SHisping Lin 				&ErrorOrigin);
8679deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
8689deb34f6SHisping Lin 		return TeecResult;
8699deb34f6SHisping Lin 
8709deb34f6SHisping Lin 	TeecOperation.params[0].value.a = key_id;
8719deb34f6SHisping Lin 
8729deb34f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
8739deb34f6SHisping Lin 						    TEEC_NONE,
8749deb34f6SHisping Lin 						    TEEC_NONE,
8759deb34f6SHisping Lin 						    TEEC_NONE);
8769deb34f6SHisping Lin 
8779deb34f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8789deb34f6SHisping Lin 					STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN,
8799deb34f6SHisping Lin 					&TeecOperation,
8809deb34f6SHisping Lin 					&ErrorOrigin);
8819deb34f6SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
8829deb34f6SHisping Lin 		*value = TeecOperation.params[0].value.b;
8839deb34f6SHisping Lin 
8849deb34f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
8859deb34f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8869deb34f6SHisping Lin 
8879deb34f6SHisping Lin 	return TeecResult;
8889deb34f6SHisping Lin }
8899deb34f6SHisping Lin 
89090e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)
891a405238aSHisping Lin {
892a405238aSHisping Lin 	TEEC_Result TeecResult;
893a405238aSHisping Lin 	TEEC_Context TeecContext;
894a405238aSHisping Lin 	TEEC_Session TeecSession;
895a405238aSHisping Lin 	uint32_t ErrorOrigin;
896a405238aSHisping Lin 
897a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
898a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
899a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
900a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
901a405238aSHisping Lin 
902a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
903a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
904a405238aSHisping Lin 		return TeecResult;
905a405238aSHisping Lin 
906a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
907a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
908a405238aSHisping Lin 		return TeecResult;
909a405238aSHisping Lin 
910a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
911a405238aSHisping Lin 				&TeecSession,
912a405238aSHisping Lin 				TeecUuid,
913a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
914a405238aSHisping Lin 				NULL,
915a405238aSHisping Lin 				NULL,
916a405238aSHisping Lin 				&ErrorOrigin);
917a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
918a405238aSHisping Lin 		return TeecResult;
919a405238aSHisping Lin 
920a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
921a405238aSHisping Lin 
922a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
923a405238aSHisping Lin 						    TEEC_NONE,
924a405238aSHisping Lin 						    TEEC_NONE,
925a405238aSHisping Lin 						    TEEC_NONE);
926a405238aSHisping Lin 
927a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
928a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
929a405238aSHisping Lin 					&TeecOperation,
930a405238aSHisping Lin 					&ErrorOrigin);
931a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
932a405238aSHisping Lin 		goto exit;
933a405238aSHisping Lin 
934a405238aSHisping Lin exit:
935a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
936a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
937a405238aSHisping Lin 
938a405238aSHisping Lin 	return TeecResult;
939a405238aSHisping Lin }
940a405238aSHisping Lin 
9412f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config,
9422f8c34bdSxb.wang 				   uint32_t src_phys_addr, uint32_t dst_phys_addr,
9432f8c34bdSxb.wang 				   uint32_t len)
944fc3694d6Sxb.wang {
945fc3694d6Sxb.wang 	TEEC_Result TeecResult;
946fc3694d6Sxb.wang 	TEEC_Context TeecContext;
947fc3694d6Sxb.wang 	TEEC_Session TeecSession;
948fc3694d6Sxb.wang 	TEEC_Operation TeecOperation = {0};
949fc3694d6Sxb.wang 	uint32_t ErrorOrigin;
950fc3694d6Sxb.wang 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
951fc3694d6Sxb.wang 	TEEC_SharedMemory SharedMem_config = {0};
952fc3694d6Sxb.wang 
9532f8c34bdSxb.wang 	if (key_id != RK_OEM_OTP_KEY0 &&
9542f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY1 &&
9552f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY2 &&
9562f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY3 &&
9572f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY_FW)
958fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
959fc3694d6Sxb.wang 
9602f8c34bdSxb.wang 	if (!config)
961fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
962fc3694d6Sxb.wang 
963fc3694d6Sxb.wang 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
964fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
965fc3694d6Sxb.wang 
966fc3694d6Sxb.wang 	if (config->mode >= RK_CIPHER_MODE_XTS)
967fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
968fc3694d6Sxb.wang 
969fc3694d6Sxb.wang 	if (config->operation != RK_MODE_ENCRYPT &&
970fc3694d6Sxb.wang 	    config->operation != RK_MODE_DECRYPT)
971fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
972fc3694d6Sxb.wang 
973fc3694d6Sxb.wang 	if (config->key_len != 16 &&
974fc3694d6Sxb.wang 	    config->key_len != 24 &&
975fc3694d6Sxb.wang 	    config->key_len != 32)
976fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
977fc3694d6Sxb.wang 
9782f8c34bdSxb.wang 	if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16)
9792f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
9802f8c34bdSxb.wang 
9812f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126)
9822f8c34bdSxb.wang 	if (config->key_len == 24)
9832f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
9842f8c34bdSxb.wang #endif
9852f8c34bdSxb.wang 
986fc3694d6Sxb.wang 	if (len % AES_BLOCK_SIZE ||
987fc3694d6Sxb.wang 	    len == 0)
988fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
989fc3694d6Sxb.wang 
9902f8c34bdSxb.wang 	if (!src_phys_addr || !dst_phys_addr)
9912f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
9922f8c34bdSxb.wang 
993fc3694d6Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
994fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
995fc3694d6Sxb.wang 		return TeecResult;
996fc3694d6Sxb.wang 
997fc3694d6Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
998fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
999fc3694d6Sxb.wang 		return TeecResult;
1000fc3694d6Sxb.wang 
1001fc3694d6Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
1002fc3694d6Sxb.wang 				      &TeecSession,
1003fc3694d6Sxb.wang 				      &uuid,
1004fc3694d6Sxb.wang 				      TEEC_LOGIN_PUBLIC,
1005fc3694d6Sxb.wang 				      NULL,
1006fc3694d6Sxb.wang 				      NULL,
1007fc3694d6Sxb.wang 				      &ErrorOrigin);
1008fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1009fc3694d6Sxb.wang 		goto exit;
1010fc3694d6Sxb.wang 
1011fc3694d6Sxb.wang 	SharedMem_config.size = sizeof(rk_cipher_config);
1012fc3694d6Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
1013fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1014fc3694d6Sxb.wang 		goto exit;
1015fc3694d6Sxb.wang 
1016fc3694d6Sxb.wang 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
1017fc3694d6Sxb.wang 	TeecOperation.params[0].value.a       = key_id;
1018fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
1019fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
10202f8c34bdSxb.wang 	TeecOperation.params[2].value.a       = src_phys_addr;
10212f8c34bdSxb.wang 	TeecOperation.params[2].value.b       = len;
10222f8c34bdSxb.wang 	TeecOperation.params[3].value.a       = dst_phys_addr;
1023fc3694d6Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1024fc3694d6Sxb.wang 						    TEEC_MEMREF_TEMP_INPUT,
10252f8c34bdSxb.wang 						    TEEC_VALUE_INPUT,
10262f8c34bdSxb.wang 						    TEEC_VALUE_INPUT);
10272f8c34bdSxb.wang 
10282f8c34bdSxb.wang 	crypto_flush_cacheline(src_phys_addr, len);
10292f8c34bdSxb.wang 	crypto_flush_cacheline(dst_phys_addr, len);
10302f8c34bdSxb.wang 
1031fc3694d6Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10322f8c34bdSxb.wang 					CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER,
1033fc3694d6Sxb.wang 					&TeecOperation,
1034fc3694d6Sxb.wang 					&ErrorOrigin);
1035fc3694d6Sxb.wang 
1036a900eef3SHisping Lin 	crypto_invalidate_cacheline(dst_phys_addr, len);
1037a900eef3SHisping Lin 
1038fc3694d6Sxb.wang exit:
1039fc3694d6Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem_config);
1040fc3694d6Sxb.wang 	TEEC_CloseSession(&TeecSession);
1041fc3694d6Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
1042fc3694d6Sxb.wang 	return TeecResult;
1043fc3694d6Sxb.wang }
1044fc3694d6Sxb.wang 
10454aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
10464aa61755SAndy Ye {
10474aa61755SAndy Ye 	TEEC_Result TeecResult;
10484aa61755SAndy Ye 	TEEC_Context TeecContext;
10494aa61755SAndy Ye 	TEEC_Session TeecSession;
10504aa61755SAndy Ye 	uint32_t ErrorOrigin;
10514aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
10524aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
10534aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
10544aa61755SAndy Ye 				}
10554aa61755SAndy Ye 			     };
10564aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
10574aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
10583251364cSHisping Lin 	struct blk_desc *dev_desc;
10593251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
10606651d4c0SJason Zhu 	if (!dev_desc) {
10616651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
10626651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
10636651d4c0SJason Zhu 	}
10644aa61755SAndy Ye 
1065f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1066f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1067f4e1db95SHisping Lin 		return TeecResult;
10684aa61755SAndy Ye 
10694aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1070f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1071f4e1db95SHisping Lin 		return TeecResult;
10724aa61755SAndy Ye 
10733251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
10743251364cSHisping Lin 						TEEC_NONE,
10753251364cSHisping Lin 						TEEC_NONE,
10763251364cSHisping Lin 						TEEC_NONE);
10773251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1078b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1079b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1080b9a7e756SHisping Lin 	else
1081b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1082b9a7e756SHisping Lin 
10833251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
10843251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
10853251364cSHisping Lin #endif
10863251364cSHisping Lin 
10874aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
10884aa61755SAndy Ye 				      &TeecSession,
10894aa61755SAndy Ye 				      TeecUuid,
10904aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
10914aa61755SAndy Ye 				      NULL,
10923251364cSHisping Lin 					&TeecOperation,
10934aa61755SAndy Ye 				      &ErrorOrigin);
1094f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1095f4e1db95SHisping Lin 		return TeecResult;
10964aa61755SAndy Ye 
10974aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
10984aa61755SAndy Ye 
10994aa61755SAndy Ye 	SharedMem0.size = *dh_size;
11004aa61755SAndy Ye 	SharedMem0.flags = 0;
11014aa61755SAndy Ye 
11024aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1103f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1104f4e1db95SHisping Lin 		goto exit;
11054aa61755SAndy Ye 
11064aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11074aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11084aa61755SAndy Ye 
11094aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
11104aa61755SAndy Ye 						    TEEC_NONE,
11114aa61755SAndy Ye 						    TEEC_NONE,
11124aa61755SAndy Ye 						    TEEC_NONE);
11134aa61755SAndy Ye 
11144aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11154aa61755SAndy Ye 					143,
11164aa61755SAndy Ye 					&TeecOperation,
11174aa61755SAndy Ye 					&ErrorOrigin);
1118f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1119f4e1db95SHisping Lin 		goto exit;
11204aa61755SAndy Ye 
11214aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
11224aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1123f4e1db95SHisping Lin exit:
11244aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
11254aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1126f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11274aa61755SAndy Ye 
11284aa61755SAndy Ye 	return TeecResult;
11294aa61755SAndy Ye }
11304aa61755SAndy Ye 
11314aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
11324aa61755SAndy Ye {
11334aa61755SAndy Ye 	TEEC_Result TeecResult;
11344aa61755SAndy Ye 	TEEC_Context TeecContext;
11354aa61755SAndy Ye 	TEEC_Session TeecSession;
11364aa61755SAndy Ye 	uint32_t ErrorOrigin;
11374aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
11384aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
11394aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
11404aa61755SAndy Ye 				}
11414aa61755SAndy Ye 			     };
11424aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
11434aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
11443251364cSHisping Lin 	struct blk_desc *dev_desc;
11453251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
11466651d4c0SJason Zhu 	if (!dev_desc) {
11476651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
11486651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
11496651d4c0SJason Zhu 	}
11504aa61755SAndy Ye 
1151f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1152f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1153f4e1db95SHisping Lin 		return TeecResult;
11544aa61755SAndy Ye 
11554aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1156f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1157f4e1db95SHisping Lin 		return TeecResult;
11584aa61755SAndy Ye 
11593251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
11603251364cSHisping Lin 						TEEC_NONE,
11613251364cSHisping Lin 						TEEC_NONE,
11623251364cSHisping Lin 						TEEC_NONE);
11633251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1164b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1165b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1166b9a7e756SHisping Lin 	else
1167b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1168b9a7e756SHisping Lin 
11693251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
11703251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
11713251364cSHisping Lin #endif
11723251364cSHisping Lin 
11734aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
11744aa61755SAndy Ye 				      &TeecSession,
11754aa61755SAndy Ye 				      TeecUuid,
11764aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
11774aa61755SAndy Ye 				      NULL,
11783251364cSHisping Lin 					&TeecOperation,
11794aa61755SAndy Ye 				      &ErrorOrigin);
1180f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1181f4e1db95SHisping Lin 		return TeecResult;
11824aa61755SAndy Ye 
11834aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
11844aa61755SAndy Ye 
11854aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
11864aa61755SAndy Ye 	SharedMem0.flags = 0;
11874aa61755SAndy Ye 
11884aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1189f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1190f4e1db95SHisping Lin 		goto exit;
11914aa61755SAndy Ye 
11924aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11934aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11944aa61755SAndy Ye 
11954aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
11964aa61755SAndy Ye 						    TEEC_NONE,
11974aa61755SAndy Ye 						    TEEC_NONE,
11984aa61755SAndy Ye 						    TEEC_NONE);
11994aa61755SAndy Ye 
12004aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12014aa61755SAndy Ye 					144,
12024aa61755SAndy Ye 					&TeecOperation,
12034aa61755SAndy Ye 					&ErrorOrigin);
1204f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1205f4e1db95SHisping Lin 		goto exit;
12064aa61755SAndy Ye 
12074aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
12084aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1209f4e1db95SHisping Lin exit:
12104aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
12114aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1212f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12134aa61755SAndy Ye 
12144aa61755SAndy Ye 	return TeecResult;
12154aa61755SAndy Ye }
12164aa61755SAndy Ye 
12174aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
12184aa61755SAndy Ye 			      uint32_t *operation_size,
12194aa61755SAndy Ye 			      uint8_t *out,
12204aa61755SAndy Ye 			      uint32_t *out_len)
12214aa61755SAndy Ye {
12224aa61755SAndy Ye 	TEEC_Result TeecResult;
12234aa61755SAndy Ye 	TEEC_Context TeecContext;
12244aa61755SAndy Ye 	TEEC_Session TeecSession;
12254aa61755SAndy Ye 	uint32_t ErrorOrigin;
12264aa61755SAndy Ye 
12274aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
12284aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
12294aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
12304aa61755SAndy Ye 				}
12314aa61755SAndy Ye 			     };
12324aa61755SAndy Ye 
12334aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
12344aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
12353251364cSHisping Lin 	struct blk_desc *dev_desc;
12363251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
12376651d4c0SJason Zhu 	if (!dev_desc) {
12386651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
12396651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
12406651d4c0SJason Zhu 	}
12414aa61755SAndy Ye 
1242f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1243f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1244f4e1db95SHisping Lin 		return TeecResult;
12454aa61755SAndy Ye 
12464aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1247f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1248f4e1db95SHisping Lin 		return TeecResult;
12494aa61755SAndy Ye 
12503251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
12513251364cSHisping Lin 						TEEC_NONE,
12523251364cSHisping Lin 						TEEC_NONE,
12533251364cSHisping Lin 						TEEC_NONE);
12543251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1255b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1256b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1257b9a7e756SHisping Lin 	else
1258b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1259b9a7e756SHisping Lin 
12603251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
12613251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
12623251364cSHisping Lin #endif
12633251364cSHisping Lin 
12644aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
12654aa61755SAndy Ye 				      &TeecSession,
12664aa61755SAndy Ye 				      TeecUuid,
12674aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
12684aa61755SAndy Ye 				      NULL,
12693251364cSHisping Lin 					&TeecOperation,
12704aa61755SAndy Ye 				      &ErrorOrigin);
1271f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1272f4e1db95SHisping Lin 		return TeecResult;
12734aa61755SAndy Ye 
12744aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
12754aa61755SAndy Ye 
12764aa61755SAndy Ye 	SharedMem0.size = *operation_size;
12774aa61755SAndy Ye 	SharedMem0.flags = 0;
12784aa61755SAndy Ye 
12794aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1280f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1281f4e1db95SHisping Lin 		goto exit;
12824aa61755SAndy Ye 
12834aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
12844aa61755SAndy Ye 
12854aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12864aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12874aa61755SAndy Ye 
12884aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
12894aa61755SAndy Ye 
12904aa61755SAndy Ye 	SharedMem1.size = *out_len;
12914aa61755SAndy Ye 	SharedMem1.flags = 0;
12924aa61755SAndy Ye 
12934aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1294f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1295f4e1db95SHisping Lin 		goto exit;
12964aa61755SAndy Ye 
12974aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
12984aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
12994aa61755SAndy Ye 
13004aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
13014aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
13024aa61755SAndy Ye 						    TEEC_NONE,
13034aa61755SAndy Ye 						    TEEC_NONE);
13044aa61755SAndy Ye 
13054aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13064aa61755SAndy Ye 					145,
13074aa61755SAndy Ye 					&TeecOperation,
13084aa61755SAndy Ye 					&ErrorOrigin);
1309f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1310f4e1db95SHisping Lin 		goto exit;
13114aa61755SAndy Ye 
13124aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
13134aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1314f4e1db95SHisping Lin exit:
13154aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
13164aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1317f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1318f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
13194aa61755SAndy Ye 
13204aa61755SAndy Ye 	return TeecResult;
13214aa61755SAndy Ye }
13224aa61755SAndy Ye 
13234aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
13244aa61755SAndy Ye {
13254aa61755SAndy Ye 	TEEC_Result TeecResult;
13264aa61755SAndy Ye 	TEEC_Context TeecContext;
13274aa61755SAndy Ye 	TEEC_Session TeecSession;
13284aa61755SAndy Ye 	uint32_t ErrorOrigin;
13294aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
13304aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
13314aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
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 	}
1342f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1343f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1344f4e1db95SHisping Lin 		return TeecResult;
13454aa61755SAndy Ye 
13464aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1347f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1348f4e1db95SHisping Lin 		return TeecResult;
13494aa61755SAndy Ye 
13503251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
13513251364cSHisping Lin 						TEEC_NONE,
13523251364cSHisping Lin 						TEEC_NONE,
13533251364cSHisping Lin 						TEEC_NONE);
13543251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1355b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1356b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1357b9a7e756SHisping Lin 	else
1358b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1359b9a7e756SHisping Lin 
13603251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
13613251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
13623251364cSHisping Lin #endif
13633251364cSHisping Lin 
13644aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
13654aa61755SAndy Ye 					&TeecSession,
13664aa61755SAndy Ye 					TeecUuid,
13674aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
13684aa61755SAndy Ye 					NULL,
13693251364cSHisping Lin 					&TeecOperation,
13704aa61755SAndy Ye 					&ErrorOrigin);
1371f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1372f4e1db95SHisping Lin 		return TeecResult;
13734aa61755SAndy Ye 
13744aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
13754aa61755SAndy Ye 
13764aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
13774aa61755SAndy Ye 	SharedMem0.flags = 0;
13784aa61755SAndy Ye 
13794aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1380f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1381f4e1db95SHisping Lin 		goto exit;
13824aa61755SAndy Ye 
13834aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
13844aa61755SAndy Ye 
13854aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13864aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13874aa61755SAndy Ye 
13884aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
13894aa61755SAndy Ye 						    TEEC_NONE,
13904aa61755SAndy Ye 						    TEEC_NONE,
13914aa61755SAndy Ye 						    TEEC_NONE);
13924aa61755SAndy Ye 
13934aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13944aa61755SAndy Ye 					146,
13954aa61755SAndy Ye 					&TeecOperation,
13964aa61755SAndy Ye 					&ErrorOrigin);
1397f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1398f4e1db95SHisping Lin 		goto exit;
1399f4e1db95SHisping Lin exit:
14004aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
14014aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1402f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14034aa61755SAndy Ye 
14044aa61755SAndy Ye 	return TeecResult;
14054aa61755SAndy Ye }
1406