xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision c95f09d3e8643ebcae3e4e2b9beccfa10acd1c0c)
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
38ac6d8253SHisping Lin #define STORAGE_CMD_WRITE_ESCK_KEY		27
39ac6d8253SHisping Lin #define STORAGE_CMD_ESCK_KEY_IS_WRITTEN		28
40ac6d8253SHisping Lin #define STORAGE_CMD_SET_ESCK_KEY_MASK		29
4111b25801SHisping Lin #define STORAGE_CMD_WRITE_FW_ENCRYPT_KEY	30
4211b25801SHisping Lin #define STORAGE_CMD_FW_ENCRYPT_KEY_IS_WRITTEN	31
4311b25801SHisping Lin #define STORAGE_CMD_SET_FW_ENCRYPT_KEY_MASK	32
44ae8ec5e1SHisping Lin 
452f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER	0x00000002
46437ac8e2SLin Jinhan #define CRYPTO_SERVICE_CMD_FW_KEY_PHYS_CIPHER		0x00000007
47*c95f09d3Sxb.wang #define CRYPTO_SERVICE_CMD_VERIFY_CONFIG_IP		0x00000009
48fc3694d6Sxb.wang 
49fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID	{ 0x0cacdb5d, 0x4fea, 0x466c, \
50fc3694d6Sxb.wang 		{ 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } }
51fc3694d6Sxb.wang 
b2hs_add_base(uint8_t in)52ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
53ae8ec5e1SHisping Lin {
54ae8ec5e1SHisping Lin 	if (in > 9)
55ae8ec5e1SHisping Lin 		return in + 55;
56ae8ec5e1SHisping Lin 	else
57ae8ec5e1SHisping Lin 		return in + 48;
58ae8ec5e1SHisping Lin }
59ae8ec5e1SHisping Lin 
b2hs(uint8_t * b,uint8_t * hs,uint32_t blen,uint32_t hslen)60c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
61ae8ec5e1SHisping Lin {
62ae8ec5e1SHisping Lin 	uint32_t i = 0;
63ae8ec5e1SHisping Lin 
64ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
65ae8ec5e1SHisping Lin 		return 0;
66ae8ec5e1SHisping Lin 
67ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
68ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
69ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
70ae8ec5e1SHisping Lin 	}
71ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
72ae8ec5e1SHisping Lin 
73ae8ec5e1SHisping Lin 	return blen * 2;
74ae8ec5e1SHisping Lin }
75ae8ec5e1SHisping Lin 
crypto_flush_cacheline(uint32_t addr,uint32_t size)762f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size)
772f8c34bdSxb.wang {
782f8c34bdSxb.wang 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
792f8c34bdSxb.wang 	ulong aligned_input, aligned_len;
802f8c34bdSxb.wang 
812f8c34bdSxb.wang 	if (!addr || !size)
822f8c34bdSxb.wang 		return;
832f8c34bdSxb.wang 
842f8c34bdSxb.wang 	/* Must flush dcache before crypto DMA fetch data region */
852f8c34bdSxb.wang 	aligned_input = round_down(addr, alignment);
862f8c34bdSxb.wang 	aligned_len = round_up(size + (addr - aligned_input), alignment);
872f8c34bdSxb.wang 	flush_cache(aligned_input, aligned_len);
882f8c34bdSxb.wang }
892f8c34bdSxb.wang 
crypto_invalidate_cacheline(uint32_t addr,uint32_t size)90a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
91a900eef3SHisping Lin {
92a900eef3SHisping Lin 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
93a900eef3SHisping Lin 	ulong aligned_input, aligned_len;
94a900eef3SHisping Lin 
95a900eef3SHisping Lin 	if (!addr || !size)
96a900eef3SHisping Lin 		return;
97a900eef3SHisping Lin 
98a900eef3SHisping Lin 	/* Must invalidate dcache after crypto DMA write data region */
99a900eef3SHisping Lin 	aligned_input = round_down(addr, alignment);
100a900eef3SHisping Lin 	aligned_len = round_up(size + (addr - aligned_input), alignment);
101a900eef3SHisping Lin 	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
102a900eef3SHisping Lin }
103a900eef3SHisping Lin 
trusty_base_write_security_data(char * filename,uint32_t filename_size,uint8_t * data,uint32_t data_size)104c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
105c7de5349SHisping Lin 						uint32_t filename_size,
106c7de5349SHisping Lin 						uint8_t *data,
107c7de5349SHisping Lin 						uint32_t data_size)
108ae8ec5e1SHisping Lin {
109ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
110ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
111ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
112ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
113ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
114ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
115ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
116ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1173251364cSHisping Lin 	struct blk_desc *dev_desc;
1183251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1196651d4c0SJason Zhu 	if (!dev_desc) {
1206651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1216651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1226651d4c0SJason Zhu 	}
1233251364cSHisping Lin 
124f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
125f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
126f4e1db95SHisping Lin 		return TeecResult;
127ae8ec5e1SHisping Lin 
128ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
129f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
130f4e1db95SHisping Lin 		return TeecResult;
131ae8ec5e1SHisping Lin 
1323251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1333251364cSHisping Lin 						    TEEC_NONE,
1343251364cSHisping Lin 						    TEEC_NONE,
1353251364cSHisping Lin 						    TEEC_NONE);
1363251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
137f3c7fe23SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc
138f3c7fe23SHisping Lin 		TeecOperation.params[0].value.a = 1;
139f3c7fe23SHisping Lin 	else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs
140b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
141b9a7e756SHisping Lin 	else
142b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
143f3c7fe23SHisping Lin 
1443251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1453251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1463251364cSHisping Lin #endif
1473251364cSHisping Lin 
148ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
149ae8ec5e1SHisping Lin 				&TeecSession,
150ae8ec5e1SHisping Lin 				TeecUuid,
151ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
152ae8ec5e1SHisping Lin 				NULL,
1533251364cSHisping Lin 				&TeecOperation,
154ae8ec5e1SHisping Lin 				&ErrorOrigin);
155f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
156f4e1db95SHisping Lin 		return TeecResult;
157ae8ec5e1SHisping Lin 
158ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
159ae8ec5e1SHisping Lin 
160c7de5349SHisping Lin 	SharedMem0.size = filename_size;
161ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
162ae8ec5e1SHisping Lin 
163ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
164f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
165f4e1db95SHisping Lin 		goto exit;
166ae8ec5e1SHisping Lin 
167c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
168ae8ec5e1SHisping Lin 
169ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
170ae8ec5e1SHisping Lin 
171c7de5349SHisping Lin 	SharedMem1.size = data_size;
172c7de5349SHisping Lin 	SharedMem1.flags = 0;
173c7de5349SHisping Lin 
174c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
175c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
176c7de5349SHisping Lin 		goto exit;
177c7de5349SHisping Lin 
178c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
179c7de5349SHisping Lin 
180c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
181c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
182c7de5349SHisping Lin 
183c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
184c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
185c7de5349SHisping Lin 
186c7de5349SHisping Lin 
187c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
188c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
189c7de5349SHisping Lin 						TEEC_NONE,
190c7de5349SHisping Lin 						TEEC_NONE);
191c7de5349SHisping Lin 
192c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
193c7de5349SHisping Lin 					1,
194c7de5349SHisping Lin 					&TeecOperation,
195c7de5349SHisping Lin 					&ErrorOrigin);
196c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
197c7de5349SHisping Lin 		goto exit;
198c7de5349SHisping Lin exit:
199c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
200c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
201c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
202c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
203c7de5349SHisping Lin 
204c7de5349SHisping Lin 	return TeecResult;
205c7de5349SHisping Lin }
206c7de5349SHisping Lin 
trusty_base_read_security_data(char * filename,uint32_t filename_size,uint8_t * data,uint32_t data_size)207c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
208c7de5349SHisping Lin 					       uint32_t filename_size,
209c7de5349SHisping Lin 					       uint8_t *data,
210c7de5349SHisping Lin 					       uint32_t data_size)
211c7de5349SHisping Lin {
212c7de5349SHisping Lin 	TEEC_Result TeecResult;
213c7de5349SHisping Lin 	TEEC_Context TeecContext;
214c7de5349SHisping Lin 	TEEC_Session TeecSession;
215c7de5349SHisping Lin 	uint32_t ErrorOrigin;
216c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
217c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
218c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
219c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
220c7de5349SHisping Lin 
221c7de5349SHisping Lin 	struct blk_desc *dev_desc;
222c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
223c7de5349SHisping Lin 	if (!dev_desc) {
224c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
225c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
226c7de5349SHisping Lin 	}
227c7de5349SHisping Lin 
228c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
229c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
230c7de5349SHisping Lin 		return TeecResult;
231c7de5349SHisping Lin 
232c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
233c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
234c7de5349SHisping Lin 		return TeecResult;
235c7de5349SHisping Lin 
236c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
237c7de5349SHisping Lin 						TEEC_NONE,
238c7de5349SHisping Lin 						TEEC_NONE,
239c7de5349SHisping Lin 						TEEC_NONE);
240c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
241f3c7fe23SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc
242f3c7fe23SHisping Lin 		TeecOperation.params[0].value.a = 1;
243f3c7fe23SHisping Lin 	else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs
244c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
245c7de5349SHisping Lin 	else
246c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
247f3c7fe23SHisping Lin 
248c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
249c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
250c7de5349SHisping Lin #endif
251c7de5349SHisping Lin 
252c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
253c7de5349SHisping Lin 				&TeecSession,
254c7de5349SHisping Lin 				TeecUuid,
255c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
256c7de5349SHisping Lin 				NULL,
257c7de5349SHisping Lin 				&TeecOperation,
258c7de5349SHisping Lin 				&ErrorOrigin);
259c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
260c7de5349SHisping Lin 		return TeecResult;
261c7de5349SHisping Lin 
262c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
263c7de5349SHisping Lin 
264c7de5349SHisping Lin 	SharedMem0.size = filename_size;
265c7de5349SHisping Lin 	SharedMem0.flags = 0;
266c7de5349SHisping Lin 
267c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
268c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
269c7de5349SHisping Lin 		goto exit;
270c7de5349SHisping Lin 
271c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
272c7de5349SHisping Lin 
273c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
274c7de5349SHisping Lin 
275c7de5349SHisping Lin 	SharedMem1.size = data_size;
276ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
277ae8ec5e1SHisping Lin 
278ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
279f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
280f4e1db95SHisping Lin 		goto exit;
281ae8ec5e1SHisping Lin 
282ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
283ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
284ae8ec5e1SHisping Lin 
285ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
286ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
287ae8ec5e1SHisping Lin 
288ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
289ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
290ae8ec5e1SHisping Lin 						TEEC_NONE,
291ae8ec5e1SHisping Lin 						TEEC_NONE);
292ae8ec5e1SHisping Lin 
293ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
294ae8ec5e1SHisping Lin 					0,
295ae8ec5e1SHisping Lin 					&TeecOperation,
296ae8ec5e1SHisping Lin 					&ErrorOrigin);
29746b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
298c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
299f4e1db95SHisping Lin exit:
300ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
301ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
302ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
30346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
304ae8ec5e1SHisping Lin 
305ae8ec5e1SHisping Lin 	return TeecResult;
306ae8ec5e1SHisping Lin }
307ae8ec5e1SHisping Lin 
trusty_base_end_security_data(void)308c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
309c7de5349SHisping Lin {
310c7de5349SHisping Lin 	TEEC_Result TeecResult;
311c7de5349SHisping Lin 	TEEC_Context TeecContext;
312c7de5349SHisping Lin 	TEEC_Session TeecSession;
313c7de5349SHisping Lin 	uint32_t ErrorOrigin;
314c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
315c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
316c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
317c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
318c7de5349SHisping Lin 
319c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
320c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
321c7de5349SHisping Lin 		return TeecResult;
322c7de5349SHisping Lin 
323c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
324c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
325c7de5349SHisping Lin 		return TeecResult;
326c7de5349SHisping Lin 
327c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
328c7de5349SHisping Lin 				&TeecSession,
329c7de5349SHisping Lin 				TeecUuid,
330c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
331c7de5349SHisping Lin 				NULL,
332c7de5349SHisping Lin 				NULL,
333c7de5349SHisping Lin 				&ErrorOrigin);
334c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
335c7de5349SHisping Lin 		return TeecResult;
336c7de5349SHisping Lin 
337c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
338c7de5349SHisping Lin 						    TEEC_NONE,
339c7de5349SHisping Lin 						    TEEC_NONE,
340c7de5349SHisping Lin 						    TEEC_NONE);
341c7de5349SHisping Lin 
342c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
343c7de5349SHisping Lin 					2,
344c7de5349SHisping Lin 					&TeecOperation,
345c7de5349SHisping Lin 					&ErrorOrigin);
346c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
347c7de5349SHisping Lin 		goto exit;
348c7de5349SHisping Lin exit:
349c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
350c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
351c7de5349SHisping Lin 
352c7de5349SHisping Lin 	return TeecResult;
353c7de5349SHisping Lin }
354c7de5349SHisping Lin 
trusty_notify_always_use_security(void)35534f2e8f6SHisping Lin static void trusty_notify_always_use_security(void)
35634f2e8f6SHisping Lin {
35734f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION)
35834f2e8f6SHisping Lin 	TEEC_Result TeecResult;
35934f2e8f6SHisping Lin 	TEEC_Context TeecContext;
36034f2e8f6SHisping Lin 	TEEC_Session TeecSession;
36134f2e8f6SHisping Lin 	uint32_t ErrorOrigin;
36234f2e8f6SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
36334f2e8f6SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
36434f2e8f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
36534f2e8f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
36634f2e8f6SHisping Lin 
36734f2e8f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
36834f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
36934f2e8f6SHisping Lin 		return;
37034f2e8f6SHisping Lin 
37134f2e8f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
37234f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
37334f2e8f6SHisping Lin 		return;
37434f2e8f6SHisping Lin 
37534f2e8f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
37634f2e8f6SHisping Lin 				&TeecSession,
37734f2e8f6SHisping Lin 				TeecUuid,
37834f2e8f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
37934f2e8f6SHisping Lin 				NULL,
38034f2e8f6SHisping Lin 				NULL,
38134f2e8f6SHisping Lin 				&ErrorOrigin);
38234f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
38334f2e8f6SHisping Lin 		return;
38434f2e8f6SHisping Lin 
38534f2e8f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
38634f2e8f6SHisping Lin 						    TEEC_NONE,
38734f2e8f6SHisping Lin 						    TEEC_NONE,
38834f2e8f6SHisping Lin 						    TEEC_NONE);
38934f2e8f6SHisping Lin 
39034f2e8f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
39134f2e8f6SHisping Lin 					9,
39234f2e8f6SHisping Lin 					&TeecOperation,
39334f2e8f6SHisping Lin 					&ErrorOrigin);
39434f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
39534f2e8f6SHisping Lin 		debug("notify always use security fail! please update optee!");
39634f2e8f6SHisping Lin 
39734f2e8f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
39834f2e8f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
39934f2e8f6SHisping Lin 
40034f2e8f6SHisping Lin 	return;
40134f2e8f6SHisping Lin #endif
40234f2e8f6SHisping Lin }
40334f2e8f6SHisping Lin 
trusty_read_rollback_index(uint32_t slot,uint64_t * value)404c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
405c7de5349SHisping Lin {
406c7de5349SHisping Lin 	char hs[9];
407c7de5349SHisping Lin 
408c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
409c7de5349SHisping Lin 
410c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
411c7de5349SHisping Lin }
412c7de5349SHisping Lin 
trusty_write_rollback_index(uint32_t slot,uint64_t value)413ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
414ae8ec5e1SHisping Lin {
415c7de5349SHisping Lin 	char hs[9];
4163251364cSHisping Lin 
417c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
418ae8ec5e1SHisping Lin 
419c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
420ae8ec5e1SHisping Lin }
421ae8ec5e1SHisping Lin 
trusty_read_permanent_attributes(uint8_t * attributes,uint32_t size)422ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
423ae8ec5e1SHisping Lin {
424c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
425c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
426ae8ec5e1SHisping Lin }
427ae8ec5e1SHisping Lin 
trusty_write_permanent_attributes(uint8_t * attributes,uint32_t size)428ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
429ae8ec5e1SHisping Lin {
430c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
431c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
4326651d4c0SJason Zhu }
433ae8ec5e1SHisping Lin 
trusty_read_permanent_attributes_flag(uint8_t * attributes)434c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
435c7de5349SHisping Lin {
436c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
437c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
438c7de5349SHisping Lin }
439ae8ec5e1SHisping Lin 
trusty_write_permanent_attributes_flag(uint8_t attributes)440c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
441c7de5349SHisping Lin {
442c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
443c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
444ae8ec5e1SHisping Lin }
445ae8ec5e1SHisping Lin 
trusty_read_permanent_attributes_cer(uint8_t * attributes,uint32_t size)446564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
447564654ebSJason Zhu 					      uint32_t size)
448564654ebSJason Zhu {
449c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
450c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
451564654ebSJason Zhu }
452564654ebSJason Zhu 
trusty_write_permanent_attributes_cer(uint8_t * attributes,uint32_t size)453564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
454564654ebSJason Zhu 					       uint32_t size)
455564654ebSJason Zhu {
456c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
457c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
458564654ebSJason Zhu }
459564654ebSJason Zhu 
trusty_read_lock_state(uint8_t * lock_state)460ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
461ae8ec5e1SHisping Lin {
462c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
463c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
464ae8ec5e1SHisping Lin }
465ae8ec5e1SHisping Lin 
trusty_write_lock_state(uint8_t lock_state)466ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
467ae8ec5e1SHisping Lin {
468c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
469c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
470ae8ec5e1SHisping Lin }
471ae8ec5e1SHisping Lin 
trusty_read_flash_lock_state(uint8_t * flash_lock_state)472ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
473ae8ec5e1SHisping Lin {
474c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
475c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
476c7de5349SHisping Lin }
477c7de5349SHisping Lin 
trusty_write_flash_lock_state(uint8_t flash_lock_state)478c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
479c7de5349SHisping Lin {
480c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
481c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
482c7de5349SHisping Lin }
483c7de5349SHisping Lin 
trusty_base_end_efuse_or_otp(void)484c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
485c7de5349SHisping Lin {
486ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
487ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
488ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
489ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
490c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
491c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
492c7de5349SHisping Lin 
493ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
494ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
495ae8ec5e1SHisping Lin 
496f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
497f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
498f4e1db95SHisping Lin 		return TeecResult;
499ae8ec5e1SHisping Lin 
500ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
501f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
502f4e1db95SHisping Lin 		return TeecResult;
503ae8ec5e1SHisping Lin 
504ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
505ae8ec5e1SHisping Lin 				      &TeecSession,
506ae8ec5e1SHisping Lin 				      TeecUuid,
507ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
508ae8ec5e1SHisping Lin 				      NULL,
509c7de5349SHisping Lin 				      NULL,
510ae8ec5e1SHisping Lin 				      &ErrorOrigin);
511f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
512f4e1db95SHisping Lin 		return TeecResult;
513ae8ec5e1SHisping Lin 
514c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
515c7de5349SHisping Lin 						    TEEC_NONE,
516ae8ec5e1SHisping Lin 						    TEEC_NONE,
517ae8ec5e1SHisping Lin 						    TEEC_NONE);
518ae8ec5e1SHisping Lin 
519ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
520c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
521ae8ec5e1SHisping Lin 					&TeecOperation,
522ae8ec5e1SHisping Lin 					&ErrorOrigin);
523c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
524c7de5349SHisping Lin 		goto exit;
525f4e1db95SHisping Lin exit:
526ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
52746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
528ae8ec5e1SHisping Lin 
529ae8ec5e1SHisping Lin 	return TeecResult;
530ae8ec5e1SHisping Lin }
531ae8ec5e1SHisping Lin 
trusty_base_efuse_or_otp_operation(uint32_t cmd,uint8_t is_write,uint32_t * buf,uint32_t length)532c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
533c7de5349SHisping Lin 						   uint8_t is_write,
534c7de5349SHisping Lin 						   uint32_t *buf,
535c7de5349SHisping Lin 						   uint32_t length)
536ae8ec5e1SHisping Lin {
537ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
538ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
539ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
540ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
541c7de5349SHisping Lin 
542c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
543c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
544ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
545ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
546ae8ec5e1SHisping Lin 
547f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
548f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
549f4e1db95SHisping Lin 		return TeecResult;
550ae8ec5e1SHisping Lin 
551ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
552f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
553f4e1db95SHisping Lin 		return TeecResult;
554ae8ec5e1SHisping Lin 
555ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
556ae8ec5e1SHisping Lin 				&TeecSession,
557ae8ec5e1SHisping Lin 				TeecUuid,
558ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
559ae8ec5e1SHisping Lin 				NULL,
560c7de5349SHisping Lin 				NULL,
561ae8ec5e1SHisping Lin 				&ErrorOrigin);
562f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
563f4e1db95SHisping Lin 		return TeecResult;
564ae8ec5e1SHisping Lin 
565ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
566ae8ec5e1SHisping Lin 
567c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
568ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
569ae8ec5e1SHisping Lin 
570ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
571f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
572f4e1db95SHisping Lin 		goto exit;
573ae8ec5e1SHisping Lin 
574ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
575ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
576ae8ec5e1SHisping Lin 
577c7de5349SHisping Lin 	if (is_write) {
578c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
579ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
580c7de5349SHisping Lin 							    TEEC_NONE,
581ae8ec5e1SHisping Lin 							    TEEC_NONE,
582ae8ec5e1SHisping Lin 							    TEEC_NONE);
583ae8ec5e1SHisping Lin 
584c7de5349SHisping Lin 	} else {
585c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
586c7de5349SHisping Lin 							    TEEC_NONE,
587c7de5349SHisping Lin 							    TEEC_NONE,
588c7de5349SHisping Lin 							    TEEC_NONE);
589c7de5349SHisping Lin 	}
590c7de5349SHisping Lin 
591ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
592c7de5349SHisping Lin 					cmd,
593ae8ec5e1SHisping Lin 					&TeecOperation,
594ae8ec5e1SHisping Lin 					&ErrorOrigin);
595f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
596f4e1db95SHisping Lin 		goto exit;
597c7de5349SHisping Lin 
598c7de5349SHisping Lin 	if (!is_write)
599c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
600c7de5349SHisping Lin 
601f4e1db95SHisping Lin exit:
602ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
603ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
60446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
605ae8ec5e1SHisping Lin 
606ae8ec5e1SHisping Lin 	return TeecResult;
607ae8ec5e1SHisping Lin }
608ae8ec5e1SHisping Lin 
trusty_read_attribute_hash(uint32_t * buf,uint32_t length)6096ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
6106ef445a4SHisping Lin {
611c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
612c7de5349SHisping Lin 						  false, buf, length);
6136ef445a4SHisping Lin }
6146ef445a4SHisping Lin 
trusty_write_attribute_hash(uint32_t * buf,uint32_t length)6156ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
6166ef445a4SHisping Lin {
617c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
618c7de5349SHisping Lin 						  true, buf, length);
61916539616SHisping Lin }
62016539616SHisping Lin 
trusty_notify_optee_uboot_end(void)62116539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
62216539616SHisping Lin {
62316539616SHisping Lin 	TEEC_Result res;
624c7de5349SHisping Lin 
625c7de5349SHisping Lin 	res = trusty_base_end_security_data();
626c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
62716539616SHisping Lin 	return res;
62816539616SHisping Lin }
6292cd27853SHisping Lin 
trusty_read_vbootkey_hash(uint32_t * buf,uint32_t length)6302cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
6312cd27853SHisping Lin {
632c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
633c7de5349SHisping Lin 						  false, buf, length);
6342cd27853SHisping Lin }
635c7de5349SHisping Lin 
trusty_write_vbootkey_hash(uint32_t * buf,uint32_t length)6362cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
6372cd27853SHisping Lin {
638c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
639c7de5349SHisping Lin 						  true, buf, length);
6402cd27853SHisping Lin }
641095e2a82SHisping Lin 
trusty_read_vbootkey_enable_flag(uint8_t * flag)642468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
643468df3b2SHisping Lin {
644468df3b2SHisping Lin 	uint32_t bootflag;
645c7de5349SHisping Lin 	TEEC_Result TeecResult;
646468df3b2SHisping Lin 
647f07e1686SHisping Lin 	*flag = 0;
648f07e1686SHisping Lin 
649c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
650c7de5349SHisping Lin 							false, &bootflag, 1);
651468df3b2SHisping Lin 
652468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
6530202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
6540202ee8aSHisping Lin 		if (bootflag == 0x00000001)
6550202ee8aSHisping Lin 			*flag = 1;
6560202ee8aSHisping Lin #else
657468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
658468df3b2SHisping Lin 			*flag = 1;
6590202ee8aSHisping Lin #endif
660468df3b2SHisping Lin 	}
661095e2a82SHisping Lin 	return TeecResult;
662095e2a82SHisping Lin }
6634aa61755SAndy Ye 
trusty_write_ta_encryption_key(uint32_t * buf,uint32_t length)6641ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
6651ef63c75SHisping Lin {
6661ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
6671ef63c75SHisping Lin 						  true, buf, length);
6681ef63c75SHisping Lin }
6691ef63c75SHisping Lin 
trusty_ta_encryption_key_is_written(uint8_t * value)67010f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value)
67110f41197SHisping Lin {
67210f41197SHisping Lin 	TEEC_Result TeecResult;
67310f41197SHisping Lin 	TEEC_Context TeecContext;
67410f41197SHisping Lin 	TEEC_Session TeecSession;
67510f41197SHisping Lin 	uint32_t ErrorOrigin;
67610f41197SHisping Lin 
67710f41197SHisping Lin 	*value = 0;
67810f41197SHisping Lin 
67910f41197SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
68010f41197SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
68110f41197SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
68210f41197SHisping Lin 	TEEC_Operation TeecOperation = {0};
68310f41197SHisping Lin 
68410f41197SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
68510f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
68610f41197SHisping Lin 		return TeecResult;
68710f41197SHisping Lin 
68810f41197SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
68910f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
69010f41197SHisping Lin 		return TeecResult;
69110f41197SHisping Lin 
69210f41197SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
69310f41197SHisping Lin 				&TeecSession,
69410f41197SHisping Lin 				TeecUuid,
69510f41197SHisping Lin 				TEEC_LOGIN_PUBLIC,
69610f41197SHisping Lin 				NULL,
69710f41197SHisping Lin 				NULL,
69810f41197SHisping Lin 				&ErrorOrigin);
69910f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
70010f41197SHisping Lin 		return TeecResult;
70110f41197SHisping Lin 
70210f41197SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
70310f41197SHisping Lin 						    TEEC_NONE,
70410f41197SHisping Lin 						    TEEC_NONE,
70510f41197SHisping Lin 						    TEEC_NONE);
70610f41197SHisping Lin 
70710f41197SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
70810f41197SHisping Lin 					STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN,
70910f41197SHisping Lin 					&TeecOperation,
71010f41197SHisping Lin 					&ErrorOrigin);
71110f41197SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
71210f41197SHisping Lin 		*value = TeecOperation.params[0].value.a;
71310f41197SHisping Lin 
71410f41197SHisping Lin 	TEEC_CloseSession(&TeecSession);
71510f41197SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
71610f41197SHisping Lin 
71710f41197SHisping Lin 	return TeecResult;
71810f41197SHisping Lin }
71910f41197SHisping Lin 
trusty_write_oem_encrypt_data(uint32_t * buf,uint32_t length)7201ac64e8aSHisping Lin uint32_t trusty_write_oem_encrypt_data(uint32_t *buf, uint32_t length)
7211ac64e8aSHisping Lin {
7221ac64e8aSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA,
7231ac64e8aSHisping Lin 						  true, buf, length);
7241ac64e8aSHisping Lin }
7251ac64e8aSHisping Lin 
trusty_oem_encrypt_data_is_written(uint8_t * value)726fc383442SHisping Lin uint32_t trusty_oem_encrypt_data_is_written(uint8_t *value)
727fc383442SHisping Lin {
728fc383442SHisping Lin 	TEEC_Result TeecResult;
729fc383442SHisping Lin 	TEEC_Context TeecContext;
730fc383442SHisping Lin 	TEEC_Session TeecSession;
731fc383442SHisping Lin 	uint32_t ErrorOrigin;
732fc383442SHisping Lin 
733fc383442SHisping Lin 	*value = 0;
734fc383442SHisping Lin 
735fc383442SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
736fc383442SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
737fc383442SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
738fc383442SHisping Lin 	TEEC_Operation TeecOperation = {0};
739fc383442SHisping Lin 
740fc383442SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
741fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
742fc383442SHisping Lin 		return TeecResult;
743fc383442SHisping Lin 
744fc383442SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
745fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
746fc383442SHisping Lin 		return TeecResult;
747fc383442SHisping Lin 
748fc383442SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
749fc383442SHisping Lin 				&TeecSession,
750fc383442SHisping Lin 				TeecUuid,
751fc383442SHisping Lin 				TEEC_LOGIN_PUBLIC,
752fc383442SHisping Lin 				NULL,
753fc383442SHisping Lin 				NULL,
754fc383442SHisping Lin 				&ErrorOrigin);
755fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
756fc383442SHisping Lin 		return TeecResult;
757fc383442SHisping Lin 
758fc383442SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
759fc383442SHisping Lin 						    TEEC_NONE,
760fc383442SHisping Lin 						    TEEC_NONE,
761fc383442SHisping Lin 						    TEEC_NONE);
762fc383442SHisping Lin 
763fc383442SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
764fc383442SHisping Lin 					STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN,
765fc383442SHisping Lin 					&TeecOperation,
766fc383442SHisping Lin 					&ErrorOrigin);
767fc383442SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
768fc383442SHisping Lin 		*value = TeecOperation.params[0].value.a;
769fc383442SHisping Lin 
770fc383442SHisping Lin 	TEEC_CloseSession(&TeecSession);
771fc383442SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
772fc383442SHisping Lin 
773fc383442SHisping Lin 	return TeecResult;
774fc383442SHisping Lin }
775fc383442SHisping Lin 
trusty_check_security_level_flag(uint8_t flag)776fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
777fbf29bfbSHisping Lin {
778fbf29bfbSHisping Lin 	uint32_t levelflag;
779fbf29bfbSHisping Lin 
780fbf29bfbSHisping Lin 	levelflag = flag;
781fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
782fbf29bfbSHisping Lin 						  true, &levelflag, 1);
783fbf29bfbSHisping Lin }
784fbf29bfbSHisping Lin 
trusty_write_oem_huk(uint32_t * buf,uint32_t length)785f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
786f39d4289SHisping Lin {
787f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
788f39d4289SHisping Lin 						  true, buf, length);
789f39d4289SHisping Lin }
790f39d4289SHisping Lin 
trusty_select_security_level(void)79134f2e8f6SHisping Lin static void trusty_select_security_level(void)
7927504da74SHisping Lin {
793b2858095SHisping Lin #ifdef CONFIG_OPTEE_SECURITY_LEVEL
7947504da74SHisping Lin 	TEEC_Result TeecResult;
7957504da74SHisping Lin 
7967504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
7977504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
7987504da74SHisping Lin 		run_command("download", 0);
7997504da74SHisping Lin 		return;
8007504da74SHisping Lin 	}
8017504da74SHisping Lin 
8027504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
8037504da74SHisping Lin 		debug("optee select security level success!");
804b2858095SHisping Lin 	else if (TeecResult == TEEC_ERROR_NOT_SUPPORTED)
805b2858095SHisping Lin 		debug("optee not support security level!");
8067504da74SHisping Lin 	else
8077504da74SHisping Lin 		panic("optee select security level fail!");
8087504da74SHisping Lin 
8097504da74SHisping Lin 	return;
8107504da74SHisping Lin #endif
8117504da74SHisping Lin }
8127504da74SHisping Lin 
optee_client_init(void)81351ac7005SHisping Lin void optee_client_init(void)
81451ac7005SHisping Lin {
81551ac7005SHisping Lin 	trusty_select_security_level();
81634f2e8f6SHisping Lin 	trusty_notify_always_use_security();
81751ac7005SHisping Lin }
81851ac7005SHisping Lin 
trusty_write_oem_ns_otp(uint32_t byte_off,uint8_t * byte_buf,uint32_t byte_len)819d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
820d5913350SHisping Lin {
821d5913350SHisping Lin 	TEEC_Result TeecResult;
822d5913350SHisping Lin 	TEEC_Context TeecContext;
823d5913350SHisping Lin 	TEEC_Session TeecSession;
824d5913350SHisping Lin 	uint32_t ErrorOrigin;
825d5913350SHisping Lin 
826d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
827d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
828d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
829d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
830d5913350SHisping Lin 
831d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
832d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
833d5913350SHisping Lin 		return TeecResult;
834d5913350SHisping Lin 
835d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
836d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
837d5913350SHisping Lin 		return TeecResult;
838d5913350SHisping Lin 
839d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
840d5913350SHisping Lin 				&TeecSession,
841d5913350SHisping Lin 				TeecUuid,
842d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
843d5913350SHisping Lin 				NULL,
844d5913350SHisping Lin 				NULL,
845d5913350SHisping Lin 				&ErrorOrigin);
846d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
847d5913350SHisping Lin 		return TeecResult;
848d5913350SHisping Lin 
849d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
850d5913350SHisping Lin 
851d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
852d5913350SHisping Lin 
853d5913350SHisping Lin 	SharedMem.size = byte_len;
854d5913350SHisping Lin 	SharedMem.flags = 0;
855d5913350SHisping Lin 
856d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
857d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
858d5913350SHisping Lin 		goto exit;
859d5913350SHisping Lin 
860d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
861d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
862d5913350SHisping Lin 
863d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
864d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
865d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
866d5913350SHisping Lin 						    TEEC_NONE,
867d5913350SHisping Lin 						    TEEC_NONE);
868d5913350SHisping Lin 
869d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
870d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
871d5913350SHisping Lin 					&TeecOperation,
872d5913350SHisping Lin 					&ErrorOrigin);
873d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
874d5913350SHisping Lin 		goto exit;
875d5913350SHisping Lin 
876d5913350SHisping Lin exit:
877d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
878d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
879d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
880d5913350SHisping Lin 
881d5913350SHisping Lin 	return TeecResult;
882d5913350SHisping Lin }
883d5913350SHisping Lin 
trusty_read_oem_ns_otp(uint32_t byte_off,uint8_t * byte_buf,uint32_t byte_len)884d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
885d5913350SHisping Lin {
886d5913350SHisping Lin 	TEEC_Result TeecResult;
887d5913350SHisping Lin 	TEEC_Context TeecContext;
888d5913350SHisping Lin 	TEEC_Session TeecSession;
889d5913350SHisping Lin 	uint32_t ErrorOrigin;
890d5913350SHisping Lin 
891d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
892d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
893d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
894d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
895d5913350SHisping Lin 
896d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
897d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
898d5913350SHisping Lin 		return TeecResult;
899d5913350SHisping Lin 
900d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
901d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
902d5913350SHisping Lin 		return TeecResult;
903d5913350SHisping Lin 
904d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
905d5913350SHisping Lin 				&TeecSession,
906d5913350SHisping Lin 				TeecUuid,
907d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
908d5913350SHisping Lin 				NULL,
909d5913350SHisping Lin 				NULL,
910d5913350SHisping Lin 				&ErrorOrigin);
911d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
912d5913350SHisping Lin 		return TeecResult;
913d5913350SHisping Lin 
914d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
915d5913350SHisping Lin 
916d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
917d5913350SHisping Lin 
918d5913350SHisping Lin 	SharedMem.size = byte_len;
919d5913350SHisping Lin 	SharedMem.flags = 0;
920d5913350SHisping Lin 
921d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
922d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
923d5913350SHisping Lin 		goto exit;
924d5913350SHisping Lin 
925d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
926d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
927d5913350SHisping Lin 
928d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
929d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
930d5913350SHisping Lin 						    TEEC_NONE,
931d5913350SHisping Lin 						    TEEC_NONE);
932d5913350SHisping Lin 
933d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
934d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
935d5913350SHisping Lin 					&TeecOperation,
936d5913350SHisping Lin 					&ErrorOrigin);
937d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
938d5913350SHisping Lin 		goto exit;
939d5913350SHisping Lin 
940d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
941d5913350SHisping Lin 
942d5913350SHisping Lin exit:
943d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
944d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
945d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
946d5913350SHisping Lin 
947d5913350SHisping Lin 	return TeecResult;
948d5913350SHisping Lin }
949d5913350SHisping Lin 
trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,uint8_t * byte_buf,uint32_t byte_len)95090e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,
951bb1ba6acSHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
952bb1ba6acSHisping Lin {
953bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
954bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
955bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
956bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
957bb1ba6acSHisping Lin 
958bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
959bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
960bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
961bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
962bb1ba6acSHisping Lin 
963bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
964bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
965bb1ba6acSHisping Lin 		return TeecResult;
966bb1ba6acSHisping Lin 
967bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
968bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
969bb1ba6acSHisping Lin 		return TeecResult;
970bb1ba6acSHisping Lin 
971bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
972bb1ba6acSHisping Lin 				&TeecSession,
973bb1ba6acSHisping Lin 				TeecUuid,
974bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
975bb1ba6acSHisping Lin 				NULL,
976bb1ba6acSHisping Lin 				NULL,
977bb1ba6acSHisping Lin 				&ErrorOrigin);
978bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
979bb1ba6acSHisping Lin 		return TeecResult;
980bb1ba6acSHisping Lin 
981bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
982bb1ba6acSHisping Lin 
983bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
984bb1ba6acSHisping Lin 
985bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
986bb1ba6acSHisping Lin 	SharedMem.flags = 0;
987bb1ba6acSHisping Lin 
988bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
989bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
990bb1ba6acSHisping Lin 		goto exit;
991bb1ba6acSHisping Lin 
992bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
993bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
994bb1ba6acSHisping Lin 
995bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
996bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
997bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
998bb1ba6acSHisping Lin 						    TEEC_NONE,
999bb1ba6acSHisping Lin 						    TEEC_NONE);
1000bb1ba6acSHisping Lin 
1001bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
100290e849a0Sxb.wang 					STORAGE_CMD_WRITE_OEM_OTP_KEY,
1003bb1ba6acSHisping Lin 					&TeecOperation,
1004bb1ba6acSHisping Lin 					&ErrorOrigin);
1005bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1006bb1ba6acSHisping Lin 		goto exit;
1007bb1ba6acSHisping Lin 
1008bb1ba6acSHisping Lin exit:
1009bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1010bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
1011bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1012bb1ba6acSHisping Lin 
1013bb1ba6acSHisping Lin 	return TeecResult;
1014bb1ba6acSHisping Lin }
1015bb1ba6acSHisping Lin 
trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id,uint8_t * value)10169deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value)
10179deb34f6SHisping Lin {
10189deb34f6SHisping Lin 	TEEC_Result TeecResult;
10199deb34f6SHisping Lin 	TEEC_Context TeecContext;
10209deb34f6SHisping Lin 	TEEC_Session TeecSession;
10219deb34f6SHisping Lin 	uint32_t ErrorOrigin;
10229deb34f6SHisping Lin 
10239deb34f6SHisping Lin 	*value = 0xFF;
10249deb34f6SHisping Lin 
10259deb34f6SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
10269deb34f6SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
10279deb34f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
10289deb34f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
10299deb34f6SHisping Lin 
10309deb34f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
10319deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10329deb34f6SHisping Lin 		return TeecResult;
10339deb34f6SHisping Lin 
10349deb34f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
10359deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10369deb34f6SHisping Lin 		return TeecResult;
10379deb34f6SHisping Lin 
10389deb34f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
10399deb34f6SHisping Lin 				&TeecSession,
10409deb34f6SHisping Lin 				TeecUuid,
10419deb34f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
10429deb34f6SHisping Lin 				NULL,
10439deb34f6SHisping Lin 				NULL,
10449deb34f6SHisping Lin 				&ErrorOrigin);
10459deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10469deb34f6SHisping Lin 		return TeecResult;
10479deb34f6SHisping Lin 
10489deb34f6SHisping Lin 	TeecOperation.params[0].value.a = key_id;
10499deb34f6SHisping Lin 
10509deb34f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
10519deb34f6SHisping Lin 						    TEEC_NONE,
10529deb34f6SHisping Lin 						    TEEC_NONE,
10539deb34f6SHisping Lin 						    TEEC_NONE);
10549deb34f6SHisping Lin 
10559deb34f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10569deb34f6SHisping Lin 					STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN,
10579deb34f6SHisping Lin 					&TeecOperation,
10589deb34f6SHisping Lin 					&ErrorOrigin);
10599deb34f6SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
10609deb34f6SHisping Lin 		*value = TeecOperation.params[0].value.b;
10619deb34f6SHisping Lin 
10629deb34f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
10639deb34f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10649deb34f6SHisping Lin 
10659deb34f6SHisping Lin 	return TeecResult;
10669deb34f6SHisping Lin }
10679deb34f6SHisping Lin 
trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)106890e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)
1069a405238aSHisping Lin {
1070a405238aSHisping Lin 	TEEC_Result TeecResult;
1071a405238aSHisping Lin 	TEEC_Context TeecContext;
1072a405238aSHisping Lin 	TEEC_Session TeecSession;
1073a405238aSHisping Lin 	uint32_t ErrorOrigin;
1074a405238aSHisping Lin 
1075a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1076a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1077a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1078a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
1079a405238aSHisping Lin 
1080a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1081a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1082a405238aSHisping Lin 		return TeecResult;
1083a405238aSHisping Lin 
1084a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1085a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1086a405238aSHisping Lin 		return TeecResult;
1087a405238aSHisping Lin 
1088a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1089a405238aSHisping Lin 				&TeecSession,
1090a405238aSHisping Lin 				TeecUuid,
1091a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
1092a405238aSHisping Lin 				NULL,
1093a405238aSHisping Lin 				NULL,
1094a405238aSHisping Lin 				&ErrorOrigin);
1095a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1096a405238aSHisping Lin 		return TeecResult;
1097a405238aSHisping Lin 
1098a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
1099a405238aSHisping Lin 
1100a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1101a405238aSHisping Lin 						    TEEC_NONE,
1102a405238aSHisping Lin 						    TEEC_NONE,
1103a405238aSHisping Lin 						    TEEC_NONE);
1104a405238aSHisping Lin 
1105a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1106a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
1107a405238aSHisping Lin 					&TeecOperation,
1108a405238aSHisping Lin 					&ErrorOrigin);
1109a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1110a405238aSHisping Lin 		goto exit;
1111a405238aSHisping Lin 
1112a405238aSHisping Lin exit:
1113a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
1114a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1115a405238aSHisping Lin 
1116a405238aSHisping Lin 	return TeecResult;
1117a405238aSHisping Lin }
1118a405238aSHisping Lin 
trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id,rk_cipher_config * config,uint32_t src_phys_addr,uint32_t dst_phys_addr,uint32_t len)11192f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config,
11202f8c34bdSxb.wang 				   uint32_t src_phys_addr, uint32_t dst_phys_addr,
11212f8c34bdSxb.wang 				   uint32_t len)
1122fc3694d6Sxb.wang {
1123fc3694d6Sxb.wang 	TEEC_Result TeecResult;
1124fc3694d6Sxb.wang 	TEEC_Context TeecContext;
1125fc3694d6Sxb.wang 	TEEC_Session TeecSession;
1126fc3694d6Sxb.wang 	TEEC_Operation TeecOperation = {0};
1127fc3694d6Sxb.wang 	uint32_t ErrorOrigin;
1128fc3694d6Sxb.wang 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
1129fc3694d6Sxb.wang 	TEEC_SharedMemory SharedMem_config = {0};
1130fc3694d6Sxb.wang 
11312f8c34bdSxb.wang 	if (key_id != RK_OEM_OTP_KEY0 &&
11322f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY1 &&
11332f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY2 &&
11342f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY3 &&
11352f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY_FW)
1136fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1137fc3694d6Sxb.wang 
11382f8c34bdSxb.wang 	if (!config)
1139fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1140fc3694d6Sxb.wang 
1141fc3694d6Sxb.wang 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
1142fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1143fc3694d6Sxb.wang 
1144fc3694d6Sxb.wang 	if (config->mode >= RK_CIPHER_MODE_XTS)
1145fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1146fc3694d6Sxb.wang 
1147fc3694d6Sxb.wang 	if (config->operation != RK_MODE_ENCRYPT &&
1148fc3694d6Sxb.wang 	    config->operation != RK_MODE_DECRYPT)
1149fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1150fc3694d6Sxb.wang 
1151fc3694d6Sxb.wang 	if (config->key_len != 16 &&
1152fc3694d6Sxb.wang 	    config->key_len != 24 &&
1153fc3694d6Sxb.wang 	    config->key_len != 32)
1154fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1155fc3694d6Sxb.wang 
11562f8c34bdSxb.wang 	if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16)
11572f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11582f8c34bdSxb.wang 
11592f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126)
11602f8c34bdSxb.wang 	if (config->key_len == 24)
11612f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11622f8c34bdSxb.wang #endif
11632f8c34bdSxb.wang 
1164fc3694d6Sxb.wang 	if (len % AES_BLOCK_SIZE ||
1165fc3694d6Sxb.wang 	    len == 0)
1166fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1167fc3694d6Sxb.wang 
11682f8c34bdSxb.wang 	if (!src_phys_addr || !dst_phys_addr)
11692f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11702f8c34bdSxb.wang 
1171fc3694d6Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
1172fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1173fc3694d6Sxb.wang 		return TeecResult;
1174fc3694d6Sxb.wang 
1175fc3694d6Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1176fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1177fc3694d6Sxb.wang 		return TeecResult;
1178fc3694d6Sxb.wang 
1179fc3694d6Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
1180fc3694d6Sxb.wang 				      &TeecSession,
1181fc3694d6Sxb.wang 				      &uuid,
1182fc3694d6Sxb.wang 				      TEEC_LOGIN_PUBLIC,
1183fc3694d6Sxb.wang 				      NULL,
1184fc3694d6Sxb.wang 				      NULL,
1185fc3694d6Sxb.wang 				      &ErrorOrigin);
1186fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1187fc3694d6Sxb.wang 		goto exit;
1188fc3694d6Sxb.wang 
1189fc3694d6Sxb.wang 	SharedMem_config.size = sizeof(rk_cipher_config);
1190fc3694d6Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
1191fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1192fc3694d6Sxb.wang 		goto exit;
1193fc3694d6Sxb.wang 
1194fc3694d6Sxb.wang 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
1195fc3694d6Sxb.wang 	TeecOperation.params[0].value.a       = key_id;
1196fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
1197fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
11982f8c34bdSxb.wang 	TeecOperation.params[2].value.a       = src_phys_addr;
11992f8c34bdSxb.wang 	TeecOperation.params[2].value.b       = len;
12002f8c34bdSxb.wang 	TeecOperation.params[3].value.a       = dst_phys_addr;
1201fc3694d6Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1202fc3694d6Sxb.wang 						    TEEC_MEMREF_TEMP_INPUT,
12032f8c34bdSxb.wang 						    TEEC_VALUE_INPUT,
12042f8c34bdSxb.wang 						    TEEC_VALUE_INPUT);
12052f8c34bdSxb.wang 
12062f8c34bdSxb.wang 	crypto_flush_cacheline(src_phys_addr, len);
12072f8c34bdSxb.wang 	crypto_flush_cacheline(dst_phys_addr, len);
12082f8c34bdSxb.wang 
1209fc3694d6Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12102f8c34bdSxb.wang 					CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER,
1211fc3694d6Sxb.wang 					&TeecOperation,
1212fc3694d6Sxb.wang 					&ErrorOrigin);
1213fc3694d6Sxb.wang 
1214a900eef3SHisping Lin 	crypto_invalidate_cacheline(dst_phys_addr, len);
1215a900eef3SHisping Lin 
1216fc3694d6Sxb.wang exit:
1217fc3694d6Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem_config);
1218fc3694d6Sxb.wang 	TEEC_CloseSession(&TeecSession);
1219fc3694d6Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
1220fc3694d6Sxb.wang 	return TeecResult;
1221fc3694d6Sxb.wang }
1222fc3694d6Sxb.wang 
trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id,uint8_t * byte_buf,uint32_t byte_len)1223a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id,
1224a828eba9SHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
1225a828eba9SHisping Lin {
1226a828eba9SHisping Lin 	TEEC_Result TeecResult;
1227a828eba9SHisping Lin 	TEEC_Context TeecContext;
1228a828eba9SHisping Lin 	TEEC_Session TeecSession;
1229a828eba9SHisping Lin 	uint32_t ErrorOrigin;
1230a828eba9SHisping Lin 
1231a828eba9SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1232a828eba9SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1233a828eba9SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1234a828eba9SHisping Lin 	TEEC_Operation TeecOperation = {0};
1235a828eba9SHisping Lin 
1236a828eba9SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1237a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1238a828eba9SHisping Lin 		return TeecResult;
1239a828eba9SHisping Lin 
1240a828eba9SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1241a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1242a828eba9SHisping Lin 		return TeecResult;
1243a828eba9SHisping Lin 
1244a828eba9SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1245a828eba9SHisping Lin 				&TeecSession,
1246a828eba9SHisping Lin 				TeecUuid,
1247a828eba9SHisping Lin 				TEEC_LOGIN_PUBLIC,
1248a828eba9SHisping Lin 				NULL,
1249a828eba9SHisping Lin 				NULL,
1250a828eba9SHisping Lin 				&ErrorOrigin);
1251a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1252a828eba9SHisping Lin 		return TeecResult;
1253a828eba9SHisping Lin 
1254a828eba9SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1255a828eba9SHisping Lin 
1256a828eba9SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1257a828eba9SHisping Lin 
1258a828eba9SHisping Lin 	SharedMem.size = byte_len;
1259a828eba9SHisping Lin 	SharedMem.flags = 0;
1260a828eba9SHisping Lin 
1261a828eba9SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1262a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1263a828eba9SHisping Lin 		goto exit;
1264a828eba9SHisping Lin 
1265a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1266a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1267a828eba9SHisping Lin 
1268a828eba9SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1269a828eba9SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1270a828eba9SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1271a828eba9SHisping Lin 						    TEEC_NONE,
1272a828eba9SHisping Lin 						    TEEC_NONE);
1273a828eba9SHisping Lin 
1274a828eba9SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1275a828eba9SHisping Lin 					STORAGE_CMD_WRITE_OEM_HDCP_KEY,
1276a828eba9SHisping Lin 					&TeecOperation,
1277a828eba9SHisping Lin 					&ErrorOrigin);
1278a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1279a828eba9SHisping Lin 		goto exit;
1280a828eba9SHisping Lin 
1281a828eba9SHisping Lin exit:
1282a828eba9SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1283a828eba9SHisping Lin 	TEEC_CloseSession(&TeecSession);
1284a828eba9SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1285a828eba9SHisping Lin 
1286a828eba9SHisping Lin 	return TeecResult;
1287a828eba9SHisping Lin }
1288a828eba9SHisping Lin 
trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id,uint8_t * value)1289e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value)
1290e8bc2655SHisping Lin {
1291e8bc2655SHisping Lin 	TEEC_Result TeecResult;
1292e8bc2655SHisping Lin 	TEEC_Context TeecContext;
1293e8bc2655SHisping Lin 	TEEC_Session TeecSession;
1294e8bc2655SHisping Lin 	uint32_t ErrorOrigin;
1295e8bc2655SHisping Lin 
1296e8bc2655SHisping Lin 	*value = 0xFF;
1297e8bc2655SHisping Lin 
1298e8bc2655SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1299e8bc2655SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1300e8bc2655SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1301e8bc2655SHisping Lin 	TEEC_Operation TeecOperation = {0};
1302e8bc2655SHisping Lin 
1303e8bc2655SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1304e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1305e8bc2655SHisping Lin 		return TeecResult;
1306e8bc2655SHisping Lin 
1307e8bc2655SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1308e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1309e8bc2655SHisping Lin 		return TeecResult;
1310e8bc2655SHisping Lin 
1311e8bc2655SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1312e8bc2655SHisping Lin 				&TeecSession,
1313e8bc2655SHisping Lin 				TeecUuid,
1314e8bc2655SHisping Lin 				TEEC_LOGIN_PUBLIC,
1315e8bc2655SHisping Lin 				NULL,
1316e8bc2655SHisping Lin 				NULL,
1317e8bc2655SHisping Lin 				&ErrorOrigin);
1318e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1319e8bc2655SHisping Lin 		return TeecResult;
1320e8bc2655SHisping Lin 
1321e8bc2655SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1322e8bc2655SHisping Lin 
1323e8bc2655SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1324e8bc2655SHisping Lin 						    TEEC_NONE,
1325e8bc2655SHisping Lin 						    TEEC_NONE,
1326e8bc2655SHisping Lin 						    TEEC_NONE);
1327e8bc2655SHisping Lin 
1328e8bc2655SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1329e8bc2655SHisping Lin 					STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN,
1330e8bc2655SHisping Lin 					&TeecOperation,
1331e8bc2655SHisping Lin 					&ErrorOrigin);
1332e8bc2655SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1333e8bc2655SHisping Lin 		*value = TeecOperation.params[0].value.b;
1334e8bc2655SHisping Lin 
1335e8bc2655SHisping Lin 	TEEC_CloseSession(&TeecSession);
1336e8bc2655SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1337e8bc2655SHisping Lin 
1338e8bc2655SHisping Lin 	return TeecResult;
1339e8bc2655SHisping Lin }
1340e8bc2655SHisping Lin 
trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id)1341bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id)
1342bfd9cea4SHisping Lin {
1343bfd9cea4SHisping Lin 	TEEC_Result TeecResult;
1344bfd9cea4SHisping Lin 	TEEC_Context TeecContext;
1345bfd9cea4SHisping Lin 	TEEC_Session TeecSession;
1346bfd9cea4SHisping Lin 	uint32_t ErrorOrigin;
1347bfd9cea4SHisping Lin 
1348bfd9cea4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1349bfd9cea4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1350bfd9cea4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1351bfd9cea4SHisping Lin 	TEEC_Operation TeecOperation = {0};
1352bfd9cea4SHisping Lin 
1353bfd9cea4SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1354bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1355bfd9cea4SHisping Lin 		return TeecResult;
1356bfd9cea4SHisping Lin 
1357bfd9cea4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1358bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1359bfd9cea4SHisping Lin 		return TeecResult;
1360bfd9cea4SHisping Lin 
1361bfd9cea4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1362bfd9cea4SHisping Lin 				&TeecSession,
1363bfd9cea4SHisping Lin 				TeecUuid,
1364bfd9cea4SHisping Lin 				TEEC_LOGIN_PUBLIC,
1365bfd9cea4SHisping Lin 				NULL,
1366bfd9cea4SHisping Lin 				NULL,
1367bfd9cea4SHisping Lin 				&ErrorOrigin);
1368bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1369bfd9cea4SHisping Lin 		return TeecResult;
1370bfd9cea4SHisping Lin 
1371bfd9cea4SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1372bfd9cea4SHisping Lin 
1373bfd9cea4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1374bfd9cea4SHisping Lin 						    TEEC_NONE,
1375bfd9cea4SHisping Lin 						    TEEC_NONE,
1376bfd9cea4SHisping Lin 						    TEEC_NONE);
1377bfd9cea4SHisping Lin 
1378bfd9cea4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1379bfd9cea4SHisping Lin 					STORAGE_CMD_SET_OEM_HDCP_KEY_MASK,
1380bfd9cea4SHisping Lin 					&TeecOperation,
1381bfd9cea4SHisping Lin 					&ErrorOrigin);
1382bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1383bfd9cea4SHisping Lin 		goto exit;
1384bfd9cea4SHisping Lin 
1385bfd9cea4SHisping Lin exit:
1386bfd9cea4SHisping Lin 	TEEC_CloseSession(&TeecSession);
1387bfd9cea4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1388bfd9cea4SHisping Lin 
1389bfd9cea4SHisping Lin 	return TeecResult;
1390bfd9cea4SHisping Lin }
1391bfd9cea4SHisping Lin 
trusty_write_esck_key(enum RK_ESCK_KEYID key_id,uint8_t * byte_buf,uint32_t byte_len)1392ac6d8253SHisping Lin uint32_t trusty_write_esck_key(enum RK_ESCK_KEYID key_id,
1393ac6d8253SHisping Lin 			       uint8_t *byte_buf, uint32_t byte_len)
1394ac6d8253SHisping Lin {
1395ac6d8253SHisping Lin 	TEEC_Result TeecResult;
1396ac6d8253SHisping Lin 	TEEC_Context TeecContext;
1397ac6d8253SHisping Lin 	TEEC_Session TeecSession;
1398ac6d8253SHisping Lin 	uint32_t ErrorOrigin;
1399ac6d8253SHisping Lin 
1400ac6d8253SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1401ac6d8253SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1402ac6d8253SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1403ac6d8253SHisping Lin 	TEEC_Operation TeecOperation = {0};
1404ac6d8253SHisping Lin 
1405ac6d8253SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1406ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1407ac6d8253SHisping Lin 		return TeecResult;
1408ac6d8253SHisping Lin 
1409ac6d8253SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1410ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1411ac6d8253SHisping Lin 		return TeecResult;
1412ac6d8253SHisping Lin 
1413ac6d8253SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1414ac6d8253SHisping Lin 				&TeecSession,
1415ac6d8253SHisping Lin 				TeecUuid,
1416ac6d8253SHisping Lin 				TEEC_LOGIN_PUBLIC,
1417ac6d8253SHisping Lin 				NULL,
1418ac6d8253SHisping Lin 				NULL,
1419ac6d8253SHisping Lin 				&ErrorOrigin);
1420ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1421ac6d8253SHisping Lin 		return TeecResult;
1422ac6d8253SHisping Lin 
1423ac6d8253SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1424ac6d8253SHisping Lin 
1425ac6d8253SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1426ac6d8253SHisping Lin 
1427ac6d8253SHisping Lin 	SharedMem.size = byte_len;
1428ac6d8253SHisping Lin 	SharedMem.flags = 0;
1429ac6d8253SHisping Lin 
1430ac6d8253SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1431ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1432ac6d8253SHisping Lin 		goto exit;
1433ac6d8253SHisping Lin 
1434ac6d8253SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1435ac6d8253SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1436ac6d8253SHisping Lin 
1437ac6d8253SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1438ac6d8253SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1439ac6d8253SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1440ac6d8253SHisping Lin 						    TEEC_NONE,
1441ac6d8253SHisping Lin 						    TEEC_NONE);
1442ac6d8253SHisping Lin 
1443ac6d8253SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1444ac6d8253SHisping Lin 					STORAGE_CMD_WRITE_ESCK_KEY,
1445ac6d8253SHisping Lin 					&TeecOperation,
1446ac6d8253SHisping Lin 					&ErrorOrigin);
1447ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1448ac6d8253SHisping Lin 		goto exit;
1449ac6d8253SHisping Lin 
1450ac6d8253SHisping Lin exit:
1451ac6d8253SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1452ac6d8253SHisping Lin 	TEEC_CloseSession(&TeecSession);
1453ac6d8253SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1454ac6d8253SHisping Lin 
1455ac6d8253SHisping Lin 	return TeecResult;
1456ac6d8253SHisping Lin }
1457ac6d8253SHisping Lin 
trusty_esck_key_is_written(enum RK_ESCK_KEYID key_id,uint8_t * value)1458ac6d8253SHisping Lin uint32_t trusty_esck_key_is_written(enum RK_ESCK_KEYID key_id, uint8_t *value)
1459ac6d8253SHisping Lin {
1460ac6d8253SHisping Lin 	TEEC_Result TeecResult;
1461ac6d8253SHisping Lin 	TEEC_Context TeecContext;
1462ac6d8253SHisping Lin 	TEEC_Session TeecSession;
1463ac6d8253SHisping Lin 	uint32_t ErrorOrigin;
1464ac6d8253SHisping Lin 
1465ac6d8253SHisping Lin 	*value = 0xFF;
1466ac6d8253SHisping Lin 
1467ac6d8253SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1468ac6d8253SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1469ac6d8253SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1470ac6d8253SHisping Lin 	TEEC_Operation TeecOperation = {0};
1471ac6d8253SHisping Lin 
1472ac6d8253SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1473ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1474ac6d8253SHisping Lin 		return TeecResult;
1475ac6d8253SHisping Lin 
1476ac6d8253SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1477ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1478ac6d8253SHisping Lin 		return TeecResult;
1479ac6d8253SHisping Lin 
1480ac6d8253SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1481ac6d8253SHisping Lin 				&TeecSession,
1482ac6d8253SHisping Lin 				TeecUuid,
1483ac6d8253SHisping Lin 				TEEC_LOGIN_PUBLIC,
1484ac6d8253SHisping Lin 				NULL,
1485ac6d8253SHisping Lin 				NULL,
1486ac6d8253SHisping Lin 				&ErrorOrigin);
1487ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1488ac6d8253SHisping Lin 		return TeecResult;
1489ac6d8253SHisping Lin 
1490ac6d8253SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1491ac6d8253SHisping Lin 
1492ac6d8253SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1493ac6d8253SHisping Lin 						    TEEC_NONE,
1494ac6d8253SHisping Lin 						    TEEC_NONE,
1495ac6d8253SHisping Lin 						    TEEC_NONE);
1496ac6d8253SHisping Lin 
1497ac6d8253SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1498ac6d8253SHisping Lin 					STORAGE_CMD_ESCK_KEY_IS_WRITTEN,
1499ac6d8253SHisping Lin 					&TeecOperation,
1500ac6d8253SHisping Lin 					&ErrorOrigin);
1501ac6d8253SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1502ac6d8253SHisping Lin 		*value = TeecOperation.params[0].value.b;
1503ac6d8253SHisping Lin 
1504ac6d8253SHisping Lin 	TEEC_CloseSession(&TeecSession);
1505ac6d8253SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1506ac6d8253SHisping Lin 
1507ac6d8253SHisping Lin 	return TeecResult;
1508ac6d8253SHisping Lin }
1509ac6d8253SHisping Lin 
trusty_set_esck_key_mask(enum RK_ESCK_KEYID key_id)1510ac6d8253SHisping Lin uint32_t trusty_set_esck_key_mask(enum RK_ESCK_KEYID key_id)
1511ac6d8253SHisping Lin {
1512ac6d8253SHisping Lin 	TEEC_Result TeecResult;
1513ac6d8253SHisping Lin 	TEEC_Context TeecContext;
1514ac6d8253SHisping Lin 	TEEC_Session TeecSession;
1515ac6d8253SHisping Lin 	uint32_t ErrorOrigin;
1516ac6d8253SHisping Lin 
1517ac6d8253SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1518ac6d8253SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1519ac6d8253SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1520ac6d8253SHisping Lin 	TEEC_Operation TeecOperation = {0};
1521ac6d8253SHisping Lin 
1522ac6d8253SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1523ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1524ac6d8253SHisping Lin 		return TeecResult;
1525ac6d8253SHisping Lin 
1526ac6d8253SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1527ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1528ac6d8253SHisping Lin 		return TeecResult;
1529ac6d8253SHisping Lin 
1530ac6d8253SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1531ac6d8253SHisping Lin 				&TeecSession,
1532ac6d8253SHisping Lin 				TeecUuid,
1533ac6d8253SHisping Lin 				TEEC_LOGIN_PUBLIC,
1534ac6d8253SHisping Lin 				NULL,
1535ac6d8253SHisping Lin 				NULL,
1536ac6d8253SHisping Lin 				&ErrorOrigin);
1537ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1538ac6d8253SHisping Lin 		return TeecResult;
1539ac6d8253SHisping Lin 
1540ac6d8253SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1541ac6d8253SHisping Lin 
1542ac6d8253SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1543ac6d8253SHisping Lin 						    TEEC_NONE,
1544ac6d8253SHisping Lin 						    TEEC_NONE,
1545ac6d8253SHisping Lin 						    TEEC_NONE);
1546ac6d8253SHisping Lin 
1547ac6d8253SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1548ac6d8253SHisping Lin 					STORAGE_CMD_SET_ESCK_KEY_MASK,
1549ac6d8253SHisping Lin 					&TeecOperation,
1550ac6d8253SHisping Lin 					&ErrorOrigin);
1551ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1552ac6d8253SHisping Lin 		goto exit;
1553ac6d8253SHisping Lin 
1554ac6d8253SHisping Lin exit:
1555ac6d8253SHisping Lin 	TEEC_CloseSession(&TeecSession);
1556ac6d8253SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1557ac6d8253SHisping Lin 
1558ac6d8253SHisping Lin 	return TeecResult;
1559ac6d8253SHisping Lin }
1560ac6d8253SHisping Lin 
trusty_write_fw_encrypt_key(enum RK_FW_KEYID key_id,uint8_t * byte_buf,uint32_t byte_len)156111b25801SHisping Lin uint32_t trusty_write_fw_encrypt_key(enum RK_FW_KEYID key_id,
156211b25801SHisping Lin 				     uint8_t *byte_buf, uint32_t byte_len)
156311b25801SHisping Lin {
156411b25801SHisping Lin 	TEEC_Result TeecResult;
156511b25801SHisping Lin 	TEEC_Context TeecContext;
156611b25801SHisping Lin 	TEEC_Session TeecSession;
156711b25801SHisping Lin 	uint32_t ErrorOrigin;
156811b25801SHisping Lin 
156911b25801SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
157011b25801SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
157111b25801SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
157211b25801SHisping Lin 	TEEC_Operation TeecOperation = {0};
157311b25801SHisping Lin 
157411b25801SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
157511b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
157611b25801SHisping Lin 		return TeecResult;
157711b25801SHisping Lin 
157811b25801SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
157911b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
158011b25801SHisping Lin 		return TeecResult;
158111b25801SHisping Lin 
158211b25801SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
158311b25801SHisping Lin 				&TeecSession,
158411b25801SHisping Lin 				TeecUuid,
158511b25801SHisping Lin 				TEEC_LOGIN_PUBLIC,
158611b25801SHisping Lin 				NULL,
158711b25801SHisping Lin 				NULL,
158811b25801SHisping Lin 				&ErrorOrigin);
158911b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
159011b25801SHisping Lin 		return TeecResult;
159111b25801SHisping Lin 
159211b25801SHisping Lin 	TeecOperation.params[0].value.a = key_id;
159311b25801SHisping Lin 
159411b25801SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
159511b25801SHisping Lin 
159611b25801SHisping Lin 	SharedMem.size = byte_len;
159711b25801SHisping Lin 	SharedMem.flags = 0;
159811b25801SHisping Lin 
159911b25801SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
160011b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
160111b25801SHisping Lin 		goto exit;
160211b25801SHisping Lin 
160311b25801SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
160411b25801SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
160511b25801SHisping Lin 
160611b25801SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
160711b25801SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
160811b25801SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
160911b25801SHisping Lin 						    TEEC_NONE,
161011b25801SHisping Lin 						    TEEC_NONE);
161111b25801SHisping Lin 
161211b25801SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
161311b25801SHisping Lin 					STORAGE_CMD_WRITE_FW_ENCRYPT_KEY,
161411b25801SHisping Lin 					&TeecOperation,
161511b25801SHisping Lin 					&ErrorOrigin);
161611b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
161711b25801SHisping Lin 		goto exit;
161811b25801SHisping Lin 
161911b25801SHisping Lin exit:
162011b25801SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
162111b25801SHisping Lin 	TEEC_CloseSession(&TeecSession);
162211b25801SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
162311b25801SHisping Lin 
162411b25801SHisping Lin 	return TeecResult;
162511b25801SHisping Lin }
162611b25801SHisping Lin 
trusty_fw_encrypt_key_is_written(enum RK_FW_KEYID key_id,uint8_t * value)162711b25801SHisping Lin uint32_t trusty_fw_encrypt_key_is_written(enum RK_FW_KEYID key_id, uint8_t *value)
162811b25801SHisping Lin {
162911b25801SHisping Lin 	TEEC_Result TeecResult;
163011b25801SHisping Lin 	TEEC_Context TeecContext;
163111b25801SHisping Lin 	TEEC_Session TeecSession;
163211b25801SHisping Lin 	uint32_t ErrorOrigin;
163311b25801SHisping Lin 
163411b25801SHisping Lin 	*value = 0xFF;
163511b25801SHisping Lin 
163611b25801SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
163711b25801SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
163811b25801SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
163911b25801SHisping Lin 	TEEC_Operation TeecOperation = {0};
164011b25801SHisping Lin 
164111b25801SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
164211b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
164311b25801SHisping Lin 		return TeecResult;
164411b25801SHisping Lin 
164511b25801SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
164611b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
164711b25801SHisping Lin 		return TeecResult;
164811b25801SHisping Lin 
164911b25801SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
165011b25801SHisping Lin 				&TeecSession,
165111b25801SHisping Lin 				TeecUuid,
165211b25801SHisping Lin 				TEEC_LOGIN_PUBLIC,
165311b25801SHisping Lin 				NULL,
165411b25801SHisping Lin 				NULL,
165511b25801SHisping Lin 				&ErrorOrigin);
165611b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
165711b25801SHisping Lin 		return TeecResult;
165811b25801SHisping Lin 
165911b25801SHisping Lin 	TeecOperation.params[0].value.a = key_id;
166011b25801SHisping Lin 
166111b25801SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
166211b25801SHisping Lin 						    TEEC_NONE,
166311b25801SHisping Lin 						    TEEC_NONE,
166411b25801SHisping Lin 						    TEEC_NONE);
166511b25801SHisping Lin 
166611b25801SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
166711b25801SHisping Lin 					STORAGE_CMD_FW_ENCRYPT_KEY_IS_WRITTEN,
166811b25801SHisping Lin 					&TeecOperation,
166911b25801SHisping Lin 					&ErrorOrigin);
167011b25801SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
167111b25801SHisping Lin 		*value = TeecOperation.params[0].value.b;
167211b25801SHisping Lin 
167311b25801SHisping Lin 	TEEC_CloseSession(&TeecSession);
167411b25801SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
167511b25801SHisping Lin 
167611b25801SHisping Lin 	return TeecResult;
167711b25801SHisping Lin }
167811b25801SHisping Lin 
trusty_set_fw_encrypt_key_mask(enum RK_FW_KEYID key_id)167911b25801SHisping Lin uint32_t trusty_set_fw_encrypt_key_mask(enum RK_FW_KEYID key_id)
168011b25801SHisping Lin {
168111b25801SHisping Lin 	TEEC_Result TeecResult;
168211b25801SHisping Lin 	TEEC_Context TeecContext;
168311b25801SHisping Lin 	TEEC_Session TeecSession;
168411b25801SHisping Lin 	uint32_t ErrorOrigin;
168511b25801SHisping Lin 
168611b25801SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
168711b25801SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
168811b25801SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
168911b25801SHisping Lin 	TEEC_Operation TeecOperation = {0};
169011b25801SHisping Lin 
169111b25801SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
169211b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
169311b25801SHisping Lin 		return TeecResult;
169411b25801SHisping Lin 
169511b25801SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
169611b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
169711b25801SHisping Lin 		return TeecResult;
169811b25801SHisping Lin 
169911b25801SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
170011b25801SHisping Lin 				&TeecSession,
170111b25801SHisping Lin 				TeecUuid,
170211b25801SHisping Lin 				TEEC_LOGIN_PUBLIC,
170311b25801SHisping Lin 				NULL,
170411b25801SHisping Lin 				NULL,
170511b25801SHisping Lin 				&ErrorOrigin);
170611b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
170711b25801SHisping Lin 		return TeecResult;
170811b25801SHisping Lin 
170911b25801SHisping Lin 	TeecOperation.params[0].value.a = key_id;
171011b25801SHisping Lin 
171111b25801SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
171211b25801SHisping Lin 						    TEEC_NONE,
171311b25801SHisping Lin 						    TEEC_NONE,
171411b25801SHisping Lin 						    TEEC_NONE);
171511b25801SHisping Lin 
171611b25801SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
171711b25801SHisping Lin 					STORAGE_CMD_SET_FW_ENCRYPT_KEY_MASK,
171811b25801SHisping Lin 					&TeecOperation,
171911b25801SHisping Lin 					&ErrorOrigin);
172011b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
172111b25801SHisping Lin 		goto exit;
172211b25801SHisping Lin 
172311b25801SHisping Lin exit:
172411b25801SHisping Lin 	TEEC_CloseSession(&TeecSession);
172511b25801SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
172611b25801SHisping Lin 
172711b25801SHisping Lin 	return TeecResult;
172811b25801SHisping Lin }
trusty_oem_user_ta_transfer(void)17294d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void)
17304d4c5043SHisping Lin {
17314d4c5043SHisping Lin 	TEEC_Result TeecResult;
17324d4c5043SHisping Lin 	TEEC_Context TeecContext;
17334d4c5043SHisping Lin 	TEEC_Session TeecSession;
17344d4c5043SHisping Lin 	uint32_t ErrorOrigin;
17354d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
17364d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
17374d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
17384d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
17394d4c5043SHisping Lin 	const uint8_t transfer_inout[] = "Transfer data test.";
17404d4c5043SHisping Lin 
17414d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
17424d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17434d4c5043SHisping Lin 		return TeecResult;
17444d4c5043SHisping Lin 
17454d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
17464d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17474d4c5043SHisping Lin 		return TeecResult;
17484d4c5043SHisping Lin 
17494d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
17504d4c5043SHisping Lin 						TEEC_NONE,
17514d4c5043SHisping Lin 						TEEC_NONE,
17524d4c5043SHisping Lin 						TEEC_NONE);
17534d4c5043SHisping Lin 
17544d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
17554d4c5043SHisping Lin 				&TeecSession,
17564d4c5043SHisping Lin 				TeecUuid,
17574d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
17584d4c5043SHisping Lin 				NULL,
17594d4c5043SHisping Lin 				&TeecOperation,
17604d4c5043SHisping Lin 				&ErrorOrigin);
17614d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17624d4c5043SHisping Lin 		return TeecResult;
17634d4c5043SHisping Lin 
17644d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
17654d4c5043SHisping Lin 
17664d4c5043SHisping Lin 	SharedMem0.size = sizeof(transfer_inout);
17674d4c5043SHisping Lin 	SharedMem0.flags = 0;
17684d4c5043SHisping Lin 
17694d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17704d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17714d4c5043SHisping Lin 		goto exit;
17724d4c5043SHisping Lin 
17734d4c5043SHisping Lin 	memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size);
17744d4c5043SHisping Lin 
17754d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
17764d4c5043SHisping Lin 
17774d4c5043SHisping Lin 	SharedMem1.size = sizeof(transfer_inout);
17784d4c5043SHisping Lin 	SharedMem1.flags = 0;
17794d4c5043SHisping Lin 
17804d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
17814d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17824d4c5043SHisping Lin 		goto exit;
17834d4c5043SHisping Lin 
17844d4c5043SHisping Lin 	TeecOperation.params[0].value.a = 66;
17854d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer;
17864d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem0.size;
17874d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer;
17884d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.size = SharedMem1.size;
17894d4c5043SHisping Lin 
17904d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
17914d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_INPUT,
17924d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_OUTPUT,
17934d4c5043SHisping Lin 						TEEC_NONE);
17944d4c5043SHisping Lin 
17954d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17964d4c5043SHisping Lin 					102,
17974d4c5043SHisping Lin 					&TeecOperation,
17984d4c5043SHisping Lin 					&ErrorOrigin);
17994d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
18004d4c5043SHisping Lin 		goto exit;
18014d4c5043SHisping Lin 
18024d4c5043SHisping Lin 	//Check the result
18034d4c5043SHisping Lin 	if (TeecOperation.params[0].value.a == 66 + 1 &&
18044d4c5043SHisping Lin 	    TeecOperation.params[0].value.b == TeecOperation.params[0].value.a)
18054d4c5043SHisping Lin 		printf("test value : Pass!\n");
18064d4c5043SHisping Lin 	else
18074d4c5043SHisping Lin 		printf("test value : Fail! (mismatch values)\n");
18084d4c5043SHisping Lin 
18094d4c5043SHisping Lin 	if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0)
18104d4c5043SHisping Lin 		printf("test buffer : Pass!\n");
18114d4c5043SHisping Lin 	else
18124d4c5043SHisping Lin 		printf("test buffer : Fail! (mismatch buffer)\n");
18134d4c5043SHisping Lin 
18144d4c5043SHisping Lin exit:
18154d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
18164d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
18174d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
18184d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18194d4c5043SHisping Lin 
18204d4c5043SHisping Lin 	return TeecResult;
18214d4c5043SHisping Lin }
18224d4c5043SHisping Lin 
trusty_oem_user_ta_storage(void)18234d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void)
18244d4c5043SHisping Lin {
18254d4c5043SHisping Lin 	TEEC_Result TeecResult;
18264d4c5043SHisping Lin 	TEEC_Context TeecContext;
18274d4c5043SHisping Lin 	TEEC_Session TeecSession;
18284d4c5043SHisping Lin 	uint32_t ErrorOrigin;
18294d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
18304d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
18314d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
18324d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
18334d4c5043SHisping Lin 
18344d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
18354d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
18364d4c5043SHisping Lin 		return TeecResult;
18374d4c5043SHisping Lin 
18384d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
18394d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
18404d4c5043SHisping Lin 		return TeecResult;
18414d4c5043SHisping Lin 
18424d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
18434d4c5043SHisping Lin 						TEEC_NONE,
18444d4c5043SHisping Lin 						TEEC_NONE,
18454d4c5043SHisping Lin 						TEEC_NONE);
18464d4c5043SHisping Lin 
18474d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
18484d4c5043SHisping Lin 				&TeecSession,
18494d4c5043SHisping Lin 				TeecUuid,
18504d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
18514d4c5043SHisping Lin 				NULL,
18524d4c5043SHisping Lin 				&TeecOperation,
18534d4c5043SHisping Lin 				&ErrorOrigin);
18544d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
18554d4c5043SHisping Lin 		return TeecResult;
18564d4c5043SHisping Lin 
18574d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
18584d4c5043SHisping Lin 						TEEC_NONE,
18594d4c5043SHisping Lin 						TEEC_NONE,
18604d4c5043SHisping Lin 						TEEC_NONE);
18614d4c5043SHisping Lin 
18624d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18634d4c5043SHisping Lin 					103,
18644d4c5043SHisping Lin 					&TeecOperation,
18654d4c5043SHisping Lin 					&ErrorOrigin);
18664d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
18674d4c5043SHisping Lin 		goto exit;
18684d4c5043SHisping Lin 
18694d4c5043SHisping Lin exit:
18704d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
18714d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18724d4c5043SHisping Lin 
18734d4c5043SHisping Lin 	return TeecResult;
18744d4c5043SHisping Lin }
18754d4c5043SHisping Lin 
trusty_attest_dh(uint8_t * dh,uint32_t * dh_size)18764aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
18774aa61755SAndy Ye {
18784aa61755SAndy Ye 	TEEC_Result TeecResult;
18794aa61755SAndy Ye 	TEEC_Context TeecContext;
18804aa61755SAndy Ye 	TEEC_Session TeecSession;
18814aa61755SAndy Ye 	uint32_t ErrorOrigin;
18824aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18834aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18844aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
18854aa61755SAndy Ye 				}
18864aa61755SAndy Ye 			     };
18874aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
18884aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
18893251364cSHisping Lin 	struct blk_desc *dev_desc;
18903251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
18916651d4c0SJason Zhu 	if (!dev_desc) {
18926651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
18936651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
18946651d4c0SJason Zhu 	}
18954aa61755SAndy Ye 
1896f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1897f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1898f4e1db95SHisping Lin 		return TeecResult;
18994aa61755SAndy Ye 
19004aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1901f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1902f4e1db95SHisping Lin 		return TeecResult;
19034aa61755SAndy Ye 
19043251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
19053251364cSHisping Lin 						TEEC_NONE,
19063251364cSHisping Lin 						TEEC_NONE,
19073251364cSHisping Lin 						TEEC_NONE);
19083251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1909b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1910b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1911b9a7e756SHisping Lin 	else
1912b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1913b9a7e756SHisping Lin 
19143251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
19153251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
19163251364cSHisping Lin #endif
19173251364cSHisping Lin 
19184aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
19194aa61755SAndy Ye 				      &TeecSession,
19204aa61755SAndy Ye 				      TeecUuid,
19214aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
19224aa61755SAndy Ye 				      NULL,
19233251364cSHisping Lin 					&TeecOperation,
19244aa61755SAndy Ye 				      &ErrorOrigin);
1925f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1926f4e1db95SHisping Lin 		return TeecResult;
19274aa61755SAndy Ye 
19284aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
19294aa61755SAndy Ye 
19304aa61755SAndy Ye 	SharedMem0.size = *dh_size;
19314aa61755SAndy Ye 	SharedMem0.flags = 0;
19324aa61755SAndy Ye 
19334aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1934f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1935f4e1db95SHisping Lin 		goto exit;
19364aa61755SAndy Ye 
19374aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
19384aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
19394aa61755SAndy Ye 
19404aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
19414aa61755SAndy Ye 						    TEEC_NONE,
19424aa61755SAndy Ye 						    TEEC_NONE,
19434aa61755SAndy Ye 						    TEEC_NONE);
19444aa61755SAndy Ye 
19454aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
19464aa61755SAndy Ye 					143,
19474aa61755SAndy Ye 					&TeecOperation,
19484aa61755SAndy Ye 					&ErrorOrigin);
1949f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1950f4e1db95SHisping Lin 		goto exit;
19514aa61755SAndy Ye 
19524aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
19534aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1954f4e1db95SHisping Lin exit:
19554aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
19564aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1957f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
19584aa61755SAndy Ye 
19594aa61755SAndy Ye 	return TeecResult;
19604aa61755SAndy Ye }
19614aa61755SAndy Ye 
trusty_attest_uuid(uint8_t * uuid,uint32_t * uuid_size)19624aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
19634aa61755SAndy Ye {
19644aa61755SAndy Ye 	TEEC_Result TeecResult;
19654aa61755SAndy Ye 	TEEC_Context TeecContext;
19664aa61755SAndy Ye 	TEEC_Session TeecSession;
19674aa61755SAndy Ye 	uint32_t ErrorOrigin;
19684aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
19694aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
19704aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
19714aa61755SAndy Ye 				}
19724aa61755SAndy Ye 			     };
19734aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
19744aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
19753251364cSHisping Lin 	struct blk_desc *dev_desc;
19763251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
19776651d4c0SJason Zhu 	if (!dev_desc) {
19786651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
19796651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
19806651d4c0SJason Zhu 	}
19814aa61755SAndy Ye 
1982f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1983f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1984f4e1db95SHisping Lin 		return TeecResult;
19854aa61755SAndy Ye 
19864aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1987f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1988f4e1db95SHisping Lin 		return TeecResult;
19894aa61755SAndy Ye 
19903251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
19913251364cSHisping Lin 						TEEC_NONE,
19923251364cSHisping Lin 						TEEC_NONE,
19933251364cSHisping Lin 						TEEC_NONE);
19943251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1995b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1996b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1997b9a7e756SHisping Lin 	else
1998b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1999b9a7e756SHisping Lin 
20003251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
20013251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
20023251364cSHisping Lin #endif
20033251364cSHisping Lin 
20044aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
20054aa61755SAndy Ye 				      &TeecSession,
20064aa61755SAndy Ye 				      TeecUuid,
20074aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
20084aa61755SAndy Ye 				      NULL,
20093251364cSHisping Lin 					&TeecOperation,
20104aa61755SAndy Ye 				      &ErrorOrigin);
2011f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2012f4e1db95SHisping Lin 		return TeecResult;
20134aa61755SAndy Ye 
20144aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
20154aa61755SAndy Ye 
20164aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
20174aa61755SAndy Ye 	SharedMem0.flags = 0;
20184aa61755SAndy Ye 
20194aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
2020f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2021f4e1db95SHisping Lin 		goto exit;
20224aa61755SAndy Ye 
20234aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
20244aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
20254aa61755SAndy Ye 
20264aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
20274aa61755SAndy Ye 						    TEEC_NONE,
20284aa61755SAndy Ye 						    TEEC_NONE,
20294aa61755SAndy Ye 						    TEEC_NONE);
20304aa61755SAndy Ye 
20314aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
20324aa61755SAndy Ye 					144,
20334aa61755SAndy Ye 					&TeecOperation,
20344aa61755SAndy Ye 					&ErrorOrigin);
2035f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2036f4e1db95SHisping Lin 		goto exit;
20374aa61755SAndy Ye 
20384aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
20394aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
2040f4e1db95SHisping Lin exit:
20414aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
20424aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
2043f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
20444aa61755SAndy Ye 
20454aa61755SAndy Ye 	return TeecResult;
20464aa61755SAndy Ye }
20474aa61755SAndy Ye 
trusty_attest_get_ca(uint8_t * operation_start,uint32_t * operation_size,uint8_t * out,uint32_t * out_len)20484aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
20494aa61755SAndy Ye 			      uint32_t *operation_size,
20504aa61755SAndy Ye 			      uint8_t *out,
20514aa61755SAndy Ye 			      uint32_t *out_len)
20524aa61755SAndy Ye {
20534aa61755SAndy Ye 	TEEC_Result TeecResult;
20544aa61755SAndy Ye 	TEEC_Context TeecContext;
20554aa61755SAndy Ye 	TEEC_Session TeecSession;
20564aa61755SAndy Ye 	uint32_t ErrorOrigin;
20574aa61755SAndy Ye 
20584aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
20594aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
20604aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
20614aa61755SAndy Ye 				}
20624aa61755SAndy Ye 			     };
20634aa61755SAndy Ye 
20644aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
20654aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
20663251364cSHisping Lin 	struct blk_desc *dev_desc;
20673251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
20686651d4c0SJason Zhu 	if (!dev_desc) {
20696651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
20706651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
20716651d4c0SJason Zhu 	}
20724aa61755SAndy Ye 
2073f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
2074f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2075f4e1db95SHisping Lin 		return TeecResult;
20764aa61755SAndy Ye 
20774aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
2078f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2079f4e1db95SHisping Lin 		return TeecResult;
20804aa61755SAndy Ye 
20813251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
20823251364cSHisping Lin 						TEEC_NONE,
20833251364cSHisping Lin 						TEEC_NONE,
20843251364cSHisping Lin 						TEEC_NONE);
20853251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2086b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
2087b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
2088b9a7e756SHisping Lin 	else
2089b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
2090b9a7e756SHisping Lin 
20913251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
20923251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
20933251364cSHisping Lin #endif
20943251364cSHisping Lin 
20954aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
20964aa61755SAndy Ye 				      &TeecSession,
20974aa61755SAndy Ye 				      TeecUuid,
20984aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
20994aa61755SAndy Ye 				      NULL,
21003251364cSHisping Lin 					&TeecOperation,
21014aa61755SAndy Ye 				      &ErrorOrigin);
2102f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2103f4e1db95SHisping Lin 		return TeecResult;
21044aa61755SAndy Ye 
21054aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
21064aa61755SAndy Ye 
21074aa61755SAndy Ye 	SharedMem0.size = *operation_size;
21084aa61755SAndy Ye 	SharedMem0.flags = 0;
21094aa61755SAndy Ye 
21104aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
2111f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2112f4e1db95SHisping Lin 		goto exit;
21134aa61755SAndy Ye 
21144aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
21154aa61755SAndy Ye 
21164aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
21174aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
21184aa61755SAndy Ye 
21194aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
21204aa61755SAndy Ye 
21214aa61755SAndy Ye 	SharedMem1.size = *out_len;
21224aa61755SAndy Ye 	SharedMem1.flags = 0;
21234aa61755SAndy Ye 
21244aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
2125f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2126f4e1db95SHisping Lin 		goto exit;
21274aa61755SAndy Ye 
21284aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
21294aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
21304aa61755SAndy Ye 
21314aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
21324aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
21334aa61755SAndy Ye 						    TEEC_NONE,
21344aa61755SAndy Ye 						    TEEC_NONE);
21354aa61755SAndy Ye 
21364aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
21374aa61755SAndy Ye 					145,
21384aa61755SAndy Ye 					&TeecOperation,
21394aa61755SAndy Ye 					&ErrorOrigin);
2140f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2141f4e1db95SHisping Lin 		goto exit;
21424aa61755SAndy Ye 
21434aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
21444aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
2145f4e1db95SHisping Lin exit:
21464aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
21474aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
2148f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
2149f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
21504aa61755SAndy Ye 
21514aa61755SAndy Ye 	return TeecResult;
21524aa61755SAndy Ye }
21534aa61755SAndy Ye 
trusty_attest_set_ca(uint8_t * ca_response,uint32_t * ca_response_size)21544aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
21554aa61755SAndy Ye {
21564aa61755SAndy Ye 	TEEC_Result TeecResult;
21574aa61755SAndy Ye 	TEEC_Context TeecContext;
21584aa61755SAndy Ye 	TEEC_Session TeecSession;
21594aa61755SAndy Ye 	uint32_t ErrorOrigin;
21604aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
21614aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
21624aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
21634aa61755SAndy Ye 				}
21644aa61755SAndy Ye 			     };
21654aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
21664aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
21673251364cSHisping Lin 	struct blk_desc *dev_desc;
21683251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
21696651d4c0SJason Zhu 	if (!dev_desc) {
21706651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
21716651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
21726651d4c0SJason Zhu 	}
2173f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
2174f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2175f4e1db95SHisping Lin 		return TeecResult;
21764aa61755SAndy Ye 
21774aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
2178f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2179f4e1db95SHisping Lin 		return TeecResult;
21804aa61755SAndy Ye 
21813251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
21823251364cSHisping Lin 						TEEC_NONE,
21833251364cSHisping Lin 						TEEC_NONE,
21843251364cSHisping Lin 						TEEC_NONE);
21853251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2186b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
2187b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
2188b9a7e756SHisping Lin 	else
2189b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
2190b9a7e756SHisping Lin 
21913251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
21923251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
21933251364cSHisping Lin #endif
21943251364cSHisping Lin 
21954aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
21964aa61755SAndy Ye 					&TeecSession,
21974aa61755SAndy Ye 					TeecUuid,
21984aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
21994aa61755SAndy Ye 					NULL,
22003251364cSHisping Lin 					&TeecOperation,
22014aa61755SAndy Ye 					&ErrorOrigin);
2202f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2203f4e1db95SHisping Lin 		return TeecResult;
22044aa61755SAndy Ye 
22054aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
22064aa61755SAndy Ye 
22074aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
22084aa61755SAndy Ye 	SharedMem0.flags = 0;
22094aa61755SAndy Ye 
22104aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
2211f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2212f4e1db95SHisping Lin 		goto exit;
22134aa61755SAndy Ye 
22144aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
22154aa61755SAndy Ye 
22164aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
22174aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
22184aa61755SAndy Ye 
22194aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
22204aa61755SAndy Ye 						    TEEC_NONE,
22214aa61755SAndy Ye 						    TEEC_NONE,
22224aa61755SAndy Ye 						    TEEC_NONE);
22234aa61755SAndy Ye 
22244aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
22254aa61755SAndy Ye 					146,
22264aa61755SAndy Ye 					&TeecOperation,
22274aa61755SAndy Ye 					&ErrorOrigin);
2228f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2229f4e1db95SHisping Lin 		goto exit;
2230f4e1db95SHisping Lin exit:
22314aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
22324aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
2233f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
22344aa61755SAndy Ye 
22354aa61755SAndy Ye 	return TeecResult;
22364aa61755SAndy Ye }
2237437ac8e2SLin Jinhan 
trusty_fw_key_cipher(enum RK_FW_KEYID key_id,rk_cipher_config * config,uint32_t src_phys_addr,uint32_t dst_phys_addr,uint32_t len)2238437ac8e2SLin Jinhan uint32_t trusty_fw_key_cipher(enum RK_FW_KEYID key_id, rk_cipher_config *config,
2239437ac8e2SLin Jinhan 			      uint32_t src_phys_addr, uint32_t dst_phys_addr,
2240437ac8e2SLin Jinhan 			      uint32_t len)
2241437ac8e2SLin Jinhan {
2242437ac8e2SLin Jinhan 	TEEC_Result TeecResult;
2243437ac8e2SLin Jinhan 	TEEC_Context TeecContext;
2244437ac8e2SLin Jinhan 	TEEC_Session TeecSession;
2245437ac8e2SLin Jinhan 	TEEC_Operation TeecOperation = {0};
2246437ac8e2SLin Jinhan 	uint32_t ErrorOrigin;
2247437ac8e2SLin Jinhan 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
2248437ac8e2SLin Jinhan 	TEEC_SharedMemory SharedMem_config = {0};
2249437ac8e2SLin Jinhan 
2250437ac8e2SLin Jinhan 	if (key_id != RK_FW_KEY0)
2251437ac8e2SLin Jinhan 		return TEEC_ERROR_BAD_PARAMETERS;
2252437ac8e2SLin Jinhan 
2253437ac8e2SLin Jinhan 	if (!config)
2254437ac8e2SLin Jinhan 		return TEEC_ERROR_BAD_PARAMETERS;
2255437ac8e2SLin Jinhan 
2256437ac8e2SLin Jinhan 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
2257437ac8e2SLin Jinhan 		return TEEC_ERROR_BAD_PARAMETERS;
2258437ac8e2SLin Jinhan 
2259437ac8e2SLin Jinhan 	if (config->mode >= RK_CIPHER_MODE_XTS)
2260437ac8e2SLin Jinhan 		return TEEC_ERROR_BAD_PARAMETERS;
2261437ac8e2SLin Jinhan 
2262437ac8e2SLin Jinhan 	if (config->operation != RK_MODE_ENCRYPT &&
2263437ac8e2SLin Jinhan 	    config->operation != RK_MODE_DECRYPT)
2264437ac8e2SLin Jinhan 		return TEEC_ERROR_BAD_PARAMETERS;
2265437ac8e2SLin Jinhan 
2266437ac8e2SLin Jinhan 	if (config->key_len != 16 &&
2267437ac8e2SLin Jinhan 	    config->key_len != 24 &&
2268437ac8e2SLin Jinhan 	    config->key_len != 32)
2269437ac8e2SLin Jinhan 		return TEEC_ERROR_BAD_PARAMETERS;
2270437ac8e2SLin Jinhan 
2271437ac8e2SLin Jinhan 	if (len % AES_BLOCK_SIZE || len == 0)
2272437ac8e2SLin Jinhan 		return TEEC_ERROR_BAD_PARAMETERS;
2273437ac8e2SLin Jinhan 
2274437ac8e2SLin Jinhan 	if (!src_phys_addr || !dst_phys_addr)
2275437ac8e2SLin Jinhan 		return TEEC_ERROR_BAD_PARAMETERS;
2276437ac8e2SLin Jinhan 
2277437ac8e2SLin Jinhan 	TeecResult = OpteeClientApiLibInitialize();
2278437ac8e2SLin Jinhan 	if (TeecResult != TEEC_SUCCESS)
2279437ac8e2SLin Jinhan 		return TeecResult;
2280437ac8e2SLin Jinhan 
2281437ac8e2SLin Jinhan 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
2282437ac8e2SLin Jinhan 	if (TeecResult != TEEC_SUCCESS)
2283437ac8e2SLin Jinhan 		return TeecResult;
2284437ac8e2SLin Jinhan 
2285437ac8e2SLin Jinhan 	TeecResult = TEEC_OpenSession(&TeecContext,
2286437ac8e2SLin Jinhan 				      &TeecSession,
2287437ac8e2SLin Jinhan 				      &uuid,
2288437ac8e2SLin Jinhan 				      TEEC_LOGIN_PUBLIC,
2289437ac8e2SLin Jinhan 				      NULL,
2290437ac8e2SLin Jinhan 				      NULL,
2291437ac8e2SLin Jinhan 				      &ErrorOrigin);
2292437ac8e2SLin Jinhan 	if (TeecResult != TEEC_SUCCESS)
2293437ac8e2SLin Jinhan 		goto exit;
2294437ac8e2SLin Jinhan 
2295437ac8e2SLin Jinhan 	SharedMem_config.size = sizeof(rk_cipher_config);
2296437ac8e2SLin Jinhan 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
2297437ac8e2SLin Jinhan 	if (TeecResult != TEEC_SUCCESS)
2298437ac8e2SLin Jinhan 		goto exit;
2299437ac8e2SLin Jinhan 
2300437ac8e2SLin Jinhan 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
2301437ac8e2SLin Jinhan 	TeecOperation.params[0].value.a       = key_id;
2302437ac8e2SLin Jinhan 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
2303437ac8e2SLin Jinhan 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
2304437ac8e2SLin Jinhan 	TeecOperation.params[2].value.a       = src_phys_addr;
2305437ac8e2SLin Jinhan 	TeecOperation.params[2].value.b       = len;
2306437ac8e2SLin Jinhan 	TeecOperation.params[3].value.a       = dst_phys_addr;
2307437ac8e2SLin Jinhan 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2308437ac8e2SLin Jinhan 						    TEEC_MEMREF_TEMP_INPUT,
2309437ac8e2SLin Jinhan 						    TEEC_VALUE_INPUT,
2310437ac8e2SLin Jinhan 						    TEEC_VALUE_INPUT);
2311437ac8e2SLin Jinhan 
2312437ac8e2SLin Jinhan 	crypto_flush_cacheline(src_phys_addr, len);
2313437ac8e2SLin Jinhan 	crypto_flush_cacheline(dst_phys_addr, len);
2314437ac8e2SLin Jinhan 
2315437ac8e2SLin Jinhan 	TeecResult = TEEC_InvokeCommand(&TeecSession,
2316437ac8e2SLin Jinhan 					CRYPTO_SERVICE_CMD_FW_KEY_PHYS_CIPHER,
2317437ac8e2SLin Jinhan 					&TeecOperation,
2318437ac8e2SLin Jinhan 					&ErrorOrigin);
2319437ac8e2SLin Jinhan 
2320437ac8e2SLin Jinhan 	crypto_invalidate_cacheline(dst_phys_addr, len);
2321437ac8e2SLin Jinhan 
2322437ac8e2SLin Jinhan exit:
2323437ac8e2SLin Jinhan 	TEEC_ReleaseSharedMemory(&SharedMem_config);
2324437ac8e2SLin Jinhan 	TEEC_CloseSession(&TeecSession);
2325437ac8e2SLin Jinhan 	TEEC_FinalizeContext(&TeecContext);
2326437ac8e2SLin Jinhan 	return TeecResult;
2327437ac8e2SLin Jinhan }
2328437ac8e2SLin Jinhan 
trusty_verify_config_ip(char * licence_str)2329*c95f09d3Sxb.wang uint32_t trusty_verify_config_ip(char *licence_str)
2330*c95f09d3Sxb.wang {
2331*c95f09d3Sxb.wang 	TEEC_Result TeecResult;
2332*c95f09d3Sxb.wang 	TEEC_Context TeecContext;
2333*c95f09d3Sxb.wang 	TEEC_Session TeecSession;
2334*c95f09d3Sxb.wang 	uint32_t ErrorOrigin;
2335*c95f09d3Sxb.wang 
2336*c95f09d3Sxb.wang 	TEEC_UUID tempuuid = RK_CRYPTO_SERVICE_UUID;
2337*c95f09d3Sxb.wang 	TEEC_UUID *TeecUuid = &tempuuid;
2338*c95f09d3Sxb.wang 	TEEC_Operation TeecOperation = {0};
2339*c95f09d3Sxb.wang 
2340*c95f09d3Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
2341*c95f09d3Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
2342*c95f09d3Sxb.wang 		return TeecResult;
2343*c95f09d3Sxb.wang 
2344*c95f09d3Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
2345*c95f09d3Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
2346*c95f09d3Sxb.wang 		return TeecResult;
2347*c95f09d3Sxb.wang 
2348*c95f09d3Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
2349*c95f09d3Sxb.wang 				      &TeecSession,
2350*c95f09d3Sxb.wang 				      TeecUuid,
2351*c95f09d3Sxb.wang 				      TEEC_LOGIN_PUBLIC,
2352*c95f09d3Sxb.wang 				      NULL,
2353*c95f09d3Sxb.wang 				      NULL,
2354*c95f09d3Sxb.wang 				      &ErrorOrigin);
2355*c95f09d3Sxb.wang 	if (TeecResult != TEEC_SUCCESS) {
2356*c95f09d3Sxb.wang 		TEEC_FinalizeContext(&TeecContext);
2357*c95f09d3Sxb.wang 		return TeecResult;
2358*c95f09d3Sxb.wang 	}
2359*c95f09d3Sxb.wang 
2360*c95f09d3Sxb.wang 	TEEC_SharedMemory SharedMem = {0};
2361*c95f09d3Sxb.wang 
2362*c95f09d3Sxb.wang 	SharedMem.size = strlen(licence_str);
2363*c95f09d3Sxb.wang 	SharedMem.flags = 0;
2364*c95f09d3Sxb.wang 
2365*c95f09d3Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
2366*c95f09d3Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
2367*c95f09d3Sxb.wang 		goto exit;
2368*c95f09d3Sxb.wang 
2369*c95f09d3Sxb.wang 	memcpy(SharedMem.buffer, licence_str, SharedMem.size);
2370*c95f09d3Sxb.wang 	TeecOperation.params[0].tmpref.buffer = SharedMem.buffer;
2371*c95f09d3Sxb.wang 	TeecOperation.params[0].tmpref.size = SharedMem.size;
2372*c95f09d3Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
2373*c95f09d3Sxb.wang 						    TEEC_NONE,
2374*c95f09d3Sxb.wang 						    TEEC_NONE,
2375*c95f09d3Sxb.wang 						    TEEC_NONE);
2376*c95f09d3Sxb.wang 
2377*c95f09d3Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
2378*c95f09d3Sxb.wang 					CRYPTO_SERVICE_CMD_VERIFY_CONFIG_IP,
2379*c95f09d3Sxb.wang 					&TeecOperation,
2380*c95f09d3Sxb.wang 					&ErrorOrigin);
2381*c95f09d3Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
2382*c95f09d3Sxb.wang 		goto exit;
2383*c95f09d3Sxb.wang 
2384*c95f09d3Sxb.wang exit:
2385*c95f09d3Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem);
2386*c95f09d3Sxb.wang 	TEEC_CloseSession(&TeecSession);
2387*c95f09d3Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
2388*c95f09d3Sxb.wang 
2389*c95f09d3Sxb.wang 	return TeecResult;
2390*c95f09d3Sxb.wang }
2391