xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 11b25801bd4e56894e87abd893d0b2c620bc8e17)
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
41*11b25801SHisping Lin #define STORAGE_CMD_WRITE_FW_ENCRYPT_KEY	30
42*11b25801SHisping Lin #define STORAGE_CMD_FW_ENCRYPT_KEY_IS_WRITTEN	31
43*11b25801SHisping Lin #define STORAGE_CMD_SET_FW_ENCRYPT_KEY_MASK	32
44ae8ec5e1SHisping Lin 
452f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER	0x00000002
46fc3694d6Sxb.wang 
47fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID	{ 0x0cacdb5d, 0x4fea, 0x466c, \
48fc3694d6Sxb.wang 		{ 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } }
49fc3694d6Sxb.wang 
50ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
51ae8ec5e1SHisping Lin {
52ae8ec5e1SHisping Lin 	if (in > 9)
53ae8ec5e1SHisping Lin 		return in + 55;
54ae8ec5e1SHisping Lin 	else
55ae8ec5e1SHisping Lin 		return in + 48;
56ae8ec5e1SHisping Lin }
57ae8ec5e1SHisping Lin 
58c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
59ae8ec5e1SHisping Lin {
60ae8ec5e1SHisping Lin 	uint32_t i = 0;
61ae8ec5e1SHisping Lin 
62ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
63ae8ec5e1SHisping Lin 		return 0;
64ae8ec5e1SHisping Lin 
65ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
66ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
67ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
68ae8ec5e1SHisping Lin 	}
69ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
70ae8ec5e1SHisping Lin 
71ae8ec5e1SHisping Lin 	return blen * 2;
72ae8ec5e1SHisping Lin }
73ae8ec5e1SHisping Lin 
742f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size)
752f8c34bdSxb.wang {
762f8c34bdSxb.wang 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
772f8c34bdSxb.wang 	ulong aligned_input, aligned_len;
782f8c34bdSxb.wang 
792f8c34bdSxb.wang 	if (!addr || !size)
802f8c34bdSxb.wang 		return;
812f8c34bdSxb.wang 
822f8c34bdSxb.wang 	/* Must flush dcache before crypto DMA fetch data region */
832f8c34bdSxb.wang 	aligned_input = round_down(addr, alignment);
842f8c34bdSxb.wang 	aligned_len = round_up(size + (addr - aligned_input), alignment);
852f8c34bdSxb.wang 	flush_cache(aligned_input, aligned_len);
862f8c34bdSxb.wang }
872f8c34bdSxb.wang 
88a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
89a900eef3SHisping Lin {
90a900eef3SHisping Lin 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
91a900eef3SHisping Lin 	ulong aligned_input, aligned_len;
92a900eef3SHisping Lin 
93a900eef3SHisping Lin 	if (!addr || !size)
94a900eef3SHisping Lin 		return;
95a900eef3SHisping Lin 
96a900eef3SHisping Lin 	/* Must invalidate dcache after crypto DMA write data region */
97a900eef3SHisping Lin 	aligned_input = round_down(addr, alignment);
98a900eef3SHisping Lin 	aligned_len = round_up(size + (addr - aligned_input), alignment);
99a900eef3SHisping Lin 	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
100a900eef3SHisping Lin }
101a900eef3SHisping Lin 
102c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
103c7de5349SHisping Lin 						uint32_t filename_size,
104c7de5349SHisping Lin 						uint8_t *data,
105c7de5349SHisping Lin 						uint32_t data_size)
106ae8ec5e1SHisping Lin {
107ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
108ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
109ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
110ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
111ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
112ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
113ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
114ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1153251364cSHisping Lin 	struct blk_desc *dev_desc;
1163251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1176651d4c0SJason Zhu 	if (!dev_desc) {
1186651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1196651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1206651d4c0SJason Zhu 	}
1213251364cSHisping Lin 
122f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
123f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
124f4e1db95SHisping Lin 		return TeecResult;
125ae8ec5e1SHisping Lin 
126ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
127f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
128f4e1db95SHisping Lin 		return TeecResult;
129ae8ec5e1SHisping Lin 
1303251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1313251364cSHisping Lin 						    TEEC_NONE,
1323251364cSHisping Lin 						    TEEC_NONE,
1333251364cSHisping Lin 						    TEEC_NONE);
1343251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
135f3c7fe23SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc
136f3c7fe23SHisping Lin 		TeecOperation.params[0].value.a = 1;
137f3c7fe23SHisping Lin 	else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs
138b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
139b9a7e756SHisping Lin 	else
140b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
141f3c7fe23SHisping Lin 
1423251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1433251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1443251364cSHisping Lin #endif
1453251364cSHisping Lin 
146ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
147ae8ec5e1SHisping Lin 				&TeecSession,
148ae8ec5e1SHisping Lin 				TeecUuid,
149ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
150ae8ec5e1SHisping Lin 				NULL,
1513251364cSHisping Lin 				&TeecOperation,
152ae8ec5e1SHisping Lin 				&ErrorOrigin);
153f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
154f4e1db95SHisping Lin 		return TeecResult;
155ae8ec5e1SHisping Lin 
156ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
157ae8ec5e1SHisping Lin 
158c7de5349SHisping Lin 	SharedMem0.size = filename_size;
159ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
160ae8ec5e1SHisping Lin 
161ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
162f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
163f4e1db95SHisping Lin 		goto exit;
164ae8ec5e1SHisping Lin 
165c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
166ae8ec5e1SHisping Lin 
167ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
168ae8ec5e1SHisping Lin 
169c7de5349SHisping Lin 	SharedMem1.size = data_size;
170c7de5349SHisping Lin 	SharedMem1.flags = 0;
171c7de5349SHisping Lin 
172c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
173c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
174c7de5349SHisping Lin 		goto exit;
175c7de5349SHisping Lin 
176c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
177c7de5349SHisping Lin 
178c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
179c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
180c7de5349SHisping Lin 
181c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
182c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
183c7de5349SHisping Lin 
184c7de5349SHisping Lin 
185c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
186c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
187c7de5349SHisping Lin 						TEEC_NONE,
188c7de5349SHisping Lin 						TEEC_NONE);
189c7de5349SHisping Lin 
190c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
191c7de5349SHisping Lin 					1,
192c7de5349SHisping Lin 					&TeecOperation,
193c7de5349SHisping Lin 					&ErrorOrigin);
194c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
195c7de5349SHisping Lin 		goto exit;
196c7de5349SHisping Lin exit:
197c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
198c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
199c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
200c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
201c7de5349SHisping Lin 
202c7de5349SHisping Lin 	return TeecResult;
203c7de5349SHisping Lin }
204c7de5349SHisping Lin 
205c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
206c7de5349SHisping Lin 					       uint32_t filename_size,
207c7de5349SHisping Lin 					       uint8_t *data,
208c7de5349SHisping Lin 					       uint32_t data_size)
209c7de5349SHisping Lin {
210c7de5349SHisping Lin 	TEEC_Result TeecResult;
211c7de5349SHisping Lin 	TEEC_Context TeecContext;
212c7de5349SHisping Lin 	TEEC_Session TeecSession;
213c7de5349SHisping Lin 	uint32_t ErrorOrigin;
214c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
215c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
216c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
217c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
218c7de5349SHisping Lin 
219c7de5349SHisping Lin 	struct blk_desc *dev_desc;
220c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
221c7de5349SHisping Lin 	if (!dev_desc) {
222c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
223c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
224c7de5349SHisping Lin 	}
225c7de5349SHisping Lin 
226c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
227c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
228c7de5349SHisping Lin 		return TeecResult;
229c7de5349SHisping Lin 
230c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
231c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
232c7de5349SHisping Lin 		return TeecResult;
233c7de5349SHisping Lin 
234c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
235c7de5349SHisping Lin 						TEEC_NONE,
236c7de5349SHisping Lin 						TEEC_NONE,
237c7de5349SHisping Lin 						TEEC_NONE);
238c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
239f3c7fe23SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc
240f3c7fe23SHisping Lin 		TeecOperation.params[0].value.a = 1;
241f3c7fe23SHisping Lin 	else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs
242c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
243c7de5349SHisping Lin 	else
244c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
245f3c7fe23SHisping Lin 
246c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
247c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
248c7de5349SHisping Lin #endif
249c7de5349SHisping Lin 
250c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
251c7de5349SHisping Lin 				&TeecSession,
252c7de5349SHisping Lin 				TeecUuid,
253c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
254c7de5349SHisping Lin 				NULL,
255c7de5349SHisping Lin 				&TeecOperation,
256c7de5349SHisping Lin 				&ErrorOrigin);
257c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
258c7de5349SHisping Lin 		return TeecResult;
259c7de5349SHisping Lin 
260c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
261c7de5349SHisping Lin 
262c7de5349SHisping Lin 	SharedMem0.size = filename_size;
263c7de5349SHisping Lin 	SharedMem0.flags = 0;
264c7de5349SHisping Lin 
265c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
266c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
267c7de5349SHisping Lin 		goto exit;
268c7de5349SHisping Lin 
269c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
270c7de5349SHisping Lin 
271c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
272c7de5349SHisping Lin 
273c7de5349SHisping Lin 	SharedMem1.size = data_size;
274ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
275ae8ec5e1SHisping Lin 
276ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
277f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
278f4e1db95SHisping Lin 		goto exit;
279ae8ec5e1SHisping Lin 
280ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
281ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
282ae8ec5e1SHisping Lin 
283ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
284ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
285ae8ec5e1SHisping Lin 
286ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
287ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
288ae8ec5e1SHisping Lin 						TEEC_NONE,
289ae8ec5e1SHisping Lin 						TEEC_NONE);
290ae8ec5e1SHisping Lin 
291ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
292ae8ec5e1SHisping Lin 					0,
293ae8ec5e1SHisping Lin 					&TeecOperation,
294ae8ec5e1SHisping Lin 					&ErrorOrigin);
29546b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
296c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
297f4e1db95SHisping Lin exit:
298ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
299ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
300ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
30146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
302ae8ec5e1SHisping Lin 
303ae8ec5e1SHisping Lin 	return TeecResult;
304ae8ec5e1SHisping Lin }
305ae8ec5e1SHisping Lin 
306c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
307c7de5349SHisping Lin {
308c7de5349SHisping Lin 	TEEC_Result TeecResult;
309c7de5349SHisping Lin 	TEEC_Context TeecContext;
310c7de5349SHisping Lin 	TEEC_Session TeecSession;
311c7de5349SHisping Lin 	uint32_t ErrorOrigin;
312c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
313c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
314c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
315c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
316c7de5349SHisping Lin 
317c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
318c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
319c7de5349SHisping Lin 		return TeecResult;
320c7de5349SHisping Lin 
321c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
322c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
323c7de5349SHisping Lin 		return TeecResult;
324c7de5349SHisping Lin 
325c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
326c7de5349SHisping Lin 				&TeecSession,
327c7de5349SHisping Lin 				TeecUuid,
328c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
329c7de5349SHisping Lin 				NULL,
330c7de5349SHisping Lin 				NULL,
331c7de5349SHisping Lin 				&ErrorOrigin);
332c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
333c7de5349SHisping Lin 		return TeecResult;
334c7de5349SHisping Lin 
335c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
336c7de5349SHisping Lin 						    TEEC_NONE,
337c7de5349SHisping Lin 						    TEEC_NONE,
338c7de5349SHisping Lin 						    TEEC_NONE);
339c7de5349SHisping Lin 
340c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
341c7de5349SHisping Lin 					2,
342c7de5349SHisping Lin 					&TeecOperation,
343c7de5349SHisping Lin 					&ErrorOrigin);
344c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
345c7de5349SHisping Lin 		goto exit;
346c7de5349SHisping Lin exit:
347c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
348c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
349c7de5349SHisping Lin 
350c7de5349SHisping Lin 	return TeecResult;
351c7de5349SHisping Lin }
352c7de5349SHisping Lin 
35334f2e8f6SHisping Lin static void trusty_notify_always_use_security(void)
35434f2e8f6SHisping Lin {
35534f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION)
35634f2e8f6SHisping Lin 	TEEC_Result TeecResult;
35734f2e8f6SHisping Lin 	TEEC_Context TeecContext;
35834f2e8f6SHisping Lin 	TEEC_Session TeecSession;
35934f2e8f6SHisping Lin 	uint32_t ErrorOrigin;
36034f2e8f6SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
36134f2e8f6SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
36234f2e8f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
36334f2e8f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
36434f2e8f6SHisping Lin 
36534f2e8f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
36634f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
36734f2e8f6SHisping Lin 		return;
36834f2e8f6SHisping Lin 
36934f2e8f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
37034f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
37134f2e8f6SHisping Lin 		return;
37234f2e8f6SHisping Lin 
37334f2e8f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
37434f2e8f6SHisping Lin 				&TeecSession,
37534f2e8f6SHisping Lin 				TeecUuid,
37634f2e8f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
37734f2e8f6SHisping Lin 				NULL,
37834f2e8f6SHisping Lin 				NULL,
37934f2e8f6SHisping Lin 				&ErrorOrigin);
38034f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
38134f2e8f6SHisping Lin 		return;
38234f2e8f6SHisping Lin 
38334f2e8f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
38434f2e8f6SHisping Lin 						    TEEC_NONE,
38534f2e8f6SHisping Lin 						    TEEC_NONE,
38634f2e8f6SHisping Lin 						    TEEC_NONE);
38734f2e8f6SHisping Lin 
38834f2e8f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
38934f2e8f6SHisping Lin 					9,
39034f2e8f6SHisping Lin 					&TeecOperation,
39134f2e8f6SHisping Lin 					&ErrorOrigin);
39234f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
39334f2e8f6SHisping Lin 		debug("notify always use security fail! please update optee!");
39434f2e8f6SHisping Lin 
39534f2e8f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
39634f2e8f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
39734f2e8f6SHisping Lin 
39834f2e8f6SHisping Lin 	return;
39934f2e8f6SHisping Lin #endif
40034f2e8f6SHisping Lin }
40134f2e8f6SHisping Lin 
402c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
403c7de5349SHisping Lin {
404c7de5349SHisping Lin 	char hs[9];
405c7de5349SHisping Lin 
406c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
407c7de5349SHisping Lin 
408c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
409c7de5349SHisping Lin }
410c7de5349SHisping Lin 
411ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
412ae8ec5e1SHisping Lin {
413c7de5349SHisping Lin 	char hs[9];
4143251364cSHisping Lin 
415c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
416ae8ec5e1SHisping Lin 
417c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
418ae8ec5e1SHisping Lin }
419ae8ec5e1SHisping Lin 
420ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
421ae8ec5e1SHisping Lin {
422c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
423c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
424ae8ec5e1SHisping Lin }
425ae8ec5e1SHisping Lin 
426ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
427ae8ec5e1SHisping Lin {
428c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
429c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
4306651d4c0SJason Zhu }
431ae8ec5e1SHisping Lin 
432c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
433c7de5349SHisping Lin {
434c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
435c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
436c7de5349SHisping Lin }
437ae8ec5e1SHisping Lin 
438c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
439c7de5349SHisping Lin {
440c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
441c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
442ae8ec5e1SHisping Lin }
443ae8ec5e1SHisping Lin 
444564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
445564654ebSJason Zhu 					      uint32_t size)
446564654ebSJason Zhu {
447c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
448c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
449564654ebSJason Zhu }
450564654ebSJason Zhu 
451564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
452564654ebSJason Zhu 					       uint32_t size)
453564654ebSJason Zhu {
454c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
455c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
456564654ebSJason Zhu }
457564654ebSJason Zhu 
458ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
459ae8ec5e1SHisping Lin {
460c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
461c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
462ae8ec5e1SHisping Lin }
463ae8ec5e1SHisping Lin 
464ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
465ae8ec5e1SHisping Lin {
466c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
467c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
468ae8ec5e1SHisping Lin }
469ae8ec5e1SHisping Lin 
470ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
471ae8ec5e1SHisping Lin {
472c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
473c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
474c7de5349SHisping Lin }
475c7de5349SHisping Lin 
476c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
477c7de5349SHisping Lin {
478c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
479c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
480c7de5349SHisping Lin }
481c7de5349SHisping Lin 
482c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
483c7de5349SHisping Lin {
484ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
485ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
486ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
487ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
488c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
489c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
490c7de5349SHisping Lin 
491ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
492ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
493ae8ec5e1SHisping Lin 
494f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
495f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
496f4e1db95SHisping Lin 		return TeecResult;
497ae8ec5e1SHisping Lin 
498ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
499f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
500f4e1db95SHisping Lin 		return TeecResult;
501ae8ec5e1SHisping Lin 
502ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
503ae8ec5e1SHisping Lin 				      &TeecSession,
504ae8ec5e1SHisping Lin 				      TeecUuid,
505ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
506ae8ec5e1SHisping Lin 				      NULL,
507c7de5349SHisping Lin 				      NULL,
508ae8ec5e1SHisping Lin 				      &ErrorOrigin);
509f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
510f4e1db95SHisping Lin 		return TeecResult;
511ae8ec5e1SHisping Lin 
512c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
513c7de5349SHisping Lin 						    TEEC_NONE,
514ae8ec5e1SHisping Lin 						    TEEC_NONE,
515ae8ec5e1SHisping Lin 						    TEEC_NONE);
516ae8ec5e1SHisping Lin 
517ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
518c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
519ae8ec5e1SHisping Lin 					&TeecOperation,
520ae8ec5e1SHisping Lin 					&ErrorOrigin);
521c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
522c7de5349SHisping Lin 		goto exit;
523f4e1db95SHisping Lin exit:
524ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
52546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
526ae8ec5e1SHisping Lin 
527ae8ec5e1SHisping Lin 	return TeecResult;
528ae8ec5e1SHisping Lin }
529ae8ec5e1SHisping Lin 
530c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
531c7de5349SHisping Lin 						   uint8_t is_write,
532c7de5349SHisping Lin 						   uint32_t *buf,
533c7de5349SHisping Lin 						   uint32_t length)
534ae8ec5e1SHisping Lin {
535ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
536ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
537ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
538ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
539c7de5349SHisping Lin 
540c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
541c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
542ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
543ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
544ae8ec5e1SHisping Lin 
545f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
546f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
547f4e1db95SHisping Lin 		return TeecResult;
548ae8ec5e1SHisping Lin 
549ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
550f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
551f4e1db95SHisping Lin 		return TeecResult;
552ae8ec5e1SHisping Lin 
553ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
554ae8ec5e1SHisping Lin 				&TeecSession,
555ae8ec5e1SHisping Lin 				TeecUuid,
556ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
557ae8ec5e1SHisping Lin 				NULL,
558c7de5349SHisping Lin 				NULL,
559ae8ec5e1SHisping Lin 				&ErrorOrigin);
560f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
561f4e1db95SHisping Lin 		return TeecResult;
562ae8ec5e1SHisping Lin 
563ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
564ae8ec5e1SHisping Lin 
565c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
566ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
567ae8ec5e1SHisping Lin 
568ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
569f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
570f4e1db95SHisping Lin 		goto exit;
571ae8ec5e1SHisping Lin 
572ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
573ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
574ae8ec5e1SHisping Lin 
575c7de5349SHisping Lin 	if (is_write) {
576c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
577ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
578c7de5349SHisping Lin 							    TEEC_NONE,
579ae8ec5e1SHisping Lin 							    TEEC_NONE,
580ae8ec5e1SHisping Lin 							    TEEC_NONE);
581ae8ec5e1SHisping Lin 
582c7de5349SHisping Lin 	} else {
583c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
584c7de5349SHisping Lin 							    TEEC_NONE,
585c7de5349SHisping Lin 							    TEEC_NONE,
586c7de5349SHisping Lin 							    TEEC_NONE);
587c7de5349SHisping Lin 	}
588c7de5349SHisping Lin 
589ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
590c7de5349SHisping Lin 					cmd,
591ae8ec5e1SHisping Lin 					&TeecOperation,
592ae8ec5e1SHisping Lin 					&ErrorOrigin);
593f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
594f4e1db95SHisping Lin 		goto exit;
595c7de5349SHisping Lin 
596c7de5349SHisping Lin 	if (!is_write)
597c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
598c7de5349SHisping Lin 
599f4e1db95SHisping Lin exit:
600ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
601ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
60246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
603ae8ec5e1SHisping Lin 
604ae8ec5e1SHisping Lin 	return TeecResult;
605ae8ec5e1SHisping Lin }
606ae8ec5e1SHisping Lin 
6076ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
6086ef445a4SHisping Lin {
609c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
610c7de5349SHisping Lin 						  false, buf, length);
6116ef445a4SHisping Lin }
6126ef445a4SHisping Lin 
6136ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
6146ef445a4SHisping Lin {
615c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
616c7de5349SHisping Lin 						  true, buf, length);
61716539616SHisping Lin }
61816539616SHisping Lin 
61916539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
62016539616SHisping Lin {
62116539616SHisping Lin 	TEEC_Result res;
622c7de5349SHisping Lin 
623c7de5349SHisping Lin 	res = trusty_base_end_security_data();
624c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
62516539616SHisping Lin 	return res;
62616539616SHisping Lin }
6272cd27853SHisping Lin 
6282cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
6292cd27853SHisping Lin {
630c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
631c7de5349SHisping Lin 						  false, buf, length);
6322cd27853SHisping Lin }
633c7de5349SHisping Lin 
6342cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
6352cd27853SHisping Lin {
636c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
637c7de5349SHisping Lin 						  true, buf, length);
6382cd27853SHisping Lin }
639095e2a82SHisping Lin 
640468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
641468df3b2SHisping Lin {
642468df3b2SHisping Lin 	uint32_t bootflag;
643c7de5349SHisping Lin 	TEEC_Result TeecResult;
644468df3b2SHisping Lin 
645f07e1686SHisping Lin 	*flag = 0;
646f07e1686SHisping Lin 
647c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
648c7de5349SHisping Lin 							false, &bootflag, 1);
649468df3b2SHisping Lin 
650468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
6510202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
6520202ee8aSHisping Lin 		if (bootflag == 0x00000001)
6530202ee8aSHisping Lin 			*flag = 1;
6540202ee8aSHisping Lin #else
655468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
656468df3b2SHisping Lin 			*flag = 1;
6570202ee8aSHisping Lin #endif
658468df3b2SHisping Lin 	}
659095e2a82SHisping Lin 	return TeecResult;
660095e2a82SHisping Lin }
6614aa61755SAndy Ye 
6621ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
6631ef63c75SHisping Lin {
6641ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
6651ef63c75SHisping Lin 						  true, buf, length);
6661ef63c75SHisping Lin }
6671ef63c75SHisping Lin 
66810f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value)
66910f41197SHisping Lin {
67010f41197SHisping Lin 	TEEC_Result TeecResult;
67110f41197SHisping Lin 	TEEC_Context TeecContext;
67210f41197SHisping Lin 	TEEC_Session TeecSession;
67310f41197SHisping Lin 	uint32_t ErrorOrigin;
67410f41197SHisping Lin 
67510f41197SHisping Lin 	*value = 0;
67610f41197SHisping Lin 
67710f41197SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
67810f41197SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
67910f41197SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
68010f41197SHisping Lin 	TEEC_Operation TeecOperation = {0};
68110f41197SHisping Lin 
68210f41197SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
68310f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
68410f41197SHisping Lin 		return TeecResult;
68510f41197SHisping Lin 
68610f41197SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
68710f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
68810f41197SHisping Lin 		return TeecResult;
68910f41197SHisping Lin 
69010f41197SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
69110f41197SHisping Lin 				&TeecSession,
69210f41197SHisping Lin 				TeecUuid,
69310f41197SHisping Lin 				TEEC_LOGIN_PUBLIC,
69410f41197SHisping Lin 				NULL,
69510f41197SHisping Lin 				NULL,
69610f41197SHisping Lin 				&ErrorOrigin);
69710f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
69810f41197SHisping Lin 		return TeecResult;
69910f41197SHisping Lin 
70010f41197SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
70110f41197SHisping Lin 						    TEEC_NONE,
70210f41197SHisping Lin 						    TEEC_NONE,
70310f41197SHisping Lin 						    TEEC_NONE);
70410f41197SHisping Lin 
70510f41197SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
70610f41197SHisping Lin 					STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN,
70710f41197SHisping Lin 					&TeecOperation,
70810f41197SHisping Lin 					&ErrorOrigin);
70910f41197SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
71010f41197SHisping Lin 		*value = TeecOperation.params[0].value.a;
71110f41197SHisping Lin 
71210f41197SHisping Lin 	TEEC_CloseSession(&TeecSession);
71310f41197SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
71410f41197SHisping Lin 
71510f41197SHisping Lin 	return TeecResult;
71610f41197SHisping Lin }
71710f41197SHisping Lin 
7181ac64e8aSHisping Lin uint32_t trusty_write_oem_encrypt_data(uint32_t *buf, uint32_t length)
7191ac64e8aSHisping Lin {
7201ac64e8aSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA,
7211ac64e8aSHisping Lin 						  true, buf, length);
7221ac64e8aSHisping Lin }
7231ac64e8aSHisping Lin 
724fc383442SHisping Lin uint32_t trusty_oem_encrypt_data_is_written(uint8_t *value)
725fc383442SHisping Lin {
726fc383442SHisping Lin 	TEEC_Result TeecResult;
727fc383442SHisping Lin 	TEEC_Context TeecContext;
728fc383442SHisping Lin 	TEEC_Session TeecSession;
729fc383442SHisping Lin 	uint32_t ErrorOrigin;
730fc383442SHisping Lin 
731fc383442SHisping Lin 	*value = 0;
732fc383442SHisping Lin 
733fc383442SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
734fc383442SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
735fc383442SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
736fc383442SHisping Lin 	TEEC_Operation TeecOperation = {0};
737fc383442SHisping Lin 
738fc383442SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
739fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
740fc383442SHisping Lin 		return TeecResult;
741fc383442SHisping Lin 
742fc383442SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
743fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
744fc383442SHisping Lin 		return TeecResult;
745fc383442SHisping Lin 
746fc383442SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
747fc383442SHisping Lin 				&TeecSession,
748fc383442SHisping Lin 				TeecUuid,
749fc383442SHisping Lin 				TEEC_LOGIN_PUBLIC,
750fc383442SHisping Lin 				NULL,
751fc383442SHisping Lin 				NULL,
752fc383442SHisping Lin 				&ErrorOrigin);
753fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
754fc383442SHisping Lin 		return TeecResult;
755fc383442SHisping Lin 
756fc383442SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
757fc383442SHisping Lin 						    TEEC_NONE,
758fc383442SHisping Lin 						    TEEC_NONE,
759fc383442SHisping Lin 						    TEEC_NONE);
760fc383442SHisping Lin 
761fc383442SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
762fc383442SHisping Lin 					STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN,
763fc383442SHisping Lin 					&TeecOperation,
764fc383442SHisping Lin 					&ErrorOrigin);
765fc383442SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
766fc383442SHisping Lin 		*value = TeecOperation.params[0].value.a;
767fc383442SHisping Lin 
768fc383442SHisping Lin 	TEEC_CloseSession(&TeecSession);
769fc383442SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
770fc383442SHisping Lin 
771fc383442SHisping Lin 	return TeecResult;
772fc383442SHisping Lin }
773fc383442SHisping Lin 
774fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
775fbf29bfbSHisping Lin {
776fbf29bfbSHisping Lin 	uint32_t levelflag;
777fbf29bfbSHisping Lin 
778fbf29bfbSHisping Lin 	levelflag = flag;
779fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
780fbf29bfbSHisping Lin 						  true, &levelflag, 1);
781fbf29bfbSHisping Lin }
782fbf29bfbSHisping Lin 
783f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
784f39d4289SHisping Lin {
785f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
786f39d4289SHisping Lin 						  true, buf, length);
787f39d4289SHisping Lin }
788f39d4289SHisping Lin 
78934f2e8f6SHisping Lin static void trusty_select_security_level(void)
7907504da74SHisping Lin {
791b2858095SHisping Lin #ifdef CONFIG_OPTEE_SECURITY_LEVEL
7927504da74SHisping Lin 	TEEC_Result TeecResult;
7937504da74SHisping Lin 
7947504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
7957504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
7967504da74SHisping Lin 		run_command("download", 0);
7977504da74SHisping Lin 		return;
7987504da74SHisping Lin 	}
7997504da74SHisping Lin 
8007504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
8017504da74SHisping Lin 		debug("optee select security level success!");
802b2858095SHisping Lin 	else if (TeecResult == TEEC_ERROR_NOT_SUPPORTED)
803b2858095SHisping Lin 		debug("optee not support security level!");
8047504da74SHisping Lin 	else
8057504da74SHisping Lin 		panic("optee select security level fail!");
8067504da74SHisping Lin 
8077504da74SHisping Lin 	return;
8087504da74SHisping Lin #endif
8097504da74SHisping Lin }
8107504da74SHisping Lin 
81151ac7005SHisping Lin void optee_client_init(void)
81251ac7005SHisping Lin {
81351ac7005SHisping Lin 	trusty_select_security_level();
81434f2e8f6SHisping Lin 	trusty_notify_always_use_security();
81551ac7005SHisping Lin }
81651ac7005SHisping Lin 
817d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
818d5913350SHisping Lin {
819d5913350SHisping Lin 	TEEC_Result TeecResult;
820d5913350SHisping Lin 	TEEC_Context TeecContext;
821d5913350SHisping Lin 	TEEC_Session TeecSession;
822d5913350SHisping Lin 	uint32_t ErrorOrigin;
823d5913350SHisping Lin 
824d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
825d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
826d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
827d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
828d5913350SHisping Lin 
829d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
830d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
831d5913350SHisping Lin 		return TeecResult;
832d5913350SHisping Lin 
833d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
834d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
835d5913350SHisping Lin 		return TeecResult;
836d5913350SHisping Lin 
837d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
838d5913350SHisping Lin 				&TeecSession,
839d5913350SHisping Lin 				TeecUuid,
840d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
841d5913350SHisping Lin 				NULL,
842d5913350SHisping Lin 				NULL,
843d5913350SHisping Lin 				&ErrorOrigin);
844d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
845d5913350SHisping Lin 		return TeecResult;
846d5913350SHisping Lin 
847d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
848d5913350SHisping Lin 
849d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
850d5913350SHisping Lin 
851d5913350SHisping Lin 	SharedMem.size = byte_len;
852d5913350SHisping Lin 	SharedMem.flags = 0;
853d5913350SHisping Lin 
854d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
855d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
856d5913350SHisping Lin 		goto exit;
857d5913350SHisping Lin 
858d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
859d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
860d5913350SHisping Lin 
861d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
862d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
863d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
864d5913350SHisping Lin 						    TEEC_NONE,
865d5913350SHisping Lin 						    TEEC_NONE);
866d5913350SHisping Lin 
867d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
868d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
869d5913350SHisping Lin 					&TeecOperation,
870d5913350SHisping Lin 					&ErrorOrigin);
871d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
872d5913350SHisping Lin 		goto exit;
873d5913350SHisping Lin 
874d5913350SHisping Lin exit:
875d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
876d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
877d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
878d5913350SHisping Lin 
879d5913350SHisping Lin 	return TeecResult;
880d5913350SHisping Lin }
881d5913350SHisping Lin 
882d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
883d5913350SHisping Lin {
884d5913350SHisping Lin 	TEEC_Result TeecResult;
885d5913350SHisping Lin 	TEEC_Context TeecContext;
886d5913350SHisping Lin 	TEEC_Session TeecSession;
887d5913350SHisping Lin 	uint32_t ErrorOrigin;
888d5913350SHisping Lin 
889d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
890d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
891d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
892d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
893d5913350SHisping Lin 
894d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
895d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
896d5913350SHisping Lin 		return TeecResult;
897d5913350SHisping Lin 
898d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
899d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
900d5913350SHisping Lin 		return TeecResult;
901d5913350SHisping Lin 
902d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
903d5913350SHisping Lin 				&TeecSession,
904d5913350SHisping Lin 				TeecUuid,
905d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
906d5913350SHisping Lin 				NULL,
907d5913350SHisping Lin 				NULL,
908d5913350SHisping Lin 				&ErrorOrigin);
909d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
910d5913350SHisping Lin 		return TeecResult;
911d5913350SHisping Lin 
912d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
913d5913350SHisping Lin 
914d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
915d5913350SHisping Lin 
916d5913350SHisping Lin 	SharedMem.size = byte_len;
917d5913350SHisping Lin 	SharedMem.flags = 0;
918d5913350SHisping Lin 
919d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
920d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
921d5913350SHisping Lin 		goto exit;
922d5913350SHisping Lin 
923d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
924d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
925d5913350SHisping Lin 
926d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
927d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
928d5913350SHisping Lin 						    TEEC_NONE,
929d5913350SHisping Lin 						    TEEC_NONE);
930d5913350SHisping Lin 
931d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
932d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
933d5913350SHisping Lin 					&TeecOperation,
934d5913350SHisping Lin 					&ErrorOrigin);
935d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
936d5913350SHisping Lin 		goto exit;
937d5913350SHisping Lin 
938d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
939d5913350SHisping Lin 
940d5913350SHisping Lin exit:
941d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
942d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
943d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
944d5913350SHisping Lin 
945d5913350SHisping Lin 	return TeecResult;
946d5913350SHisping Lin }
947d5913350SHisping Lin 
94890e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,
949bb1ba6acSHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
950bb1ba6acSHisping Lin {
951bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
952bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
953bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
954bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
955bb1ba6acSHisping Lin 
956bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
957bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
958bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
959bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
960bb1ba6acSHisping Lin 
961bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
962bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
963bb1ba6acSHisping Lin 		return TeecResult;
964bb1ba6acSHisping Lin 
965bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
966bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
967bb1ba6acSHisping Lin 		return TeecResult;
968bb1ba6acSHisping Lin 
969bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
970bb1ba6acSHisping Lin 				&TeecSession,
971bb1ba6acSHisping Lin 				TeecUuid,
972bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
973bb1ba6acSHisping Lin 				NULL,
974bb1ba6acSHisping Lin 				NULL,
975bb1ba6acSHisping Lin 				&ErrorOrigin);
976bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
977bb1ba6acSHisping Lin 		return TeecResult;
978bb1ba6acSHisping Lin 
979bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
980bb1ba6acSHisping Lin 
981bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
982bb1ba6acSHisping Lin 
983bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
984bb1ba6acSHisping Lin 	SharedMem.flags = 0;
985bb1ba6acSHisping Lin 
986bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
987bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
988bb1ba6acSHisping Lin 		goto exit;
989bb1ba6acSHisping Lin 
990bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
991bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
992bb1ba6acSHisping Lin 
993bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
994bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
995bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
996bb1ba6acSHisping Lin 						    TEEC_NONE,
997bb1ba6acSHisping Lin 						    TEEC_NONE);
998bb1ba6acSHisping Lin 
999bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
100090e849a0Sxb.wang 					STORAGE_CMD_WRITE_OEM_OTP_KEY,
1001bb1ba6acSHisping Lin 					&TeecOperation,
1002bb1ba6acSHisping Lin 					&ErrorOrigin);
1003bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1004bb1ba6acSHisping Lin 		goto exit;
1005bb1ba6acSHisping Lin 
1006bb1ba6acSHisping Lin exit:
1007bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1008bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
1009bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1010bb1ba6acSHisping Lin 
1011bb1ba6acSHisping Lin 	return TeecResult;
1012bb1ba6acSHisping Lin }
1013bb1ba6acSHisping Lin 
10149deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value)
10159deb34f6SHisping Lin {
10169deb34f6SHisping Lin 	TEEC_Result TeecResult;
10179deb34f6SHisping Lin 	TEEC_Context TeecContext;
10189deb34f6SHisping Lin 	TEEC_Session TeecSession;
10199deb34f6SHisping Lin 	uint32_t ErrorOrigin;
10209deb34f6SHisping Lin 
10219deb34f6SHisping Lin 	*value = 0xFF;
10229deb34f6SHisping Lin 
10239deb34f6SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
10249deb34f6SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
10259deb34f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
10269deb34f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
10279deb34f6SHisping Lin 
10289deb34f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
10299deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10309deb34f6SHisping Lin 		return TeecResult;
10319deb34f6SHisping Lin 
10329deb34f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
10339deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10349deb34f6SHisping Lin 		return TeecResult;
10359deb34f6SHisping Lin 
10369deb34f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
10379deb34f6SHisping Lin 				&TeecSession,
10389deb34f6SHisping Lin 				TeecUuid,
10399deb34f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
10409deb34f6SHisping Lin 				NULL,
10419deb34f6SHisping Lin 				NULL,
10429deb34f6SHisping Lin 				&ErrorOrigin);
10439deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10449deb34f6SHisping Lin 		return TeecResult;
10459deb34f6SHisping Lin 
10469deb34f6SHisping Lin 	TeecOperation.params[0].value.a = key_id;
10479deb34f6SHisping Lin 
10489deb34f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
10499deb34f6SHisping Lin 						    TEEC_NONE,
10509deb34f6SHisping Lin 						    TEEC_NONE,
10519deb34f6SHisping Lin 						    TEEC_NONE);
10529deb34f6SHisping Lin 
10539deb34f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10549deb34f6SHisping Lin 					STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN,
10559deb34f6SHisping Lin 					&TeecOperation,
10569deb34f6SHisping Lin 					&ErrorOrigin);
10579deb34f6SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
10589deb34f6SHisping Lin 		*value = TeecOperation.params[0].value.b;
10599deb34f6SHisping Lin 
10609deb34f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
10619deb34f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10629deb34f6SHisping Lin 
10639deb34f6SHisping Lin 	return TeecResult;
10649deb34f6SHisping Lin }
10659deb34f6SHisping Lin 
106690e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)
1067a405238aSHisping Lin {
1068a405238aSHisping Lin 	TEEC_Result TeecResult;
1069a405238aSHisping Lin 	TEEC_Context TeecContext;
1070a405238aSHisping Lin 	TEEC_Session TeecSession;
1071a405238aSHisping Lin 	uint32_t ErrorOrigin;
1072a405238aSHisping Lin 
1073a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1074a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1075a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1076a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
1077a405238aSHisping Lin 
1078a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1079a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1080a405238aSHisping Lin 		return TeecResult;
1081a405238aSHisping Lin 
1082a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1083a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1084a405238aSHisping Lin 		return TeecResult;
1085a405238aSHisping Lin 
1086a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1087a405238aSHisping Lin 				&TeecSession,
1088a405238aSHisping Lin 				TeecUuid,
1089a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
1090a405238aSHisping Lin 				NULL,
1091a405238aSHisping Lin 				NULL,
1092a405238aSHisping Lin 				&ErrorOrigin);
1093a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1094a405238aSHisping Lin 		return TeecResult;
1095a405238aSHisping Lin 
1096a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
1097a405238aSHisping Lin 
1098a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1099a405238aSHisping Lin 						    TEEC_NONE,
1100a405238aSHisping Lin 						    TEEC_NONE,
1101a405238aSHisping Lin 						    TEEC_NONE);
1102a405238aSHisping Lin 
1103a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1104a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
1105a405238aSHisping Lin 					&TeecOperation,
1106a405238aSHisping Lin 					&ErrorOrigin);
1107a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1108a405238aSHisping Lin 		goto exit;
1109a405238aSHisping Lin 
1110a405238aSHisping Lin exit:
1111a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
1112a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1113a405238aSHisping Lin 
1114a405238aSHisping Lin 	return TeecResult;
1115a405238aSHisping Lin }
1116a405238aSHisping Lin 
11172f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config,
11182f8c34bdSxb.wang 				   uint32_t src_phys_addr, uint32_t dst_phys_addr,
11192f8c34bdSxb.wang 				   uint32_t len)
1120fc3694d6Sxb.wang {
1121fc3694d6Sxb.wang 	TEEC_Result TeecResult;
1122fc3694d6Sxb.wang 	TEEC_Context TeecContext;
1123fc3694d6Sxb.wang 	TEEC_Session TeecSession;
1124fc3694d6Sxb.wang 	TEEC_Operation TeecOperation = {0};
1125fc3694d6Sxb.wang 	uint32_t ErrorOrigin;
1126fc3694d6Sxb.wang 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
1127fc3694d6Sxb.wang 	TEEC_SharedMemory SharedMem_config = {0};
1128fc3694d6Sxb.wang 
11292f8c34bdSxb.wang 	if (key_id != RK_OEM_OTP_KEY0 &&
11302f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY1 &&
11312f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY2 &&
11322f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY3 &&
11332f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY_FW)
1134fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1135fc3694d6Sxb.wang 
11362f8c34bdSxb.wang 	if (!config)
1137fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1138fc3694d6Sxb.wang 
1139fc3694d6Sxb.wang 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
1140fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1141fc3694d6Sxb.wang 
1142fc3694d6Sxb.wang 	if (config->mode >= RK_CIPHER_MODE_XTS)
1143fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1144fc3694d6Sxb.wang 
1145fc3694d6Sxb.wang 	if (config->operation != RK_MODE_ENCRYPT &&
1146fc3694d6Sxb.wang 	    config->operation != RK_MODE_DECRYPT)
1147fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1148fc3694d6Sxb.wang 
1149fc3694d6Sxb.wang 	if (config->key_len != 16 &&
1150fc3694d6Sxb.wang 	    config->key_len != 24 &&
1151fc3694d6Sxb.wang 	    config->key_len != 32)
1152fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1153fc3694d6Sxb.wang 
11542f8c34bdSxb.wang 	if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16)
11552f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11562f8c34bdSxb.wang 
11572f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126)
11582f8c34bdSxb.wang 	if (config->key_len == 24)
11592f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11602f8c34bdSxb.wang #endif
11612f8c34bdSxb.wang 
1162fc3694d6Sxb.wang 	if (len % AES_BLOCK_SIZE ||
1163fc3694d6Sxb.wang 	    len == 0)
1164fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1165fc3694d6Sxb.wang 
11662f8c34bdSxb.wang 	if (!src_phys_addr || !dst_phys_addr)
11672f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11682f8c34bdSxb.wang 
1169fc3694d6Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
1170fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1171fc3694d6Sxb.wang 		return TeecResult;
1172fc3694d6Sxb.wang 
1173fc3694d6Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1174fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1175fc3694d6Sxb.wang 		return TeecResult;
1176fc3694d6Sxb.wang 
1177fc3694d6Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
1178fc3694d6Sxb.wang 				      &TeecSession,
1179fc3694d6Sxb.wang 				      &uuid,
1180fc3694d6Sxb.wang 				      TEEC_LOGIN_PUBLIC,
1181fc3694d6Sxb.wang 				      NULL,
1182fc3694d6Sxb.wang 				      NULL,
1183fc3694d6Sxb.wang 				      &ErrorOrigin);
1184fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1185fc3694d6Sxb.wang 		goto exit;
1186fc3694d6Sxb.wang 
1187fc3694d6Sxb.wang 	SharedMem_config.size = sizeof(rk_cipher_config);
1188fc3694d6Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
1189fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1190fc3694d6Sxb.wang 		goto exit;
1191fc3694d6Sxb.wang 
1192fc3694d6Sxb.wang 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
1193fc3694d6Sxb.wang 	TeecOperation.params[0].value.a       = key_id;
1194fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
1195fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
11962f8c34bdSxb.wang 	TeecOperation.params[2].value.a       = src_phys_addr;
11972f8c34bdSxb.wang 	TeecOperation.params[2].value.b       = len;
11982f8c34bdSxb.wang 	TeecOperation.params[3].value.a       = dst_phys_addr;
1199fc3694d6Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1200fc3694d6Sxb.wang 						    TEEC_MEMREF_TEMP_INPUT,
12012f8c34bdSxb.wang 						    TEEC_VALUE_INPUT,
12022f8c34bdSxb.wang 						    TEEC_VALUE_INPUT);
12032f8c34bdSxb.wang 
12042f8c34bdSxb.wang 	crypto_flush_cacheline(src_phys_addr, len);
12052f8c34bdSxb.wang 	crypto_flush_cacheline(dst_phys_addr, len);
12062f8c34bdSxb.wang 
1207fc3694d6Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12082f8c34bdSxb.wang 					CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER,
1209fc3694d6Sxb.wang 					&TeecOperation,
1210fc3694d6Sxb.wang 					&ErrorOrigin);
1211fc3694d6Sxb.wang 
1212a900eef3SHisping Lin 	crypto_invalidate_cacheline(dst_phys_addr, len);
1213a900eef3SHisping Lin 
1214fc3694d6Sxb.wang exit:
1215fc3694d6Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem_config);
1216fc3694d6Sxb.wang 	TEEC_CloseSession(&TeecSession);
1217fc3694d6Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
1218fc3694d6Sxb.wang 	return TeecResult;
1219fc3694d6Sxb.wang }
1220fc3694d6Sxb.wang 
1221a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id,
1222a828eba9SHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
1223a828eba9SHisping Lin {
1224a828eba9SHisping Lin 	TEEC_Result TeecResult;
1225a828eba9SHisping Lin 	TEEC_Context TeecContext;
1226a828eba9SHisping Lin 	TEEC_Session TeecSession;
1227a828eba9SHisping Lin 	uint32_t ErrorOrigin;
1228a828eba9SHisping Lin 
1229a828eba9SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1230a828eba9SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1231a828eba9SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1232a828eba9SHisping Lin 	TEEC_Operation TeecOperation = {0};
1233a828eba9SHisping Lin 
1234a828eba9SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1235a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1236a828eba9SHisping Lin 		return TeecResult;
1237a828eba9SHisping Lin 
1238a828eba9SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1239a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1240a828eba9SHisping Lin 		return TeecResult;
1241a828eba9SHisping Lin 
1242a828eba9SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1243a828eba9SHisping Lin 				&TeecSession,
1244a828eba9SHisping Lin 				TeecUuid,
1245a828eba9SHisping Lin 				TEEC_LOGIN_PUBLIC,
1246a828eba9SHisping Lin 				NULL,
1247a828eba9SHisping Lin 				NULL,
1248a828eba9SHisping Lin 				&ErrorOrigin);
1249a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1250a828eba9SHisping Lin 		return TeecResult;
1251a828eba9SHisping Lin 
1252a828eba9SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1253a828eba9SHisping Lin 
1254a828eba9SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1255a828eba9SHisping Lin 
1256a828eba9SHisping Lin 	SharedMem.size = byte_len;
1257a828eba9SHisping Lin 	SharedMem.flags = 0;
1258a828eba9SHisping Lin 
1259a828eba9SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1260a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1261a828eba9SHisping Lin 		goto exit;
1262a828eba9SHisping Lin 
1263a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1264a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1265a828eba9SHisping Lin 
1266a828eba9SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1267a828eba9SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1268a828eba9SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1269a828eba9SHisping Lin 						    TEEC_NONE,
1270a828eba9SHisping Lin 						    TEEC_NONE);
1271a828eba9SHisping Lin 
1272a828eba9SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1273a828eba9SHisping Lin 					STORAGE_CMD_WRITE_OEM_HDCP_KEY,
1274a828eba9SHisping Lin 					&TeecOperation,
1275a828eba9SHisping Lin 					&ErrorOrigin);
1276a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1277a828eba9SHisping Lin 		goto exit;
1278a828eba9SHisping Lin 
1279a828eba9SHisping Lin exit:
1280a828eba9SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1281a828eba9SHisping Lin 	TEEC_CloseSession(&TeecSession);
1282a828eba9SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1283a828eba9SHisping Lin 
1284a828eba9SHisping Lin 	return TeecResult;
1285a828eba9SHisping Lin }
1286a828eba9SHisping Lin 
1287e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value)
1288e8bc2655SHisping Lin {
1289e8bc2655SHisping Lin 	TEEC_Result TeecResult;
1290e8bc2655SHisping Lin 	TEEC_Context TeecContext;
1291e8bc2655SHisping Lin 	TEEC_Session TeecSession;
1292e8bc2655SHisping Lin 	uint32_t ErrorOrigin;
1293e8bc2655SHisping Lin 
1294e8bc2655SHisping Lin 	*value = 0xFF;
1295e8bc2655SHisping Lin 
1296e8bc2655SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1297e8bc2655SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1298e8bc2655SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1299e8bc2655SHisping Lin 	TEEC_Operation TeecOperation = {0};
1300e8bc2655SHisping Lin 
1301e8bc2655SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1302e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1303e8bc2655SHisping Lin 		return TeecResult;
1304e8bc2655SHisping Lin 
1305e8bc2655SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1306e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1307e8bc2655SHisping Lin 		return TeecResult;
1308e8bc2655SHisping Lin 
1309e8bc2655SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1310e8bc2655SHisping Lin 				&TeecSession,
1311e8bc2655SHisping Lin 				TeecUuid,
1312e8bc2655SHisping Lin 				TEEC_LOGIN_PUBLIC,
1313e8bc2655SHisping Lin 				NULL,
1314e8bc2655SHisping Lin 				NULL,
1315e8bc2655SHisping Lin 				&ErrorOrigin);
1316e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1317e8bc2655SHisping Lin 		return TeecResult;
1318e8bc2655SHisping Lin 
1319e8bc2655SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1320e8bc2655SHisping Lin 
1321e8bc2655SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1322e8bc2655SHisping Lin 						    TEEC_NONE,
1323e8bc2655SHisping Lin 						    TEEC_NONE,
1324e8bc2655SHisping Lin 						    TEEC_NONE);
1325e8bc2655SHisping Lin 
1326e8bc2655SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1327e8bc2655SHisping Lin 					STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN,
1328e8bc2655SHisping Lin 					&TeecOperation,
1329e8bc2655SHisping Lin 					&ErrorOrigin);
1330e8bc2655SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1331e8bc2655SHisping Lin 		*value = TeecOperation.params[0].value.b;
1332e8bc2655SHisping Lin 
1333e8bc2655SHisping Lin 	TEEC_CloseSession(&TeecSession);
1334e8bc2655SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1335e8bc2655SHisping Lin 
1336e8bc2655SHisping Lin 	return TeecResult;
1337e8bc2655SHisping Lin }
1338e8bc2655SHisping Lin 
1339bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id)
1340bfd9cea4SHisping Lin {
1341bfd9cea4SHisping Lin 	TEEC_Result TeecResult;
1342bfd9cea4SHisping Lin 	TEEC_Context TeecContext;
1343bfd9cea4SHisping Lin 	TEEC_Session TeecSession;
1344bfd9cea4SHisping Lin 	uint32_t ErrorOrigin;
1345bfd9cea4SHisping Lin 
1346bfd9cea4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1347bfd9cea4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1348bfd9cea4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1349bfd9cea4SHisping Lin 	TEEC_Operation TeecOperation = {0};
1350bfd9cea4SHisping Lin 
1351bfd9cea4SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1352bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1353bfd9cea4SHisping Lin 		return TeecResult;
1354bfd9cea4SHisping Lin 
1355bfd9cea4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1356bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1357bfd9cea4SHisping Lin 		return TeecResult;
1358bfd9cea4SHisping Lin 
1359bfd9cea4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1360bfd9cea4SHisping Lin 				&TeecSession,
1361bfd9cea4SHisping Lin 				TeecUuid,
1362bfd9cea4SHisping Lin 				TEEC_LOGIN_PUBLIC,
1363bfd9cea4SHisping Lin 				NULL,
1364bfd9cea4SHisping Lin 				NULL,
1365bfd9cea4SHisping Lin 				&ErrorOrigin);
1366bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1367bfd9cea4SHisping Lin 		return TeecResult;
1368bfd9cea4SHisping Lin 
1369bfd9cea4SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1370bfd9cea4SHisping Lin 
1371bfd9cea4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1372bfd9cea4SHisping Lin 						    TEEC_NONE,
1373bfd9cea4SHisping Lin 						    TEEC_NONE,
1374bfd9cea4SHisping Lin 						    TEEC_NONE);
1375bfd9cea4SHisping Lin 
1376bfd9cea4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1377bfd9cea4SHisping Lin 					STORAGE_CMD_SET_OEM_HDCP_KEY_MASK,
1378bfd9cea4SHisping Lin 					&TeecOperation,
1379bfd9cea4SHisping Lin 					&ErrorOrigin);
1380bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1381bfd9cea4SHisping Lin 		goto exit;
1382bfd9cea4SHisping Lin 
1383bfd9cea4SHisping Lin exit:
1384bfd9cea4SHisping Lin 	TEEC_CloseSession(&TeecSession);
1385bfd9cea4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1386bfd9cea4SHisping Lin 
1387bfd9cea4SHisping Lin 	return TeecResult;
1388bfd9cea4SHisping Lin }
1389bfd9cea4SHisping Lin 
1390ac6d8253SHisping Lin uint32_t trusty_write_esck_key(enum RK_ESCK_KEYID key_id,
1391ac6d8253SHisping Lin 			       uint8_t *byte_buf, uint32_t byte_len)
1392ac6d8253SHisping Lin {
1393ac6d8253SHisping Lin 	TEEC_Result TeecResult;
1394ac6d8253SHisping Lin 	TEEC_Context TeecContext;
1395ac6d8253SHisping Lin 	TEEC_Session TeecSession;
1396ac6d8253SHisping Lin 	uint32_t ErrorOrigin;
1397ac6d8253SHisping Lin 
1398ac6d8253SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1399ac6d8253SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1400ac6d8253SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1401ac6d8253SHisping Lin 	TEEC_Operation TeecOperation = {0};
1402ac6d8253SHisping Lin 
1403ac6d8253SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1404ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1405ac6d8253SHisping Lin 		return TeecResult;
1406ac6d8253SHisping Lin 
1407ac6d8253SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1408ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1409ac6d8253SHisping Lin 		return TeecResult;
1410ac6d8253SHisping Lin 
1411ac6d8253SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1412ac6d8253SHisping Lin 				&TeecSession,
1413ac6d8253SHisping Lin 				TeecUuid,
1414ac6d8253SHisping Lin 				TEEC_LOGIN_PUBLIC,
1415ac6d8253SHisping Lin 				NULL,
1416ac6d8253SHisping Lin 				NULL,
1417ac6d8253SHisping Lin 				&ErrorOrigin);
1418ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1419ac6d8253SHisping Lin 		return TeecResult;
1420ac6d8253SHisping Lin 
1421ac6d8253SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1422ac6d8253SHisping Lin 
1423ac6d8253SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1424ac6d8253SHisping Lin 
1425ac6d8253SHisping Lin 	SharedMem.size = byte_len;
1426ac6d8253SHisping Lin 	SharedMem.flags = 0;
1427ac6d8253SHisping Lin 
1428ac6d8253SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1429ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1430ac6d8253SHisping Lin 		goto exit;
1431ac6d8253SHisping Lin 
1432ac6d8253SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1433ac6d8253SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1434ac6d8253SHisping Lin 
1435ac6d8253SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1436ac6d8253SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1437ac6d8253SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1438ac6d8253SHisping Lin 						    TEEC_NONE,
1439ac6d8253SHisping Lin 						    TEEC_NONE);
1440ac6d8253SHisping Lin 
1441ac6d8253SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1442ac6d8253SHisping Lin 					STORAGE_CMD_WRITE_ESCK_KEY,
1443ac6d8253SHisping Lin 					&TeecOperation,
1444ac6d8253SHisping Lin 					&ErrorOrigin);
1445ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1446ac6d8253SHisping Lin 		goto exit;
1447ac6d8253SHisping Lin 
1448ac6d8253SHisping Lin exit:
1449ac6d8253SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1450ac6d8253SHisping Lin 	TEEC_CloseSession(&TeecSession);
1451ac6d8253SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1452ac6d8253SHisping Lin 
1453ac6d8253SHisping Lin 	return TeecResult;
1454ac6d8253SHisping Lin }
1455ac6d8253SHisping Lin 
1456ac6d8253SHisping Lin uint32_t trusty_esck_key_is_written(enum RK_ESCK_KEYID key_id, uint8_t *value)
1457ac6d8253SHisping Lin {
1458ac6d8253SHisping Lin 	TEEC_Result TeecResult;
1459ac6d8253SHisping Lin 	TEEC_Context TeecContext;
1460ac6d8253SHisping Lin 	TEEC_Session TeecSession;
1461ac6d8253SHisping Lin 	uint32_t ErrorOrigin;
1462ac6d8253SHisping Lin 
1463ac6d8253SHisping Lin 	*value = 0xFF;
1464ac6d8253SHisping Lin 
1465ac6d8253SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1466ac6d8253SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1467ac6d8253SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1468ac6d8253SHisping Lin 	TEEC_Operation TeecOperation = {0};
1469ac6d8253SHisping Lin 
1470ac6d8253SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1471ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1472ac6d8253SHisping Lin 		return TeecResult;
1473ac6d8253SHisping Lin 
1474ac6d8253SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1475ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1476ac6d8253SHisping Lin 		return TeecResult;
1477ac6d8253SHisping Lin 
1478ac6d8253SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1479ac6d8253SHisping Lin 				&TeecSession,
1480ac6d8253SHisping Lin 				TeecUuid,
1481ac6d8253SHisping Lin 				TEEC_LOGIN_PUBLIC,
1482ac6d8253SHisping Lin 				NULL,
1483ac6d8253SHisping Lin 				NULL,
1484ac6d8253SHisping Lin 				&ErrorOrigin);
1485ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1486ac6d8253SHisping Lin 		return TeecResult;
1487ac6d8253SHisping Lin 
1488ac6d8253SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1489ac6d8253SHisping Lin 
1490ac6d8253SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1491ac6d8253SHisping Lin 						    TEEC_NONE,
1492ac6d8253SHisping Lin 						    TEEC_NONE,
1493ac6d8253SHisping Lin 						    TEEC_NONE);
1494ac6d8253SHisping Lin 
1495ac6d8253SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1496ac6d8253SHisping Lin 					STORAGE_CMD_ESCK_KEY_IS_WRITTEN,
1497ac6d8253SHisping Lin 					&TeecOperation,
1498ac6d8253SHisping Lin 					&ErrorOrigin);
1499ac6d8253SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1500ac6d8253SHisping Lin 		*value = TeecOperation.params[0].value.b;
1501ac6d8253SHisping Lin 
1502ac6d8253SHisping Lin 	TEEC_CloseSession(&TeecSession);
1503ac6d8253SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1504ac6d8253SHisping Lin 
1505ac6d8253SHisping Lin 	return TeecResult;
1506ac6d8253SHisping Lin }
1507ac6d8253SHisping Lin 
1508ac6d8253SHisping Lin uint32_t trusty_set_esck_key_mask(enum RK_ESCK_KEYID key_id)
1509ac6d8253SHisping Lin {
1510ac6d8253SHisping Lin 	TEEC_Result TeecResult;
1511ac6d8253SHisping Lin 	TEEC_Context TeecContext;
1512ac6d8253SHisping Lin 	TEEC_Session TeecSession;
1513ac6d8253SHisping Lin 	uint32_t ErrorOrigin;
1514ac6d8253SHisping Lin 
1515ac6d8253SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1516ac6d8253SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1517ac6d8253SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1518ac6d8253SHisping Lin 	TEEC_Operation TeecOperation = {0};
1519ac6d8253SHisping Lin 
1520ac6d8253SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1521ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1522ac6d8253SHisping Lin 		return TeecResult;
1523ac6d8253SHisping Lin 
1524ac6d8253SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1525ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1526ac6d8253SHisping Lin 		return TeecResult;
1527ac6d8253SHisping Lin 
1528ac6d8253SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1529ac6d8253SHisping Lin 				&TeecSession,
1530ac6d8253SHisping Lin 				TeecUuid,
1531ac6d8253SHisping Lin 				TEEC_LOGIN_PUBLIC,
1532ac6d8253SHisping Lin 				NULL,
1533ac6d8253SHisping Lin 				NULL,
1534ac6d8253SHisping Lin 				&ErrorOrigin);
1535ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1536ac6d8253SHisping Lin 		return TeecResult;
1537ac6d8253SHisping Lin 
1538ac6d8253SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1539ac6d8253SHisping Lin 
1540ac6d8253SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1541ac6d8253SHisping Lin 						    TEEC_NONE,
1542ac6d8253SHisping Lin 						    TEEC_NONE,
1543ac6d8253SHisping Lin 						    TEEC_NONE);
1544ac6d8253SHisping Lin 
1545ac6d8253SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1546ac6d8253SHisping Lin 					STORAGE_CMD_SET_ESCK_KEY_MASK,
1547ac6d8253SHisping Lin 					&TeecOperation,
1548ac6d8253SHisping Lin 					&ErrorOrigin);
1549ac6d8253SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1550ac6d8253SHisping Lin 		goto exit;
1551ac6d8253SHisping Lin 
1552ac6d8253SHisping Lin exit:
1553ac6d8253SHisping Lin 	TEEC_CloseSession(&TeecSession);
1554ac6d8253SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1555ac6d8253SHisping Lin 
1556ac6d8253SHisping Lin 	return TeecResult;
1557ac6d8253SHisping Lin }
1558ac6d8253SHisping Lin 
1559*11b25801SHisping Lin uint32_t trusty_write_fw_encrypt_key(enum RK_FW_KEYID key_id,
1560*11b25801SHisping Lin 				     uint8_t *byte_buf, uint32_t byte_len)
1561*11b25801SHisping Lin {
1562*11b25801SHisping Lin 	TEEC_Result TeecResult;
1563*11b25801SHisping Lin 	TEEC_Context TeecContext;
1564*11b25801SHisping Lin 	TEEC_Session TeecSession;
1565*11b25801SHisping Lin 	uint32_t ErrorOrigin;
1566*11b25801SHisping Lin 
1567*11b25801SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1568*11b25801SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1569*11b25801SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1570*11b25801SHisping Lin 	TEEC_Operation TeecOperation = {0};
1571*11b25801SHisping Lin 
1572*11b25801SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1573*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1574*11b25801SHisping Lin 		return TeecResult;
1575*11b25801SHisping Lin 
1576*11b25801SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1577*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1578*11b25801SHisping Lin 		return TeecResult;
1579*11b25801SHisping Lin 
1580*11b25801SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1581*11b25801SHisping Lin 				&TeecSession,
1582*11b25801SHisping Lin 				TeecUuid,
1583*11b25801SHisping Lin 				TEEC_LOGIN_PUBLIC,
1584*11b25801SHisping Lin 				NULL,
1585*11b25801SHisping Lin 				NULL,
1586*11b25801SHisping Lin 				&ErrorOrigin);
1587*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1588*11b25801SHisping Lin 		return TeecResult;
1589*11b25801SHisping Lin 
1590*11b25801SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1591*11b25801SHisping Lin 
1592*11b25801SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1593*11b25801SHisping Lin 
1594*11b25801SHisping Lin 	SharedMem.size = byte_len;
1595*11b25801SHisping Lin 	SharedMem.flags = 0;
1596*11b25801SHisping Lin 
1597*11b25801SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1598*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1599*11b25801SHisping Lin 		goto exit;
1600*11b25801SHisping Lin 
1601*11b25801SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1602*11b25801SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1603*11b25801SHisping Lin 
1604*11b25801SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1605*11b25801SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1606*11b25801SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1607*11b25801SHisping Lin 						    TEEC_NONE,
1608*11b25801SHisping Lin 						    TEEC_NONE);
1609*11b25801SHisping Lin 
1610*11b25801SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1611*11b25801SHisping Lin 					STORAGE_CMD_WRITE_FW_ENCRYPT_KEY,
1612*11b25801SHisping Lin 					&TeecOperation,
1613*11b25801SHisping Lin 					&ErrorOrigin);
1614*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1615*11b25801SHisping Lin 		goto exit;
1616*11b25801SHisping Lin 
1617*11b25801SHisping Lin exit:
1618*11b25801SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1619*11b25801SHisping Lin 	TEEC_CloseSession(&TeecSession);
1620*11b25801SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1621*11b25801SHisping Lin 
1622*11b25801SHisping Lin 	return TeecResult;
1623*11b25801SHisping Lin }
1624*11b25801SHisping Lin 
1625*11b25801SHisping Lin uint32_t trusty_fw_encrypt_key_is_written(enum RK_FW_KEYID key_id, uint8_t *value)
1626*11b25801SHisping Lin {
1627*11b25801SHisping Lin 	TEEC_Result TeecResult;
1628*11b25801SHisping Lin 	TEEC_Context TeecContext;
1629*11b25801SHisping Lin 	TEEC_Session TeecSession;
1630*11b25801SHisping Lin 	uint32_t ErrorOrigin;
1631*11b25801SHisping Lin 
1632*11b25801SHisping Lin 	*value = 0xFF;
1633*11b25801SHisping Lin 
1634*11b25801SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1635*11b25801SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1636*11b25801SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1637*11b25801SHisping Lin 	TEEC_Operation TeecOperation = {0};
1638*11b25801SHisping Lin 
1639*11b25801SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1640*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1641*11b25801SHisping Lin 		return TeecResult;
1642*11b25801SHisping Lin 
1643*11b25801SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1644*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1645*11b25801SHisping Lin 		return TeecResult;
1646*11b25801SHisping Lin 
1647*11b25801SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1648*11b25801SHisping Lin 				&TeecSession,
1649*11b25801SHisping Lin 				TeecUuid,
1650*11b25801SHisping Lin 				TEEC_LOGIN_PUBLIC,
1651*11b25801SHisping Lin 				NULL,
1652*11b25801SHisping Lin 				NULL,
1653*11b25801SHisping Lin 				&ErrorOrigin);
1654*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1655*11b25801SHisping Lin 		return TeecResult;
1656*11b25801SHisping Lin 
1657*11b25801SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1658*11b25801SHisping Lin 
1659*11b25801SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1660*11b25801SHisping Lin 						    TEEC_NONE,
1661*11b25801SHisping Lin 						    TEEC_NONE,
1662*11b25801SHisping Lin 						    TEEC_NONE);
1663*11b25801SHisping Lin 
1664*11b25801SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1665*11b25801SHisping Lin 					STORAGE_CMD_FW_ENCRYPT_KEY_IS_WRITTEN,
1666*11b25801SHisping Lin 					&TeecOperation,
1667*11b25801SHisping Lin 					&ErrorOrigin);
1668*11b25801SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1669*11b25801SHisping Lin 		*value = TeecOperation.params[0].value.b;
1670*11b25801SHisping Lin 
1671*11b25801SHisping Lin 	TEEC_CloseSession(&TeecSession);
1672*11b25801SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1673*11b25801SHisping Lin 
1674*11b25801SHisping Lin 	return TeecResult;
1675*11b25801SHisping Lin }
1676*11b25801SHisping Lin 
1677*11b25801SHisping Lin uint32_t trusty_set_fw_encrypt_key_mask(enum RK_FW_KEYID key_id)
1678*11b25801SHisping Lin {
1679*11b25801SHisping Lin 	TEEC_Result TeecResult;
1680*11b25801SHisping Lin 	TEEC_Context TeecContext;
1681*11b25801SHisping Lin 	TEEC_Session TeecSession;
1682*11b25801SHisping Lin 	uint32_t ErrorOrigin;
1683*11b25801SHisping Lin 
1684*11b25801SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1685*11b25801SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1686*11b25801SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1687*11b25801SHisping Lin 	TEEC_Operation TeecOperation = {0};
1688*11b25801SHisping Lin 
1689*11b25801SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1690*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1691*11b25801SHisping Lin 		return TeecResult;
1692*11b25801SHisping Lin 
1693*11b25801SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1694*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1695*11b25801SHisping Lin 		return TeecResult;
1696*11b25801SHisping Lin 
1697*11b25801SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1698*11b25801SHisping Lin 				&TeecSession,
1699*11b25801SHisping Lin 				TeecUuid,
1700*11b25801SHisping Lin 				TEEC_LOGIN_PUBLIC,
1701*11b25801SHisping Lin 				NULL,
1702*11b25801SHisping Lin 				NULL,
1703*11b25801SHisping Lin 				&ErrorOrigin);
1704*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1705*11b25801SHisping Lin 		return TeecResult;
1706*11b25801SHisping Lin 
1707*11b25801SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1708*11b25801SHisping Lin 
1709*11b25801SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1710*11b25801SHisping Lin 						    TEEC_NONE,
1711*11b25801SHisping Lin 						    TEEC_NONE,
1712*11b25801SHisping Lin 						    TEEC_NONE);
1713*11b25801SHisping Lin 
1714*11b25801SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1715*11b25801SHisping Lin 					STORAGE_CMD_SET_FW_ENCRYPT_KEY_MASK,
1716*11b25801SHisping Lin 					&TeecOperation,
1717*11b25801SHisping Lin 					&ErrorOrigin);
1718*11b25801SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1719*11b25801SHisping Lin 		goto exit;
1720*11b25801SHisping Lin 
1721*11b25801SHisping Lin exit:
1722*11b25801SHisping Lin 	TEEC_CloseSession(&TeecSession);
1723*11b25801SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1724*11b25801SHisping Lin 
1725*11b25801SHisping Lin 	return TeecResult;
1726*11b25801SHisping Lin }
17274d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void)
17284d4c5043SHisping Lin {
17294d4c5043SHisping Lin 	TEEC_Result TeecResult;
17304d4c5043SHisping Lin 	TEEC_Context TeecContext;
17314d4c5043SHisping Lin 	TEEC_Session TeecSession;
17324d4c5043SHisping Lin 	uint32_t ErrorOrigin;
17334d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
17344d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
17354d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
17364d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
17374d4c5043SHisping Lin 	const uint8_t transfer_inout[] = "Transfer data test.";
17384d4c5043SHisping Lin 
17394d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
17404d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17414d4c5043SHisping Lin 		return TeecResult;
17424d4c5043SHisping Lin 
17434d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
17444d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17454d4c5043SHisping Lin 		return TeecResult;
17464d4c5043SHisping Lin 
17474d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
17484d4c5043SHisping Lin 						TEEC_NONE,
17494d4c5043SHisping Lin 						TEEC_NONE,
17504d4c5043SHisping Lin 						TEEC_NONE);
17514d4c5043SHisping Lin 
17524d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
17534d4c5043SHisping Lin 				&TeecSession,
17544d4c5043SHisping Lin 				TeecUuid,
17554d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
17564d4c5043SHisping Lin 				NULL,
17574d4c5043SHisping Lin 				&TeecOperation,
17584d4c5043SHisping Lin 				&ErrorOrigin);
17594d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17604d4c5043SHisping Lin 		return TeecResult;
17614d4c5043SHisping Lin 
17624d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
17634d4c5043SHisping Lin 
17644d4c5043SHisping Lin 	SharedMem0.size = sizeof(transfer_inout);
17654d4c5043SHisping Lin 	SharedMem0.flags = 0;
17664d4c5043SHisping Lin 
17674d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
17684d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17694d4c5043SHisping Lin 		goto exit;
17704d4c5043SHisping Lin 
17714d4c5043SHisping Lin 	memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size);
17724d4c5043SHisping Lin 
17734d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
17744d4c5043SHisping Lin 
17754d4c5043SHisping Lin 	SharedMem1.size = sizeof(transfer_inout);
17764d4c5043SHisping Lin 	SharedMem1.flags = 0;
17774d4c5043SHisping Lin 
17784d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
17794d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17804d4c5043SHisping Lin 		goto exit;
17814d4c5043SHisping Lin 
17824d4c5043SHisping Lin 	TeecOperation.params[0].value.a = 66;
17834d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer;
17844d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem0.size;
17854d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer;
17864d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.size = SharedMem1.size;
17874d4c5043SHisping Lin 
17884d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
17894d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_INPUT,
17904d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_OUTPUT,
17914d4c5043SHisping Lin 						TEEC_NONE);
17924d4c5043SHisping Lin 
17934d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17944d4c5043SHisping Lin 					102,
17954d4c5043SHisping Lin 					&TeecOperation,
17964d4c5043SHisping Lin 					&ErrorOrigin);
17974d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
17984d4c5043SHisping Lin 		goto exit;
17994d4c5043SHisping Lin 
18004d4c5043SHisping Lin 	//Check the result
18014d4c5043SHisping Lin 	if (TeecOperation.params[0].value.a == 66 + 1 &&
18024d4c5043SHisping Lin 	    TeecOperation.params[0].value.b == TeecOperation.params[0].value.a)
18034d4c5043SHisping Lin 		printf("test value : Pass!\n");
18044d4c5043SHisping Lin 	else
18054d4c5043SHisping Lin 		printf("test value : Fail! (mismatch values)\n");
18064d4c5043SHisping Lin 
18074d4c5043SHisping Lin 	if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0)
18084d4c5043SHisping Lin 		printf("test buffer : Pass!\n");
18094d4c5043SHisping Lin 	else
18104d4c5043SHisping Lin 		printf("test buffer : Fail! (mismatch buffer)\n");
18114d4c5043SHisping Lin 
18124d4c5043SHisping Lin exit:
18134d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
18144d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
18154d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
18164d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18174d4c5043SHisping Lin 
18184d4c5043SHisping Lin 	return TeecResult;
18194d4c5043SHisping Lin }
18204d4c5043SHisping Lin 
18214d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void)
18224d4c5043SHisping Lin {
18234d4c5043SHisping Lin 	TEEC_Result TeecResult;
18244d4c5043SHisping Lin 	TEEC_Context TeecContext;
18254d4c5043SHisping Lin 	TEEC_Session TeecSession;
18264d4c5043SHisping Lin 	uint32_t ErrorOrigin;
18274d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
18284d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
18294d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
18304d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
18314d4c5043SHisping Lin 
18324d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
18334d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
18344d4c5043SHisping Lin 		return TeecResult;
18354d4c5043SHisping Lin 
18364d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
18374d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
18384d4c5043SHisping Lin 		return TeecResult;
18394d4c5043SHisping Lin 
18404d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
18414d4c5043SHisping Lin 						TEEC_NONE,
18424d4c5043SHisping Lin 						TEEC_NONE,
18434d4c5043SHisping Lin 						TEEC_NONE);
18444d4c5043SHisping Lin 
18454d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
18464d4c5043SHisping Lin 				&TeecSession,
18474d4c5043SHisping Lin 				TeecUuid,
18484d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
18494d4c5043SHisping Lin 				NULL,
18504d4c5043SHisping Lin 				&TeecOperation,
18514d4c5043SHisping Lin 				&ErrorOrigin);
18524d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
18534d4c5043SHisping Lin 		return TeecResult;
18544d4c5043SHisping Lin 
18554d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
18564d4c5043SHisping Lin 						TEEC_NONE,
18574d4c5043SHisping Lin 						TEEC_NONE,
18584d4c5043SHisping Lin 						TEEC_NONE);
18594d4c5043SHisping Lin 
18604d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18614d4c5043SHisping Lin 					103,
18624d4c5043SHisping Lin 					&TeecOperation,
18634d4c5043SHisping Lin 					&ErrorOrigin);
18644d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
18654d4c5043SHisping Lin 		goto exit;
18664d4c5043SHisping Lin 
18674d4c5043SHisping Lin exit:
18684d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
18694d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18704d4c5043SHisping Lin 
18714d4c5043SHisping Lin 	return TeecResult;
18724d4c5043SHisping Lin }
18734d4c5043SHisping Lin 
18744aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
18754aa61755SAndy Ye {
18764aa61755SAndy Ye 	TEEC_Result TeecResult;
18774aa61755SAndy Ye 	TEEC_Context TeecContext;
18784aa61755SAndy Ye 	TEEC_Session TeecSession;
18794aa61755SAndy Ye 	uint32_t ErrorOrigin;
18804aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18814aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18824aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
18834aa61755SAndy Ye 				}
18844aa61755SAndy Ye 			     };
18854aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
18864aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
18873251364cSHisping Lin 	struct blk_desc *dev_desc;
18883251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
18896651d4c0SJason Zhu 	if (!dev_desc) {
18906651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
18916651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
18926651d4c0SJason Zhu 	}
18934aa61755SAndy Ye 
1894f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1895f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1896f4e1db95SHisping Lin 		return TeecResult;
18974aa61755SAndy Ye 
18984aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1899f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1900f4e1db95SHisping Lin 		return TeecResult;
19014aa61755SAndy Ye 
19023251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
19033251364cSHisping Lin 						TEEC_NONE,
19043251364cSHisping Lin 						TEEC_NONE,
19053251364cSHisping Lin 						TEEC_NONE);
19063251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1907b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1908b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1909b9a7e756SHisping Lin 	else
1910b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1911b9a7e756SHisping Lin 
19123251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
19133251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
19143251364cSHisping Lin #endif
19153251364cSHisping Lin 
19164aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
19174aa61755SAndy Ye 				      &TeecSession,
19184aa61755SAndy Ye 				      TeecUuid,
19194aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
19204aa61755SAndy Ye 				      NULL,
19213251364cSHisping Lin 					&TeecOperation,
19224aa61755SAndy Ye 				      &ErrorOrigin);
1923f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1924f4e1db95SHisping Lin 		return TeecResult;
19254aa61755SAndy Ye 
19264aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
19274aa61755SAndy Ye 
19284aa61755SAndy Ye 	SharedMem0.size = *dh_size;
19294aa61755SAndy Ye 	SharedMem0.flags = 0;
19304aa61755SAndy Ye 
19314aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1932f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1933f4e1db95SHisping Lin 		goto exit;
19344aa61755SAndy Ye 
19354aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
19364aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
19374aa61755SAndy Ye 
19384aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
19394aa61755SAndy Ye 						    TEEC_NONE,
19404aa61755SAndy Ye 						    TEEC_NONE,
19414aa61755SAndy Ye 						    TEEC_NONE);
19424aa61755SAndy Ye 
19434aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
19444aa61755SAndy Ye 					143,
19454aa61755SAndy Ye 					&TeecOperation,
19464aa61755SAndy Ye 					&ErrorOrigin);
1947f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1948f4e1db95SHisping Lin 		goto exit;
19494aa61755SAndy Ye 
19504aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
19514aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1952f4e1db95SHisping Lin exit:
19534aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
19544aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1955f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
19564aa61755SAndy Ye 
19574aa61755SAndy Ye 	return TeecResult;
19584aa61755SAndy Ye }
19594aa61755SAndy Ye 
19604aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
19614aa61755SAndy Ye {
19624aa61755SAndy Ye 	TEEC_Result TeecResult;
19634aa61755SAndy Ye 	TEEC_Context TeecContext;
19644aa61755SAndy Ye 	TEEC_Session TeecSession;
19654aa61755SAndy Ye 	uint32_t ErrorOrigin;
19664aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
19674aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
19684aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
19694aa61755SAndy Ye 				}
19704aa61755SAndy Ye 			     };
19714aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
19724aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
19733251364cSHisping Lin 	struct blk_desc *dev_desc;
19743251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
19756651d4c0SJason Zhu 	if (!dev_desc) {
19766651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
19776651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
19786651d4c0SJason Zhu 	}
19794aa61755SAndy Ye 
1980f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1981f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1982f4e1db95SHisping Lin 		return TeecResult;
19834aa61755SAndy Ye 
19844aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1985f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1986f4e1db95SHisping Lin 		return TeecResult;
19874aa61755SAndy Ye 
19883251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
19893251364cSHisping Lin 						TEEC_NONE,
19903251364cSHisping Lin 						TEEC_NONE,
19913251364cSHisping Lin 						TEEC_NONE);
19923251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1993b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1994b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1995b9a7e756SHisping Lin 	else
1996b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1997b9a7e756SHisping Lin 
19983251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
19993251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
20003251364cSHisping Lin #endif
20013251364cSHisping Lin 
20024aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
20034aa61755SAndy Ye 				      &TeecSession,
20044aa61755SAndy Ye 				      TeecUuid,
20054aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
20064aa61755SAndy Ye 				      NULL,
20073251364cSHisping Lin 					&TeecOperation,
20084aa61755SAndy Ye 				      &ErrorOrigin);
2009f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2010f4e1db95SHisping Lin 		return TeecResult;
20114aa61755SAndy Ye 
20124aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
20134aa61755SAndy Ye 
20144aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
20154aa61755SAndy Ye 	SharedMem0.flags = 0;
20164aa61755SAndy Ye 
20174aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
2018f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2019f4e1db95SHisping Lin 		goto exit;
20204aa61755SAndy Ye 
20214aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
20224aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
20234aa61755SAndy Ye 
20244aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
20254aa61755SAndy Ye 						    TEEC_NONE,
20264aa61755SAndy Ye 						    TEEC_NONE,
20274aa61755SAndy Ye 						    TEEC_NONE);
20284aa61755SAndy Ye 
20294aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
20304aa61755SAndy Ye 					144,
20314aa61755SAndy Ye 					&TeecOperation,
20324aa61755SAndy Ye 					&ErrorOrigin);
2033f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2034f4e1db95SHisping Lin 		goto exit;
20354aa61755SAndy Ye 
20364aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
20374aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
2038f4e1db95SHisping Lin exit:
20394aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
20404aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
2041f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
20424aa61755SAndy Ye 
20434aa61755SAndy Ye 	return TeecResult;
20444aa61755SAndy Ye }
20454aa61755SAndy Ye 
20464aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
20474aa61755SAndy Ye 			      uint32_t *operation_size,
20484aa61755SAndy Ye 			      uint8_t *out,
20494aa61755SAndy Ye 			      uint32_t *out_len)
20504aa61755SAndy Ye {
20514aa61755SAndy Ye 	TEEC_Result TeecResult;
20524aa61755SAndy Ye 	TEEC_Context TeecContext;
20534aa61755SAndy Ye 	TEEC_Session TeecSession;
20544aa61755SAndy Ye 	uint32_t ErrorOrigin;
20554aa61755SAndy Ye 
20564aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
20574aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
20584aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
20594aa61755SAndy Ye 				}
20604aa61755SAndy Ye 			     };
20614aa61755SAndy Ye 
20624aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
20634aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
20643251364cSHisping Lin 	struct blk_desc *dev_desc;
20653251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
20666651d4c0SJason Zhu 	if (!dev_desc) {
20676651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
20686651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
20696651d4c0SJason Zhu 	}
20704aa61755SAndy Ye 
2071f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
2072f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2073f4e1db95SHisping Lin 		return TeecResult;
20744aa61755SAndy Ye 
20754aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
2076f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2077f4e1db95SHisping Lin 		return TeecResult;
20784aa61755SAndy Ye 
20793251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
20803251364cSHisping Lin 						TEEC_NONE,
20813251364cSHisping Lin 						TEEC_NONE,
20823251364cSHisping Lin 						TEEC_NONE);
20833251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2084b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
2085b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
2086b9a7e756SHisping Lin 	else
2087b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
2088b9a7e756SHisping Lin 
20893251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
20903251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
20913251364cSHisping Lin #endif
20923251364cSHisping Lin 
20934aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
20944aa61755SAndy Ye 				      &TeecSession,
20954aa61755SAndy Ye 				      TeecUuid,
20964aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
20974aa61755SAndy Ye 				      NULL,
20983251364cSHisping Lin 					&TeecOperation,
20994aa61755SAndy Ye 				      &ErrorOrigin);
2100f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2101f4e1db95SHisping Lin 		return TeecResult;
21024aa61755SAndy Ye 
21034aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
21044aa61755SAndy Ye 
21054aa61755SAndy Ye 	SharedMem0.size = *operation_size;
21064aa61755SAndy Ye 	SharedMem0.flags = 0;
21074aa61755SAndy Ye 
21084aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
2109f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2110f4e1db95SHisping Lin 		goto exit;
21114aa61755SAndy Ye 
21124aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
21134aa61755SAndy Ye 
21144aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
21154aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
21164aa61755SAndy Ye 
21174aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
21184aa61755SAndy Ye 
21194aa61755SAndy Ye 	SharedMem1.size = *out_len;
21204aa61755SAndy Ye 	SharedMem1.flags = 0;
21214aa61755SAndy Ye 
21224aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
2123f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2124f4e1db95SHisping Lin 		goto exit;
21254aa61755SAndy Ye 
21264aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
21274aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
21284aa61755SAndy Ye 
21294aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
21304aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
21314aa61755SAndy Ye 						    TEEC_NONE,
21324aa61755SAndy Ye 						    TEEC_NONE);
21334aa61755SAndy Ye 
21344aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
21354aa61755SAndy Ye 					145,
21364aa61755SAndy Ye 					&TeecOperation,
21374aa61755SAndy Ye 					&ErrorOrigin);
2138f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2139f4e1db95SHisping Lin 		goto exit;
21404aa61755SAndy Ye 
21414aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
21424aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
2143f4e1db95SHisping Lin exit:
21444aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
21454aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
2146f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
2147f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
21484aa61755SAndy Ye 
21494aa61755SAndy Ye 	return TeecResult;
21504aa61755SAndy Ye }
21514aa61755SAndy Ye 
21524aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
21534aa61755SAndy Ye {
21544aa61755SAndy Ye 	TEEC_Result TeecResult;
21554aa61755SAndy Ye 	TEEC_Context TeecContext;
21564aa61755SAndy Ye 	TEEC_Session TeecSession;
21574aa61755SAndy Ye 	uint32_t ErrorOrigin;
21584aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
21594aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
21604aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
21614aa61755SAndy Ye 				}
21624aa61755SAndy Ye 			     };
21634aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
21644aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
21653251364cSHisping Lin 	struct blk_desc *dev_desc;
21663251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
21676651d4c0SJason Zhu 	if (!dev_desc) {
21686651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
21696651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
21706651d4c0SJason Zhu 	}
2171f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
2172f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2173f4e1db95SHisping Lin 		return TeecResult;
21744aa61755SAndy Ye 
21754aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
2176f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2177f4e1db95SHisping Lin 		return TeecResult;
21784aa61755SAndy Ye 
21793251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
21803251364cSHisping Lin 						TEEC_NONE,
21813251364cSHisping Lin 						TEEC_NONE,
21823251364cSHisping Lin 						TEEC_NONE);
21833251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
2184b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
2185b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
2186b9a7e756SHisping Lin 	else
2187b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
2188b9a7e756SHisping Lin 
21893251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
21903251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
21913251364cSHisping Lin #endif
21923251364cSHisping Lin 
21934aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
21944aa61755SAndy Ye 					&TeecSession,
21954aa61755SAndy Ye 					TeecUuid,
21964aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
21974aa61755SAndy Ye 					NULL,
21983251364cSHisping Lin 					&TeecOperation,
21994aa61755SAndy Ye 					&ErrorOrigin);
2200f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2201f4e1db95SHisping Lin 		return TeecResult;
22024aa61755SAndy Ye 
22034aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
22044aa61755SAndy Ye 
22054aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
22064aa61755SAndy Ye 	SharedMem0.flags = 0;
22074aa61755SAndy Ye 
22084aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
2209f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2210f4e1db95SHisping Lin 		goto exit;
22114aa61755SAndy Ye 
22124aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
22134aa61755SAndy Ye 
22144aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
22154aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
22164aa61755SAndy Ye 
22174aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
22184aa61755SAndy Ye 						    TEEC_NONE,
22194aa61755SAndy Ye 						    TEEC_NONE,
22204aa61755SAndy Ye 						    TEEC_NONE);
22214aa61755SAndy Ye 
22224aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
22234aa61755SAndy Ye 					146,
22244aa61755SAndy Ye 					&TeecOperation,
22254aa61755SAndy Ye 					&ErrorOrigin);
2226f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
2227f4e1db95SHisping Lin 		goto exit;
2228f4e1db95SHisping Lin exit:
22294aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
22304aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
2231f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
22324aa61755SAndy Ye 
22334aa61755SAndy Ye 	return TeecResult;
22344aa61755SAndy Ye }
2235