xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision ac6d8253981eb8d1a89e5a2d529e08c8f75f5aca)
1ae8ec5e1SHisping Lin /*
2ae8ec5e1SHisping Lin  * Copyright 2017, Rockchip Electronics Co., Ltd
3ae8ec5e1SHisping Lin  * hisping lin, <hisping.lin@rock-chips.com>
4ae8ec5e1SHisping Lin  *
5ae8ec5e1SHisping Lin  * SPDX-License-Identifier:	GPL-2.0+
6ae8ec5e1SHisping Lin  */
7ae8ec5e1SHisping Lin 
8ae8ec5e1SHisping Lin #include <common.h>
9bb1ba6acSHisping Lin #include <optee_include/OpteeClientInterface.h>
10ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h>
11ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h>
1278ef5fbdSqiujian #include <optee_include/tee_api_defines.h>
133251364cSHisping Lin #include <boot_rkimg.h>
14a7df4868Stony.xu #include <stdlib.h>
151e8c0e44STony Xu #include <attestation_key.h>
16a7df4868Stony.xu 
17a7df4868Stony.xu #define	BOOT_FROM_EMMC	(1 << 1)
18c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH		0
19c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH	1
20c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP		2
21c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH		3
22c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH		4
23c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG		5
241ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY	9
25fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG	10
26f39d4289SHisping Lin #define STORAGE_CMD_WRITE_OEM_HUK		11
27d5913350SHisping Lin #define STORAGE_CMD_WRITE_OEM_NS_OTP		12
28d5913350SHisping Lin #define STORAGE_CMD_READ_OEM_NS_OTP		13
2990e849a0Sxb.wang #define STORAGE_CMD_WRITE_OEM_OTP_KEY		14
30a405238aSHisping Lin #define STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK	15
319deb34f6SHisping Lin #define STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN	16
3210f41197SHisping Lin #define STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN	20
33a828eba9SHisping Lin #define STORAGE_CMD_WRITE_OEM_HDCP_KEY	21
34e8bc2655SHisping Lin #define STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN	22
35bfd9cea4SHisping Lin #define STORAGE_CMD_SET_OEM_HDCP_KEY_MASK	23
361ac64e8aSHisping Lin #define STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA	24
37fc383442SHisping Lin #define STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN	25
38*ac6d8253SHisping Lin #define STORAGE_CMD_WRITE_ESCK_KEY		27
39*ac6d8253SHisping Lin #define STORAGE_CMD_ESCK_KEY_IS_WRITTEN		28
40*ac6d8253SHisping Lin #define STORAGE_CMD_SET_ESCK_KEY_MASK		29
41ae8ec5e1SHisping Lin 
422f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER	0x00000002
43fc3694d6Sxb.wang 
44fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID	{ 0x0cacdb5d, 0x4fea, 0x466c, \
45fc3694d6Sxb.wang 		{ 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } }
46fc3694d6Sxb.wang 
47ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
48ae8ec5e1SHisping Lin {
49ae8ec5e1SHisping Lin 	if (in > 9)
50ae8ec5e1SHisping Lin 		return in + 55;
51ae8ec5e1SHisping Lin 	else
52ae8ec5e1SHisping Lin 		return in + 48;
53ae8ec5e1SHisping Lin }
54ae8ec5e1SHisping Lin 
55c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
56ae8ec5e1SHisping Lin {
57ae8ec5e1SHisping Lin 	uint32_t i = 0;
58ae8ec5e1SHisping Lin 
59ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
60ae8ec5e1SHisping Lin 		return 0;
61ae8ec5e1SHisping Lin 
62ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
63ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
64ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
65ae8ec5e1SHisping Lin 	}
66ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
67ae8ec5e1SHisping Lin 
68ae8ec5e1SHisping Lin 	return blen * 2;
69ae8ec5e1SHisping Lin }
70ae8ec5e1SHisping Lin 
712f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size)
722f8c34bdSxb.wang {
732f8c34bdSxb.wang 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
742f8c34bdSxb.wang 	ulong aligned_input, aligned_len;
752f8c34bdSxb.wang 
762f8c34bdSxb.wang 	if (!addr || !size)
772f8c34bdSxb.wang 		return;
782f8c34bdSxb.wang 
792f8c34bdSxb.wang 	/* Must flush dcache before crypto DMA fetch data region */
802f8c34bdSxb.wang 	aligned_input = round_down(addr, alignment);
812f8c34bdSxb.wang 	aligned_len = round_up(size + (addr - aligned_input), alignment);
822f8c34bdSxb.wang 	flush_cache(aligned_input, aligned_len);
832f8c34bdSxb.wang }
842f8c34bdSxb.wang 
85a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
86a900eef3SHisping Lin {
87a900eef3SHisping Lin 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
88a900eef3SHisping Lin 	ulong aligned_input, aligned_len;
89a900eef3SHisping Lin 
90a900eef3SHisping Lin 	if (!addr || !size)
91a900eef3SHisping Lin 		return;
92a900eef3SHisping Lin 
93a900eef3SHisping Lin 	/* Must invalidate dcache after crypto DMA write data region */
94a900eef3SHisping Lin 	aligned_input = round_down(addr, alignment);
95a900eef3SHisping Lin 	aligned_len = round_up(size + (addr - aligned_input), alignment);
96a900eef3SHisping Lin 	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
97a900eef3SHisping Lin }
98a900eef3SHisping Lin 
99c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
100c7de5349SHisping Lin 						uint32_t filename_size,
101c7de5349SHisping Lin 						uint8_t *data,
102c7de5349SHisping Lin 						uint32_t data_size)
103ae8ec5e1SHisping Lin {
104ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
105ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
106ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
107ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
108ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
109ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
110ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
111ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1123251364cSHisping Lin 	struct blk_desc *dev_desc;
1133251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1146651d4c0SJason Zhu 	if (!dev_desc) {
1156651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1166651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1176651d4c0SJason Zhu 	}
1183251364cSHisping Lin 
119f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
120f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
121f4e1db95SHisping Lin 		return TeecResult;
122ae8ec5e1SHisping Lin 
123ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
124f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
125f4e1db95SHisping Lin 		return TeecResult;
126ae8ec5e1SHisping Lin 
1273251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1283251364cSHisping Lin 						    TEEC_NONE,
1293251364cSHisping Lin 						    TEEC_NONE,
1303251364cSHisping Lin 						    TEEC_NONE);
1313251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
132f3c7fe23SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc
133f3c7fe23SHisping Lin 		TeecOperation.params[0].value.a = 1;
134f3c7fe23SHisping Lin 	else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs
135b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
136b9a7e756SHisping Lin 	else
137b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
138f3c7fe23SHisping Lin 
1393251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1403251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1413251364cSHisping Lin #endif
1423251364cSHisping Lin 
143ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
144ae8ec5e1SHisping Lin 				&TeecSession,
145ae8ec5e1SHisping Lin 				TeecUuid,
146ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
147ae8ec5e1SHisping Lin 				NULL,
1483251364cSHisping Lin 				&TeecOperation,
149ae8ec5e1SHisping Lin 				&ErrorOrigin);
150f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
151f4e1db95SHisping Lin 		return TeecResult;
152ae8ec5e1SHisping Lin 
153ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
154ae8ec5e1SHisping Lin 
155c7de5349SHisping Lin 	SharedMem0.size = filename_size;
156ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
157ae8ec5e1SHisping Lin 
158ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
159f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
160f4e1db95SHisping Lin 		goto exit;
161ae8ec5e1SHisping Lin 
162c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
163ae8ec5e1SHisping Lin 
164ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
165ae8ec5e1SHisping Lin 
166c7de5349SHisping Lin 	SharedMem1.size = data_size;
167c7de5349SHisping Lin 	SharedMem1.flags = 0;
168c7de5349SHisping Lin 
169c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
170c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
171c7de5349SHisping Lin 		goto exit;
172c7de5349SHisping Lin 
173c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
174c7de5349SHisping Lin 
175c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
176c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
177c7de5349SHisping Lin 
178c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
179c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
180c7de5349SHisping Lin 
181c7de5349SHisping Lin 
182c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
183c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
184c7de5349SHisping Lin 						TEEC_NONE,
185c7de5349SHisping Lin 						TEEC_NONE);
186c7de5349SHisping Lin 
187c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
188c7de5349SHisping Lin 					1,
189c7de5349SHisping Lin 					&TeecOperation,
190c7de5349SHisping Lin 					&ErrorOrigin);
191c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
192c7de5349SHisping Lin 		goto exit;
193c7de5349SHisping Lin exit:
194c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
195c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
196c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
197c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
198c7de5349SHisping Lin 
199c7de5349SHisping Lin 	return TeecResult;
200c7de5349SHisping Lin }
201c7de5349SHisping Lin 
202c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
203c7de5349SHisping Lin 					       uint32_t filename_size,
204c7de5349SHisping Lin 					       uint8_t *data,
205c7de5349SHisping Lin 					       uint32_t data_size)
206c7de5349SHisping Lin {
207c7de5349SHisping Lin 	TEEC_Result TeecResult;
208c7de5349SHisping Lin 	TEEC_Context TeecContext;
209c7de5349SHisping Lin 	TEEC_Session TeecSession;
210c7de5349SHisping Lin 	uint32_t ErrorOrigin;
211c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
212c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
213c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
214c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
215c7de5349SHisping Lin 
216c7de5349SHisping Lin 	struct blk_desc *dev_desc;
217c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
218c7de5349SHisping Lin 	if (!dev_desc) {
219c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
220c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
221c7de5349SHisping Lin 	}
222c7de5349SHisping Lin 
223c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
224c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
225c7de5349SHisping Lin 		return TeecResult;
226c7de5349SHisping Lin 
227c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
228c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
229c7de5349SHisping Lin 		return TeecResult;
230c7de5349SHisping Lin 
231c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
232c7de5349SHisping Lin 						TEEC_NONE,
233c7de5349SHisping Lin 						TEEC_NONE,
234c7de5349SHisping Lin 						TEEC_NONE);
235c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
236f3c7fe23SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc
237f3c7fe23SHisping Lin 		TeecOperation.params[0].value.a = 1;
238f3c7fe23SHisping Lin 	else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs
239c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
240c7de5349SHisping Lin 	else
241c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
242f3c7fe23SHisping Lin 
243c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
244c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
245c7de5349SHisping Lin #endif
246c7de5349SHisping Lin 
247c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
248c7de5349SHisping Lin 				&TeecSession,
249c7de5349SHisping Lin 				TeecUuid,
250c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
251c7de5349SHisping Lin 				NULL,
252c7de5349SHisping Lin 				&TeecOperation,
253c7de5349SHisping Lin 				&ErrorOrigin);
254c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
255c7de5349SHisping Lin 		return TeecResult;
256c7de5349SHisping Lin 
257c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
258c7de5349SHisping Lin 
259c7de5349SHisping Lin 	SharedMem0.size = filename_size;
260c7de5349SHisping Lin 	SharedMem0.flags = 0;
261c7de5349SHisping Lin 
262c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
263c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
264c7de5349SHisping Lin 		goto exit;
265c7de5349SHisping Lin 
266c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
267c7de5349SHisping Lin 
268c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
269c7de5349SHisping Lin 
270c7de5349SHisping Lin 	SharedMem1.size = data_size;
271ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
274f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
275f4e1db95SHisping Lin 		goto exit;
276ae8ec5e1SHisping Lin 
277ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
278ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
279ae8ec5e1SHisping Lin 
280ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
281ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
282ae8ec5e1SHisping Lin 
283ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
284ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
285ae8ec5e1SHisping Lin 						TEEC_NONE,
286ae8ec5e1SHisping Lin 						TEEC_NONE);
287ae8ec5e1SHisping Lin 
288ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
289ae8ec5e1SHisping Lin 					0,
290ae8ec5e1SHisping Lin 					&TeecOperation,
291ae8ec5e1SHisping Lin 					&ErrorOrigin);
29246b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
293c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
294f4e1db95SHisping Lin exit:
295ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
296ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
297ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
29846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
299ae8ec5e1SHisping Lin 
300ae8ec5e1SHisping Lin 	return TeecResult;
301ae8ec5e1SHisping Lin }
302ae8ec5e1SHisping Lin 
303c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
304c7de5349SHisping Lin {
305c7de5349SHisping Lin 	TEEC_Result TeecResult;
306c7de5349SHisping Lin 	TEEC_Context TeecContext;
307c7de5349SHisping Lin 	TEEC_Session TeecSession;
308c7de5349SHisping Lin 	uint32_t ErrorOrigin;
309c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
310c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
311c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
312c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
313c7de5349SHisping Lin 
314c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
315c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
316c7de5349SHisping Lin 		return TeecResult;
317c7de5349SHisping Lin 
318c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
319c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
320c7de5349SHisping Lin 		return TeecResult;
321c7de5349SHisping Lin 
322c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
323c7de5349SHisping Lin 				&TeecSession,
324c7de5349SHisping Lin 				TeecUuid,
325c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
326c7de5349SHisping Lin 				NULL,
327c7de5349SHisping Lin 				NULL,
328c7de5349SHisping Lin 				&ErrorOrigin);
329c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
330c7de5349SHisping Lin 		return TeecResult;
331c7de5349SHisping Lin 
332c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
333c7de5349SHisping Lin 						    TEEC_NONE,
334c7de5349SHisping Lin 						    TEEC_NONE,
335c7de5349SHisping Lin 						    TEEC_NONE);
336c7de5349SHisping Lin 
337c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
338c7de5349SHisping Lin 					2,
339c7de5349SHisping Lin 					&TeecOperation,
340c7de5349SHisping Lin 					&ErrorOrigin);
341c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
342c7de5349SHisping Lin 		goto exit;
343c7de5349SHisping Lin exit:
344c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
345c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
346c7de5349SHisping Lin 
347c7de5349SHisping Lin 	return TeecResult;
348c7de5349SHisping Lin }
349c7de5349SHisping Lin 
35034f2e8f6SHisping Lin static void trusty_notify_always_use_security(void)
35134f2e8f6SHisping Lin {
35234f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION)
35334f2e8f6SHisping Lin 	TEEC_Result TeecResult;
35434f2e8f6SHisping Lin 	TEEC_Context TeecContext;
35534f2e8f6SHisping Lin 	TEEC_Session TeecSession;
35634f2e8f6SHisping Lin 	uint32_t ErrorOrigin;
35734f2e8f6SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
35834f2e8f6SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
35934f2e8f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
36034f2e8f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
36134f2e8f6SHisping Lin 
36234f2e8f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
36334f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
36434f2e8f6SHisping Lin 		return;
36534f2e8f6SHisping Lin 
36634f2e8f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
36734f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
36834f2e8f6SHisping Lin 		return;
36934f2e8f6SHisping Lin 
37034f2e8f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
37134f2e8f6SHisping Lin 				&TeecSession,
37234f2e8f6SHisping Lin 				TeecUuid,
37334f2e8f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
37434f2e8f6SHisping Lin 				NULL,
37534f2e8f6SHisping Lin 				NULL,
37634f2e8f6SHisping Lin 				&ErrorOrigin);
37734f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
37834f2e8f6SHisping Lin 		return;
37934f2e8f6SHisping Lin 
38034f2e8f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
38134f2e8f6SHisping Lin 						    TEEC_NONE,
38234f2e8f6SHisping Lin 						    TEEC_NONE,
38334f2e8f6SHisping Lin 						    TEEC_NONE);
38434f2e8f6SHisping Lin 
38534f2e8f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
38634f2e8f6SHisping Lin 					9,
38734f2e8f6SHisping Lin 					&TeecOperation,
38834f2e8f6SHisping Lin 					&ErrorOrigin);
38934f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
39034f2e8f6SHisping Lin 		debug("notify always use security fail! please update optee!");
39134f2e8f6SHisping Lin 
39234f2e8f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
39334f2e8f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
39434f2e8f6SHisping Lin 
39534f2e8f6SHisping Lin 	return;
39634f2e8f6SHisping Lin #endif
39734f2e8f6SHisping Lin }
39834f2e8f6SHisping Lin 
399c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
400c7de5349SHisping Lin {
401c7de5349SHisping Lin 	char hs[9];
402c7de5349SHisping Lin 
403c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
404c7de5349SHisping Lin 
405c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
406c7de5349SHisping Lin }
407c7de5349SHisping Lin 
408ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
409ae8ec5e1SHisping Lin {
410c7de5349SHisping Lin 	char hs[9];
4113251364cSHisping Lin 
412c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
413ae8ec5e1SHisping Lin 
414c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
415ae8ec5e1SHisping Lin }
416ae8ec5e1SHisping Lin 
417ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
418ae8ec5e1SHisping Lin {
419c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
420c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
421ae8ec5e1SHisping Lin }
422ae8ec5e1SHisping Lin 
423ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
424ae8ec5e1SHisping Lin {
425c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
426c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
4276651d4c0SJason Zhu }
428ae8ec5e1SHisping Lin 
429c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
430c7de5349SHisping Lin {
431c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
432c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
433c7de5349SHisping Lin }
434ae8ec5e1SHisping Lin 
435c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
436c7de5349SHisping Lin {
437c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
438c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
439ae8ec5e1SHisping Lin }
440ae8ec5e1SHisping Lin 
441564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
442564654ebSJason Zhu 					      uint32_t size)
443564654ebSJason Zhu {
444c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
445c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
446564654ebSJason Zhu }
447564654ebSJason Zhu 
448564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
449564654ebSJason Zhu 					       uint32_t size)
450564654ebSJason Zhu {
451c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
452c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
453564654ebSJason Zhu }
454564654ebSJason Zhu 
455ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
456ae8ec5e1SHisping Lin {
457c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
458c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
459ae8ec5e1SHisping Lin }
460ae8ec5e1SHisping Lin 
461ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
462ae8ec5e1SHisping Lin {
463c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
464c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
465ae8ec5e1SHisping Lin }
466ae8ec5e1SHisping Lin 
467ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
468ae8ec5e1SHisping Lin {
469c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
470c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
471c7de5349SHisping Lin }
472c7de5349SHisping Lin 
473c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
474c7de5349SHisping Lin {
475c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
476c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
477c7de5349SHisping Lin }
478c7de5349SHisping Lin 
479c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
480c7de5349SHisping Lin {
481ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
482ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
483ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
484ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
485c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
486c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
487c7de5349SHisping Lin 
488ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
489ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
490ae8ec5e1SHisping Lin 
491f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
492f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
493f4e1db95SHisping Lin 		return TeecResult;
494ae8ec5e1SHisping Lin 
495ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
496f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
497f4e1db95SHisping Lin 		return TeecResult;
498ae8ec5e1SHisping Lin 
499ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
500ae8ec5e1SHisping Lin 				      &TeecSession,
501ae8ec5e1SHisping Lin 				      TeecUuid,
502ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
503ae8ec5e1SHisping Lin 				      NULL,
504c7de5349SHisping Lin 				      NULL,
505ae8ec5e1SHisping Lin 				      &ErrorOrigin);
506f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
507f4e1db95SHisping Lin 		return TeecResult;
508ae8ec5e1SHisping Lin 
509c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
510c7de5349SHisping Lin 						    TEEC_NONE,
511ae8ec5e1SHisping Lin 						    TEEC_NONE,
512ae8ec5e1SHisping Lin 						    TEEC_NONE);
513ae8ec5e1SHisping Lin 
514ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
515c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
516ae8ec5e1SHisping Lin 					&TeecOperation,
517ae8ec5e1SHisping Lin 					&ErrorOrigin);
518c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
519c7de5349SHisping Lin 		goto exit;
520f4e1db95SHisping Lin exit:
521ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
52246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
523ae8ec5e1SHisping Lin 
524ae8ec5e1SHisping Lin 	return TeecResult;
525ae8ec5e1SHisping Lin }
526ae8ec5e1SHisping Lin 
527c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
528c7de5349SHisping Lin 						   uint8_t is_write,
529c7de5349SHisping Lin 						   uint32_t *buf,
530c7de5349SHisping Lin 						   uint32_t length)
531ae8ec5e1SHisping Lin {
532ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
533ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
534ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
535ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
536c7de5349SHisping Lin 
537c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
538c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
539ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
540ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
541ae8ec5e1SHisping Lin 
542f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
543f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
544f4e1db95SHisping Lin 		return TeecResult;
545ae8ec5e1SHisping Lin 
546ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
547f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
548f4e1db95SHisping Lin 		return TeecResult;
549ae8ec5e1SHisping Lin 
550ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
551ae8ec5e1SHisping Lin 				&TeecSession,
552ae8ec5e1SHisping Lin 				TeecUuid,
553ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
554ae8ec5e1SHisping Lin 				NULL,
555c7de5349SHisping Lin 				NULL,
556ae8ec5e1SHisping Lin 				&ErrorOrigin);
557f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
558f4e1db95SHisping Lin 		return TeecResult;
559ae8ec5e1SHisping Lin 
560ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
561ae8ec5e1SHisping Lin 
562c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
563ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
564ae8ec5e1SHisping Lin 
565ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
566f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
567f4e1db95SHisping Lin 		goto exit;
568ae8ec5e1SHisping Lin 
569ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
570ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
571ae8ec5e1SHisping Lin 
572c7de5349SHisping Lin 	if (is_write) {
573c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
574ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
575c7de5349SHisping Lin 							    TEEC_NONE,
576ae8ec5e1SHisping Lin 							    TEEC_NONE,
577ae8ec5e1SHisping Lin 							    TEEC_NONE);
578ae8ec5e1SHisping Lin 
579c7de5349SHisping Lin 	} else {
580c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
581c7de5349SHisping Lin 							    TEEC_NONE,
582c7de5349SHisping Lin 							    TEEC_NONE,
583c7de5349SHisping Lin 							    TEEC_NONE);
584c7de5349SHisping Lin 	}
585c7de5349SHisping Lin 
586ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
587c7de5349SHisping Lin 					cmd,
588ae8ec5e1SHisping Lin 					&TeecOperation,
589ae8ec5e1SHisping Lin 					&ErrorOrigin);
590f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
591f4e1db95SHisping Lin 		goto exit;
592c7de5349SHisping Lin 
593c7de5349SHisping Lin 	if (!is_write)
594c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
595c7de5349SHisping Lin 
596f4e1db95SHisping Lin exit:
597ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
598ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
59946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
600ae8ec5e1SHisping Lin 
601ae8ec5e1SHisping Lin 	return TeecResult;
602ae8ec5e1SHisping Lin }
603ae8ec5e1SHisping Lin 
6046ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
6056ef445a4SHisping Lin {
606c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
607c7de5349SHisping Lin 						  false, buf, length);
6086ef445a4SHisping Lin }
6096ef445a4SHisping Lin 
6106ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
6116ef445a4SHisping Lin {
612c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
613c7de5349SHisping Lin 						  true, buf, length);
61416539616SHisping Lin }
61516539616SHisping Lin 
61616539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
61716539616SHisping Lin {
61816539616SHisping Lin 	TEEC_Result res;
619c7de5349SHisping Lin 
620c7de5349SHisping Lin 	res = trusty_base_end_security_data();
621c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
62216539616SHisping Lin 	return res;
62316539616SHisping Lin }
6242cd27853SHisping Lin 
6252cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
6262cd27853SHisping Lin {
627c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
628c7de5349SHisping Lin 						  false, buf, length);
6292cd27853SHisping Lin }
630c7de5349SHisping Lin 
6312cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
6322cd27853SHisping Lin {
633c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
634c7de5349SHisping Lin 						  true, buf, length);
6352cd27853SHisping Lin }
636095e2a82SHisping Lin 
637468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
638468df3b2SHisping Lin {
639468df3b2SHisping Lin 	uint32_t bootflag;
640c7de5349SHisping Lin 	TEEC_Result TeecResult;
641468df3b2SHisping Lin 
642f07e1686SHisping Lin 	*flag = 0;
643f07e1686SHisping Lin 
644c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
645c7de5349SHisping Lin 							false, &bootflag, 1);
646468df3b2SHisping Lin 
647468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
6480202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
6490202ee8aSHisping Lin 		if (bootflag == 0x00000001)
6500202ee8aSHisping Lin 			*flag = 1;
6510202ee8aSHisping Lin #else
652468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
653468df3b2SHisping Lin 			*flag = 1;
6540202ee8aSHisping Lin #endif
655468df3b2SHisping Lin 	}
656095e2a82SHisping Lin 	return TeecResult;
657095e2a82SHisping Lin }
6584aa61755SAndy Ye 
6591ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
6601ef63c75SHisping Lin {
6611ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
6621ef63c75SHisping Lin 						  true, buf, length);
6631ef63c75SHisping Lin }
6641ef63c75SHisping Lin 
66510f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value)
66610f41197SHisping Lin {
66710f41197SHisping Lin 	TEEC_Result TeecResult;
66810f41197SHisping Lin 	TEEC_Context TeecContext;
66910f41197SHisping Lin 	TEEC_Session TeecSession;
67010f41197SHisping Lin 	uint32_t ErrorOrigin;
67110f41197SHisping Lin 
67210f41197SHisping Lin 	*value = 0;
67310f41197SHisping Lin 
67410f41197SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
67510f41197SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
67610f41197SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
67710f41197SHisping Lin 	TEEC_Operation TeecOperation = {0};
67810f41197SHisping Lin 
67910f41197SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
68010f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
68110f41197SHisping Lin 		return TeecResult;
68210f41197SHisping Lin 
68310f41197SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
68410f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
68510f41197SHisping Lin 		return TeecResult;
68610f41197SHisping Lin 
68710f41197SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
68810f41197SHisping Lin 				&TeecSession,
68910f41197SHisping Lin 				TeecUuid,
69010f41197SHisping Lin 				TEEC_LOGIN_PUBLIC,
69110f41197SHisping Lin 				NULL,
69210f41197SHisping Lin 				NULL,
69310f41197SHisping Lin 				&ErrorOrigin);
69410f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
69510f41197SHisping Lin 		return TeecResult;
69610f41197SHisping Lin 
69710f41197SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
69810f41197SHisping Lin 						    TEEC_NONE,
69910f41197SHisping Lin 						    TEEC_NONE,
70010f41197SHisping Lin 						    TEEC_NONE);
70110f41197SHisping Lin 
70210f41197SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
70310f41197SHisping Lin 					STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN,
70410f41197SHisping Lin 					&TeecOperation,
70510f41197SHisping Lin 					&ErrorOrigin);
70610f41197SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
70710f41197SHisping Lin 		*value = TeecOperation.params[0].value.a;
70810f41197SHisping Lin 
70910f41197SHisping Lin 	TEEC_CloseSession(&TeecSession);
71010f41197SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
71110f41197SHisping Lin 
71210f41197SHisping Lin 	return TeecResult;
71310f41197SHisping Lin }
71410f41197SHisping Lin 
7151ac64e8aSHisping Lin uint32_t trusty_write_oem_encrypt_data(uint32_t *buf, uint32_t length)
7161ac64e8aSHisping Lin {
7171ac64e8aSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA,
7181ac64e8aSHisping Lin 						  true, buf, length);
7191ac64e8aSHisping Lin }
7201ac64e8aSHisping Lin 
721fc383442SHisping Lin uint32_t trusty_oem_encrypt_data_is_written(uint8_t *value)
722fc383442SHisping Lin {
723fc383442SHisping Lin 	TEEC_Result TeecResult;
724fc383442SHisping Lin 	TEEC_Context TeecContext;
725fc383442SHisping Lin 	TEEC_Session TeecSession;
726fc383442SHisping Lin 	uint32_t ErrorOrigin;
727fc383442SHisping Lin 
728fc383442SHisping Lin 	*value = 0;
729fc383442SHisping Lin 
730fc383442SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
731fc383442SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
732fc383442SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
733fc383442SHisping Lin 	TEEC_Operation TeecOperation = {0};
734fc383442SHisping Lin 
735fc383442SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
736fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
737fc383442SHisping Lin 		return TeecResult;
738fc383442SHisping Lin 
739fc383442SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
740fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
741fc383442SHisping Lin 		return TeecResult;
742fc383442SHisping Lin 
743fc383442SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
744fc383442SHisping Lin 				&TeecSession,
745fc383442SHisping Lin 				TeecUuid,
746fc383442SHisping Lin 				TEEC_LOGIN_PUBLIC,
747fc383442SHisping Lin 				NULL,
748fc383442SHisping Lin 				NULL,
749fc383442SHisping Lin 				&ErrorOrigin);
750fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
751fc383442SHisping Lin 		return TeecResult;
752fc383442SHisping Lin 
753fc383442SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
754fc383442SHisping Lin 						    TEEC_NONE,
755fc383442SHisping Lin 						    TEEC_NONE,
756fc383442SHisping Lin 						    TEEC_NONE);
757fc383442SHisping Lin 
758fc383442SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
759fc383442SHisping Lin 					STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN,
760fc383442SHisping Lin 					&TeecOperation,
761fc383442SHisping Lin 					&ErrorOrigin);
762fc383442SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
763fc383442SHisping Lin 		*value = TeecOperation.params[0].value.a;
764fc383442SHisping Lin 
765fc383442SHisping Lin 	TEEC_CloseSession(&TeecSession);
766fc383442SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
767fc383442SHisping Lin 
768fc383442SHisping Lin 	return TeecResult;
769fc383442SHisping Lin }
770fc383442SHisping Lin 
771fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
772fbf29bfbSHisping Lin {
773fbf29bfbSHisping Lin 	uint32_t levelflag;
774fbf29bfbSHisping Lin 
775fbf29bfbSHisping Lin 	levelflag = flag;
776fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
777fbf29bfbSHisping Lin 						  true, &levelflag, 1);
778fbf29bfbSHisping Lin }
779fbf29bfbSHisping Lin 
780f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
781f39d4289SHisping Lin {
782f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
783f39d4289SHisping Lin 						  true, buf, length);
784f39d4289SHisping Lin }
785f39d4289SHisping Lin 
78634f2e8f6SHisping Lin static void trusty_select_security_level(void)
7877504da74SHisping Lin {
788b2858095SHisping Lin #ifdef CONFIG_OPTEE_SECURITY_LEVEL
7897504da74SHisping Lin 	TEEC_Result TeecResult;
7907504da74SHisping Lin 
7917504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
7927504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
7937504da74SHisping Lin 		run_command("download", 0);
7947504da74SHisping Lin 		return;
7957504da74SHisping Lin 	}
7967504da74SHisping Lin 
7977504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
7987504da74SHisping Lin 		debug("optee select security level success!");
799b2858095SHisping Lin 	else if (TeecResult == TEEC_ERROR_NOT_SUPPORTED)
800b2858095SHisping Lin 		debug("optee not support security level!");
8017504da74SHisping Lin 	else
8027504da74SHisping Lin 		panic("optee select security level fail!");
8037504da74SHisping Lin 
8047504da74SHisping Lin 	return;
8057504da74SHisping Lin #endif
8067504da74SHisping Lin }
8077504da74SHisping Lin 
80851ac7005SHisping Lin void optee_client_init(void)
80951ac7005SHisping Lin {
81051ac7005SHisping Lin 	trusty_select_security_level();
81134f2e8f6SHisping Lin 	trusty_notify_always_use_security();
81251ac7005SHisping Lin }
81351ac7005SHisping Lin 
814d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
815d5913350SHisping Lin {
816d5913350SHisping Lin 	TEEC_Result TeecResult;
817d5913350SHisping Lin 	TEEC_Context TeecContext;
818d5913350SHisping Lin 	TEEC_Session TeecSession;
819d5913350SHisping Lin 	uint32_t ErrorOrigin;
820d5913350SHisping Lin 
821d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
822d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
823d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
824d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
825d5913350SHisping Lin 
826d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
827d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
828d5913350SHisping Lin 		return TeecResult;
829d5913350SHisping Lin 
830d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
831d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
832d5913350SHisping Lin 		return TeecResult;
833d5913350SHisping Lin 
834d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
835d5913350SHisping Lin 				&TeecSession,
836d5913350SHisping Lin 				TeecUuid,
837d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
838d5913350SHisping Lin 				NULL,
839d5913350SHisping Lin 				NULL,
840d5913350SHisping Lin 				&ErrorOrigin);
841d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
842d5913350SHisping Lin 		return TeecResult;
843d5913350SHisping Lin 
844d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
845d5913350SHisping Lin 
846d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
847d5913350SHisping Lin 
848d5913350SHisping Lin 	SharedMem.size = byte_len;
849d5913350SHisping Lin 	SharedMem.flags = 0;
850d5913350SHisping Lin 
851d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
852d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
853d5913350SHisping Lin 		goto exit;
854d5913350SHisping Lin 
855d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
856d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
857d5913350SHisping Lin 
858d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
859d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
860d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
861d5913350SHisping Lin 						    TEEC_NONE,
862d5913350SHisping Lin 						    TEEC_NONE);
863d5913350SHisping Lin 
864d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
865d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
866d5913350SHisping Lin 					&TeecOperation,
867d5913350SHisping Lin 					&ErrorOrigin);
868d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
869d5913350SHisping Lin 		goto exit;
870d5913350SHisping Lin 
871d5913350SHisping Lin exit:
872d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
873d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
874d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
875d5913350SHisping Lin 
876d5913350SHisping Lin 	return TeecResult;
877d5913350SHisping Lin }
878d5913350SHisping Lin 
879d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
880d5913350SHisping Lin {
881d5913350SHisping Lin 	TEEC_Result TeecResult;
882d5913350SHisping Lin 	TEEC_Context TeecContext;
883d5913350SHisping Lin 	TEEC_Session TeecSession;
884d5913350SHisping Lin 	uint32_t ErrorOrigin;
885d5913350SHisping Lin 
886d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
887d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
888d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
889d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
890d5913350SHisping Lin 
891d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
892d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
893d5913350SHisping Lin 		return TeecResult;
894d5913350SHisping Lin 
895d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
896d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
897d5913350SHisping Lin 		return TeecResult;
898d5913350SHisping Lin 
899d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
900d5913350SHisping Lin 				&TeecSession,
901d5913350SHisping Lin 				TeecUuid,
902d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
903d5913350SHisping Lin 				NULL,
904d5913350SHisping Lin 				NULL,
905d5913350SHisping Lin 				&ErrorOrigin);
906d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
907d5913350SHisping Lin 		return TeecResult;
908d5913350SHisping Lin 
909d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
910d5913350SHisping Lin 
911d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
912d5913350SHisping Lin 
913d5913350SHisping Lin 	SharedMem.size = byte_len;
914d5913350SHisping Lin 	SharedMem.flags = 0;
915d5913350SHisping Lin 
916d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
917d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
918d5913350SHisping Lin 		goto exit;
919d5913350SHisping Lin 
920d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
921d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
922d5913350SHisping Lin 
923d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
924d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
925d5913350SHisping Lin 						    TEEC_NONE,
926d5913350SHisping Lin 						    TEEC_NONE);
927d5913350SHisping Lin 
928d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
929d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
930d5913350SHisping Lin 					&TeecOperation,
931d5913350SHisping Lin 					&ErrorOrigin);
932d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
933d5913350SHisping Lin 		goto exit;
934d5913350SHisping Lin 
935d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
936d5913350SHisping Lin 
937d5913350SHisping Lin exit:
938d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
939d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
940d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
941d5913350SHisping Lin 
942d5913350SHisping Lin 	return TeecResult;
943d5913350SHisping Lin }
944d5913350SHisping Lin 
94590e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,
946bb1ba6acSHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
947bb1ba6acSHisping Lin {
948bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
949bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
950bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
951bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
952bb1ba6acSHisping Lin 
953bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
954bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
955bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
956bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
957bb1ba6acSHisping Lin 
958bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
959bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
960bb1ba6acSHisping Lin 		return TeecResult;
961bb1ba6acSHisping Lin 
962bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
963bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
964bb1ba6acSHisping Lin 		return TeecResult;
965bb1ba6acSHisping Lin 
966bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
967bb1ba6acSHisping Lin 				&TeecSession,
968bb1ba6acSHisping Lin 				TeecUuid,
969bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
970bb1ba6acSHisping Lin 				NULL,
971bb1ba6acSHisping Lin 				NULL,
972bb1ba6acSHisping Lin 				&ErrorOrigin);
973bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
974bb1ba6acSHisping Lin 		return TeecResult;
975bb1ba6acSHisping Lin 
976bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
977bb1ba6acSHisping Lin 
978bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
979bb1ba6acSHisping Lin 
980bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
981bb1ba6acSHisping Lin 	SharedMem.flags = 0;
982bb1ba6acSHisping Lin 
983bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
984bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
985bb1ba6acSHisping Lin 		goto exit;
986bb1ba6acSHisping Lin 
987bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
988bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
989bb1ba6acSHisping Lin 
990bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
991bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
992bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
993bb1ba6acSHisping Lin 						    TEEC_NONE,
994bb1ba6acSHisping Lin 						    TEEC_NONE);
995bb1ba6acSHisping Lin 
996bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
99790e849a0Sxb.wang 					STORAGE_CMD_WRITE_OEM_OTP_KEY,
998bb1ba6acSHisping Lin 					&TeecOperation,
999bb1ba6acSHisping Lin 					&ErrorOrigin);
1000bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1001bb1ba6acSHisping Lin 		goto exit;
1002bb1ba6acSHisping Lin 
1003bb1ba6acSHisping Lin exit:
1004bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1005bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
1006bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1007bb1ba6acSHisping Lin 
1008bb1ba6acSHisping Lin 	return TeecResult;
1009bb1ba6acSHisping Lin }
1010bb1ba6acSHisping Lin 
10119deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value)
10129deb34f6SHisping Lin {
10139deb34f6SHisping Lin 	TEEC_Result TeecResult;
10149deb34f6SHisping Lin 	TEEC_Context TeecContext;
10159deb34f6SHisping Lin 	TEEC_Session TeecSession;
10169deb34f6SHisping Lin 	uint32_t ErrorOrigin;
10179deb34f6SHisping Lin 
10189deb34f6SHisping Lin 	*value = 0xFF;
10199deb34f6SHisping Lin 
10209deb34f6SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
10219deb34f6SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
10229deb34f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
10239deb34f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
10249deb34f6SHisping Lin 
10259deb34f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
10269deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10279deb34f6SHisping Lin 		return TeecResult;
10289deb34f6SHisping Lin 
10299deb34f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
10309deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10319deb34f6SHisping Lin 		return TeecResult;
10329deb34f6SHisping Lin 
10339deb34f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
10349deb34f6SHisping Lin 				&TeecSession,
10359deb34f6SHisping Lin 				TeecUuid,
10369deb34f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
10379deb34f6SHisping Lin 				NULL,
10389deb34f6SHisping Lin 				NULL,
10399deb34f6SHisping Lin 				&ErrorOrigin);
10409deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10419deb34f6SHisping Lin 		return TeecResult;
10429deb34f6SHisping Lin 
10439deb34f6SHisping Lin 	TeecOperation.params[0].value.a = key_id;
10449deb34f6SHisping Lin 
10459deb34f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
10469deb34f6SHisping Lin 						    TEEC_NONE,
10479deb34f6SHisping Lin 						    TEEC_NONE,
10489deb34f6SHisping Lin 						    TEEC_NONE);
10499deb34f6SHisping Lin 
10509deb34f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10519deb34f6SHisping Lin 					STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN,
10529deb34f6SHisping Lin 					&TeecOperation,
10539deb34f6SHisping Lin 					&ErrorOrigin);
10549deb34f6SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
10559deb34f6SHisping Lin 		*value = TeecOperation.params[0].value.b;
10569deb34f6SHisping Lin 
10579deb34f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
10589deb34f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10599deb34f6SHisping Lin 
10609deb34f6SHisping Lin 	return TeecResult;
10619deb34f6SHisping Lin }
10629deb34f6SHisping Lin 
106390e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)
1064a405238aSHisping Lin {
1065a405238aSHisping Lin 	TEEC_Result TeecResult;
1066a405238aSHisping Lin 	TEEC_Context TeecContext;
1067a405238aSHisping Lin 	TEEC_Session TeecSession;
1068a405238aSHisping Lin 	uint32_t ErrorOrigin;
1069a405238aSHisping Lin 
1070a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1071a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1072a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1073a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
1074a405238aSHisping Lin 
1075a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1076a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1077a405238aSHisping Lin 		return TeecResult;
1078a405238aSHisping Lin 
1079a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1080a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1081a405238aSHisping Lin 		return TeecResult;
1082a405238aSHisping Lin 
1083a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1084a405238aSHisping Lin 				&TeecSession,
1085a405238aSHisping Lin 				TeecUuid,
1086a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
1087a405238aSHisping Lin 				NULL,
1088a405238aSHisping Lin 				NULL,
1089a405238aSHisping Lin 				&ErrorOrigin);
1090a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1091a405238aSHisping Lin 		return TeecResult;
1092a405238aSHisping Lin 
1093a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
1094a405238aSHisping Lin 
1095a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1096a405238aSHisping Lin 						    TEEC_NONE,
1097a405238aSHisping Lin 						    TEEC_NONE,
1098a405238aSHisping Lin 						    TEEC_NONE);
1099a405238aSHisping Lin 
1100a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1101a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
1102a405238aSHisping Lin 					&TeecOperation,
1103a405238aSHisping Lin 					&ErrorOrigin);
1104a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1105a405238aSHisping Lin 		goto exit;
1106a405238aSHisping Lin 
1107a405238aSHisping Lin exit:
1108a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
1109a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1110a405238aSHisping Lin 
1111a405238aSHisping Lin 	return TeecResult;
1112a405238aSHisping Lin }
1113a405238aSHisping Lin 
11142f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config,
11152f8c34bdSxb.wang 				   uint32_t src_phys_addr, uint32_t dst_phys_addr,
11162f8c34bdSxb.wang 				   uint32_t len)
1117fc3694d6Sxb.wang {
1118fc3694d6Sxb.wang 	TEEC_Result TeecResult;
1119fc3694d6Sxb.wang 	TEEC_Context TeecContext;
1120fc3694d6Sxb.wang 	TEEC_Session TeecSession;
1121fc3694d6Sxb.wang 	TEEC_Operation TeecOperation = {0};
1122fc3694d6Sxb.wang 	uint32_t ErrorOrigin;
1123fc3694d6Sxb.wang 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
1124fc3694d6Sxb.wang 	TEEC_SharedMemory SharedMem_config = {0};
1125fc3694d6Sxb.wang 
11262f8c34bdSxb.wang 	if (key_id != RK_OEM_OTP_KEY0 &&
11272f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY1 &&
11282f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY2 &&
11292f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY3 &&
11302f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY_FW)
1131fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1132fc3694d6Sxb.wang 
11332f8c34bdSxb.wang 	if (!config)
1134fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1135fc3694d6Sxb.wang 
1136fc3694d6Sxb.wang 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
1137fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1138fc3694d6Sxb.wang 
1139fc3694d6Sxb.wang 	if (config->mode >= RK_CIPHER_MODE_XTS)
1140fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1141fc3694d6Sxb.wang 
1142fc3694d6Sxb.wang 	if (config->operation != RK_MODE_ENCRYPT &&
1143fc3694d6Sxb.wang 	    config->operation != RK_MODE_DECRYPT)
1144fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1145fc3694d6Sxb.wang 
1146fc3694d6Sxb.wang 	if (config->key_len != 16 &&
1147fc3694d6Sxb.wang 	    config->key_len != 24 &&
1148fc3694d6Sxb.wang 	    config->key_len != 32)
1149fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1150fc3694d6Sxb.wang 
11512f8c34bdSxb.wang 	if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16)
11522f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11532f8c34bdSxb.wang 
11542f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126)
11552f8c34bdSxb.wang 	if (config->key_len == 24)
11562f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11572f8c34bdSxb.wang #endif
11582f8c34bdSxb.wang 
1159fc3694d6Sxb.wang 	if (len % AES_BLOCK_SIZE ||
1160fc3694d6Sxb.wang 	    len == 0)
1161fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1162fc3694d6Sxb.wang 
11632f8c34bdSxb.wang 	if (!src_phys_addr || !dst_phys_addr)
11642f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11652f8c34bdSxb.wang 
1166fc3694d6Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
1167fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1168fc3694d6Sxb.wang 		return TeecResult;
1169fc3694d6Sxb.wang 
1170fc3694d6Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1171fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1172fc3694d6Sxb.wang 		return TeecResult;
1173fc3694d6Sxb.wang 
1174fc3694d6Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
1175fc3694d6Sxb.wang 				      &TeecSession,
1176fc3694d6Sxb.wang 				      &uuid,
1177fc3694d6Sxb.wang 				      TEEC_LOGIN_PUBLIC,
1178fc3694d6Sxb.wang 				      NULL,
1179fc3694d6Sxb.wang 				      NULL,
1180fc3694d6Sxb.wang 				      &ErrorOrigin);
1181fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1182fc3694d6Sxb.wang 		goto exit;
1183fc3694d6Sxb.wang 
1184fc3694d6Sxb.wang 	SharedMem_config.size = sizeof(rk_cipher_config);
1185fc3694d6Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
1186fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1187fc3694d6Sxb.wang 		goto exit;
1188fc3694d6Sxb.wang 
1189fc3694d6Sxb.wang 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
1190fc3694d6Sxb.wang 	TeecOperation.params[0].value.a       = key_id;
1191fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
1192fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
11932f8c34bdSxb.wang 	TeecOperation.params[2].value.a       = src_phys_addr;
11942f8c34bdSxb.wang 	TeecOperation.params[2].value.b       = len;
11952f8c34bdSxb.wang 	TeecOperation.params[3].value.a       = dst_phys_addr;
1196fc3694d6Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1197fc3694d6Sxb.wang 						    TEEC_MEMREF_TEMP_INPUT,
11982f8c34bdSxb.wang 						    TEEC_VALUE_INPUT,
11992f8c34bdSxb.wang 						    TEEC_VALUE_INPUT);
12002f8c34bdSxb.wang 
12012f8c34bdSxb.wang 	crypto_flush_cacheline(src_phys_addr, len);
12022f8c34bdSxb.wang 	crypto_flush_cacheline(dst_phys_addr, len);
12032f8c34bdSxb.wang 
1204fc3694d6Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12052f8c34bdSxb.wang 					CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER,
1206fc3694d6Sxb.wang 					&TeecOperation,
1207fc3694d6Sxb.wang 					&ErrorOrigin);
1208fc3694d6Sxb.wang 
1209a900eef3SHisping Lin 	crypto_invalidate_cacheline(dst_phys_addr, len);
1210a900eef3SHisping Lin 
1211fc3694d6Sxb.wang exit:
1212fc3694d6Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem_config);
1213fc3694d6Sxb.wang 	TEEC_CloseSession(&TeecSession);
1214fc3694d6Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
1215fc3694d6Sxb.wang 	return TeecResult;
1216fc3694d6Sxb.wang }
1217fc3694d6Sxb.wang 
1218a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id,
1219a828eba9SHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
1220a828eba9SHisping Lin {
1221a828eba9SHisping Lin 	TEEC_Result TeecResult;
1222a828eba9SHisping Lin 	TEEC_Context TeecContext;
1223a828eba9SHisping Lin 	TEEC_Session TeecSession;
1224a828eba9SHisping Lin 	uint32_t ErrorOrigin;
1225a828eba9SHisping Lin 
1226a828eba9SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1227a828eba9SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1228a828eba9SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1229a828eba9SHisping Lin 	TEEC_Operation TeecOperation = {0};
1230a828eba9SHisping Lin 
1231a828eba9SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1232a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1233a828eba9SHisping Lin 		return TeecResult;
1234a828eba9SHisping Lin 
1235a828eba9SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1236a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1237a828eba9SHisping Lin 		return TeecResult;
1238a828eba9SHisping Lin 
1239a828eba9SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1240a828eba9SHisping Lin 				&TeecSession,
1241a828eba9SHisping Lin 				TeecUuid,
1242a828eba9SHisping Lin 				TEEC_LOGIN_PUBLIC,
1243a828eba9SHisping Lin 				NULL,
1244a828eba9SHisping Lin 				NULL,
1245a828eba9SHisping Lin 				&ErrorOrigin);
1246a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1247a828eba9SHisping Lin 		return TeecResult;
1248a828eba9SHisping Lin 
1249a828eba9SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1250a828eba9SHisping Lin 
1251a828eba9SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1252a828eba9SHisping Lin 
1253a828eba9SHisping Lin 	SharedMem.size = byte_len;
1254a828eba9SHisping Lin 	SharedMem.flags = 0;
1255a828eba9SHisping Lin 
1256a828eba9SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1257a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1258a828eba9SHisping Lin 		goto exit;
1259a828eba9SHisping Lin 
1260a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1261a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1262a828eba9SHisping Lin 
1263a828eba9SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1264a828eba9SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1265a828eba9SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1266a828eba9SHisping Lin 						    TEEC_NONE,
1267a828eba9SHisping Lin 						    TEEC_NONE);
1268a828eba9SHisping Lin 
1269a828eba9SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1270a828eba9SHisping Lin 					STORAGE_CMD_WRITE_OEM_HDCP_KEY,
1271a828eba9SHisping Lin 					&TeecOperation,
1272a828eba9SHisping Lin 					&ErrorOrigin);
1273a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1274a828eba9SHisping Lin 		goto exit;
1275a828eba9SHisping Lin 
1276a828eba9SHisping Lin exit:
1277a828eba9SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1278a828eba9SHisping Lin 	TEEC_CloseSession(&TeecSession);
1279a828eba9SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1280a828eba9SHisping Lin 
1281a828eba9SHisping Lin 	return TeecResult;
1282a828eba9SHisping Lin }
1283a828eba9SHisping Lin 
1284e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value)
1285e8bc2655SHisping Lin {
1286e8bc2655SHisping Lin 	TEEC_Result TeecResult;
1287e8bc2655SHisping Lin 	TEEC_Context TeecContext;
1288e8bc2655SHisping Lin 	TEEC_Session TeecSession;
1289e8bc2655SHisping Lin 	uint32_t ErrorOrigin;
1290e8bc2655SHisping Lin 
1291e8bc2655SHisping Lin 	*value = 0xFF;
1292e8bc2655SHisping Lin 
1293e8bc2655SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1294e8bc2655SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1295e8bc2655SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1296e8bc2655SHisping Lin 	TEEC_Operation TeecOperation = {0};
1297e8bc2655SHisping Lin 
1298e8bc2655SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1299e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1300e8bc2655SHisping Lin 		return TeecResult;
1301e8bc2655SHisping Lin 
1302e8bc2655SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1303e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1304e8bc2655SHisping Lin 		return TeecResult;
1305e8bc2655SHisping Lin 
1306e8bc2655SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1307e8bc2655SHisping Lin 				&TeecSession,
1308e8bc2655SHisping Lin 				TeecUuid,
1309e8bc2655SHisping Lin 				TEEC_LOGIN_PUBLIC,
1310e8bc2655SHisping Lin 				NULL,
1311e8bc2655SHisping Lin 				NULL,
1312e8bc2655SHisping Lin 				&ErrorOrigin);
1313e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1314e8bc2655SHisping Lin 		return TeecResult;
1315e8bc2655SHisping Lin 
1316e8bc2655SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1317e8bc2655SHisping Lin 
1318e8bc2655SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1319e8bc2655SHisping Lin 						    TEEC_NONE,
1320e8bc2655SHisping Lin 						    TEEC_NONE,
1321e8bc2655SHisping Lin 						    TEEC_NONE);
1322e8bc2655SHisping Lin 
1323e8bc2655SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1324e8bc2655SHisping Lin 					STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN,
1325e8bc2655SHisping Lin 					&TeecOperation,
1326e8bc2655SHisping Lin 					&ErrorOrigin);
1327e8bc2655SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1328e8bc2655SHisping Lin 		*value = TeecOperation.params[0].value.b;
1329e8bc2655SHisping Lin 
1330e8bc2655SHisping Lin 	TEEC_CloseSession(&TeecSession);
1331e8bc2655SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1332e8bc2655SHisping Lin 
1333e8bc2655SHisping Lin 	return TeecResult;
1334e8bc2655SHisping Lin }
1335e8bc2655SHisping Lin 
1336bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id)
1337bfd9cea4SHisping Lin {
1338bfd9cea4SHisping Lin 	TEEC_Result TeecResult;
1339bfd9cea4SHisping Lin 	TEEC_Context TeecContext;
1340bfd9cea4SHisping Lin 	TEEC_Session TeecSession;
1341bfd9cea4SHisping Lin 	uint32_t ErrorOrigin;
1342bfd9cea4SHisping Lin 
1343bfd9cea4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1344bfd9cea4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1345bfd9cea4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1346bfd9cea4SHisping Lin 	TEEC_Operation TeecOperation = {0};
1347bfd9cea4SHisping Lin 
1348bfd9cea4SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1349bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1350bfd9cea4SHisping Lin 		return TeecResult;
1351bfd9cea4SHisping Lin 
1352bfd9cea4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1353bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1354bfd9cea4SHisping Lin 		return TeecResult;
1355bfd9cea4SHisping Lin 
1356bfd9cea4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1357bfd9cea4SHisping Lin 				&TeecSession,
1358bfd9cea4SHisping Lin 				TeecUuid,
1359bfd9cea4SHisping Lin 				TEEC_LOGIN_PUBLIC,
1360bfd9cea4SHisping Lin 				NULL,
1361bfd9cea4SHisping Lin 				NULL,
1362bfd9cea4SHisping Lin 				&ErrorOrigin);
1363bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1364bfd9cea4SHisping Lin 		return TeecResult;
1365bfd9cea4SHisping Lin 
1366bfd9cea4SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1367bfd9cea4SHisping Lin 
1368bfd9cea4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1369bfd9cea4SHisping Lin 						    TEEC_NONE,
1370bfd9cea4SHisping Lin 						    TEEC_NONE,
1371bfd9cea4SHisping Lin 						    TEEC_NONE);
1372bfd9cea4SHisping Lin 
1373bfd9cea4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1374bfd9cea4SHisping Lin 					STORAGE_CMD_SET_OEM_HDCP_KEY_MASK,
1375bfd9cea4SHisping Lin 					&TeecOperation,
1376bfd9cea4SHisping Lin 					&ErrorOrigin);
1377bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1378bfd9cea4SHisping Lin 		goto exit;
1379bfd9cea4SHisping Lin 
1380bfd9cea4SHisping Lin exit:
1381bfd9cea4SHisping Lin 	TEEC_CloseSession(&TeecSession);
1382bfd9cea4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1383bfd9cea4SHisping Lin 
1384bfd9cea4SHisping Lin 	return TeecResult;
1385bfd9cea4SHisping Lin }
1386bfd9cea4SHisping Lin 
1387*ac6d8253SHisping Lin uint32_t trusty_write_esck_key(enum RK_ESCK_KEYID key_id,
1388*ac6d8253SHisping Lin 			       uint8_t *byte_buf, uint32_t byte_len)
1389*ac6d8253SHisping Lin {
1390*ac6d8253SHisping Lin 	TEEC_Result TeecResult;
1391*ac6d8253SHisping Lin 	TEEC_Context TeecContext;
1392*ac6d8253SHisping Lin 	TEEC_Session TeecSession;
1393*ac6d8253SHisping Lin 	uint32_t ErrorOrigin;
1394*ac6d8253SHisping Lin 
1395*ac6d8253SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1396*ac6d8253SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1397*ac6d8253SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1398*ac6d8253SHisping Lin 	TEEC_Operation TeecOperation = {0};
1399*ac6d8253SHisping Lin 
1400*ac6d8253SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1401*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1402*ac6d8253SHisping Lin 		return TeecResult;
1403*ac6d8253SHisping Lin 
1404*ac6d8253SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1405*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1406*ac6d8253SHisping Lin 		return TeecResult;
1407*ac6d8253SHisping Lin 
1408*ac6d8253SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1409*ac6d8253SHisping Lin 				&TeecSession,
1410*ac6d8253SHisping Lin 				TeecUuid,
1411*ac6d8253SHisping Lin 				TEEC_LOGIN_PUBLIC,
1412*ac6d8253SHisping Lin 				NULL,
1413*ac6d8253SHisping Lin 				NULL,
1414*ac6d8253SHisping Lin 				&ErrorOrigin);
1415*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1416*ac6d8253SHisping Lin 		return TeecResult;
1417*ac6d8253SHisping Lin 
1418*ac6d8253SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1419*ac6d8253SHisping Lin 
1420*ac6d8253SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1421*ac6d8253SHisping Lin 
1422*ac6d8253SHisping Lin 	SharedMem.size = byte_len;
1423*ac6d8253SHisping Lin 	SharedMem.flags = 0;
1424*ac6d8253SHisping Lin 
1425*ac6d8253SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1426*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1427*ac6d8253SHisping Lin 		goto exit;
1428*ac6d8253SHisping Lin 
1429*ac6d8253SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1430*ac6d8253SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1431*ac6d8253SHisping Lin 
1432*ac6d8253SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1433*ac6d8253SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1434*ac6d8253SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1435*ac6d8253SHisping Lin 						    TEEC_NONE,
1436*ac6d8253SHisping Lin 						    TEEC_NONE);
1437*ac6d8253SHisping Lin 
1438*ac6d8253SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1439*ac6d8253SHisping Lin 					STORAGE_CMD_WRITE_ESCK_KEY,
1440*ac6d8253SHisping Lin 					&TeecOperation,
1441*ac6d8253SHisping Lin 					&ErrorOrigin);
1442*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1443*ac6d8253SHisping Lin 		goto exit;
1444*ac6d8253SHisping Lin 
1445*ac6d8253SHisping Lin exit:
1446*ac6d8253SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1447*ac6d8253SHisping Lin 	TEEC_CloseSession(&TeecSession);
1448*ac6d8253SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1449*ac6d8253SHisping Lin 
1450*ac6d8253SHisping Lin 	return TeecResult;
1451*ac6d8253SHisping Lin }
1452*ac6d8253SHisping Lin 
1453*ac6d8253SHisping Lin uint32_t trusty_esck_key_is_written(enum RK_ESCK_KEYID key_id, uint8_t *value)
1454*ac6d8253SHisping Lin {
1455*ac6d8253SHisping Lin 	TEEC_Result TeecResult;
1456*ac6d8253SHisping Lin 	TEEC_Context TeecContext;
1457*ac6d8253SHisping Lin 	TEEC_Session TeecSession;
1458*ac6d8253SHisping Lin 	uint32_t ErrorOrigin;
1459*ac6d8253SHisping Lin 
1460*ac6d8253SHisping Lin 	*value = 0xFF;
1461*ac6d8253SHisping Lin 
1462*ac6d8253SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1463*ac6d8253SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1464*ac6d8253SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1465*ac6d8253SHisping Lin 	TEEC_Operation TeecOperation = {0};
1466*ac6d8253SHisping Lin 
1467*ac6d8253SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1468*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1469*ac6d8253SHisping Lin 		return TeecResult;
1470*ac6d8253SHisping Lin 
1471*ac6d8253SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1472*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1473*ac6d8253SHisping Lin 		return TeecResult;
1474*ac6d8253SHisping Lin 
1475*ac6d8253SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1476*ac6d8253SHisping Lin 				&TeecSession,
1477*ac6d8253SHisping Lin 				TeecUuid,
1478*ac6d8253SHisping Lin 				TEEC_LOGIN_PUBLIC,
1479*ac6d8253SHisping Lin 				NULL,
1480*ac6d8253SHisping Lin 				NULL,
1481*ac6d8253SHisping Lin 				&ErrorOrigin);
1482*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1483*ac6d8253SHisping Lin 		return TeecResult;
1484*ac6d8253SHisping Lin 
1485*ac6d8253SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1486*ac6d8253SHisping Lin 
1487*ac6d8253SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1488*ac6d8253SHisping Lin 						    TEEC_NONE,
1489*ac6d8253SHisping Lin 						    TEEC_NONE,
1490*ac6d8253SHisping Lin 						    TEEC_NONE);
1491*ac6d8253SHisping Lin 
1492*ac6d8253SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1493*ac6d8253SHisping Lin 					STORAGE_CMD_ESCK_KEY_IS_WRITTEN,
1494*ac6d8253SHisping Lin 					&TeecOperation,
1495*ac6d8253SHisping Lin 					&ErrorOrigin);
1496*ac6d8253SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1497*ac6d8253SHisping Lin 		*value = TeecOperation.params[0].value.b;
1498*ac6d8253SHisping Lin 
1499*ac6d8253SHisping Lin 	TEEC_CloseSession(&TeecSession);
1500*ac6d8253SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1501*ac6d8253SHisping Lin 
1502*ac6d8253SHisping Lin 	return TeecResult;
1503*ac6d8253SHisping Lin }
1504*ac6d8253SHisping Lin 
1505*ac6d8253SHisping Lin uint32_t trusty_set_esck_key_mask(enum RK_ESCK_KEYID key_id)
1506*ac6d8253SHisping Lin {
1507*ac6d8253SHisping Lin 	TEEC_Result TeecResult;
1508*ac6d8253SHisping Lin 	TEEC_Context TeecContext;
1509*ac6d8253SHisping Lin 	TEEC_Session TeecSession;
1510*ac6d8253SHisping Lin 	uint32_t ErrorOrigin;
1511*ac6d8253SHisping Lin 
1512*ac6d8253SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1513*ac6d8253SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1514*ac6d8253SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1515*ac6d8253SHisping Lin 	TEEC_Operation TeecOperation = {0};
1516*ac6d8253SHisping Lin 
1517*ac6d8253SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1518*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1519*ac6d8253SHisping Lin 		return TeecResult;
1520*ac6d8253SHisping Lin 
1521*ac6d8253SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1522*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1523*ac6d8253SHisping Lin 		return TeecResult;
1524*ac6d8253SHisping Lin 
1525*ac6d8253SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1526*ac6d8253SHisping Lin 				&TeecSession,
1527*ac6d8253SHisping Lin 				TeecUuid,
1528*ac6d8253SHisping Lin 				TEEC_LOGIN_PUBLIC,
1529*ac6d8253SHisping Lin 				NULL,
1530*ac6d8253SHisping Lin 				NULL,
1531*ac6d8253SHisping Lin 				&ErrorOrigin);
1532*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1533*ac6d8253SHisping Lin 		return TeecResult;
1534*ac6d8253SHisping Lin 
1535*ac6d8253SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1536*ac6d8253SHisping Lin 
1537*ac6d8253SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1538*ac6d8253SHisping Lin 						    TEEC_NONE,
1539*ac6d8253SHisping Lin 						    TEEC_NONE,
1540*ac6d8253SHisping Lin 						    TEEC_NONE);
1541*ac6d8253SHisping Lin 
1542*ac6d8253SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1543*ac6d8253SHisping Lin 					STORAGE_CMD_SET_ESCK_KEY_MASK,
1544*ac6d8253SHisping Lin 					&TeecOperation,
1545*ac6d8253SHisping Lin 					&ErrorOrigin);
1546*ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1547*ac6d8253SHisping Lin 		goto exit;
1548*ac6d8253SHisping Lin 
1549*ac6d8253SHisping Lin exit:
1550*ac6d8253SHisping Lin 	TEEC_CloseSession(&TeecSession);
1551*ac6d8253SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1552*ac6d8253SHisping Lin 
1553*ac6d8253SHisping Lin 	return TeecResult;
1554*ac6d8253SHisping Lin }
1555*ac6d8253SHisping Lin 
15564d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void)
15574d4c5043SHisping Lin {
15584d4c5043SHisping Lin 	TEEC_Result TeecResult;
15594d4c5043SHisping Lin 	TEEC_Context TeecContext;
15604d4c5043SHisping Lin 	TEEC_Session TeecSession;
15614d4c5043SHisping Lin 	uint32_t ErrorOrigin;
15624d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
15634d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
15644d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
15654d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
15664d4c5043SHisping Lin 	const uint8_t transfer_inout[] = "Transfer data test.";
15674d4c5043SHisping Lin 
15684d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
15694d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
15704d4c5043SHisping Lin 		return TeecResult;
15714d4c5043SHisping Lin 
15724d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
15734d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
15744d4c5043SHisping Lin 		return TeecResult;
15754d4c5043SHisping Lin 
15764d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
15774d4c5043SHisping Lin 						TEEC_NONE,
15784d4c5043SHisping Lin 						TEEC_NONE,
15794d4c5043SHisping Lin 						TEEC_NONE);
15804d4c5043SHisping Lin 
15814d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
15824d4c5043SHisping Lin 				&TeecSession,
15834d4c5043SHisping Lin 				TeecUuid,
15844d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
15854d4c5043SHisping Lin 				NULL,
15864d4c5043SHisping Lin 				&TeecOperation,
15874d4c5043SHisping Lin 				&ErrorOrigin);
15884d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
15894d4c5043SHisping Lin 		return TeecResult;
15904d4c5043SHisping Lin 
15914d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
15924d4c5043SHisping Lin 
15934d4c5043SHisping Lin 	SharedMem0.size = sizeof(transfer_inout);
15944d4c5043SHisping Lin 	SharedMem0.flags = 0;
15954d4c5043SHisping Lin 
15964d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
15974d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
15984d4c5043SHisping Lin 		goto exit;
15994d4c5043SHisping Lin 
16004d4c5043SHisping Lin 	memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size);
16014d4c5043SHisping Lin 
16024d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
16034d4c5043SHisping Lin 
16044d4c5043SHisping Lin 	SharedMem1.size = sizeof(transfer_inout);
16054d4c5043SHisping Lin 	SharedMem1.flags = 0;
16064d4c5043SHisping Lin 
16074d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
16084d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
16094d4c5043SHisping Lin 		goto exit;
16104d4c5043SHisping Lin 
16114d4c5043SHisping Lin 	TeecOperation.params[0].value.a = 66;
16124d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer;
16134d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem0.size;
16144d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer;
16154d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.size = SharedMem1.size;
16164d4c5043SHisping Lin 
16174d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
16184d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_INPUT,
16194d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_OUTPUT,
16204d4c5043SHisping Lin 						TEEC_NONE);
16214d4c5043SHisping Lin 
16224d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16234d4c5043SHisping Lin 					102,
16244d4c5043SHisping Lin 					&TeecOperation,
16254d4c5043SHisping Lin 					&ErrorOrigin);
16264d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
16274d4c5043SHisping Lin 		goto exit;
16284d4c5043SHisping Lin 
16294d4c5043SHisping Lin 	//Check the result
16304d4c5043SHisping Lin 	if (TeecOperation.params[0].value.a == 66 + 1 &&
16314d4c5043SHisping Lin 	    TeecOperation.params[0].value.b == TeecOperation.params[0].value.a)
16324d4c5043SHisping Lin 		printf("test value : Pass!\n");
16334d4c5043SHisping Lin 	else
16344d4c5043SHisping Lin 		printf("test value : Fail! (mismatch values)\n");
16354d4c5043SHisping Lin 
16364d4c5043SHisping Lin 	if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0)
16374d4c5043SHisping Lin 		printf("test buffer : Pass!\n");
16384d4c5043SHisping Lin 	else
16394d4c5043SHisping Lin 		printf("test buffer : Fail! (mismatch buffer)\n");
16404d4c5043SHisping Lin 
16414d4c5043SHisping Lin exit:
16424d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
16434d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
16444d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
16454d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
16464d4c5043SHisping Lin 
16474d4c5043SHisping Lin 	return TeecResult;
16484d4c5043SHisping Lin }
16494d4c5043SHisping Lin 
16504d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void)
16514d4c5043SHisping Lin {
16524d4c5043SHisping Lin 	TEEC_Result TeecResult;
16534d4c5043SHisping Lin 	TEEC_Context TeecContext;
16544d4c5043SHisping Lin 	TEEC_Session TeecSession;
16554d4c5043SHisping Lin 	uint32_t ErrorOrigin;
16564d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
16574d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
16584d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
16594d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
16604d4c5043SHisping Lin 
16614d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
16624d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
16634d4c5043SHisping Lin 		return TeecResult;
16644d4c5043SHisping Lin 
16654d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
16664d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
16674d4c5043SHisping Lin 		return TeecResult;
16684d4c5043SHisping Lin 
16694d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
16704d4c5043SHisping Lin 						TEEC_NONE,
16714d4c5043SHisping Lin 						TEEC_NONE,
16724d4c5043SHisping Lin 						TEEC_NONE);
16734d4c5043SHisping Lin 
16744d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
16754d4c5043SHisping Lin 				&TeecSession,
16764d4c5043SHisping Lin 				TeecUuid,
16774d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
16784d4c5043SHisping Lin 				NULL,
16794d4c5043SHisping Lin 				&TeecOperation,
16804d4c5043SHisping Lin 				&ErrorOrigin);
16814d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
16824d4c5043SHisping Lin 		return TeecResult;
16834d4c5043SHisping Lin 
16844d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
16854d4c5043SHisping Lin 						TEEC_NONE,
16864d4c5043SHisping Lin 						TEEC_NONE,
16874d4c5043SHisping Lin 						TEEC_NONE);
16884d4c5043SHisping Lin 
16894d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16904d4c5043SHisping Lin 					103,
16914d4c5043SHisping Lin 					&TeecOperation,
16924d4c5043SHisping Lin 					&ErrorOrigin);
16934d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
16944d4c5043SHisping Lin 		goto exit;
16954d4c5043SHisping Lin 
16964d4c5043SHisping Lin exit:
16974d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
16984d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
16994d4c5043SHisping Lin 
17004d4c5043SHisping Lin 	return TeecResult;
17014d4c5043SHisping Lin }
17024d4c5043SHisping Lin 
17034aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
17044aa61755SAndy Ye {
17054aa61755SAndy Ye 	TEEC_Result TeecResult;
17064aa61755SAndy Ye 	TEEC_Context TeecContext;
17074aa61755SAndy Ye 	TEEC_Session TeecSession;
17084aa61755SAndy Ye 	uint32_t ErrorOrigin;
17094aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17104aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17114aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17124aa61755SAndy Ye 				}
17134aa61755SAndy Ye 			     };
17144aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17154aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17163251364cSHisping Lin 	struct blk_desc *dev_desc;
17173251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17186651d4c0SJason Zhu 	if (!dev_desc) {
17196651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17206651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17216651d4c0SJason Zhu 	}
17224aa61755SAndy Ye 
1723f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1724f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1725f4e1db95SHisping Lin 		return TeecResult;
17264aa61755SAndy Ye 
17274aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1728f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1729f4e1db95SHisping Lin 		return TeecResult;
17304aa61755SAndy Ye 
17313251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17323251364cSHisping Lin 						TEEC_NONE,
17333251364cSHisping Lin 						TEEC_NONE,
17343251364cSHisping Lin 						TEEC_NONE);
17353251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1736b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1737b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1738b9a7e756SHisping Lin 	else
1739b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1740b9a7e756SHisping Lin 
17413251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17423251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17433251364cSHisping Lin #endif
17443251364cSHisping Lin 
17454aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17464aa61755SAndy Ye 				      &TeecSession,
17474aa61755SAndy Ye 				      TeecUuid,
17484aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17494aa61755SAndy Ye 				      NULL,
17503251364cSHisping Lin 					&TeecOperation,
17514aa61755SAndy Ye 				      &ErrorOrigin);
1752f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1753f4e1db95SHisping Lin 		return TeecResult;
17544aa61755SAndy Ye 
17554aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17564aa61755SAndy Ye 
17574aa61755SAndy Ye 	SharedMem0.size = *dh_size;
17584aa61755SAndy Ye 	SharedMem0.flags = 0;
17594aa61755SAndy Ye 
17604aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1761f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1762f4e1db95SHisping Lin 		goto exit;
17634aa61755SAndy Ye 
17644aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17654aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17664aa61755SAndy Ye 
17674aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17684aa61755SAndy Ye 						    TEEC_NONE,
17694aa61755SAndy Ye 						    TEEC_NONE,
17704aa61755SAndy Ye 						    TEEC_NONE);
17714aa61755SAndy Ye 
17724aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17734aa61755SAndy Ye 					143,
17744aa61755SAndy Ye 					&TeecOperation,
17754aa61755SAndy Ye 					&ErrorOrigin);
1776f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1777f4e1db95SHisping Lin 		goto exit;
17784aa61755SAndy Ye 
17794aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
17804aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1781f4e1db95SHisping Lin exit:
17824aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17834aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1784f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
17854aa61755SAndy Ye 
17864aa61755SAndy Ye 	return TeecResult;
17874aa61755SAndy Ye }
17884aa61755SAndy Ye 
17894aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
17904aa61755SAndy Ye {
17914aa61755SAndy Ye 	TEEC_Result TeecResult;
17924aa61755SAndy Ye 	TEEC_Context TeecContext;
17934aa61755SAndy Ye 	TEEC_Session TeecSession;
17944aa61755SAndy Ye 	uint32_t ErrorOrigin;
17954aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17964aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17974aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17984aa61755SAndy Ye 				}
17994aa61755SAndy Ye 			     };
18004aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
18014aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
18023251364cSHisping Lin 	struct blk_desc *dev_desc;
18033251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
18046651d4c0SJason Zhu 	if (!dev_desc) {
18056651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
18066651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
18076651d4c0SJason Zhu 	}
18084aa61755SAndy Ye 
1809f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1810f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1811f4e1db95SHisping Lin 		return TeecResult;
18124aa61755SAndy Ye 
18134aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1814f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1815f4e1db95SHisping Lin 		return TeecResult;
18164aa61755SAndy Ye 
18173251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
18183251364cSHisping Lin 						TEEC_NONE,
18193251364cSHisping Lin 						TEEC_NONE,
18203251364cSHisping Lin 						TEEC_NONE);
18213251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1822b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1823b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1824b9a7e756SHisping Lin 	else
1825b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1826b9a7e756SHisping Lin 
18273251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
18283251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
18293251364cSHisping Lin #endif
18303251364cSHisping Lin 
18314aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
18324aa61755SAndy Ye 				      &TeecSession,
18334aa61755SAndy Ye 				      TeecUuid,
18344aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
18354aa61755SAndy Ye 				      NULL,
18363251364cSHisping Lin 					&TeecOperation,
18374aa61755SAndy Ye 				      &ErrorOrigin);
1838f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1839f4e1db95SHisping Lin 		return TeecResult;
18404aa61755SAndy Ye 
18414aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
18424aa61755SAndy Ye 
18434aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
18444aa61755SAndy Ye 	SharedMem0.flags = 0;
18454aa61755SAndy Ye 
18464aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1847f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1848f4e1db95SHisping Lin 		goto exit;
18494aa61755SAndy Ye 
18504aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18514aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18524aa61755SAndy Ye 
18534aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
18544aa61755SAndy Ye 						    TEEC_NONE,
18554aa61755SAndy Ye 						    TEEC_NONE,
18564aa61755SAndy Ye 						    TEEC_NONE);
18574aa61755SAndy Ye 
18584aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18594aa61755SAndy Ye 					144,
18604aa61755SAndy Ye 					&TeecOperation,
18614aa61755SAndy Ye 					&ErrorOrigin);
1862f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1863f4e1db95SHisping Lin 		goto exit;
18644aa61755SAndy Ye 
18654aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
18664aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1867f4e1db95SHisping Lin exit:
18684aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18694aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1870f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18714aa61755SAndy Ye 
18724aa61755SAndy Ye 	return TeecResult;
18734aa61755SAndy Ye }
18744aa61755SAndy Ye 
18754aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
18764aa61755SAndy Ye 			      uint32_t *operation_size,
18774aa61755SAndy Ye 			      uint8_t *out,
18784aa61755SAndy Ye 			      uint32_t *out_len)
18794aa61755SAndy Ye {
18804aa61755SAndy Ye 	TEEC_Result TeecResult;
18814aa61755SAndy Ye 	TEEC_Context TeecContext;
18824aa61755SAndy Ye 	TEEC_Session TeecSession;
18834aa61755SAndy Ye 	uint32_t ErrorOrigin;
18844aa61755SAndy Ye 
18854aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18864aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18874aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
18884aa61755SAndy Ye 				}
18894aa61755SAndy Ye 			     };
18904aa61755SAndy Ye 
18914aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
18924aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
18933251364cSHisping Lin 	struct blk_desc *dev_desc;
18943251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
18956651d4c0SJason Zhu 	if (!dev_desc) {
18966651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
18976651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
18986651d4c0SJason Zhu 	}
18994aa61755SAndy Ye 
1900f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1901f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1902f4e1db95SHisping Lin 		return TeecResult;
19034aa61755SAndy Ye 
19044aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1905f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1906f4e1db95SHisping Lin 		return TeecResult;
19074aa61755SAndy Ye 
19083251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
19093251364cSHisping Lin 						TEEC_NONE,
19103251364cSHisping Lin 						TEEC_NONE,
19113251364cSHisping Lin 						TEEC_NONE);
19123251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1913b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1914b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1915b9a7e756SHisping Lin 	else
1916b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1917b9a7e756SHisping Lin 
19183251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
19193251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
19203251364cSHisping Lin #endif
19213251364cSHisping Lin 
19224aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
19234aa61755SAndy Ye 				      &TeecSession,
19244aa61755SAndy Ye 				      TeecUuid,
19254aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
19264aa61755SAndy Ye 				      NULL,
19273251364cSHisping Lin 					&TeecOperation,
19284aa61755SAndy Ye 				      &ErrorOrigin);
1929f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1930f4e1db95SHisping Lin 		return TeecResult;
19314aa61755SAndy Ye 
19324aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
19334aa61755SAndy Ye 
19344aa61755SAndy Ye 	SharedMem0.size = *operation_size;
19354aa61755SAndy Ye 	SharedMem0.flags = 0;
19364aa61755SAndy Ye 
19374aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1938f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1939f4e1db95SHisping Lin 		goto exit;
19404aa61755SAndy Ye 
19414aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
19424aa61755SAndy Ye 
19434aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
19444aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
19454aa61755SAndy Ye 
19464aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
19474aa61755SAndy Ye 
19484aa61755SAndy Ye 	SharedMem1.size = *out_len;
19494aa61755SAndy Ye 	SharedMem1.flags = 0;
19504aa61755SAndy Ye 
19514aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1952f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1953f4e1db95SHisping Lin 		goto exit;
19544aa61755SAndy Ye 
19554aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
19564aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
19574aa61755SAndy Ye 
19584aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
19594aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
19604aa61755SAndy Ye 						    TEEC_NONE,
19614aa61755SAndy Ye 						    TEEC_NONE);
19624aa61755SAndy Ye 
19634aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
19644aa61755SAndy Ye 					145,
19654aa61755SAndy Ye 					&TeecOperation,
19664aa61755SAndy Ye 					&ErrorOrigin);
1967f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1968f4e1db95SHisping Lin 		goto exit;
19694aa61755SAndy Ye 
19704aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
19714aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1972f4e1db95SHisping Lin exit:
19734aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
19744aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1975f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1976f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
19774aa61755SAndy Ye 
19784aa61755SAndy Ye 	return TeecResult;
19794aa61755SAndy Ye }
19804aa61755SAndy Ye 
19814aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
19824aa61755SAndy Ye {
19834aa61755SAndy Ye 	TEEC_Result TeecResult;
19844aa61755SAndy Ye 	TEEC_Context TeecContext;
19854aa61755SAndy Ye 	TEEC_Session TeecSession;
19864aa61755SAndy Ye 	uint32_t ErrorOrigin;
19874aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
19884aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
19894aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
19904aa61755SAndy Ye 				}
19914aa61755SAndy Ye 			     };
19924aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
19934aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
19943251364cSHisping Lin 	struct blk_desc *dev_desc;
19953251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
19966651d4c0SJason Zhu 	if (!dev_desc) {
19976651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
19986651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
19996651d4c0SJason Zhu 	}
2000f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
2001f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2002f4e1db95SHisping Lin 		return TeecResult;
20034aa61755SAndy Ye 
20044aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
2005f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2006f4e1db95SHisping Lin 		return TeecResult;
20074aa61755SAndy Ye 
20083251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
20093251364cSHisping Lin 						TEEC_NONE,
20103251364cSHisping Lin 						TEEC_NONE,
20113251364cSHisping Lin 						TEEC_NONE);
20123251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2013b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
2014b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
2015b9a7e756SHisping Lin 	else
2016b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
2017b9a7e756SHisping Lin 
20183251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
20193251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
20203251364cSHisping Lin #endif
20213251364cSHisping Lin 
20224aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
20234aa61755SAndy Ye 					&TeecSession,
20244aa61755SAndy Ye 					TeecUuid,
20254aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
20264aa61755SAndy Ye 					NULL,
20273251364cSHisping Lin 					&TeecOperation,
20284aa61755SAndy Ye 					&ErrorOrigin);
2029f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2030f4e1db95SHisping Lin 		return TeecResult;
20314aa61755SAndy Ye 
20324aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
20334aa61755SAndy Ye 
20344aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
20354aa61755SAndy Ye 	SharedMem0.flags = 0;
20364aa61755SAndy Ye 
20374aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
2038f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2039f4e1db95SHisping Lin 		goto exit;
20404aa61755SAndy Ye 
20414aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
20424aa61755SAndy Ye 
20434aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
20444aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
20454aa61755SAndy Ye 
20464aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
20474aa61755SAndy Ye 						    TEEC_NONE,
20484aa61755SAndy Ye 						    TEEC_NONE,
20494aa61755SAndy Ye 						    TEEC_NONE);
20504aa61755SAndy Ye 
20514aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
20524aa61755SAndy Ye 					146,
20534aa61755SAndy Ye 					&TeecOperation,
20544aa61755SAndy Ye 					&ErrorOrigin);
2055f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2056f4e1db95SHisping Lin 		goto exit;
2057f4e1db95SHisping Lin exit:
20584aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
20594aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
2060f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
20614aa61755SAndy Ye 
20624aa61755SAndy Ye 	return TeecResult;
20634aa61755SAndy Ye }
2064