xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision bfd9cea4b72bab8860067083995cad4847a14c77)
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
35*bfd9cea4SHisping Lin #define STORAGE_CMD_SET_OEM_HDCP_KEY_MASK	23
36ae8ec5e1SHisping Lin 
372f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER	0x00000002
38fc3694d6Sxb.wang 
39fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID	{ 0x0cacdb5d, 0x4fea, 0x466c, \
40fc3694d6Sxb.wang 		{ 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } }
41fc3694d6Sxb.wang 
42ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
43ae8ec5e1SHisping Lin {
44ae8ec5e1SHisping Lin 	if (in > 9)
45ae8ec5e1SHisping Lin 		return in + 55;
46ae8ec5e1SHisping Lin 	else
47ae8ec5e1SHisping Lin 		return in + 48;
48ae8ec5e1SHisping Lin }
49ae8ec5e1SHisping Lin 
50c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
51ae8ec5e1SHisping Lin {
52ae8ec5e1SHisping Lin 	uint32_t i = 0;
53ae8ec5e1SHisping Lin 
54ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
55ae8ec5e1SHisping Lin 		return 0;
56ae8ec5e1SHisping Lin 
57ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
58ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
59ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
60ae8ec5e1SHisping Lin 	}
61ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
62ae8ec5e1SHisping Lin 
63ae8ec5e1SHisping Lin 	return blen * 2;
64ae8ec5e1SHisping Lin }
65ae8ec5e1SHisping Lin 
662f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size)
672f8c34bdSxb.wang {
682f8c34bdSxb.wang 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
692f8c34bdSxb.wang 	ulong aligned_input, aligned_len;
702f8c34bdSxb.wang 
712f8c34bdSxb.wang 	if (!addr || !size)
722f8c34bdSxb.wang 		return;
732f8c34bdSxb.wang 
742f8c34bdSxb.wang 	/* Must flush dcache before crypto DMA fetch data region */
752f8c34bdSxb.wang 	aligned_input = round_down(addr, alignment);
762f8c34bdSxb.wang 	aligned_len = round_up(size + (addr - aligned_input), alignment);
772f8c34bdSxb.wang 	flush_cache(aligned_input, aligned_len);
782f8c34bdSxb.wang }
792f8c34bdSxb.wang 
80a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
81a900eef3SHisping Lin {
82a900eef3SHisping Lin 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
83a900eef3SHisping Lin 	ulong aligned_input, aligned_len;
84a900eef3SHisping Lin 
85a900eef3SHisping Lin 	if (!addr || !size)
86a900eef3SHisping Lin 		return;
87a900eef3SHisping Lin 
88a900eef3SHisping Lin 	/* Must invalidate dcache after crypto DMA write data region */
89a900eef3SHisping Lin 	aligned_input = round_down(addr, alignment);
90a900eef3SHisping Lin 	aligned_len = round_up(size + (addr - aligned_input), alignment);
91a900eef3SHisping Lin 	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
92a900eef3SHisping Lin }
93a900eef3SHisping Lin 
94c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
95c7de5349SHisping Lin 						uint32_t filename_size,
96c7de5349SHisping Lin 						uint8_t *data,
97c7de5349SHisping Lin 						uint32_t data_size)
98ae8ec5e1SHisping Lin {
99ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
100ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
101ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
102ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
103ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
104ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
105ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
106ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1073251364cSHisping Lin 	struct blk_desc *dev_desc;
1083251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1096651d4c0SJason Zhu 	if (!dev_desc) {
1106651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1116651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1126651d4c0SJason Zhu 	}
1133251364cSHisping Lin 
114f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
115f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
116f4e1db95SHisping Lin 		return TeecResult;
117ae8ec5e1SHisping Lin 
118ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
119f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
120f4e1db95SHisping Lin 		return TeecResult;
121ae8ec5e1SHisping Lin 
1223251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1233251364cSHisping Lin 						    TEEC_NONE,
1243251364cSHisping Lin 						    TEEC_NONE,
1253251364cSHisping Lin 						    TEEC_NONE);
1263251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
127b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
128b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
129b9a7e756SHisping Lin 	else
130b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1313251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1323251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1333251364cSHisping Lin #endif
1343251364cSHisping Lin 
135ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
136ae8ec5e1SHisping Lin 				&TeecSession,
137ae8ec5e1SHisping Lin 				TeecUuid,
138ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
139ae8ec5e1SHisping Lin 				NULL,
1403251364cSHisping Lin 				&TeecOperation,
141ae8ec5e1SHisping Lin 				&ErrorOrigin);
142f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
143f4e1db95SHisping Lin 		return TeecResult;
144ae8ec5e1SHisping Lin 
145ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
146ae8ec5e1SHisping Lin 
147c7de5349SHisping Lin 	SharedMem0.size = filename_size;
148ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
149ae8ec5e1SHisping Lin 
150ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
151f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
152f4e1db95SHisping Lin 		goto exit;
153ae8ec5e1SHisping Lin 
154c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
155ae8ec5e1SHisping Lin 
156ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
157ae8ec5e1SHisping Lin 
158c7de5349SHisping Lin 	SharedMem1.size = data_size;
159c7de5349SHisping Lin 	SharedMem1.flags = 0;
160c7de5349SHisping Lin 
161c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
162c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
163c7de5349SHisping Lin 		goto exit;
164c7de5349SHisping Lin 
165c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
166c7de5349SHisping Lin 
167c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
168c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
169c7de5349SHisping Lin 
170c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
171c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
172c7de5349SHisping Lin 
173c7de5349SHisping Lin 
174c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
175c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
176c7de5349SHisping Lin 						TEEC_NONE,
177c7de5349SHisping Lin 						TEEC_NONE);
178c7de5349SHisping Lin 
179c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
180c7de5349SHisping Lin 					1,
181c7de5349SHisping Lin 					&TeecOperation,
182c7de5349SHisping Lin 					&ErrorOrigin);
183c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
184c7de5349SHisping Lin 		goto exit;
185c7de5349SHisping Lin exit:
186c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
187c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
188c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
189c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
190c7de5349SHisping Lin 
191c7de5349SHisping Lin 	return TeecResult;
192c7de5349SHisping Lin }
193c7de5349SHisping Lin 
194c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
195c7de5349SHisping Lin 					       uint32_t filename_size,
196c7de5349SHisping Lin 					       uint8_t *data,
197c7de5349SHisping Lin 					       uint32_t data_size)
198c7de5349SHisping Lin {
199c7de5349SHisping Lin 	TEEC_Result TeecResult;
200c7de5349SHisping Lin 	TEEC_Context TeecContext;
201c7de5349SHisping Lin 	TEEC_Session TeecSession;
202c7de5349SHisping Lin 	uint32_t ErrorOrigin;
203c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
204c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
205c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
206c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
207c7de5349SHisping Lin 
208c7de5349SHisping Lin 	struct blk_desc *dev_desc;
209c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
210c7de5349SHisping Lin 	if (!dev_desc) {
211c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
212c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
213c7de5349SHisping Lin 	}
214c7de5349SHisping Lin 
215c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
216c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
217c7de5349SHisping Lin 		return TeecResult;
218c7de5349SHisping Lin 
219c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
220c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
221c7de5349SHisping Lin 		return TeecResult;
222c7de5349SHisping Lin 
223c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
224c7de5349SHisping Lin 						TEEC_NONE,
225c7de5349SHisping Lin 						TEEC_NONE,
226c7de5349SHisping Lin 						TEEC_NONE);
227c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
228c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
229c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
230c7de5349SHisping Lin 	else
231c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
232c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
233c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
234c7de5349SHisping Lin #endif
235c7de5349SHisping Lin 
236c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
237c7de5349SHisping Lin 				&TeecSession,
238c7de5349SHisping Lin 				TeecUuid,
239c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
240c7de5349SHisping Lin 				NULL,
241c7de5349SHisping Lin 				&TeecOperation,
242c7de5349SHisping Lin 				&ErrorOrigin);
243c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
244c7de5349SHisping Lin 		return TeecResult;
245c7de5349SHisping Lin 
246c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
247c7de5349SHisping Lin 
248c7de5349SHisping Lin 	SharedMem0.size = filename_size;
249c7de5349SHisping Lin 	SharedMem0.flags = 0;
250c7de5349SHisping Lin 
251c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
252c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
253c7de5349SHisping Lin 		goto exit;
254c7de5349SHisping Lin 
255c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
256c7de5349SHisping Lin 
257c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
258c7de5349SHisping Lin 
259c7de5349SHisping Lin 	SharedMem1.size = data_size;
260ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
261ae8ec5e1SHisping Lin 
262ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
263f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
264f4e1db95SHisping Lin 		goto exit;
265ae8ec5e1SHisping Lin 
266ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
267ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
268ae8ec5e1SHisping Lin 
269ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
270ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
271ae8ec5e1SHisping Lin 
272ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
273ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
274ae8ec5e1SHisping Lin 						TEEC_NONE,
275ae8ec5e1SHisping Lin 						TEEC_NONE);
276ae8ec5e1SHisping Lin 
277ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
278ae8ec5e1SHisping Lin 					0,
279ae8ec5e1SHisping Lin 					&TeecOperation,
280ae8ec5e1SHisping Lin 					&ErrorOrigin);
28146b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
282c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
283f4e1db95SHisping Lin exit:
284ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
285ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
286ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
28746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
288ae8ec5e1SHisping Lin 
289ae8ec5e1SHisping Lin 	return TeecResult;
290ae8ec5e1SHisping Lin }
291ae8ec5e1SHisping Lin 
292c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
293c7de5349SHisping Lin {
294c7de5349SHisping Lin 	TEEC_Result TeecResult;
295c7de5349SHisping Lin 	TEEC_Context TeecContext;
296c7de5349SHisping Lin 	TEEC_Session TeecSession;
297c7de5349SHisping Lin 	uint32_t ErrorOrigin;
298c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
299c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
300c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
301c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
302c7de5349SHisping Lin 
303c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
304c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
305c7de5349SHisping Lin 		return TeecResult;
306c7de5349SHisping Lin 
307c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
308c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
309c7de5349SHisping Lin 		return TeecResult;
310c7de5349SHisping Lin 
311c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
312c7de5349SHisping Lin 				&TeecSession,
313c7de5349SHisping Lin 				TeecUuid,
314c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
315c7de5349SHisping Lin 				NULL,
316c7de5349SHisping Lin 				NULL,
317c7de5349SHisping Lin 				&ErrorOrigin);
318c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
319c7de5349SHisping Lin 		return TeecResult;
320c7de5349SHisping Lin 
321c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
322c7de5349SHisping Lin 						    TEEC_NONE,
323c7de5349SHisping Lin 						    TEEC_NONE,
324c7de5349SHisping Lin 						    TEEC_NONE);
325c7de5349SHisping Lin 
326c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
327c7de5349SHisping Lin 					2,
328c7de5349SHisping Lin 					&TeecOperation,
329c7de5349SHisping Lin 					&ErrorOrigin);
330c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
331c7de5349SHisping Lin 		goto exit;
332c7de5349SHisping Lin exit:
333c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
334c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
335c7de5349SHisping Lin 
336c7de5349SHisping Lin 	return TeecResult;
337c7de5349SHisping Lin }
338c7de5349SHisping Lin 
33934f2e8f6SHisping Lin static void trusty_notify_always_use_security(void)
34034f2e8f6SHisping Lin {
34134f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION)
34234f2e8f6SHisping Lin 	TEEC_Result TeecResult;
34334f2e8f6SHisping Lin 	TEEC_Context TeecContext;
34434f2e8f6SHisping Lin 	TEEC_Session TeecSession;
34534f2e8f6SHisping Lin 	uint32_t ErrorOrigin;
34634f2e8f6SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
34734f2e8f6SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
34834f2e8f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
34934f2e8f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
35034f2e8f6SHisping Lin 
35134f2e8f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
35234f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
35334f2e8f6SHisping Lin 		return;
35434f2e8f6SHisping Lin 
35534f2e8f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
35634f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
35734f2e8f6SHisping Lin 		return;
35834f2e8f6SHisping Lin 
35934f2e8f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
36034f2e8f6SHisping Lin 				&TeecSession,
36134f2e8f6SHisping Lin 				TeecUuid,
36234f2e8f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
36334f2e8f6SHisping Lin 				NULL,
36434f2e8f6SHisping Lin 				NULL,
36534f2e8f6SHisping Lin 				&ErrorOrigin);
36634f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
36734f2e8f6SHisping Lin 		return;
36834f2e8f6SHisping Lin 
36934f2e8f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
37034f2e8f6SHisping Lin 						    TEEC_NONE,
37134f2e8f6SHisping Lin 						    TEEC_NONE,
37234f2e8f6SHisping Lin 						    TEEC_NONE);
37334f2e8f6SHisping Lin 
37434f2e8f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
37534f2e8f6SHisping Lin 					9,
37634f2e8f6SHisping Lin 					&TeecOperation,
37734f2e8f6SHisping Lin 					&ErrorOrigin);
37834f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
37934f2e8f6SHisping Lin 		debug("notify always use security fail! please update optee!");
38034f2e8f6SHisping Lin 
38134f2e8f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
38234f2e8f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
38334f2e8f6SHisping Lin 
38434f2e8f6SHisping Lin 	return;
38534f2e8f6SHisping Lin #endif
38634f2e8f6SHisping Lin }
38734f2e8f6SHisping Lin 
388c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
389c7de5349SHisping Lin {
390c7de5349SHisping Lin 	char hs[9];
391c7de5349SHisping Lin 
392c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
393c7de5349SHisping Lin 
394c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
395c7de5349SHisping Lin }
396c7de5349SHisping Lin 
397ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
398ae8ec5e1SHisping Lin {
399c7de5349SHisping Lin 	char hs[9];
4003251364cSHisping Lin 
401c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
402ae8ec5e1SHisping Lin 
403c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
404ae8ec5e1SHisping Lin }
405ae8ec5e1SHisping Lin 
406ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
407ae8ec5e1SHisping Lin {
408c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
409c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
410ae8ec5e1SHisping Lin }
411ae8ec5e1SHisping Lin 
412ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
413ae8ec5e1SHisping Lin {
414c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
415c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
4166651d4c0SJason Zhu }
417ae8ec5e1SHisping Lin 
418c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
419c7de5349SHisping Lin {
420c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
421c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
422c7de5349SHisping Lin }
423ae8ec5e1SHisping Lin 
424c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
425c7de5349SHisping Lin {
426c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
427c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
428ae8ec5e1SHisping Lin }
429ae8ec5e1SHisping Lin 
430564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
431564654ebSJason Zhu 					      uint32_t size)
432564654ebSJason Zhu {
433c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
434c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
435564654ebSJason Zhu }
436564654ebSJason Zhu 
437564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
438564654ebSJason Zhu 					       uint32_t size)
439564654ebSJason Zhu {
440c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
441c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
442564654ebSJason Zhu }
443564654ebSJason Zhu 
444ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
445ae8ec5e1SHisping Lin {
446c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
447c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
448ae8ec5e1SHisping Lin }
449ae8ec5e1SHisping Lin 
450ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
451ae8ec5e1SHisping Lin {
452c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
453c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
454ae8ec5e1SHisping Lin }
455ae8ec5e1SHisping Lin 
456ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
457ae8ec5e1SHisping Lin {
458c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
459c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
460c7de5349SHisping Lin }
461c7de5349SHisping Lin 
462c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
463c7de5349SHisping Lin {
464c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
465c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
466c7de5349SHisping Lin }
467c7de5349SHisping Lin 
468c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
469c7de5349SHisping Lin {
470ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
471ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
472ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
473ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
474c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
475c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
476c7de5349SHisping Lin 
477ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
478ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
479ae8ec5e1SHisping Lin 
480f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
481f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
482f4e1db95SHisping Lin 		return TeecResult;
483ae8ec5e1SHisping Lin 
484ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
485f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
486f4e1db95SHisping Lin 		return TeecResult;
487ae8ec5e1SHisping Lin 
488ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
489ae8ec5e1SHisping Lin 				      &TeecSession,
490ae8ec5e1SHisping Lin 				      TeecUuid,
491ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
492ae8ec5e1SHisping Lin 				      NULL,
493c7de5349SHisping Lin 				      NULL,
494ae8ec5e1SHisping Lin 				      &ErrorOrigin);
495f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
496f4e1db95SHisping Lin 		return TeecResult;
497ae8ec5e1SHisping Lin 
498c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
499c7de5349SHisping Lin 						    TEEC_NONE,
500ae8ec5e1SHisping Lin 						    TEEC_NONE,
501ae8ec5e1SHisping Lin 						    TEEC_NONE);
502ae8ec5e1SHisping Lin 
503ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
504c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
505ae8ec5e1SHisping Lin 					&TeecOperation,
506ae8ec5e1SHisping Lin 					&ErrorOrigin);
507c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
508c7de5349SHisping Lin 		goto exit;
509f4e1db95SHisping Lin exit:
510ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
51146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
512ae8ec5e1SHisping Lin 
513ae8ec5e1SHisping Lin 	return TeecResult;
514ae8ec5e1SHisping Lin }
515ae8ec5e1SHisping Lin 
516c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
517c7de5349SHisping Lin 						   uint8_t is_write,
518c7de5349SHisping Lin 						   uint32_t *buf,
519c7de5349SHisping Lin 						   uint32_t length)
520ae8ec5e1SHisping Lin {
521ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
522ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
523ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
524ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
525c7de5349SHisping Lin 
526c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
527c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
528ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
529ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
530ae8ec5e1SHisping Lin 
531f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
532f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
533f4e1db95SHisping Lin 		return TeecResult;
534ae8ec5e1SHisping Lin 
535ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
536f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
537f4e1db95SHisping Lin 		return TeecResult;
538ae8ec5e1SHisping Lin 
539ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
540ae8ec5e1SHisping Lin 				&TeecSession,
541ae8ec5e1SHisping Lin 				TeecUuid,
542ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
543ae8ec5e1SHisping Lin 				NULL,
544c7de5349SHisping Lin 				NULL,
545ae8ec5e1SHisping Lin 				&ErrorOrigin);
546f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
547f4e1db95SHisping Lin 		return TeecResult;
548ae8ec5e1SHisping Lin 
549ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
550ae8ec5e1SHisping Lin 
551c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
552ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
553ae8ec5e1SHisping Lin 
554ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
555f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
556f4e1db95SHisping Lin 		goto exit;
557ae8ec5e1SHisping Lin 
558ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
559ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
560ae8ec5e1SHisping Lin 
561c7de5349SHisping Lin 	if (is_write) {
562c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
563ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
564c7de5349SHisping Lin 							    TEEC_NONE,
565ae8ec5e1SHisping Lin 							    TEEC_NONE,
566ae8ec5e1SHisping Lin 							    TEEC_NONE);
567ae8ec5e1SHisping Lin 
568c7de5349SHisping Lin 	} else {
569c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
570c7de5349SHisping Lin 							    TEEC_NONE,
571c7de5349SHisping Lin 							    TEEC_NONE,
572c7de5349SHisping Lin 							    TEEC_NONE);
573c7de5349SHisping Lin 	}
574c7de5349SHisping Lin 
575ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
576c7de5349SHisping Lin 					cmd,
577ae8ec5e1SHisping Lin 					&TeecOperation,
578ae8ec5e1SHisping Lin 					&ErrorOrigin);
579f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
580f4e1db95SHisping Lin 		goto exit;
581c7de5349SHisping Lin 
582c7de5349SHisping Lin 	if (!is_write)
583c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
584c7de5349SHisping Lin 
585f4e1db95SHisping Lin exit:
586ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
587ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
58846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
589ae8ec5e1SHisping Lin 
590ae8ec5e1SHisping Lin 	return TeecResult;
591ae8ec5e1SHisping Lin }
592ae8ec5e1SHisping Lin 
5936ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5946ef445a4SHisping Lin {
595c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
596c7de5349SHisping Lin 						  false, buf, length);
5976ef445a4SHisping Lin }
5986ef445a4SHisping Lin 
5996ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
6006ef445a4SHisping Lin {
601c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
602c7de5349SHisping Lin 						  true, buf, length);
60316539616SHisping Lin }
60416539616SHisping Lin 
60516539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
60616539616SHisping Lin {
60716539616SHisping Lin 	TEEC_Result res;
608c7de5349SHisping Lin 
609c7de5349SHisping Lin 	res = trusty_base_end_security_data();
610c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
61116539616SHisping Lin 	return res;
61216539616SHisping Lin }
6132cd27853SHisping Lin 
6142cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
6152cd27853SHisping Lin {
616c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
617c7de5349SHisping Lin 						  false, buf, length);
6182cd27853SHisping Lin }
619c7de5349SHisping Lin 
6202cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
6212cd27853SHisping Lin {
622c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
623c7de5349SHisping Lin 						  true, buf, length);
6242cd27853SHisping Lin }
625095e2a82SHisping Lin 
626468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
627468df3b2SHisping Lin {
628468df3b2SHisping Lin 	uint32_t bootflag;
629c7de5349SHisping Lin 	TEEC_Result TeecResult;
630468df3b2SHisping Lin 
631f07e1686SHisping Lin 	*flag = 0;
632f07e1686SHisping Lin 
633c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
634c7de5349SHisping Lin 							false, &bootflag, 1);
635468df3b2SHisping Lin 
636468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
6370202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
6380202ee8aSHisping Lin 		if (bootflag == 0x00000001)
6390202ee8aSHisping Lin 			*flag = 1;
6400202ee8aSHisping Lin #else
641468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
642468df3b2SHisping Lin 			*flag = 1;
6430202ee8aSHisping Lin #endif
644468df3b2SHisping Lin 	}
645095e2a82SHisping Lin 	return TeecResult;
646095e2a82SHisping Lin }
6474aa61755SAndy Ye 
6481ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
6491ef63c75SHisping Lin {
6501ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
6511ef63c75SHisping Lin 						  true, buf, length);
6521ef63c75SHisping Lin }
6531ef63c75SHisping Lin 
65410f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value)
65510f41197SHisping Lin {
65610f41197SHisping Lin 	TEEC_Result TeecResult;
65710f41197SHisping Lin 	TEEC_Context TeecContext;
65810f41197SHisping Lin 	TEEC_Session TeecSession;
65910f41197SHisping Lin 	uint32_t ErrorOrigin;
66010f41197SHisping Lin 
66110f41197SHisping Lin 	*value = 0;
66210f41197SHisping Lin 
66310f41197SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
66410f41197SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
66510f41197SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
66610f41197SHisping Lin 	TEEC_Operation TeecOperation = {0};
66710f41197SHisping Lin 
66810f41197SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
66910f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
67010f41197SHisping Lin 		return TeecResult;
67110f41197SHisping Lin 
67210f41197SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
67310f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
67410f41197SHisping Lin 		return TeecResult;
67510f41197SHisping Lin 
67610f41197SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
67710f41197SHisping Lin 				&TeecSession,
67810f41197SHisping Lin 				TeecUuid,
67910f41197SHisping Lin 				TEEC_LOGIN_PUBLIC,
68010f41197SHisping Lin 				NULL,
68110f41197SHisping Lin 				NULL,
68210f41197SHisping Lin 				&ErrorOrigin);
68310f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
68410f41197SHisping Lin 		return TeecResult;
68510f41197SHisping Lin 
68610f41197SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
68710f41197SHisping Lin 						    TEEC_NONE,
68810f41197SHisping Lin 						    TEEC_NONE,
68910f41197SHisping Lin 						    TEEC_NONE);
69010f41197SHisping Lin 
69110f41197SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
69210f41197SHisping Lin 					STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN,
69310f41197SHisping Lin 					&TeecOperation,
69410f41197SHisping Lin 					&ErrorOrigin);
69510f41197SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
69610f41197SHisping Lin 		*value = TeecOperation.params[0].value.a;
69710f41197SHisping Lin 
69810f41197SHisping Lin 	TEEC_CloseSession(&TeecSession);
69910f41197SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
70010f41197SHisping Lin 
70110f41197SHisping Lin 	return TeecResult;
70210f41197SHisping Lin }
70310f41197SHisping Lin 
704fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
705fbf29bfbSHisping Lin {
706fbf29bfbSHisping Lin 	uint32_t levelflag;
707fbf29bfbSHisping Lin 
708fbf29bfbSHisping Lin 	levelflag = flag;
709fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
710fbf29bfbSHisping Lin 						  true, &levelflag, 1);
711fbf29bfbSHisping Lin }
712fbf29bfbSHisping Lin 
713f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
714f39d4289SHisping Lin {
715f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
716f39d4289SHisping Lin 						  true, buf, length);
717f39d4289SHisping Lin }
718f39d4289SHisping Lin 
71934f2e8f6SHisping Lin static void trusty_select_security_level(void)
7207504da74SHisping Lin {
7217504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
7227504da74SHisping Lin 	TEEC_Result TeecResult;
7237504da74SHisping Lin 
7247504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
7257504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
7267504da74SHisping Lin 		run_command("download", 0);
7277504da74SHisping Lin 		return;
7287504da74SHisping Lin 	}
7297504da74SHisping Lin 
7307504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
7317504da74SHisping Lin 		debug("optee select security level success!");
7327504da74SHisping Lin 	else
7337504da74SHisping Lin 		panic("optee select security level fail!");
7347504da74SHisping Lin 
7357504da74SHisping Lin 	return;
7367504da74SHisping Lin #endif
7377504da74SHisping Lin }
7387504da74SHisping Lin 
73951ac7005SHisping Lin void optee_client_init(void)
74051ac7005SHisping Lin {
74151ac7005SHisping Lin 	trusty_select_security_level();
74234f2e8f6SHisping Lin 	trusty_notify_always_use_security();
74351ac7005SHisping Lin }
74451ac7005SHisping Lin 
745d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
746d5913350SHisping Lin {
747d5913350SHisping Lin 	TEEC_Result TeecResult;
748d5913350SHisping Lin 	TEEC_Context TeecContext;
749d5913350SHisping Lin 	TEEC_Session TeecSession;
750d5913350SHisping Lin 	uint32_t ErrorOrigin;
751d5913350SHisping Lin 
752d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
753d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
754d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
755d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
756d5913350SHisping Lin 
757d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
758d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
759d5913350SHisping Lin 		return TeecResult;
760d5913350SHisping Lin 
761d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
762d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
763d5913350SHisping Lin 		return TeecResult;
764d5913350SHisping Lin 
765d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
766d5913350SHisping Lin 				&TeecSession,
767d5913350SHisping Lin 				TeecUuid,
768d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
769d5913350SHisping Lin 				NULL,
770d5913350SHisping Lin 				NULL,
771d5913350SHisping Lin 				&ErrorOrigin);
772d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
773d5913350SHisping Lin 		return TeecResult;
774d5913350SHisping Lin 
775d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
776d5913350SHisping Lin 
777d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
778d5913350SHisping Lin 
779d5913350SHisping Lin 	SharedMem.size = byte_len;
780d5913350SHisping Lin 	SharedMem.flags = 0;
781d5913350SHisping Lin 
782d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
783d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
784d5913350SHisping Lin 		goto exit;
785d5913350SHisping Lin 
786d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
787d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
788d5913350SHisping Lin 
789d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
790d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
791d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
792d5913350SHisping Lin 						    TEEC_NONE,
793d5913350SHisping Lin 						    TEEC_NONE);
794d5913350SHisping Lin 
795d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
796d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
797d5913350SHisping Lin 					&TeecOperation,
798d5913350SHisping Lin 					&ErrorOrigin);
799d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
800d5913350SHisping Lin 		goto exit;
801d5913350SHisping Lin 
802d5913350SHisping Lin exit:
803d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
804d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
805d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
806d5913350SHisping Lin 
807d5913350SHisping Lin 	return TeecResult;
808d5913350SHisping Lin }
809d5913350SHisping Lin 
810d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
811d5913350SHisping Lin {
812d5913350SHisping Lin 	TEEC_Result TeecResult;
813d5913350SHisping Lin 	TEEC_Context TeecContext;
814d5913350SHisping Lin 	TEEC_Session TeecSession;
815d5913350SHisping Lin 	uint32_t ErrorOrigin;
816d5913350SHisping Lin 
817d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
818d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
819d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
820d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
821d5913350SHisping Lin 
822d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
823d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
824d5913350SHisping Lin 		return TeecResult;
825d5913350SHisping Lin 
826d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
827d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
828d5913350SHisping Lin 		return TeecResult;
829d5913350SHisping Lin 
830d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
831d5913350SHisping Lin 				&TeecSession,
832d5913350SHisping Lin 				TeecUuid,
833d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
834d5913350SHisping Lin 				NULL,
835d5913350SHisping Lin 				NULL,
836d5913350SHisping Lin 				&ErrorOrigin);
837d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
838d5913350SHisping Lin 		return TeecResult;
839d5913350SHisping Lin 
840d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
841d5913350SHisping Lin 
842d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
843d5913350SHisping Lin 
844d5913350SHisping Lin 	SharedMem.size = byte_len;
845d5913350SHisping Lin 	SharedMem.flags = 0;
846d5913350SHisping Lin 
847d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
848d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
849d5913350SHisping Lin 		goto exit;
850d5913350SHisping Lin 
851d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
852d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
853d5913350SHisping Lin 
854d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
855d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
856d5913350SHisping Lin 						    TEEC_NONE,
857d5913350SHisping Lin 						    TEEC_NONE);
858d5913350SHisping Lin 
859d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
860d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
861d5913350SHisping Lin 					&TeecOperation,
862d5913350SHisping Lin 					&ErrorOrigin);
863d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
864d5913350SHisping Lin 		goto exit;
865d5913350SHisping Lin 
866d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
867d5913350SHisping Lin 
868d5913350SHisping Lin exit:
869d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
870d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
871d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
872d5913350SHisping Lin 
873d5913350SHisping Lin 	return TeecResult;
874d5913350SHisping Lin }
875d5913350SHisping Lin 
87690e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,
877bb1ba6acSHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
878bb1ba6acSHisping Lin {
879bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
880bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
881bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
882bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
883bb1ba6acSHisping Lin 
884bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
885bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
886bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
887bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
888bb1ba6acSHisping Lin 
889bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
890bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
891bb1ba6acSHisping Lin 		return TeecResult;
892bb1ba6acSHisping Lin 
893bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
894bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
895bb1ba6acSHisping Lin 		return TeecResult;
896bb1ba6acSHisping Lin 
897bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
898bb1ba6acSHisping Lin 				&TeecSession,
899bb1ba6acSHisping Lin 				TeecUuid,
900bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
901bb1ba6acSHisping Lin 				NULL,
902bb1ba6acSHisping Lin 				NULL,
903bb1ba6acSHisping Lin 				&ErrorOrigin);
904bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
905bb1ba6acSHisping Lin 		return TeecResult;
906bb1ba6acSHisping Lin 
907bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
908bb1ba6acSHisping Lin 
909bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
910bb1ba6acSHisping Lin 
911bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
912bb1ba6acSHisping Lin 	SharedMem.flags = 0;
913bb1ba6acSHisping Lin 
914bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
915bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
916bb1ba6acSHisping Lin 		goto exit;
917bb1ba6acSHisping Lin 
918bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
919bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
920bb1ba6acSHisping Lin 
921bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
922bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
923bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
924bb1ba6acSHisping Lin 						    TEEC_NONE,
925bb1ba6acSHisping Lin 						    TEEC_NONE);
926bb1ba6acSHisping Lin 
927bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
92890e849a0Sxb.wang 					STORAGE_CMD_WRITE_OEM_OTP_KEY,
929bb1ba6acSHisping Lin 					&TeecOperation,
930bb1ba6acSHisping Lin 					&ErrorOrigin);
931bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
932bb1ba6acSHisping Lin 		goto exit;
933bb1ba6acSHisping Lin 
934bb1ba6acSHisping Lin exit:
935bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
936bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
937bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
938bb1ba6acSHisping Lin 
939bb1ba6acSHisping Lin 	return TeecResult;
940bb1ba6acSHisping Lin }
941bb1ba6acSHisping Lin 
9429deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value)
9439deb34f6SHisping Lin {
9449deb34f6SHisping Lin 	TEEC_Result TeecResult;
9459deb34f6SHisping Lin 	TEEC_Context TeecContext;
9469deb34f6SHisping Lin 	TEEC_Session TeecSession;
9479deb34f6SHisping Lin 	uint32_t ErrorOrigin;
9489deb34f6SHisping Lin 
9499deb34f6SHisping Lin 	*value = 0xFF;
9509deb34f6SHisping Lin 
9519deb34f6SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
9529deb34f6SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9539deb34f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9549deb34f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
9559deb34f6SHisping Lin 
9569deb34f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
9579deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9589deb34f6SHisping Lin 		return TeecResult;
9599deb34f6SHisping Lin 
9609deb34f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9619deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9629deb34f6SHisping Lin 		return TeecResult;
9639deb34f6SHisping Lin 
9649deb34f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9659deb34f6SHisping Lin 				&TeecSession,
9669deb34f6SHisping Lin 				TeecUuid,
9679deb34f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
9689deb34f6SHisping Lin 				NULL,
9699deb34f6SHisping Lin 				NULL,
9709deb34f6SHisping Lin 				&ErrorOrigin);
9719deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9729deb34f6SHisping Lin 		return TeecResult;
9739deb34f6SHisping Lin 
9749deb34f6SHisping Lin 	TeecOperation.params[0].value.a = key_id;
9759deb34f6SHisping Lin 
9769deb34f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
9779deb34f6SHisping Lin 						    TEEC_NONE,
9789deb34f6SHisping Lin 						    TEEC_NONE,
9799deb34f6SHisping Lin 						    TEEC_NONE);
9809deb34f6SHisping Lin 
9819deb34f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9829deb34f6SHisping Lin 					STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN,
9839deb34f6SHisping Lin 					&TeecOperation,
9849deb34f6SHisping Lin 					&ErrorOrigin);
9859deb34f6SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
9869deb34f6SHisping Lin 		*value = TeecOperation.params[0].value.b;
9879deb34f6SHisping Lin 
9889deb34f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
9899deb34f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9909deb34f6SHisping Lin 
9919deb34f6SHisping Lin 	return TeecResult;
9929deb34f6SHisping Lin }
9939deb34f6SHisping Lin 
99490e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)
995a405238aSHisping Lin {
996a405238aSHisping Lin 	TEEC_Result TeecResult;
997a405238aSHisping Lin 	TEEC_Context TeecContext;
998a405238aSHisping Lin 	TEEC_Session TeecSession;
999a405238aSHisping Lin 	uint32_t ErrorOrigin;
1000a405238aSHisping Lin 
1001a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1002a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1003a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1004a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
1005a405238aSHisping Lin 
1006a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1007a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1008a405238aSHisping Lin 		return TeecResult;
1009a405238aSHisping Lin 
1010a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1011a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1012a405238aSHisping Lin 		return TeecResult;
1013a405238aSHisping Lin 
1014a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1015a405238aSHisping Lin 				&TeecSession,
1016a405238aSHisping Lin 				TeecUuid,
1017a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
1018a405238aSHisping Lin 				NULL,
1019a405238aSHisping Lin 				NULL,
1020a405238aSHisping Lin 				&ErrorOrigin);
1021a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1022a405238aSHisping Lin 		return TeecResult;
1023a405238aSHisping Lin 
1024a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
1025a405238aSHisping Lin 
1026a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1027a405238aSHisping Lin 						    TEEC_NONE,
1028a405238aSHisping Lin 						    TEEC_NONE,
1029a405238aSHisping Lin 						    TEEC_NONE);
1030a405238aSHisping Lin 
1031a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1032a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
1033a405238aSHisping Lin 					&TeecOperation,
1034a405238aSHisping Lin 					&ErrorOrigin);
1035a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1036a405238aSHisping Lin 		goto exit;
1037a405238aSHisping Lin 
1038a405238aSHisping Lin exit:
1039a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
1040a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1041a405238aSHisping Lin 
1042a405238aSHisping Lin 	return TeecResult;
1043a405238aSHisping Lin }
1044a405238aSHisping Lin 
10452f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config,
10462f8c34bdSxb.wang 				   uint32_t src_phys_addr, uint32_t dst_phys_addr,
10472f8c34bdSxb.wang 				   uint32_t len)
1048fc3694d6Sxb.wang {
1049fc3694d6Sxb.wang 	TEEC_Result TeecResult;
1050fc3694d6Sxb.wang 	TEEC_Context TeecContext;
1051fc3694d6Sxb.wang 	TEEC_Session TeecSession;
1052fc3694d6Sxb.wang 	TEEC_Operation TeecOperation = {0};
1053fc3694d6Sxb.wang 	uint32_t ErrorOrigin;
1054fc3694d6Sxb.wang 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
1055fc3694d6Sxb.wang 	TEEC_SharedMemory SharedMem_config = {0};
1056fc3694d6Sxb.wang 
10572f8c34bdSxb.wang 	if (key_id != RK_OEM_OTP_KEY0 &&
10582f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY1 &&
10592f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY2 &&
10602f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY3 &&
10612f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY_FW)
1062fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1063fc3694d6Sxb.wang 
10642f8c34bdSxb.wang 	if (!config)
1065fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1066fc3694d6Sxb.wang 
1067fc3694d6Sxb.wang 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
1068fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1069fc3694d6Sxb.wang 
1070fc3694d6Sxb.wang 	if (config->mode >= RK_CIPHER_MODE_XTS)
1071fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1072fc3694d6Sxb.wang 
1073fc3694d6Sxb.wang 	if (config->operation != RK_MODE_ENCRYPT &&
1074fc3694d6Sxb.wang 	    config->operation != RK_MODE_DECRYPT)
1075fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1076fc3694d6Sxb.wang 
1077fc3694d6Sxb.wang 	if (config->key_len != 16 &&
1078fc3694d6Sxb.wang 	    config->key_len != 24 &&
1079fc3694d6Sxb.wang 	    config->key_len != 32)
1080fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1081fc3694d6Sxb.wang 
10822f8c34bdSxb.wang 	if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16)
10832f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10842f8c34bdSxb.wang 
10852f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126)
10862f8c34bdSxb.wang 	if (config->key_len == 24)
10872f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10882f8c34bdSxb.wang #endif
10892f8c34bdSxb.wang 
1090fc3694d6Sxb.wang 	if (len % AES_BLOCK_SIZE ||
1091fc3694d6Sxb.wang 	    len == 0)
1092fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1093fc3694d6Sxb.wang 
10942f8c34bdSxb.wang 	if (!src_phys_addr || !dst_phys_addr)
10952f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10962f8c34bdSxb.wang 
1097fc3694d6Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
1098fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1099fc3694d6Sxb.wang 		return TeecResult;
1100fc3694d6Sxb.wang 
1101fc3694d6Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1102fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1103fc3694d6Sxb.wang 		return TeecResult;
1104fc3694d6Sxb.wang 
1105fc3694d6Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
1106fc3694d6Sxb.wang 				      &TeecSession,
1107fc3694d6Sxb.wang 				      &uuid,
1108fc3694d6Sxb.wang 				      TEEC_LOGIN_PUBLIC,
1109fc3694d6Sxb.wang 				      NULL,
1110fc3694d6Sxb.wang 				      NULL,
1111fc3694d6Sxb.wang 				      &ErrorOrigin);
1112fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1113fc3694d6Sxb.wang 		goto exit;
1114fc3694d6Sxb.wang 
1115fc3694d6Sxb.wang 	SharedMem_config.size = sizeof(rk_cipher_config);
1116fc3694d6Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
1117fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1118fc3694d6Sxb.wang 		goto exit;
1119fc3694d6Sxb.wang 
1120fc3694d6Sxb.wang 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
1121fc3694d6Sxb.wang 	TeecOperation.params[0].value.a       = key_id;
1122fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
1123fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
11242f8c34bdSxb.wang 	TeecOperation.params[2].value.a       = src_phys_addr;
11252f8c34bdSxb.wang 	TeecOperation.params[2].value.b       = len;
11262f8c34bdSxb.wang 	TeecOperation.params[3].value.a       = dst_phys_addr;
1127fc3694d6Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1128fc3694d6Sxb.wang 						    TEEC_MEMREF_TEMP_INPUT,
11292f8c34bdSxb.wang 						    TEEC_VALUE_INPUT,
11302f8c34bdSxb.wang 						    TEEC_VALUE_INPUT);
11312f8c34bdSxb.wang 
11322f8c34bdSxb.wang 	crypto_flush_cacheline(src_phys_addr, len);
11332f8c34bdSxb.wang 	crypto_flush_cacheline(dst_phys_addr, len);
11342f8c34bdSxb.wang 
1135fc3694d6Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11362f8c34bdSxb.wang 					CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER,
1137fc3694d6Sxb.wang 					&TeecOperation,
1138fc3694d6Sxb.wang 					&ErrorOrigin);
1139fc3694d6Sxb.wang 
1140a900eef3SHisping Lin 	crypto_invalidate_cacheline(dst_phys_addr, len);
1141a900eef3SHisping Lin 
1142fc3694d6Sxb.wang exit:
1143fc3694d6Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem_config);
1144fc3694d6Sxb.wang 	TEEC_CloseSession(&TeecSession);
1145fc3694d6Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
1146fc3694d6Sxb.wang 	return TeecResult;
1147fc3694d6Sxb.wang }
1148fc3694d6Sxb.wang 
1149a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id,
1150a828eba9SHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
1151a828eba9SHisping Lin {
1152a828eba9SHisping Lin 	TEEC_Result TeecResult;
1153a828eba9SHisping Lin 	TEEC_Context TeecContext;
1154a828eba9SHisping Lin 	TEEC_Session TeecSession;
1155a828eba9SHisping Lin 	uint32_t ErrorOrigin;
1156a828eba9SHisping Lin 
1157a828eba9SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1158a828eba9SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1159a828eba9SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1160a828eba9SHisping Lin 	TEEC_Operation TeecOperation = {0};
1161a828eba9SHisping Lin 
1162a828eba9SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1163a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1164a828eba9SHisping Lin 		return TeecResult;
1165a828eba9SHisping Lin 
1166a828eba9SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1167a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1168a828eba9SHisping Lin 		return TeecResult;
1169a828eba9SHisping Lin 
1170a828eba9SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1171a828eba9SHisping Lin 				&TeecSession,
1172a828eba9SHisping Lin 				TeecUuid,
1173a828eba9SHisping Lin 				TEEC_LOGIN_PUBLIC,
1174a828eba9SHisping Lin 				NULL,
1175a828eba9SHisping Lin 				NULL,
1176a828eba9SHisping Lin 				&ErrorOrigin);
1177a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1178a828eba9SHisping Lin 		return TeecResult;
1179a828eba9SHisping Lin 
1180a828eba9SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1181a828eba9SHisping Lin 
1182a828eba9SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1183a828eba9SHisping Lin 
1184a828eba9SHisping Lin 	SharedMem.size = byte_len;
1185a828eba9SHisping Lin 	SharedMem.flags = 0;
1186a828eba9SHisping Lin 
1187a828eba9SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1188a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1189a828eba9SHisping Lin 		goto exit;
1190a828eba9SHisping Lin 
1191a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1192a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1193a828eba9SHisping Lin 
1194a828eba9SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1195a828eba9SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1196a828eba9SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1197a828eba9SHisping Lin 						    TEEC_NONE,
1198a828eba9SHisping Lin 						    TEEC_NONE);
1199a828eba9SHisping Lin 
1200a828eba9SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1201a828eba9SHisping Lin 					STORAGE_CMD_WRITE_OEM_HDCP_KEY,
1202a828eba9SHisping Lin 					&TeecOperation,
1203a828eba9SHisping Lin 					&ErrorOrigin);
1204a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1205a828eba9SHisping Lin 		goto exit;
1206a828eba9SHisping Lin 
1207a828eba9SHisping Lin exit:
1208a828eba9SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1209a828eba9SHisping Lin 	TEEC_CloseSession(&TeecSession);
1210a828eba9SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1211a828eba9SHisping Lin 
1212a828eba9SHisping Lin 	return TeecResult;
1213a828eba9SHisping Lin }
1214a828eba9SHisping Lin 
1215e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value)
1216e8bc2655SHisping Lin {
1217e8bc2655SHisping Lin 	TEEC_Result TeecResult;
1218e8bc2655SHisping Lin 	TEEC_Context TeecContext;
1219e8bc2655SHisping Lin 	TEEC_Session TeecSession;
1220e8bc2655SHisping Lin 	uint32_t ErrorOrigin;
1221e8bc2655SHisping Lin 
1222e8bc2655SHisping Lin 	*value = 0xFF;
1223e8bc2655SHisping Lin 
1224e8bc2655SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1225e8bc2655SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1226e8bc2655SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1227e8bc2655SHisping Lin 	TEEC_Operation TeecOperation = {0};
1228e8bc2655SHisping Lin 
1229e8bc2655SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1230e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1231e8bc2655SHisping Lin 		return TeecResult;
1232e8bc2655SHisping Lin 
1233e8bc2655SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1234e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1235e8bc2655SHisping Lin 		return TeecResult;
1236e8bc2655SHisping Lin 
1237e8bc2655SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1238e8bc2655SHisping Lin 				&TeecSession,
1239e8bc2655SHisping Lin 				TeecUuid,
1240e8bc2655SHisping Lin 				TEEC_LOGIN_PUBLIC,
1241e8bc2655SHisping Lin 				NULL,
1242e8bc2655SHisping Lin 				NULL,
1243e8bc2655SHisping Lin 				&ErrorOrigin);
1244e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1245e8bc2655SHisping Lin 		return TeecResult;
1246e8bc2655SHisping Lin 
1247e8bc2655SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1248e8bc2655SHisping Lin 
1249e8bc2655SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1250e8bc2655SHisping Lin 						    TEEC_NONE,
1251e8bc2655SHisping Lin 						    TEEC_NONE,
1252e8bc2655SHisping Lin 						    TEEC_NONE);
1253e8bc2655SHisping Lin 
1254e8bc2655SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1255e8bc2655SHisping Lin 					STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN,
1256e8bc2655SHisping Lin 					&TeecOperation,
1257e8bc2655SHisping Lin 					&ErrorOrigin);
1258e8bc2655SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1259e8bc2655SHisping Lin 		*value = TeecOperation.params[0].value.b;
1260e8bc2655SHisping Lin 
1261e8bc2655SHisping Lin 	TEEC_CloseSession(&TeecSession);
1262e8bc2655SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1263e8bc2655SHisping Lin 
1264e8bc2655SHisping Lin 	return TeecResult;
1265e8bc2655SHisping Lin }
1266e8bc2655SHisping Lin 
1267*bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id)
1268*bfd9cea4SHisping Lin {
1269*bfd9cea4SHisping Lin 	TEEC_Result TeecResult;
1270*bfd9cea4SHisping Lin 	TEEC_Context TeecContext;
1271*bfd9cea4SHisping Lin 	TEEC_Session TeecSession;
1272*bfd9cea4SHisping Lin 	uint32_t ErrorOrigin;
1273*bfd9cea4SHisping Lin 
1274*bfd9cea4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1275*bfd9cea4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1276*bfd9cea4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1277*bfd9cea4SHisping Lin 	TEEC_Operation TeecOperation = {0};
1278*bfd9cea4SHisping Lin 
1279*bfd9cea4SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1280*bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1281*bfd9cea4SHisping Lin 		return TeecResult;
1282*bfd9cea4SHisping Lin 
1283*bfd9cea4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1284*bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1285*bfd9cea4SHisping Lin 		return TeecResult;
1286*bfd9cea4SHisping Lin 
1287*bfd9cea4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1288*bfd9cea4SHisping Lin 				&TeecSession,
1289*bfd9cea4SHisping Lin 				TeecUuid,
1290*bfd9cea4SHisping Lin 				TEEC_LOGIN_PUBLIC,
1291*bfd9cea4SHisping Lin 				NULL,
1292*bfd9cea4SHisping Lin 				NULL,
1293*bfd9cea4SHisping Lin 				&ErrorOrigin);
1294*bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1295*bfd9cea4SHisping Lin 		return TeecResult;
1296*bfd9cea4SHisping Lin 
1297*bfd9cea4SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1298*bfd9cea4SHisping Lin 
1299*bfd9cea4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1300*bfd9cea4SHisping Lin 						    TEEC_NONE,
1301*bfd9cea4SHisping Lin 						    TEEC_NONE,
1302*bfd9cea4SHisping Lin 						    TEEC_NONE);
1303*bfd9cea4SHisping Lin 
1304*bfd9cea4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1305*bfd9cea4SHisping Lin 					STORAGE_CMD_SET_OEM_HDCP_KEY_MASK,
1306*bfd9cea4SHisping Lin 					&TeecOperation,
1307*bfd9cea4SHisping Lin 					&ErrorOrigin);
1308*bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1309*bfd9cea4SHisping Lin 		goto exit;
1310*bfd9cea4SHisping Lin 
1311*bfd9cea4SHisping Lin exit:
1312*bfd9cea4SHisping Lin 	TEEC_CloseSession(&TeecSession);
1313*bfd9cea4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1314*bfd9cea4SHisping Lin 
1315*bfd9cea4SHisping Lin 	return TeecResult;
1316*bfd9cea4SHisping Lin }
1317*bfd9cea4SHisping Lin 
13184d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void)
13194d4c5043SHisping Lin {
13204d4c5043SHisping Lin 	TEEC_Result TeecResult;
13214d4c5043SHisping Lin 	TEEC_Context TeecContext;
13224d4c5043SHisping Lin 	TEEC_Session TeecSession;
13234d4c5043SHisping Lin 	uint32_t ErrorOrigin;
13244d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
13254d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
13264d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13274d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
13284d4c5043SHisping Lin 	const uint8_t transfer_inout[] = "Transfer data test.";
13294d4c5043SHisping Lin 
13304d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
13314d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13324d4c5043SHisping Lin 		return TeecResult;
13334d4c5043SHisping Lin 
13344d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
13354d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13364d4c5043SHisping Lin 		return TeecResult;
13374d4c5043SHisping Lin 
13384d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
13394d4c5043SHisping Lin 						TEEC_NONE,
13404d4c5043SHisping Lin 						TEEC_NONE,
13414d4c5043SHisping Lin 						TEEC_NONE);
13424d4c5043SHisping Lin 
13434d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
13444d4c5043SHisping Lin 				&TeecSession,
13454d4c5043SHisping Lin 				TeecUuid,
13464d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
13474d4c5043SHisping Lin 				NULL,
13484d4c5043SHisping Lin 				&TeecOperation,
13494d4c5043SHisping Lin 				&ErrorOrigin);
13504d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13514d4c5043SHisping Lin 		return TeecResult;
13524d4c5043SHisping Lin 
13534d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
13544d4c5043SHisping Lin 
13554d4c5043SHisping Lin 	SharedMem0.size = sizeof(transfer_inout);
13564d4c5043SHisping Lin 	SharedMem0.flags = 0;
13574d4c5043SHisping Lin 
13584d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
13594d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13604d4c5043SHisping Lin 		goto exit;
13614d4c5043SHisping Lin 
13624d4c5043SHisping Lin 	memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size);
13634d4c5043SHisping Lin 
13644d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
13654d4c5043SHisping Lin 
13664d4c5043SHisping Lin 	SharedMem1.size = sizeof(transfer_inout);
13674d4c5043SHisping Lin 	SharedMem1.flags = 0;
13684d4c5043SHisping Lin 
13694d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
13704d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13714d4c5043SHisping Lin 		goto exit;
13724d4c5043SHisping Lin 
13734d4c5043SHisping Lin 	TeecOperation.params[0].value.a = 66;
13744d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer;
13754d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem0.size;
13764d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer;
13774d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.size = SharedMem1.size;
13784d4c5043SHisping Lin 
13794d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
13804d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_INPUT,
13814d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_OUTPUT,
13824d4c5043SHisping Lin 						TEEC_NONE);
13834d4c5043SHisping Lin 
13844d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13854d4c5043SHisping Lin 					102,
13864d4c5043SHisping Lin 					&TeecOperation,
13874d4c5043SHisping Lin 					&ErrorOrigin);
13884d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13894d4c5043SHisping Lin 		goto exit;
13904d4c5043SHisping Lin 
13914d4c5043SHisping Lin 	//Check the result
13924d4c5043SHisping Lin 	if (TeecOperation.params[0].value.a == 66 + 1 &&
13934d4c5043SHisping Lin 	    TeecOperation.params[0].value.b == TeecOperation.params[0].value.a)
13944d4c5043SHisping Lin 		printf("test value : Pass!\n");
13954d4c5043SHisping Lin 	else
13964d4c5043SHisping Lin 		printf("test value : Fail! (mismatch values)\n");
13974d4c5043SHisping Lin 
13984d4c5043SHisping Lin 	if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0)
13994d4c5043SHisping Lin 		printf("test buffer : Pass!\n");
14004d4c5043SHisping Lin 	else
14014d4c5043SHisping Lin 		printf("test buffer : Fail! (mismatch buffer)\n");
14024d4c5043SHisping Lin 
14034d4c5043SHisping Lin exit:
14044d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
14054d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
14064d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
14074d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14084d4c5043SHisping Lin 
14094d4c5043SHisping Lin 	return TeecResult;
14104d4c5043SHisping Lin }
14114d4c5043SHisping Lin 
14124d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void)
14134d4c5043SHisping Lin {
14144d4c5043SHisping Lin 	TEEC_Result TeecResult;
14154d4c5043SHisping Lin 	TEEC_Context TeecContext;
14164d4c5043SHisping Lin 	TEEC_Session TeecSession;
14174d4c5043SHisping Lin 	uint32_t ErrorOrigin;
14184d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
14194d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
14204d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
14214d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
14224d4c5043SHisping Lin 
14234d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
14244d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14254d4c5043SHisping Lin 		return TeecResult;
14264d4c5043SHisping Lin 
14274d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
14284d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14294d4c5043SHisping Lin 		return TeecResult;
14304d4c5043SHisping Lin 
14314d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
14324d4c5043SHisping Lin 						TEEC_NONE,
14334d4c5043SHisping Lin 						TEEC_NONE,
14344d4c5043SHisping Lin 						TEEC_NONE);
14354d4c5043SHisping Lin 
14364d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
14374d4c5043SHisping Lin 				&TeecSession,
14384d4c5043SHisping Lin 				TeecUuid,
14394d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
14404d4c5043SHisping Lin 				NULL,
14414d4c5043SHisping Lin 				&TeecOperation,
14424d4c5043SHisping Lin 				&ErrorOrigin);
14434d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14444d4c5043SHisping Lin 		return TeecResult;
14454d4c5043SHisping Lin 
14464d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
14474d4c5043SHisping Lin 						TEEC_NONE,
14484d4c5043SHisping Lin 						TEEC_NONE,
14494d4c5043SHisping Lin 						TEEC_NONE);
14504d4c5043SHisping Lin 
14514d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14524d4c5043SHisping Lin 					103,
14534d4c5043SHisping Lin 					&TeecOperation,
14544d4c5043SHisping Lin 					&ErrorOrigin);
14554d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14564d4c5043SHisping Lin 		goto exit;
14574d4c5043SHisping Lin 
14584d4c5043SHisping Lin exit:
14594d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
14604d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14614d4c5043SHisping Lin 
14624d4c5043SHisping Lin 	return TeecResult;
14634d4c5043SHisping Lin }
14644d4c5043SHisping Lin 
14654aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
14664aa61755SAndy Ye {
14674aa61755SAndy Ye 	TEEC_Result TeecResult;
14684aa61755SAndy Ye 	TEEC_Context TeecContext;
14694aa61755SAndy Ye 	TEEC_Session TeecSession;
14704aa61755SAndy Ye 	uint32_t ErrorOrigin;
14714aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
14724aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
14734aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
14744aa61755SAndy Ye 				}
14754aa61755SAndy Ye 			     };
14764aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
14774aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
14783251364cSHisping Lin 	struct blk_desc *dev_desc;
14793251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
14806651d4c0SJason Zhu 	if (!dev_desc) {
14816651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
14826651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
14836651d4c0SJason Zhu 	}
14844aa61755SAndy Ye 
1485f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1486f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1487f4e1db95SHisping Lin 		return TeecResult;
14884aa61755SAndy Ye 
14894aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1490f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1491f4e1db95SHisping Lin 		return TeecResult;
14924aa61755SAndy Ye 
14933251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
14943251364cSHisping Lin 						TEEC_NONE,
14953251364cSHisping Lin 						TEEC_NONE,
14963251364cSHisping Lin 						TEEC_NONE);
14973251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1498b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1499b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1500b9a7e756SHisping Lin 	else
1501b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1502b9a7e756SHisping Lin 
15033251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15043251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15053251364cSHisping Lin #endif
15063251364cSHisping Lin 
15074aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15084aa61755SAndy Ye 				      &TeecSession,
15094aa61755SAndy Ye 				      TeecUuid,
15104aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15114aa61755SAndy Ye 				      NULL,
15123251364cSHisping Lin 					&TeecOperation,
15134aa61755SAndy Ye 				      &ErrorOrigin);
1514f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1515f4e1db95SHisping Lin 		return TeecResult;
15164aa61755SAndy Ye 
15174aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
15184aa61755SAndy Ye 
15194aa61755SAndy Ye 	SharedMem0.size = *dh_size;
15204aa61755SAndy Ye 	SharedMem0.flags = 0;
15214aa61755SAndy Ye 
15224aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1523f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1524f4e1db95SHisping Lin 		goto exit;
15254aa61755SAndy Ye 
15264aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
15274aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
15284aa61755SAndy Ye 
15294aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
15304aa61755SAndy Ye 						    TEEC_NONE,
15314aa61755SAndy Ye 						    TEEC_NONE,
15324aa61755SAndy Ye 						    TEEC_NONE);
15334aa61755SAndy Ye 
15344aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
15354aa61755SAndy Ye 					143,
15364aa61755SAndy Ye 					&TeecOperation,
15374aa61755SAndy Ye 					&ErrorOrigin);
1538f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1539f4e1db95SHisping Lin 		goto exit;
15404aa61755SAndy Ye 
15414aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
15424aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1543f4e1db95SHisping Lin exit:
15444aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
15454aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1546f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
15474aa61755SAndy Ye 
15484aa61755SAndy Ye 	return TeecResult;
15494aa61755SAndy Ye }
15504aa61755SAndy Ye 
15514aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
15524aa61755SAndy Ye {
15534aa61755SAndy Ye 	TEEC_Result TeecResult;
15544aa61755SAndy Ye 	TEEC_Context TeecContext;
15554aa61755SAndy Ye 	TEEC_Session TeecSession;
15564aa61755SAndy Ye 	uint32_t ErrorOrigin;
15574aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15584aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15594aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15604aa61755SAndy Ye 				}
15614aa61755SAndy Ye 			     };
15624aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15634aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
15643251364cSHisping Lin 	struct blk_desc *dev_desc;
15653251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15666651d4c0SJason Zhu 	if (!dev_desc) {
15676651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15686651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15696651d4c0SJason Zhu 	}
15704aa61755SAndy Ye 
1571f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1572f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1573f4e1db95SHisping Lin 		return TeecResult;
15744aa61755SAndy Ye 
15754aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1576f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1577f4e1db95SHisping Lin 		return TeecResult;
15784aa61755SAndy Ye 
15793251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15803251364cSHisping Lin 						TEEC_NONE,
15813251364cSHisping Lin 						TEEC_NONE,
15823251364cSHisping Lin 						TEEC_NONE);
15833251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1584b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1585b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1586b9a7e756SHisping Lin 	else
1587b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1588b9a7e756SHisping Lin 
15893251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15903251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15913251364cSHisping Lin #endif
15923251364cSHisping Lin 
15934aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15944aa61755SAndy Ye 				      &TeecSession,
15954aa61755SAndy Ye 				      TeecUuid,
15964aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15974aa61755SAndy Ye 				      NULL,
15983251364cSHisping Lin 					&TeecOperation,
15994aa61755SAndy Ye 				      &ErrorOrigin);
1600f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1601f4e1db95SHisping Lin 		return TeecResult;
16024aa61755SAndy Ye 
16034aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16044aa61755SAndy Ye 
16054aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
16064aa61755SAndy Ye 	SharedMem0.flags = 0;
16074aa61755SAndy Ye 
16084aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1609f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1610f4e1db95SHisping Lin 		goto exit;
16114aa61755SAndy Ye 
16124aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
16134aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
16144aa61755SAndy Ye 
16154aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
16164aa61755SAndy Ye 						    TEEC_NONE,
16174aa61755SAndy Ye 						    TEEC_NONE,
16184aa61755SAndy Ye 						    TEEC_NONE);
16194aa61755SAndy Ye 
16204aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16214aa61755SAndy Ye 					144,
16224aa61755SAndy Ye 					&TeecOperation,
16234aa61755SAndy Ye 					&ErrorOrigin);
1624f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1625f4e1db95SHisping Lin 		goto exit;
16264aa61755SAndy Ye 
16274aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
16284aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1629f4e1db95SHisping Lin exit:
16304aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
16314aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1632f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
16334aa61755SAndy Ye 
16344aa61755SAndy Ye 	return TeecResult;
16354aa61755SAndy Ye }
16364aa61755SAndy Ye 
16374aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
16384aa61755SAndy Ye 			      uint32_t *operation_size,
16394aa61755SAndy Ye 			      uint8_t *out,
16404aa61755SAndy Ye 			      uint32_t *out_len)
16414aa61755SAndy Ye {
16424aa61755SAndy Ye 	TEEC_Result TeecResult;
16434aa61755SAndy Ye 	TEEC_Context TeecContext;
16444aa61755SAndy Ye 	TEEC_Session TeecSession;
16454aa61755SAndy Ye 	uint32_t ErrorOrigin;
16464aa61755SAndy Ye 
16474aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16484aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16494aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16504aa61755SAndy Ye 				}
16514aa61755SAndy Ye 			     };
16524aa61755SAndy Ye 
16534aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16544aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16553251364cSHisping Lin 	struct blk_desc *dev_desc;
16563251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16576651d4c0SJason Zhu 	if (!dev_desc) {
16586651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
16596651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
16606651d4c0SJason Zhu 	}
16614aa61755SAndy Ye 
1662f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1663f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1664f4e1db95SHisping Lin 		return TeecResult;
16654aa61755SAndy Ye 
16664aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1667f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1668f4e1db95SHisping Lin 		return TeecResult;
16694aa61755SAndy Ye 
16703251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16713251364cSHisping Lin 						TEEC_NONE,
16723251364cSHisping Lin 						TEEC_NONE,
16733251364cSHisping Lin 						TEEC_NONE);
16743251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1675b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1676b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1677b9a7e756SHisping Lin 	else
1678b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1679b9a7e756SHisping Lin 
16803251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16813251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16823251364cSHisping Lin #endif
16833251364cSHisping Lin 
16844aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16854aa61755SAndy Ye 				      &TeecSession,
16864aa61755SAndy Ye 				      TeecUuid,
16874aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16884aa61755SAndy Ye 				      NULL,
16893251364cSHisping Lin 					&TeecOperation,
16904aa61755SAndy Ye 				      &ErrorOrigin);
1691f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1692f4e1db95SHisping Lin 		return TeecResult;
16934aa61755SAndy Ye 
16944aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16954aa61755SAndy Ye 
16964aa61755SAndy Ye 	SharedMem0.size = *operation_size;
16974aa61755SAndy Ye 	SharedMem0.flags = 0;
16984aa61755SAndy Ye 
16994aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1700f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1701f4e1db95SHisping Lin 		goto exit;
17024aa61755SAndy Ye 
17034aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
17044aa61755SAndy Ye 
17054aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17064aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17074aa61755SAndy Ye 
17084aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
17094aa61755SAndy Ye 
17104aa61755SAndy Ye 	SharedMem1.size = *out_len;
17114aa61755SAndy Ye 	SharedMem1.flags = 0;
17124aa61755SAndy Ye 
17134aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1714f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1715f4e1db95SHisping Lin 		goto exit;
17164aa61755SAndy Ye 
17174aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
17184aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
17194aa61755SAndy Ye 
17204aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17214aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
17224aa61755SAndy Ye 						    TEEC_NONE,
17234aa61755SAndy Ye 						    TEEC_NONE);
17244aa61755SAndy Ye 
17254aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17264aa61755SAndy Ye 					145,
17274aa61755SAndy Ye 					&TeecOperation,
17284aa61755SAndy Ye 					&ErrorOrigin);
1729f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1730f4e1db95SHisping Lin 		goto exit;
17314aa61755SAndy Ye 
17324aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
17334aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1734f4e1db95SHisping Lin exit:
17354aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17364aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1737f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1738f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
17394aa61755SAndy Ye 
17404aa61755SAndy Ye 	return TeecResult;
17414aa61755SAndy Ye }
17424aa61755SAndy Ye 
17434aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
17444aa61755SAndy Ye {
17454aa61755SAndy Ye 	TEEC_Result TeecResult;
17464aa61755SAndy Ye 	TEEC_Context TeecContext;
17474aa61755SAndy Ye 	TEEC_Session TeecSession;
17484aa61755SAndy Ye 	uint32_t ErrorOrigin;
17494aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17504aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17514aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17524aa61755SAndy Ye 				}
17534aa61755SAndy Ye 			     };
17544aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17554aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17563251364cSHisping Lin 	struct blk_desc *dev_desc;
17573251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17586651d4c0SJason Zhu 	if (!dev_desc) {
17596651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17606651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17616651d4c0SJason Zhu 	}
1762f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1763f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1764f4e1db95SHisping Lin 		return TeecResult;
17654aa61755SAndy Ye 
17664aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1767f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1768f4e1db95SHisping Lin 		return TeecResult;
17694aa61755SAndy Ye 
17703251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17713251364cSHisping Lin 						TEEC_NONE,
17723251364cSHisping Lin 						TEEC_NONE,
17733251364cSHisping Lin 						TEEC_NONE);
17743251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1775b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1776b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1777b9a7e756SHisping Lin 	else
1778b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1779b9a7e756SHisping Lin 
17803251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17813251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17823251364cSHisping Lin #endif
17833251364cSHisping Lin 
17844aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17854aa61755SAndy Ye 					&TeecSession,
17864aa61755SAndy Ye 					TeecUuid,
17874aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
17884aa61755SAndy Ye 					NULL,
17893251364cSHisping Lin 					&TeecOperation,
17904aa61755SAndy Ye 					&ErrorOrigin);
1791f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1792f4e1db95SHisping Lin 		return TeecResult;
17934aa61755SAndy Ye 
17944aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17954aa61755SAndy Ye 
17964aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
17974aa61755SAndy Ye 	SharedMem0.flags = 0;
17984aa61755SAndy Ye 
17994aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1800f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1801f4e1db95SHisping Lin 		goto exit;
18024aa61755SAndy Ye 
18034aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
18044aa61755SAndy Ye 
18054aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18064aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18074aa61755SAndy Ye 
18084aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
18094aa61755SAndy Ye 						    TEEC_NONE,
18104aa61755SAndy Ye 						    TEEC_NONE,
18114aa61755SAndy Ye 						    TEEC_NONE);
18124aa61755SAndy Ye 
18134aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18144aa61755SAndy Ye 					146,
18154aa61755SAndy Ye 					&TeecOperation,
18164aa61755SAndy Ye 					&ErrorOrigin);
1817f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1818f4e1db95SHisping Lin 		goto exit;
1819f4e1db95SHisping Lin exit:
18204aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18214aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1822f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18234aa61755SAndy Ye 
18244aa61755SAndy Ye 	return TeecResult;
18254aa61755SAndy Ye }
1826