xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision e8bc2655279fcba0c10171c030ab964b7b8a5893)
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
34*e8bc2655SHisping Lin #define STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN	22
35ae8ec5e1SHisping Lin 
362f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER	0x00000002
37fc3694d6Sxb.wang 
38fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID	{ 0x0cacdb5d, 0x4fea, 0x466c, \
39fc3694d6Sxb.wang 		{ 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } }
40fc3694d6Sxb.wang 
41ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
42ae8ec5e1SHisping Lin {
43ae8ec5e1SHisping Lin 	if (in > 9)
44ae8ec5e1SHisping Lin 		return in + 55;
45ae8ec5e1SHisping Lin 	else
46ae8ec5e1SHisping Lin 		return in + 48;
47ae8ec5e1SHisping Lin }
48ae8ec5e1SHisping Lin 
49c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
50ae8ec5e1SHisping Lin {
51ae8ec5e1SHisping Lin 	uint32_t i = 0;
52ae8ec5e1SHisping Lin 
53ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
54ae8ec5e1SHisping Lin 		return 0;
55ae8ec5e1SHisping Lin 
56ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
57ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
58ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
59ae8ec5e1SHisping Lin 	}
60ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
61ae8ec5e1SHisping Lin 
62ae8ec5e1SHisping Lin 	return blen * 2;
63ae8ec5e1SHisping Lin }
64ae8ec5e1SHisping Lin 
652f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size)
662f8c34bdSxb.wang {
672f8c34bdSxb.wang 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
682f8c34bdSxb.wang 	ulong aligned_input, aligned_len;
692f8c34bdSxb.wang 
702f8c34bdSxb.wang 	if (!addr || !size)
712f8c34bdSxb.wang 		return;
722f8c34bdSxb.wang 
732f8c34bdSxb.wang 	/* Must flush dcache before crypto DMA fetch data region */
742f8c34bdSxb.wang 	aligned_input = round_down(addr, alignment);
752f8c34bdSxb.wang 	aligned_len = round_up(size + (addr - aligned_input), alignment);
762f8c34bdSxb.wang 	flush_cache(aligned_input, aligned_len);
772f8c34bdSxb.wang }
782f8c34bdSxb.wang 
79a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
80a900eef3SHisping Lin {
81a900eef3SHisping Lin 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
82a900eef3SHisping Lin 	ulong aligned_input, aligned_len;
83a900eef3SHisping Lin 
84a900eef3SHisping Lin 	if (!addr || !size)
85a900eef3SHisping Lin 		return;
86a900eef3SHisping Lin 
87a900eef3SHisping Lin 	/* Must invalidate dcache after crypto DMA write data region */
88a900eef3SHisping Lin 	aligned_input = round_down(addr, alignment);
89a900eef3SHisping Lin 	aligned_len = round_up(size + (addr - aligned_input), alignment);
90a900eef3SHisping Lin 	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
91a900eef3SHisping Lin }
92a900eef3SHisping Lin 
93c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
94c7de5349SHisping Lin 						uint32_t filename_size,
95c7de5349SHisping Lin 						uint8_t *data,
96c7de5349SHisping Lin 						uint32_t data_size)
97ae8ec5e1SHisping Lin {
98ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
99ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
100ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
101ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
102ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
103ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
104ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
105ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1063251364cSHisping Lin 	struct blk_desc *dev_desc;
1073251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1086651d4c0SJason Zhu 	if (!dev_desc) {
1096651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1106651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1116651d4c0SJason Zhu 	}
1123251364cSHisping Lin 
113f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
114f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
115f4e1db95SHisping Lin 		return TeecResult;
116ae8ec5e1SHisping Lin 
117ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
118f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
119f4e1db95SHisping Lin 		return TeecResult;
120ae8ec5e1SHisping Lin 
1213251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1223251364cSHisping Lin 						    TEEC_NONE,
1233251364cSHisping Lin 						    TEEC_NONE,
1243251364cSHisping Lin 						    TEEC_NONE);
1253251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
126b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
127b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
128b9a7e756SHisping Lin 	else
129b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1303251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1313251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1323251364cSHisping Lin #endif
1333251364cSHisping Lin 
134ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
135ae8ec5e1SHisping Lin 				&TeecSession,
136ae8ec5e1SHisping Lin 				TeecUuid,
137ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
138ae8ec5e1SHisping Lin 				NULL,
1393251364cSHisping Lin 				&TeecOperation,
140ae8ec5e1SHisping Lin 				&ErrorOrigin);
141f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
142f4e1db95SHisping Lin 		return TeecResult;
143ae8ec5e1SHisping Lin 
144ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
145ae8ec5e1SHisping Lin 
146c7de5349SHisping Lin 	SharedMem0.size = filename_size;
147ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
148ae8ec5e1SHisping Lin 
149ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
150f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
151f4e1db95SHisping Lin 		goto exit;
152ae8ec5e1SHisping Lin 
153c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
154ae8ec5e1SHisping Lin 
155ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
156ae8ec5e1SHisping Lin 
157c7de5349SHisping Lin 	SharedMem1.size = data_size;
158c7de5349SHisping Lin 	SharedMem1.flags = 0;
159c7de5349SHisping Lin 
160c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
161c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
162c7de5349SHisping Lin 		goto exit;
163c7de5349SHisping Lin 
164c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
165c7de5349SHisping Lin 
166c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
167c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
168c7de5349SHisping Lin 
169c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
170c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
171c7de5349SHisping Lin 
172c7de5349SHisping Lin 
173c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
174c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
175c7de5349SHisping Lin 						TEEC_NONE,
176c7de5349SHisping Lin 						TEEC_NONE);
177c7de5349SHisping Lin 
178c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
179c7de5349SHisping Lin 					1,
180c7de5349SHisping Lin 					&TeecOperation,
181c7de5349SHisping Lin 					&ErrorOrigin);
182c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
183c7de5349SHisping Lin 		goto exit;
184c7de5349SHisping Lin exit:
185c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
186c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
187c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
188c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
189c7de5349SHisping Lin 
190c7de5349SHisping Lin 	return TeecResult;
191c7de5349SHisping Lin }
192c7de5349SHisping Lin 
193c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
194c7de5349SHisping Lin 					       uint32_t filename_size,
195c7de5349SHisping Lin 					       uint8_t *data,
196c7de5349SHisping Lin 					       uint32_t data_size)
197c7de5349SHisping Lin {
198c7de5349SHisping Lin 	TEEC_Result TeecResult;
199c7de5349SHisping Lin 	TEEC_Context TeecContext;
200c7de5349SHisping Lin 	TEEC_Session TeecSession;
201c7de5349SHisping Lin 	uint32_t ErrorOrigin;
202c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
203c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
204c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
205c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
206c7de5349SHisping Lin 
207c7de5349SHisping Lin 	struct blk_desc *dev_desc;
208c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
209c7de5349SHisping Lin 	if (!dev_desc) {
210c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
211c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
212c7de5349SHisping Lin 	}
213c7de5349SHisping Lin 
214c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
215c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
216c7de5349SHisping Lin 		return TeecResult;
217c7de5349SHisping Lin 
218c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
219c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
220c7de5349SHisping Lin 		return TeecResult;
221c7de5349SHisping Lin 
222c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
223c7de5349SHisping Lin 						TEEC_NONE,
224c7de5349SHisping Lin 						TEEC_NONE,
225c7de5349SHisping Lin 						TEEC_NONE);
226c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
227c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
228c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
229c7de5349SHisping Lin 	else
230c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
231c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
232c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
233c7de5349SHisping Lin #endif
234c7de5349SHisping Lin 
235c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
236c7de5349SHisping Lin 				&TeecSession,
237c7de5349SHisping Lin 				TeecUuid,
238c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
239c7de5349SHisping Lin 				NULL,
240c7de5349SHisping Lin 				&TeecOperation,
241c7de5349SHisping Lin 				&ErrorOrigin);
242c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
243c7de5349SHisping Lin 		return TeecResult;
244c7de5349SHisping Lin 
245c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
246c7de5349SHisping Lin 
247c7de5349SHisping Lin 	SharedMem0.size = filename_size;
248c7de5349SHisping Lin 	SharedMem0.flags = 0;
249c7de5349SHisping Lin 
250c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
251c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
252c7de5349SHisping Lin 		goto exit;
253c7de5349SHisping Lin 
254c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
255c7de5349SHisping Lin 
256c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
257c7de5349SHisping Lin 
258c7de5349SHisping Lin 	SharedMem1.size = data_size;
259ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
260ae8ec5e1SHisping Lin 
261ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
262f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
263f4e1db95SHisping Lin 		goto exit;
264ae8ec5e1SHisping Lin 
265ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
266ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
267ae8ec5e1SHisping Lin 
268ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
269ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
270ae8ec5e1SHisping Lin 
271ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
272ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
273ae8ec5e1SHisping Lin 						TEEC_NONE,
274ae8ec5e1SHisping Lin 						TEEC_NONE);
275ae8ec5e1SHisping Lin 
276ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
277ae8ec5e1SHisping Lin 					0,
278ae8ec5e1SHisping Lin 					&TeecOperation,
279ae8ec5e1SHisping Lin 					&ErrorOrigin);
28046b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
281c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
282f4e1db95SHisping Lin exit:
283ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
284ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
285ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
28646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
287ae8ec5e1SHisping Lin 
288ae8ec5e1SHisping Lin 	return TeecResult;
289ae8ec5e1SHisping Lin }
290ae8ec5e1SHisping Lin 
291c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
292c7de5349SHisping Lin {
293c7de5349SHisping Lin 	TEEC_Result TeecResult;
294c7de5349SHisping Lin 	TEEC_Context TeecContext;
295c7de5349SHisping Lin 	TEEC_Session TeecSession;
296c7de5349SHisping Lin 	uint32_t ErrorOrigin;
297c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
298c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
299c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
300c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
301c7de5349SHisping Lin 
302c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
303c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
304c7de5349SHisping Lin 		return TeecResult;
305c7de5349SHisping Lin 
306c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
307c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
308c7de5349SHisping Lin 		return TeecResult;
309c7de5349SHisping Lin 
310c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
311c7de5349SHisping Lin 				&TeecSession,
312c7de5349SHisping Lin 				TeecUuid,
313c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
314c7de5349SHisping Lin 				NULL,
315c7de5349SHisping Lin 				NULL,
316c7de5349SHisping Lin 				&ErrorOrigin);
317c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
318c7de5349SHisping Lin 		return TeecResult;
319c7de5349SHisping Lin 
320c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
321c7de5349SHisping Lin 						    TEEC_NONE,
322c7de5349SHisping Lin 						    TEEC_NONE,
323c7de5349SHisping Lin 						    TEEC_NONE);
324c7de5349SHisping Lin 
325c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
326c7de5349SHisping Lin 					2,
327c7de5349SHisping Lin 					&TeecOperation,
328c7de5349SHisping Lin 					&ErrorOrigin);
329c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
330c7de5349SHisping Lin 		goto exit;
331c7de5349SHisping Lin exit:
332c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
333c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
334c7de5349SHisping Lin 
335c7de5349SHisping Lin 	return TeecResult;
336c7de5349SHisping Lin }
337c7de5349SHisping Lin 
33834f2e8f6SHisping Lin static void trusty_notify_always_use_security(void)
33934f2e8f6SHisping Lin {
34034f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION)
34134f2e8f6SHisping Lin 	TEEC_Result TeecResult;
34234f2e8f6SHisping Lin 	TEEC_Context TeecContext;
34334f2e8f6SHisping Lin 	TEEC_Session TeecSession;
34434f2e8f6SHisping Lin 	uint32_t ErrorOrigin;
34534f2e8f6SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
34634f2e8f6SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
34734f2e8f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
34834f2e8f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
34934f2e8f6SHisping Lin 
35034f2e8f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
35134f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
35234f2e8f6SHisping Lin 		return;
35334f2e8f6SHisping Lin 
35434f2e8f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
35534f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
35634f2e8f6SHisping Lin 		return;
35734f2e8f6SHisping Lin 
35834f2e8f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
35934f2e8f6SHisping Lin 				&TeecSession,
36034f2e8f6SHisping Lin 				TeecUuid,
36134f2e8f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
36234f2e8f6SHisping Lin 				NULL,
36334f2e8f6SHisping Lin 				NULL,
36434f2e8f6SHisping Lin 				&ErrorOrigin);
36534f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
36634f2e8f6SHisping Lin 		return;
36734f2e8f6SHisping Lin 
36834f2e8f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
36934f2e8f6SHisping Lin 						    TEEC_NONE,
37034f2e8f6SHisping Lin 						    TEEC_NONE,
37134f2e8f6SHisping Lin 						    TEEC_NONE);
37234f2e8f6SHisping Lin 
37334f2e8f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
37434f2e8f6SHisping Lin 					9,
37534f2e8f6SHisping Lin 					&TeecOperation,
37634f2e8f6SHisping Lin 					&ErrorOrigin);
37734f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
37834f2e8f6SHisping Lin 		debug("notify always use security fail! please update optee!");
37934f2e8f6SHisping Lin 
38034f2e8f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
38134f2e8f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
38234f2e8f6SHisping Lin 
38334f2e8f6SHisping Lin 	return;
38434f2e8f6SHisping Lin #endif
38534f2e8f6SHisping Lin }
38634f2e8f6SHisping Lin 
387c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
388c7de5349SHisping Lin {
389c7de5349SHisping Lin 	char hs[9];
390c7de5349SHisping Lin 
391c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
392c7de5349SHisping Lin 
393c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
394c7de5349SHisping Lin }
395c7de5349SHisping Lin 
396ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
397ae8ec5e1SHisping Lin {
398c7de5349SHisping Lin 	char hs[9];
3993251364cSHisping Lin 
400c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
401ae8ec5e1SHisping Lin 
402c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
403ae8ec5e1SHisping Lin }
404ae8ec5e1SHisping Lin 
405ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
406ae8ec5e1SHisping Lin {
407c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
408c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
409ae8ec5e1SHisping Lin }
410ae8ec5e1SHisping Lin 
411ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
412ae8ec5e1SHisping Lin {
413c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
414c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
4156651d4c0SJason Zhu }
416ae8ec5e1SHisping Lin 
417c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
418c7de5349SHisping Lin {
419c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
420c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
421c7de5349SHisping Lin }
422ae8ec5e1SHisping Lin 
423c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
424c7de5349SHisping Lin {
425c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
426c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
427ae8ec5e1SHisping Lin }
428ae8ec5e1SHisping Lin 
429564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
430564654ebSJason Zhu 					      uint32_t size)
431564654ebSJason Zhu {
432c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
433c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
434564654ebSJason Zhu }
435564654ebSJason Zhu 
436564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
437564654ebSJason Zhu 					       uint32_t size)
438564654ebSJason Zhu {
439c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
440c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
441564654ebSJason Zhu }
442564654ebSJason Zhu 
443ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
444ae8ec5e1SHisping Lin {
445c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
446c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
447ae8ec5e1SHisping Lin }
448ae8ec5e1SHisping Lin 
449ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
450ae8ec5e1SHisping Lin {
451c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
452c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
453ae8ec5e1SHisping Lin }
454ae8ec5e1SHisping Lin 
455ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
456ae8ec5e1SHisping Lin {
457c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
458c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
459c7de5349SHisping Lin }
460c7de5349SHisping Lin 
461c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
462c7de5349SHisping Lin {
463c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
464c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
465c7de5349SHisping Lin }
466c7de5349SHisping Lin 
467c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
468c7de5349SHisping Lin {
469ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
470ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
471ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
472ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
473c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
474c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
475c7de5349SHisping Lin 
476ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
477ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
478ae8ec5e1SHisping Lin 
479f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
480f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
481f4e1db95SHisping Lin 		return TeecResult;
482ae8ec5e1SHisping Lin 
483ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
484f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
485f4e1db95SHisping Lin 		return TeecResult;
486ae8ec5e1SHisping Lin 
487ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
488ae8ec5e1SHisping Lin 				      &TeecSession,
489ae8ec5e1SHisping Lin 				      TeecUuid,
490ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
491ae8ec5e1SHisping Lin 				      NULL,
492c7de5349SHisping Lin 				      NULL,
493ae8ec5e1SHisping Lin 				      &ErrorOrigin);
494f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
495f4e1db95SHisping Lin 		return TeecResult;
496ae8ec5e1SHisping Lin 
497c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
498c7de5349SHisping Lin 						    TEEC_NONE,
499ae8ec5e1SHisping Lin 						    TEEC_NONE,
500ae8ec5e1SHisping Lin 						    TEEC_NONE);
501ae8ec5e1SHisping Lin 
502ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
503c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
504ae8ec5e1SHisping Lin 					&TeecOperation,
505ae8ec5e1SHisping Lin 					&ErrorOrigin);
506c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
507c7de5349SHisping Lin 		goto exit;
508f4e1db95SHisping Lin exit:
509ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
51046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
511ae8ec5e1SHisping Lin 
512ae8ec5e1SHisping Lin 	return TeecResult;
513ae8ec5e1SHisping Lin }
514ae8ec5e1SHisping Lin 
515c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
516c7de5349SHisping Lin 						   uint8_t is_write,
517c7de5349SHisping Lin 						   uint32_t *buf,
518c7de5349SHisping Lin 						   uint32_t length)
519ae8ec5e1SHisping Lin {
520ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
521ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
522ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
523ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
524c7de5349SHisping Lin 
525c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
526c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
527ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
528ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
529ae8ec5e1SHisping Lin 
530f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
531f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
532f4e1db95SHisping Lin 		return TeecResult;
533ae8ec5e1SHisping Lin 
534ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
535f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
536f4e1db95SHisping Lin 		return TeecResult;
537ae8ec5e1SHisping Lin 
538ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
539ae8ec5e1SHisping Lin 				&TeecSession,
540ae8ec5e1SHisping Lin 				TeecUuid,
541ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
542ae8ec5e1SHisping Lin 				NULL,
543c7de5349SHisping Lin 				NULL,
544ae8ec5e1SHisping Lin 				&ErrorOrigin);
545f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
546f4e1db95SHisping Lin 		return TeecResult;
547ae8ec5e1SHisping Lin 
548ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
549ae8ec5e1SHisping Lin 
550c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
551ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
552ae8ec5e1SHisping Lin 
553ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
554f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
555f4e1db95SHisping Lin 		goto exit;
556ae8ec5e1SHisping Lin 
557ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
558ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
559ae8ec5e1SHisping Lin 
560c7de5349SHisping Lin 	if (is_write) {
561c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
562ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
563c7de5349SHisping Lin 							    TEEC_NONE,
564ae8ec5e1SHisping Lin 							    TEEC_NONE,
565ae8ec5e1SHisping Lin 							    TEEC_NONE);
566ae8ec5e1SHisping Lin 
567c7de5349SHisping Lin 	} else {
568c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
569c7de5349SHisping Lin 							    TEEC_NONE,
570c7de5349SHisping Lin 							    TEEC_NONE,
571c7de5349SHisping Lin 							    TEEC_NONE);
572c7de5349SHisping Lin 	}
573c7de5349SHisping Lin 
574ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
575c7de5349SHisping Lin 					cmd,
576ae8ec5e1SHisping Lin 					&TeecOperation,
577ae8ec5e1SHisping Lin 					&ErrorOrigin);
578f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
579f4e1db95SHisping Lin 		goto exit;
580c7de5349SHisping Lin 
581c7de5349SHisping Lin 	if (!is_write)
582c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
583c7de5349SHisping Lin 
584f4e1db95SHisping Lin exit:
585ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
586ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
58746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
588ae8ec5e1SHisping Lin 
589ae8ec5e1SHisping Lin 	return TeecResult;
590ae8ec5e1SHisping Lin }
591ae8ec5e1SHisping Lin 
5926ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5936ef445a4SHisping Lin {
594c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
595c7de5349SHisping Lin 						  false, buf, length);
5966ef445a4SHisping Lin }
5976ef445a4SHisping Lin 
5986ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5996ef445a4SHisping Lin {
600c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
601c7de5349SHisping Lin 						  true, buf, length);
60216539616SHisping Lin }
60316539616SHisping Lin 
60416539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
60516539616SHisping Lin {
60616539616SHisping Lin 	TEEC_Result res;
607c7de5349SHisping Lin 
608c7de5349SHisping Lin 	res = trusty_base_end_security_data();
609c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
61016539616SHisping Lin 	return res;
61116539616SHisping Lin }
6122cd27853SHisping Lin 
6132cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
6142cd27853SHisping Lin {
615c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
616c7de5349SHisping Lin 						  false, buf, length);
6172cd27853SHisping Lin }
618c7de5349SHisping Lin 
6192cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
6202cd27853SHisping Lin {
621c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
622c7de5349SHisping Lin 						  true, buf, length);
6232cd27853SHisping Lin }
624095e2a82SHisping Lin 
625468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
626468df3b2SHisping Lin {
627468df3b2SHisping Lin 	uint32_t bootflag;
628c7de5349SHisping Lin 	TEEC_Result TeecResult;
629468df3b2SHisping Lin 
630f07e1686SHisping Lin 	*flag = 0;
631f07e1686SHisping Lin 
632c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
633c7de5349SHisping Lin 							false, &bootflag, 1);
634468df3b2SHisping Lin 
635468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
6360202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
6370202ee8aSHisping Lin 		if (bootflag == 0x00000001)
6380202ee8aSHisping Lin 			*flag = 1;
6390202ee8aSHisping Lin #else
640468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
641468df3b2SHisping Lin 			*flag = 1;
6420202ee8aSHisping Lin #endif
643468df3b2SHisping Lin 	}
644095e2a82SHisping Lin 	return TeecResult;
645095e2a82SHisping Lin }
6464aa61755SAndy Ye 
6471ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
6481ef63c75SHisping Lin {
6491ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
6501ef63c75SHisping Lin 						  true, buf, length);
6511ef63c75SHisping Lin }
6521ef63c75SHisping Lin 
65310f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value)
65410f41197SHisping Lin {
65510f41197SHisping Lin 	TEEC_Result TeecResult;
65610f41197SHisping Lin 	TEEC_Context TeecContext;
65710f41197SHisping Lin 	TEEC_Session TeecSession;
65810f41197SHisping Lin 	uint32_t ErrorOrigin;
65910f41197SHisping Lin 
66010f41197SHisping Lin 	*value = 0;
66110f41197SHisping Lin 
66210f41197SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
66310f41197SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
66410f41197SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
66510f41197SHisping Lin 	TEEC_Operation TeecOperation = {0};
66610f41197SHisping Lin 
66710f41197SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
66810f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
66910f41197SHisping Lin 		return TeecResult;
67010f41197SHisping Lin 
67110f41197SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
67210f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
67310f41197SHisping Lin 		return TeecResult;
67410f41197SHisping Lin 
67510f41197SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
67610f41197SHisping Lin 				&TeecSession,
67710f41197SHisping Lin 				TeecUuid,
67810f41197SHisping Lin 				TEEC_LOGIN_PUBLIC,
67910f41197SHisping Lin 				NULL,
68010f41197SHisping Lin 				NULL,
68110f41197SHisping Lin 				&ErrorOrigin);
68210f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
68310f41197SHisping Lin 		return TeecResult;
68410f41197SHisping Lin 
68510f41197SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
68610f41197SHisping Lin 						    TEEC_NONE,
68710f41197SHisping Lin 						    TEEC_NONE,
68810f41197SHisping Lin 						    TEEC_NONE);
68910f41197SHisping Lin 
69010f41197SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
69110f41197SHisping Lin 					STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN,
69210f41197SHisping Lin 					&TeecOperation,
69310f41197SHisping Lin 					&ErrorOrigin);
69410f41197SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
69510f41197SHisping Lin 		*value = TeecOperation.params[0].value.a;
69610f41197SHisping Lin 
69710f41197SHisping Lin 	TEEC_CloseSession(&TeecSession);
69810f41197SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
69910f41197SHisping Lin 
70010f41197SHisping Lin 	return TeecResult;
70110f41197SHisping Lin }
70210f41197SHisping Lin 
703fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
704fbf29bfbSHisping Lin {
705fbf29bfbSHisping Lin 	uint32_t levelflag;
706fbf29bfbSHisping Lin 
707fbf29bfbSHisping Lin 	levelflag = flag;
708fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
709fbf29bfbSHisping Lin 						  true, &levelflag, 1);
710fbf29bfbSHisping Lin }
711fbf29bfbSHisping Lin 
712f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
713f39d4289SHisping Lin {
714f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
715f39d4289SHisping Lin 						  true, buf, length);
716f39d4289SHisping Lin }
717f39d4289SHisping Lin 
71834f2e8f6SHisping Lin static void trusty_select_security_level(void)
7197504da74SHisping Lin {
7207504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
7217504da74SHisping Lin 	TEEC_Result TeecResult;
7227504da74SHisping Lin 
7237504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
7247504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
7257504da74SHisping Lin 		run_command("download", 0);
7267504da74SHisping Lin 		return;
7277504da74SHisping Lin 	}
7287504da74SHisping Lin 
7297504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
7307504da74SHisping Lin 		debug("optee select security level success!");
7317504da74SHisping Lin 	else
7327504da74SHisping Lin 		panic("optee select security level fail!");
7337504da74SHisping Lin 
7347504da74SHisping Lin 	return;
7357504da74SHisping Lin #endif
7367504da74SHisping Lin }
7377504da74SHisping Lin 
73851ac7005SHisping Lin void optee_client_init(void)
73951ac7005SHisping Lin {
74051ac7005SHisping Lin 	trusty_select_security_level();
74134f2e8f6SHisping Lin 	trusty_notify_always_use_security();
74251ac7005SHisping Lin }
74351ac7005SHisping Lin 
744d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
745d5913350SHisping Lin {
746d5913350SHisping Lin 	TEEC_Result TeecResult;
747d5913350SHisping Lin 	TEEC_Context TeecContext;
748d5913350SHisping Lin 	TEEC_Session TeecSession;
749d5913350SHisping Lin 	uint32_t ErrorOrigin;
750d5913350SHisping Lin 
751d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
752d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
753d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
754d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
755d5913350SHisping Lin 
756d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
757d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
758d5913350SHisping Lin 		return TeecResult;
759d5913350SHisping Lin 
760d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
761d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
762d5913350SHisping Lin 		return TeecResult;
763d5913350SHisping Lin 
764d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
765d5913350SHisping Lin 				&TeecSession,
766d5913350SHisping Lin 				TeecUuid,
767d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
768d5913350SHisping Lin 				NULL,
769d5913350SHisping Lin 				NULL,
770d5913350SHisping Lin 				&ErrorOrigin);
771d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
772d5913350SHisping Lin 		return TeecResult;
773d5913350SHisping Lin 
774d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
775d5913350SHisping Lin 
776d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
777d5913350SHisping Lin 
778d5913350SHisping Lin 	SharedMem.size = byte_len;
779d5913350SHisping Lin 	SharedMem.flags = 0;
780d5913350SHisping Lin 
781d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
782d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
783d5913350SHisping Lin 		goto exit;
784d5913350SHisping Lin 
785d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
786d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
787d5913350SHisping Lin 
788d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
789d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
790d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
791d5913350SHisping Lin 						    TEEC_NONE,
792d5913350SHisping Lin 						    TEEC_NONE);
793d5913350SHisping Lin 
794d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
795d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
796d5913350SHisping Lin 					&TeecOperation,
797d5913350SHisping Lin 					&ErrorOrigin);
798d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
799d5913350SHisping Lin 		goto exit;
800d5913350SHisping Lin 
801d5913350SHisping Lin exit:
802d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
803d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
804d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
805d5913350SHisping Lin 
806d5913350SHisping Lin 	return TeecResult;
807d5913350SHisping Lin }
808d5913350SHisping Lin 
809d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
810d5913350SHisping Lin {
811d5913350SHisping Lin 	TEEC_Result TeecResult;
812d5913350SHisping Lin 	TEEC_Context TeecContext;
813d5913350SHisping Lin 	TEEC_Session TeecSession;
814d5913350SHisping Lin 	uint32_t ErrorOrigin;
815d5913350SHisping Lin 
816d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
817d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
818d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
819d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
820d5913350SHisping Lin 
821d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
822d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
823d5913350SHisping Lin 		return TeecResult;
824d5913350SHisping Lin 
825d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
826d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
827d5913350SHisping Lin 		return TeecResult;
828d5913350SHisping Lin 
829d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
830d5913350SHisping Lin 				&TeecSession,
831d5913350SHisping Lin 				TeecUuid,
832d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
833d5913350SHisping Lin 				NULL,
834d5913350SHisping Lin 				NULL,
835d5913350SHisping Lin 				&ErrorOrigin);
836d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
837d5913350SHisping Lin 		return TeecResult;
838d5913350SHisping Lin 
839d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
840d5913350SHisping Lin 
841d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
842d5913350SHisping Lin 
843d5913350SHisping Lin 	SharedMem.size = byte_len;
844d5913350SHisping Lin 	SharedMem.flags = 0;
845d5913350SHisping Lin 
846d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
847d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
848d5913350SHisping Lin 		goto exit;
849d5913350SHisping Lin 
850d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
851d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
852d5913350SHisping Lin 
853d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
854d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
855d5913350SHisping Lin 						    TEEC_NONE,
856d5913350SHisping Lin 						    TEEC_NONE);
857d5913350SHisping Lin 
858d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
859d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
860d5913350SHisping Lin 					&TeecOperation,
861d5913350SHisping Lin 					&ErrorOrigin);
862d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
863d5913350SHisping Lin 		goto exit;
864d5913350SHisping Lin 
865d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
866d5913350SHisping Lin 
867d5913350SHisping Lin exit:
868d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
869d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
870d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
871d5913350SHisping Lin 
872d5913350SHisping Lin 	return TeecResult;
873d5913350SHisping Lin }
874d5913350SHisping Lin 
87590e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,
876bb1ba6acSHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
877bb1ba6acSHisping Lin {
878bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
879bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
880bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
881bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
882bb1ba6acSHisping Lin 
883bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
884bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
885bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
886bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
887bb1ba6acSHisping Lin 
888bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
889bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
890bb1ba6acSHisping Lin 		return TeecResult;
891bb1ba6acSHisping Lin 
892bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
893bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
894bb1ba6acSHisping Lin 		return TeecResult;
895bb1ba6acSHisping Lin 
896bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
897bb1ba6acSHisping Lin 				&TeecSession,
898bb1ba6acSHisping Lin 				TeecUuid,
899bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
900bb1ba6acSHisping Lin 				NULL,
901bb1ba6acSHisping Lin 				NULL,
902bb1ba6acSHisping Lin 				&ErrorOrigin);
903bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
904bb1ba6acSHisping Lin 		return TeecResult;
905bb1ba6acSHisping Lin 
906bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
907bb1ba6acSHisping Lin 
908bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
909bb1ba6acSHisping Lin 
910bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
911bb1ba6acSHisping Lin 	SharedMem.flags = 0;
912bb1ba6acSHisping Lin 
913bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
914bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
915bb1ba6acSHisping Lin 		goto exit;
916bb1ba6acSHisping Lin 
917bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
918bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
919bb1ba6acSHisping Lin 
920bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
921bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
922bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
923bb1ba6acSHisping Lin 						    TEEC_NONE,
924bb1ba6acSHisping Lin 						    TEEC_NONE);
925bb1ba6acSHisping Lin 
926bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
92790e849a0Sxb.wang 					STORAGE_CMD_WRITE_OEM_OTP_KEY,
928bb1ba6acSHisping Lin 					&TeecOperation,
929bb1ba6acSHisping Lin 					&ErrorOrigin);
930bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
931bb1ba6acSHisping Lin 		goto exit;
932bb1ba6acSHisping Lin 
933bb1ba6acSHisping Lin exit:
934bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
935bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
936bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
937bb1ba6acSHisping Lin 
938bb1ba6acSHisping Lin 	return TeecResult;
939bb1ba6acSHisping Lin }
940bb1ba6acSHisping Lin 
9419deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value)
9429deb34f6SHisping Lin {
9439deb34f6SHisping Lin 	TEEC_Result TeecResult;
9449deb34f6SHisping Lin 	TEEC_Context TeecContext;
9459deb34f6SHisping Lin 	TEEC_Session TeecSession;
9469deb34f6SHisping Lin 	uint32_t ErrorOrigin;
9479deb34f6SHisping Lin 
9489deb34f6SHisping Lin 	*value = 0xFF;
9499deb34f6SHisping Lin 
9509deb34f6SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
9519deb34f6SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9529deb34f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9539deb34f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
9549deb34f6SHisping Lin 
9559deb34f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
9569deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9579deb34f6SHisping Lin 		return TeecResult;
9589deb34f6SHisping Lin 
9599deb34f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9609deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9619deb34f6SHisping Lin 		return TeecResult;
9629deb34f6SHisping Lin 
9639deb34f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9649deb34f6SHisping Lin 				&TeecSession,
9659deb34f6SHisping Lin 				TeecUuid,
9669deb34f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
9679deb34f6SHisping Lin 				NULL,
9689deb34f6SHisping Lin 				NULL,
9699deb34f6SHisping Lin 				&ErrorOrigin);
9709deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9719deb34f6SHisping Lin 		return TeecResult;
9729deb34f6SHisping Lin 
9739deb34f6SHisping Lin 	TeecOperation.params[0].value.a = key_id;
9749deb34f6SHisping Lin 
9759deb34f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
9769deb34f6SHisping Lin 						    TEEC_NONE,
9779deb34f6SHisping Lin 						    TEEC_NONE,
9789deb34f6SHisping Lin 						    TEEC_NONE);
9799deb34f6SHisping Lin 
9809deb34f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9819deb34f6SHisping Lin 					STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN,
9829deb34f6SHisping Lin 					&TeecOperation,
9839deb34f6SHisping Lin 					&ErrorOrigin);
9849deb34f6SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
9859deb34f6SHisping Lin 		*value = TeecOperation.params[0].value.b;
9869deb34f6SHisping Lin 
9879deb34f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
9889deb34f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9899deb34f6SHisping Lin 
9909deb34f6SHisping Lin 	return TeecResult;
9919deb34f6SHisping Lin }
9929deb34f6SHisping Lin 
99390e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)
994a405238aSHisping Lin {
995a405238aSHisping Lin 	TEEC_Result TeecResult;
996a405238aSHisping Lin 	TEEC_Context TeecContext;
997a405238aSHisping Lin 	TEEC_Session TeecSession;
998a405238aSHisping Lin 	uint32_t ErrorOrigin;
999a405238aSHisping Lin 
1000a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1001a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1002a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1003a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
1004a405238aSHisping Lin 
1005a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1006a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1007a405238aSHisping Lin 		return TeecResult;
1008a405238aSHisping Lin 
1009a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1010a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1011a405238aSHisping Lin 		return TeecResult;
1012a405238aSHisping Lin 
1013a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1014a405238aSHisping Lin 				&TeecSession,
1015a405238aSHisping Lin 				TeecUuid,
1016a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
1017a405238aSHisping Lin 				NULL,
1018a405238aSHisping Lin 				NULL,
1019a405238aSHisping Lin 				&ErrorOrigin);
1020a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1021a405238aSHisping Lin 		return TeecResult;
1022a405238aSHisping Lin 
1023a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
1024a405238aSHisping Lin 
1025a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1026a405238aSHisping Lin 						    TEEC_NONE,
1027a405238aSHisping Lin 						    TEEC_NONE,
1028a405238aSHisping Lin 						    TEEC_NONE);
1029a405238aSHisping Lin 
1030a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1031a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
1032a405238aSHisping Lin 					&TeecOperation,
1033a405238aSHisping Lin 					&ErrorOrigin);
1034a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1035a405238aSHisping Lin 		goto exit;
1036a405238aSHisping Lin 
1037a405238aSHisping Lin exit:
1038a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
1039a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1040a405238aSHisping Lin 
1041a405238aSHisping Lin 	return TeecResult;
1042a405238aSHisping Lin }
1043a405238aSHisping Lin 
10442f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config,
10452f8c34bdSxb.wang 				   uint32_t src_phys_addr, uint32_t dst_phys_addr,
10462f8c34bdSxb.wang 				   uint32_t len)
1047fc3694d6Sxb.wang {
1048fc3694d6Sxb.wang 	TEEC_Result TeecResult;
1049fc3694d6Sxb.wang 	TEEC_Context TeecContext;
1050fc3694d6Sxb.wang 	TEEC_Session TeecSession;
1051fc3694d6Sxb.wang 	TEEC_Operation TeecOperation = {0};
1052fc3694d6Sxb.wang 	uint32_t ErrorOrigin;
1053fc3694d6Sxb.wang 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
1054fc3694d6Sxb.wang 	TEEC_SharedMemory SharedMem_config = {0};
1055fc3694d6Sxb.wang 
10562f8c34bdSxb.wang 	if (key_id != RK_OEM_OTP_KEY0 &&
10572f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY1 &&
10582f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY2 &&
10592f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY3 &&
10602f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY_FW)
1061fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1062fc3694d6Sxb.wang 
10632f8c34bdSxb.wang 	if (!config)
1064fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1065fc3694d6Sxb.wang 
1066fc3694d6Sxb.wang 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
1067fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1068fc3694d6Sxb.wang 
1069fc3694d6Sxb.wang 	if (config->mode >= RK_CIPHER_MODE_XTS)
1070fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1071fc3694d6Sxb.wang 
1072fc3694d6Sxb.wang 	if (config->operation != RK_MODE_ENCRYPT &&
1073fc3694d6Sxb.wang 	    config->operation != RK_MODE_DECRYPT)
1074fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1075fc3694d6Sxb.wang 
1076fc3694d6Sxb.wang 	if (config->key_len != 16 &&
1077fc3694d6Sxb.wang 	    config->key_len != 24 &&
1078fc3694d6Sxb.wang 	    config->key_len != 32)
1079fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1080fc3694d6Sxb.wang 
10812f8c34bdSxb.wang 	if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16)
10822f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10832f8c34bdSxb.wang 
10842f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126)
10852f8c34bdSxb.wang 	if (config->key_len == 24)
10862f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10872f8c34bdSxb.wang #endif
10882f8c34bdSxb.wang 
1089fc3694d6Sxb.wang 	if (len % AES_BLOCK_SIZE ||
1090fc3694d6Sxb.wang 	    len == 0)
1091fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1092fc3694d6Sxb.wang 
10932f8c34bdSxb.wang 	if (!src_phys_addr || !dst_phys_addr)
10942f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10952f8c34bdSxb.wang 
1096fc3694d6Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
1097fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1098fc3694d6Sxb.wang 		return TeecResult;
1099fc3694d6Sxb.wang 
1100fc3694d6Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1101fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1102fc3694d6Sxb.wang 		return TeecResult;
1103fc3694d6Sxb.wang 
1104fc3694d6Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
1105fc3694d6Sxb.wang 				      &TeecSession,
1106fc3694d6Sxb.wang 				      &uuid,
1107fc3694d6Sxb.wang 				      TEEC_LOGIN_PUBLIC,
1108fc3694d6Sxb.wang 				      NULL,
1109fc3694d6Sxb.wang 				      NULL,
1110fc3694d6Sxb.wang 				      &ErrorOrigin);
1111fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1112fc3694d6Sxb.wang 		goto exit;
1113fc3694d6Sxb.wang 
1114fc3694d6Sxb.wang 	SharedMem_config.size = sizeof(rk_cipher_config);
1115fc3694d6Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
1116fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1117fc3694d6Sxb.wang 		goto exit;
1118fc3694d6Sxb.wang 
1119fc3694d6Sxb.wang 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
1120fc3694d6Sxb.wang 	TeecOperation.params[0].value.a       = key_id;
1121fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
1122fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
11232f8c34bdSxb.wang 	TeecOperation.params[2].value.a       = src_phys_addr;
11242f8c34bdSxb.wang 	TeecOperation.params[2].value.b       = len;
11252f8c34bdSxb.wang 	TeecOperation.params[3].value.a       = dst_phys_addr;
1126fc3694d6Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1127fc3694d6Sxb.wang 						    TEEC_MEMREF_TEMP_INPUT,
11282f8c34bdSxb.wang 						    TEEC_VALUE_INPUT,
11292f8c34bdSxb.wang 						    TEEC_VALUE_INPUT);
11302f8c34bdSxb.wang 
11312f8c34bdSxb.wang 	crypto_flush_cacheline(src_phys_addr, len);
11322f8c34bdSxb.wang 	crypto_flush_cacheline(dst_phys_addr, len);
11332f8c34bdSxb.wang 
1134fc3694d6Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11352f8c34bdSxb.wang 					CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER,
1136fc3694d6Sxb.wang 					&TeecOperation,
1137fc3694d6Sxb.wang 					&ErrorOrigin);
1138fc3694d6Sxb.wang 
1139a900eef3SHisping Lin 	crypto_invalidate_cacheline(dst_phys_addr, len);
1140a900eef3SHisping Lin 
1141fc3694d6Sxb.wang exit:
1142fc3694d6Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem_config);
1143fc3694d6Sxb.wang 	TEEC_CloseSession(&TeecSession);
1144fc3694d6Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
1145fc3694d6Sxb.wang 	return TeecResult;
1146fc3694d6Sxb.wang }
1147fc3694d6Sxb.wang 
1148a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id,
1149a828eba9SHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
1150a828eba9SHisping Lin {
1151a828eba9SHisping Lin 	TEEC_Result TeecResult;
1152a828eba9SHisping Lin 	TEEC_Context TeecContext;
1153a828eba9SHisping Lin 	TEEC_Session TeecSession;
1154a828eba9SHisping Lin 	uint32_t ErrorOrigin;
1155a828eba9SHisping Lin 
1156a828eba9SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1157a828eba9SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1158a828eba9SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1159a828eba9SHisping Lin 	TEEC_Operation TeecOperation = {0};
1160a828eba9SHisping Lin 
1161a828eba9SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1162a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1163a828eba9SHisping Lin 		return TeecResult;
1164a828eba9SHisping Lin 
1165a828eba9SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1166a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1167a828eba9SHisping Lin 		return TeecResult;
1168a828eba9SHisping Lin 
1169a828eba9SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1170a828eba9SHisping Lin 				&TeecSession,
1171a828eba9SHisping Lin 				TeecUuid,
1172a828eba9SHisping Lin 				TEEC_LOGIN_PUBLIC,
1173a828eba9SHisping Lin 				NULL,
1174a828eba9SHisping Lin 				NULL,
1175a828eba9SHisping Lin 				&ErrorOrigin);
1176a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1177a828eba9SHisping Lin 		return TeecResult;
1178a828eba9SHisping Lin 
1179a828eba9SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1180a828eba9SHisping Lin 
1181a828eba9SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1182a828eba9SHisping Lin 
1183a828eba9SHisping Lin 	SharedMem.size = byte_len;
1184a828eba9SHisping Lin 	SharedMem.flags = 0;
1185a828eba9SHisping Lin 
1186a828eba9SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1187a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1188a828eba9SHisping Lin 		goto exit;
1189a828eba9SHisping Lin 
1190a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1191a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1192a828eba9SHisping Lin 
1193a828eba9SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1194a828eba9SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1195a828eba9SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1196a828eba9SHisping Lin 						    TEEC_NONE,
1197a828eba9SHisping Lin 						    TEEC_NONE);
1198a828eba9SHisping Lin 
1199a828eba9SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1200a828eba9SHisping Lin 					STORAGE_CMD_WRITE_OEM_HDCP_KEY,
1201a828eba9SHisping Lin 					&TeecOperation,
1202a828eba9SHisping Lin 					&ErrorOrigin);
1203a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1204a828eba9SHisping Lin 		goto exit;
1205a828eba9SHisping Lin 
1206a828eba9SHisping Lin exit:
1207a828eba9SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1208a828eba9SHisping Lin 	TEEC_CloseSession(&TeecSession);
1209a828eba9SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1210a828eba9SHisping Lin 
1211a828eba9SHisping Lin 	return TeecResult;
1212a828eba9SHisping Lin }
1213a828eba9SHisping Lin 
1214*e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value)
1215*e8bc2655SHisping Lin {
1216*e8bc2655SHisping Lin 	TEEC_Result TeecResult;
1217*e8bc2655SHisping Lin 	TEEC_Context TeecContext;
1218*e8bc2655SHisping Lin 	TEEC_Session TeecSession;
1219*e8bc2655SHisping Lin 	uint32_t ErrorOrigin;
1220*e8bc2655SHisping Lin 
1221*e8bc2655SHisping Lin 	*value = 0xFF;
1222*e8bc2655SHisping Lin 
1223*e8bc2655SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1224*e8bc2655SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1225*e8bc2655SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1226*e8bc2655SHisping Lin 	TEEC_Operation TeecOperation = {0};
1227*e8bc2655SHisping Lin 
1228*e8bc2655SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1229*e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1230*e8bc2655SHisping Lin 		return TeecResult;
1231*e8bc2655SHisping Lin 
1232*e8bc2655SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1233*e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1234*e8bc2655SHisping Lin 		return TeecResult;
1235*e8bc2655SHisping Lin 
1236*e8bc2655SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1237*e8bc2655SHisping Lin 				&TeecSession,
1238*e8bc2655SHisping Lin 				TeecUuid,
1239*e8bc2655SHisping Lin 				TEEC_LOGIN_PUBLIC,
1240*e8bc2655SHisping Lin 				NULL,
1241*e8bc2655SHisping Lin 				NULL,
1242*e8bc2655SHisping Lin 				&ErrorOrigin);
1243*e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1244*e8bc2655SHisping Lin 		return TeecResult;
1245*e8bc2655SHisping Lin 
1246*e8bc2655SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1247*e8bc2655SHisping Lin 
1248*e8bc2655SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1249*e8bc2655SHisping Lin 						    TEEC_NONE,
1250*e8bc2655SHisping Lin 						    TEEC_NONE,
1251*e8bc2655SHisping Lin 						    TEEC_NONE);
1252*e8bc2655SHisping Lin 
1253*e8bc2655SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1254*e8bc2655SHisping Lin 					STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN,
1255*e8bc2655SHisping Lin 					&TeecOperation,
1256*e8bc2655SHisping Lin 					&ErrorOrigin);
1257*e8bc2655SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1258*e8bc2655SHisping Lin 		*value = TeecOperation.params[0].value.b;
1259*e8bc2655SHisping Lin 
1260*e8bc2655SHisping Lin 	TEEC_CloseSession(&TeecSession);
1261*e8bc2655SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1262*e8bc2655SHisping Lin 
1263*e8bc2655SHisping Lin 	return TeecResult;
1264*e8bc2655SHisping Lin }
1265*e8bc2655SHisping Lin 
12664d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void)
12674d4c5043SHisping Lin {
12684d4c5043SHisping Lin 	TEEC_Result TeecResult;
12694d4c5043SHisping Lin 	TEEC_Context TeecContext;
12704d4c5043SHisping Lin 	TEEC_Session TeecSession;
12714d4c5043SHisping Lin 	uint32_t ErrorOrigin;
12724d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
12734d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
12744d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
12754d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
12764d4c5043SHisping Lin 	const uint8_t transfer_inout[] = "Transfer data test.";
12774d4c5043SHisping Lin 
12784d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
12794d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
12804d4c5043SHisping Lin 		return TeecResult;
12814d4c5043SHisping Lin 
12824d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
12834d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
12844d4c5043SHisping Lin 		return TeecResult;
12854d4c5043SHisping Lin 
12864d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
12874d4c5043SHisping Lin 						TEEC_NONE,
12884d4c5043SHisping Lin 						TEEC_NONE,
12894d4c5043SHisping Lin 						TEEC_NONE);
12904d4c5043SHisping Lin 
12914d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
12924d4c5043SHisping Lin 				&TeecSession,
12934d4c5043SHisping Lin 				TeecUuid,
12944d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
12954d4c5043SHisping Lin 				NULL,
12964d4c5043SHisping Lin 				&TeecOperation,
12974d4c5043SHisping Lin 				&ErrorOrigin);
12984d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
12994d4c5043SHisping Lin 		return TeecResult;
13004d4c5043SHisping Lin 
13014d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
13024d4c5043SHisping Lin 
13034d4c5043SHisping Lin 	SharedMem0.size = sizeof(transfer_inout);
13044d4c5043SHisping Lin 	SharedMem0.flags = 0;
13054d4c5043SHisping Lin 
13064d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
13074d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13084d4c5043SHisping Lin 		goto exit;
13094d4c5043SHisping Lin 
13104d4c5043SHisping Lin 	memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size);
13114d4c5043SHisping Lin 
13124d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
13134d4c5043SHisping Lin 
13144d4c5043SHisping Lin 	SharedMem1.size = sizeof(transfer_inout);
13154d4c5043SHisping Lin 	SharedMem1.flags = 0;
13164d4c5043SHisping Lin 
13174d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
13184d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13194d4c5043SHisping Lin 		goto exit;
13204d4c5043SHisping Lin 
13214d4c5043SHisping Lin 	TeecOperation.params[0].value.a = 66;
13224d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer;
13234d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem0.size;
13244d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer;
13254d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.size = SharedMem1.size;
13264d4c5043SHisping Lin 
13274d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
13284d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_INPUT,
13294d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_OUTPUT,
13304d4c5043SHisping Lin 						TEEC_NONE);
13314d4c5043SHisping Lin 
13324d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13334d4c5043SHisping Lin 					102,
13344d4c5043SHisping Lin 					&TeecOperation,
13354d4c5043SHisping Lin 					&ErrorOrigin);
13364d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13374d4c5043SHisping Lin 		goto exit;
13384d4c5043SHisping Lin 
13394d4c5043SHisping Lin 	//Check the result
13404d4c5043SHisping Lin 	if (TeecOperation.params[0].value.a == 66 + 1 &&
13414d4c5043SHisping Lin 	    TeecOperation.params[0].value.b == TeecOperation.params[0].value.a)
13424d4c5043SHisping Lin 		printf("test value : Pass!\n");
13434d4c5043SHisping Lin 	else
13444d4c5043SHisping Lin 		printf("test value : Fail! (mismatch values)\n");
13454d4c5043SHisping Lin 
13464d4c5043SHisping Lin 	if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0)
13474d4c5043SHisping Lin 		printf("test buffer : Pass!\n");
13484d4c5043SHisping Lin 	else
13494d4c5043SHisping Lin 		printf("test buffer : Fail! (mismatch buffer)\n");
13504d4c5043SHisping Lin 
13514d4c5043SHisping Lin exit:
13524d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
13534d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
13544d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
13554d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
13564d4c5043SHisping Lin 
13574d4c5043SHisping Lin 	return TeecResult;
13584d4c5043SHisping Lin }
13594d4c5043SHisping Lin 
13604d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void)
13614d4c5043SHisping Lin {
13624d4c5043SHisping Lin 	TEEC_Result TeecResult;
13634d4c5043SHisping Lin 	TEEC_Context TeecContext;
13644d4c5043SHisping Lin 	TEEC_Session TeecSession;
13654d4c5043SHisping Lin 	uint32_t ErrorOrigin;
13664d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
13674d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
13684d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13694d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
13704d4c5043SHisping Lin 
13714d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
13724d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13734d4c5043SHisping Lin 		return TeecResult;
13744d4c5043SHisping Lin 
13754d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
13764d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13774d4c5043SHisping Lin 		return TeecResult;
13784d4c5043SHisping Lin 
13794d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
13804d4c5043SHisping Lin 						TEEC_NONE,
13814d4c5043SHisping Lin 						TEEC_NONE,
13824d4c5043SHisping Lin 						TEEC_NONE);
13834d4c5043SHisping Lin 
13844d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
13854d4c5043SHisping Lin 				&TeecSession,
13864d4c5043SHisping Lin 				TeecUuid,
13874d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
13884d4c5043SHisping Lin 				NULL,
13894d4c5043SHisping Lin 				&TeecOperation,
13904d4c5043SHisping Lin 				&ErrorOrigin);
13914d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13924d4c5043SHisping Lin 		return TeecResult;
13934d4c5043SHisping Lin 
13944d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
13954d4c5043SHisping Lin 						TEEC_NONE,
13964d4c5043SHisping Lin 						TEEC_NONE,
13974d4c5043SHisping Lin 						TEEC_NONE);
13984d4c5043SHisping Lin 
13994d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14004d4c5043SHisping Lin 					103,
14014d4c5043SHisping Lin 					&TeecOperation,
14024d4c5043SHisping Lin 					&ErrorOrigin);
14034d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14044d4c5043SHisping Lin 		goto exit;
14054d4c5043SHisping Lin 
14064d4c5043SHisping Lin exit:
14074d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
14084d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14094d4c5043SHisping Lin 
14104d4c5043SHisping Lin 	return TeecResult;
14114d4c5043SHisping Lin }
14124d4c5043SHisping Lin 
14134aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
14144aa61755SAndy Ye {
14154aa61755SAndy Ye 	TEEC_Result TeecResult;
14164aa61755SAndy Ye 	TEEC_Context TeecContext;
14174aa61755SAndy Ye 	TEEC_Session TeecSession;
14184aa61755SAndy Ye 	uint32_t ErrorOrigin;
14194aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
14204aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
14214aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
14224aa61755SAndy Ye 				}
14234aa61755SAndy Ye 			     };
14244aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
14254aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
14263251364cSHisping Lin 	struct blk_desc *dev_desc;
14273251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
14286651d4c0SJason Zhu 	if (!dev_desc) {
14296651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
14306651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
14316651d4c0SJason Zhu 	}
14324aa61755SAndy Ye 
1433f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1434f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1435f4e1db95SHisping Lin 		return TeecResult;
14364aa61755SAndy Ye 
14374aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1438f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1439f4e1db95SHisping Lin 		return TeecResult;
14404aa61755SAndy Ye 
14413251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
14423251364cSHisping Lin 						TEEC_NONE,
14433251364cSHisping Lin 						TEEC_NONE,
14443251364cSHisping Lin 						TEEC_NONE);
14453251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1446b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1447b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1448b9a7e756SHisping Lin 	else
1449b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1450b9a7e756SHisping Lin 
14513251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
14523251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
14533251364cSHisping Lin #endif
14543251364cSHisping Lin 
14554aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
14564aa61755SAndy Ye 				      &TeecSession,
14574aa61755SAndy Ye 				      TeecUuid,
14584aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
14594aa61755SAndy Ye 				      NULL,
14603251364cSHisping Lin 					&TeecOperation,
14614aa61755SAndy Ye 				      &ErrorOrigin);
1462f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1463f4e1db95SHisping Lin 		return TeecResult;
14644aa61755SAndy Ye 
14654aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
14664aa61755SAndy Ye 
14674aa61755SAndy Ye 	SharedMem0.size = *dh_size;
14684aa61755SAndy Ye 	SharedMem0.flags = 0;
14694aa61755SAndy Ye 
14704aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1471f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1472f4e1db95SHisping Lin 		goto exit;
14734aa61755SAndy Ye 
14744aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
14754aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
14764aa61755SAndy Ye 
14774aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
14784aa61755SAndy Ye 						    TEEC_NONE,
14794aa61755SAndy Ye 						    TEEC_NONE,
14804aa61755SAndy Ye 						    TEEC_NONE);
14814aa61755SAndy Ye 
14824aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14834aa61755SAndy Ye 					143,
14844aa61755SAndy Ye 					&TeecOperation,
14854aa61755SAndy Ye 					&ErrorOrigin);
1486f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1487f4e1db95SHisping Lin 		goto exit;
14884aa61755SAndy Ye 
14894aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
14904aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1491f4e1db95SHisping Lin exit:
14924aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
14934aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1494f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14954aa61755SAndy Ye 
14964aa61755SAndy Ye 	return TeecResult;
14974aa61755SAndy Ye }
14984aa61755SAndy Ye 
14994aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
15004aa61755SAndy Ye {
15014aa61755SAndy Ye 	TEEC_Result TeecResult;
15024aa61755SAndy Ye 	TEEC_Context TeecContext;
15034aa61755SAndy Ye 	TEEC_Session TeecSession;
15044aa61755SAndy Ye 	uint32_t ErrorOrigin;
15054aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15064aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15074aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15084aa61755SAndy Ye 				}
15094aa61755SAndy Ye 			     };
15104aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15114aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
15123251364cSHisping Lin 	struct blk_desc *dev_desc;
15133251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15146651d4c0SJason Zhu 	if (!dev_desc) {
15156651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15166651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15176651d4c0SJason Zhu 	}
15184aa61755SAndy Ye 
1519f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1520f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1521f4e1db95SHisping Lin 		return TeecResult;
15224aa61755SAndy Ye 
15234aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1524f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1525f4e1db95SHisping Lin 		return TeecResult;
15264aa61755SAndy Ye 
15273251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15283251364cSHisping Lin 						TEEC_NONE,
15293251364cSHisping Lin 						TEEC_NONE,
15303251364cSHisping Lin 						TEEC_NONE);
15313251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1532b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1533b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1534b9a7e756SHisping Lin 	else
1535b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1536b9a7e756SHisping Lin 
15373251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15383251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15393251364cSHisping Lin #endif
15403251364cSHisping Lin 
15414aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15424aa61755SAndy Ye 				      &TeecSession,
15434aa61755SAndy Ye 				      TeecUuid,
15444aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15454aa61755SAndy Ye 				      NULL,
15463251364cSHisping Lin 					&TeecOperation,
15474aa61755SAndy Ye 				      &ErrorOrigin);
1548f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1549f4e1db95SHisping Lin 		return TeecResult;
15504aa61755SAndy Ye 
15514aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
15524aa61755SAndy Ye 
15534aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
15544aa61755SAndy Ye 	SharedMem0.flags = 0;
15554aa61755SAndy Ye 
15564aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1557f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1558f4e1db95SHisping Lin 		goto exit;
15594aa61755SAndy Ye 
15604aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
15614aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
15624aa61755SAndy Ye 
15634aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
15644aa61755SAndy Ye 						    TEEC_NONE,
15654aa61755SAndy Ye 						    TEEC_NONE,
15664aa61755SAndy Ye 						    TEEC_NONE);
15674aa61755SAndy Ye 
15684aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
15694aa61755SAndy Ye 					144,
15704aa61755SAndy Ye 					&TeecOperation,
15714aa61755SAndy Ye 					&ErrorOrigin);
1572f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1573f4e1db95SHisping Lin 		goto exit;
15744aa61755SAndy Ye 
15754aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
15764aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1577f4e1db95SHisping Lin exit:
15784aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
15794aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1580f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
15814aa61755SAndy Ye 
15824aa61755SAndy Ye 	return TeecResult;
15834aa61755SAndy Ye }
15844aa61755SAndy Ye 
15854aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
15864aa61755SAndy Ye 			      uint32_t *operation_size,
15874aa61755SAndy Ye 			      uint8_t *out,
15884aa61755SAndy Ye 			      uint32_t *out_len)
15894aa61755SAndy Ye {
15904aa61755SAndy Ye 	TEEC_Result TeecResult;
15914aa61755SAndy Ye 	TEEC_Context TeecContext;
15924aa61755SAndy Ye 	TEEC_Session TeecSession;
15934aa61755SAndy Ye 	uint32_t ErrorOrigin;
15944aa61755SAndy Ye 
15954aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15964aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15974aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15984aa61755SAndy Ye 				}
15994aa61755SAndy Ye 			     };
16004aa61755SAndy Ye 
16014aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16024aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16033251364cSHisping Lin 	struct blk_desc *dev_desc;
16043251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16056651d4c0SJason Zhu 	if (!dev_desc) {
16066651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
16076651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
16086651d4c0SJason Zhu 	}
16094aa61755SAndy Ye 
1610f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1611f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1612f4e1db95SHisping Lin 		return TeecResult;
16134aa61755SAndy Ye 
16144aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1615f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1616f4e1db95SHisping Lin 		return TeecResult;
16174aa61755SAndy Ye 
16183251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16193251364cSHisping Lin 						TEEC_NONE,
16203251364cSHisping Lin 						TEEC_NONE,
16213251364cSHisping Lin 						TEEC_NONE);
16223251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1623b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1624b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1625b9a7e756SHisping Lin 	else
1626b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1627b9a7e756SHisping Lin 
16283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16293251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16303251364cSHisping Lin #endif
16313251364cSHisping Lin 
16324aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16334aa61755SAndy Ye 				      &TeecSession,
16344aa61755SAndy Ye 				      TeecUuid,
16354aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16364aa61755SAndy Ye 				      NULL,
16373251364cSHisping Lin 					&TeecOperation,
16384aa61755SAndy Ye 				      &ErrorOrigin);
1639f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1640f4e1db95SHisping Lin 		return TeecResult;
16414aa61755SAndy Ye 
16424aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16434aa61755SAndy Ye 
16444aa61755SAndy Ye 	SharedMem0.size = *operation_size;
16454aa61755SAndy Ye 	SharedMem0.flags = 0;
16464aa61755SAndy Ye 
16474aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1648f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1649f4e1db95SHisping Lin 		goto exit;
16504aa61755SAndy Ye 
16514aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
16524aa61755SAndy Ye 
16534aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
16544aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
16554aa61755SAndy Ye 
16564aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
16574aa61755SAndy Ye 
16584aa61755SAndy Ye 	SharedMem1.size = *out_len;
16594aa61755SAndy Ye 	SharedMem1.flags = 0;
16604aa61755SAndy Ye 
16614aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1662f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1663f4e1db95SHisping Lin 		goto exit;
16644aa61755SAndy Ye 
16654aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
16664aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
16674aa61755SAndy Ye 
16684aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
16694aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
16704aa61755SAndy Ye 						    TEEC_NONE,
16714aa61755SAndy Ye 						    TEEC_NONE);
16724aa61755SAndy Ye 
16734aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16744aa61755SAndy Ye 					145,
16754aa61755SAndy Ye 					&TeecOperation,
16764aa61755SAndy Ye 					&ErrorOrigin);
1677f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1678f4e1db95SHisping Lin 		goto exit;
16794aa61755SAndy Ye 
16804aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
16814aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1682f4e1db95SHisping Lin exit:
16834aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
16844aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1685f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1686f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
16874aa61755SAndy Ye 
16884aa61755SAndy Ye 	return TeecResult;
16894aa61755SAndy Ye }
16904aa61755SAndy Ye 
16914aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
16924aa61755SAndy Ye {
16934aa61755SAndy Ye 	TEEC_Result TeecResult;
16944aa61755SAndy Ye 	TEEC_Context TeecContext;
16954aa61755SAndy Ye 	TEEC_Session TeecSession;
16964aa61755SAndy Ye 	uint32_t ErrorOrigin;
16974aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16984aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16994aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17004aa61755SAndy Ye 				}
17014aa61755SAndy Ye 			     };
17024aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17034aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17043251364cSHisping Lin 	struct blk_desc *dev_desc;
17053251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17066651d4c0SJason Zhu 	if (!dev_desc) {
17076651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17086651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17096651d4c0SJason Zhu 	}
1710f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1711f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1712f4e1db95SHisping Lin 		return TeecResult;
17134aa61755SAndy Ye 
17144aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1715f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1716f4e1db95SHisping Lin 		return TeecResult;
17174aa61755SAndy Ye 
17183251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17193251364cSHisping Lin 						TEEC_NONE,
17203251364cSHisping Lin 						TEEC_NONE,
17213251364cSHisping Lin 						TEEC_NONE);
17223251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1723b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1724b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1725b9a7e756SHisping Lin 	else
1726b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1727b9a7e756SHisping Lin 
17283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17293251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17303251364cSHisping Lin #endif
17313251364cSHisping Lin 
17324aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17334aa61755SAndy Ye 					&TeecSession,
17344aa61755SAndy Ye 					TeecUuid,
17354aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
17364aa61755SAndy Ye 					NULL,
17373251364cSHisping Lin 					&TeecOperation,
17384aa61755SAndy Ye 					&ErrorOrigin);
1739f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1740f4e1db95SHisping Lin 		return TeecResult;
17414aa61755SAndy Ye 
17424aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17434aa61755SAndy Ye 
17444aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
17454aa61755SAndy Ye 	SharedMem0.flags = 0;
17464aa61755SAndy Ye 
17474aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1748f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1749f4e1db95SHisping Lin 		goto exit;
17504aa61755SAndy Ye 
17514aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
17524aa61755SAndy Ye 
17534aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17544aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17554aa61755SAndy Ye 
17564aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17574aa61755SAndy Ye 						    TEEC_NONE,
17584aa61755SAndy Ye 						    TEEC_NONE,
17594aa61755SAndy Ye 						    TEEC_NONE);
17604aa61755SAndy Ye 
17614aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17624aa61755SAndy Ye 					146,
17634aa61755SAndy Ye 					&TeecOperation,
17644aa61755SAndy Ye 					&ErrorOrigin);
1765f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1766f4e1db95SHisping Lin 		goto exit;
1767f4e1db95SHisping Lin exit:
17684aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
17694aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1770f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
17714aa61755SAndy Ye 
17724aa61755SAndy Ye 	return TeecResult;
17734aa61755SAndy Ye }
1774