xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 34f2e8f6ed92a5620f204b8c67a2f1c5f5ddb48f)
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
32ae8ec5e1SHisping Lin 
332f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER	0x00000002
34fc3694d6Sxb.wang 
35fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID	{ 0x0cacdb5d, 0x4fea, 0x466c, \
36fc3694d6Sxb.wang 		{ 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } }
37fc3694d6Sxb.wang 
38ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
39ae8ec5e1SHisping Lin {
40ae8ec5e1SHisping Lin 	if (in > 9)
41ae8ec5e1SHisping Lin 		return in + 55;
42ae8ec5e1SHisping Lin 	else
43ae8ec5e1SHisping Lin 		return in + 48;
44ae8ec5e1SHisping Lin }
45ae8ec5e1SHisping Lin 
46c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
47ae8ec5e1SHisping Lin {
48ae8ec5e1SHisping Lin 	uint32_t i = 0;
49ae8ec5e1SHisping Lin 
50ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
51ae8ec5e1SHisping Lin 		return 0;
52ae8ec5e1SHisping Lin 
53ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
54ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
55ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
56ae8ec5e1SHisping Lin 	}
57ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
58ae8ec5e1SHisping Lin 
59ae8ec5e1SHisping Lin 	return blen * 2;
60ae8ec5e1SHisping Lin }
61ae8ec5e1SHisping Lin 
622f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size)
632f8c34bdSxb.wang {
642f8c34bdSxb.wang 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
652f8c34bdSxb.wang 	ulong aligned_input, aligned_len;
662f8c34bdSxb.wang 
672f8c34bdSxb.wang 	if (!addr || !size)
682f8c34bdSxb.wang 		return;
692f8c34bdSxb.wang 
702f8c34bdSxb.wang 	/* Must flush dcache before crypto DMA fetch data region */
712f8c34bdSxb.wang 	aligned_input = round_down(addr, alignment);
722f8c34bdSxb.wang 	aligned_len = round_up(size + (addr - aligned_input), alignment);
732f8c34bdSxb.wang 	flush_cache(aligned_input, aligned_len);
742f8c34bdSxb.wang }
752f8c34bdSxb.wang 
76a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
77a900eef3SHisping Lin {
78a900eef3SHisping Lin 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
79a900eef3SHisping Lin 	ulong aligned_input, aligned_len;
80a900eef3SHisping Lin 
81a900eef3SHisping Lin 	if (!addr || !size)
82a900eef3SHisping Lin 		return;
83a900eef3SHisping Lin 
84a900eef3SHisping Lin 	/* Must invalidate dcache after crypto DMA write data region */
85a900eef3SHisping Lin 	aligned_input = round_down(addr, alignment);
86a900eef3SHisping Lin 	aligned_len = round_up(size + (addr - aligned_input), alignment);
87a900eef3SHisping Lin 	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
88a900eef3SHisping Lin }
89a900eef3SHisping Lin 
90c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
91c7de5349SHisping Lin 						uint32_t filename_size,
92c7de5349SHisping Lin 						uint8_t *data,
93c7de5349SHisping Lin 						uint32_t data_size)
94ae8ec5e1SHisping Lin {
95ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
96ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
97ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
98ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
99ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
100ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
101ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
102ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1033251364cSHisping Lin 	struct blk_desc *dev_desc;
1043251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1056651d4c0SJason Zhu 	if (!dev_desc) {
1066651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1076651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1086651d4c0SJason Zhu 	}
1093251364cSHisping Lin 
110f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
111f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
112f4e1db95SHisping Lin 		return TeecResult;
113ae8ec5e1SHisping Lin 
114ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
115f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
116f4e1db95SHisping Lin 		return TeecResult;
117ae8ec5e1SHisping Lin 
1183251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1193251364cSHisping Lin 						    TEEC_NONE,
1203251364cSHisping Lin 						    TEEC_NONE,
1213251364cSHisping Lin 						    TEEC_NONE);
1223251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
123b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
124b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
125b9a7e756SHisping Lin 	else
126b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1273251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1283251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1293251364cSHisping Lin #endif
1303251364cSHisping Lin 
131ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
132ae8ec5e1SHisping Lin 				&TeecSession,
133ae8ec5e1SHisping Lin 				TeecUuid,
134ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
135ae8ec5e1SHisping Lin 				NULL,
1363251364cSHisping Lin 				&TeecOperation,
137ae8ec5e1SHisping Lin 				&ErrorOrigin);
138f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
139f4e1db95SHisping Lin 		return TeecResult;
140ae8ec5e1SHisping Lin 
141ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
142ae8ec5e1SHisping Lin 
143c7de5349SHisping Lin 	SharedMem0.size = filename_size;
144ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
145ae8ec5e1SHisping Lin 
146ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
147f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
148f4e1db95SHisping Lin 		goto exit;
149ae8ec5e1SHisping Lin 
150c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
151ae8ec5e1SHisping Lin 
152ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
153ae8ec5e1SHisping Lin 
154c7de5349SHisping Lin 	SharedMem1.size = data_size;
155c7de5349SHisping Lin 	SharedMem1.flags = 0;
156c7de5349SHisping Lin 
157c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
158c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
159c7de5349SHisping Lin 		goto exit;
160c7de5349SHisping Lin 
161c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
162c7de5349SHisping Lin 
163c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
164c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
165c7de5349SHisping Lin 
166c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
167c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
168c7de5349SHisping Lin 
169c7de5349SHisping Lin 
170c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
171c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
172c7de5349SHisping Lin 						TEEC_NONE,
173c7de5349SHisping Lin 						TEEC_NONE);
174c7de5349SHisping Lin 
175c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
176c7de5349SHisping Lin 					1,
177c7de5349SHisping Lin 					&TeecOperation,
178c7de5349SHisping Lin 					&ErrorOrigin);
179c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
180c7de5349SHisping Lin 		goto exit;
181c7de5349SHisping Lin exit:
182c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
183c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
184c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
185c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
186c7de5349SHisping Lin 
187c7de5349SHisping Lin 	return TeecResult;
188c7de5349SHisping Lin }
189c7de5349SHisping Lin 
190c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
191c7de5349SHisping Lin 					       uint32_t filename_size,
192c7de5349SHisping Lin 					       uint8_t *data,
193c7de5349SHisping Lin 					       uint32_t data_size)
194c7de5349SHisping Lin {
195c7de5349SHisping Lin 	TEEC_Result TeecResult;
196c7de5349SHisping Lin 	TEEC_Context TeecContext;
197c7de5349SHisping Lin 	TEEC_Session TeecSession;
198c7de5349SHisping Lin 	uint32_t ErrorOrigin;
199c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
200c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
201c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
202c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
203c7de5349SHisping Lin 
204c7de5349SHisping Lin 	struct blk_desc *dev_desc;
205c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
206c7de5349SHisping Lin 	if (!dev_desc) {
207c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
208c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
209c7de5349SHisping Lin 	}
210c7de5349SHisping Lin 
211c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
212c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
213c7de5349SHisping Lin 		return TeecResult;
214c7de5349SHisping Lin 
215c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
216c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
217c7de5349SHisping Lin 		return TeecResult;
218c7de5349SHisping Lin 
219c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
220c7de5349SHisping Lin 						TEEC_NONE,
221c7de5349SHisping Lin 						TEEC_NONE,
222c7de5349SHisping Lin 						TEEC_NONE);
223c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
224c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
225c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
226c7de5349SHisping Lin 	else
227c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
228c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
229c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
230c7de5349SHisping Lin #endif
231c7de5349SHisping Lin 
232c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
233c7de5349SHisping Lin 				&TeecSession,
234c7de5349SHisping Lin 				TeecUuid,
235c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
236c7de5349SHisping Lin 				NULL,
237c7de5349SHisping Lin 				&TeecOperation,
238c7de5349SHisping Lin 				&ErrorOrigin);
239c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
240c7de5349SHisping Lin 		return TeecResult;
241c7de5349SHisping Lin 
242c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
243c7de5349SHisping Lin 
244c7de5349SHisping Lin 	SharedMem0.size = filename_size;
245c7de5349SHisping Lin 	SharedMem0.flags = 0;
246c7de5349SHisping Lin 
247c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
248c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
249c7de5349SHisping Lin 		goto exit;
250c7de5349SHisping Lin 
251c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
252c7de5349SHisping Lin 
253c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
254c7de5349SHisping Lin 
255c7de5349SHisping Lin 	SharedMem1.size = data_size;
256ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
257ae8ec5e1SHisping Lin 
258ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
259f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
260f4e1db95SHisping Lin 		goto exit;
261ae8ec5e1SHisping Lin 
262ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
263ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
264ae8ec5e1SHisping Lin 
265ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
266ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
267ae8ec5e1SHisping Lin 
268ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
269ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
270ae8ec5e1SHisping Lin 						TEEC_NONE,
271ae8ec5e1SHisping Lin 						TEEC_NONE);
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
274ae8ec5e1SHisping Lin 					0,
275ae8ec5e1SHisping Lin 					&TeecOperation,
276ae8ec5e1SHisping Lin 					&ErrorOrigin);
27746b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
278c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
279f4e1db95SHisping Lin exit:
280ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
281ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
282ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
28346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
284ae8ec5e1SHisping Lin 
285ae8ec5e1SHisping Lin 	return TeecResult;
286ae8ec5e1SHisping Lin }
287ae8ec5e1SHisping Lin 
288c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
289c7de5349SHisping Lin {
290c7de5349SHisping Lin 	TEEC_Result TeecResult;
291c7de5349SHisping Lin 	TEEC_Context TeecContext;
292c7de5349SHisping Lin 	TEEC_Session TeecSession;
293c7de5349SHisping Lin 	uint32_t ErrorOrigin;
294c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
295c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
296c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
297c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
298c7de5349SHisping Lin 
299c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
300c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
301c7de5349SHisping Lin 		return TeecResult;
302c7de5349SHisping Lin 
303c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
304c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
305c7de5349SHisping Lin 		return TeecResult;
306c7de5349SHisping Lin 
307c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
308c7de5349SHisping Lin 				&TeecSession,
309c7de5349SHisping Lin 				TeecUuid,
310c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
311c7de5349SHisping Lin 				NULL,
312c7de5349SHisping Lin 				NULL,
313c7de5349SHisping Lin 				&ErrorOrigin);
314c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
315c7de5349SHisping Lin 		return TeecResult;
316c7de5349SHisping Lin 
317c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
318c7de5349SHisping Lin 						    TEEC_NONE,
319c7de5349SHisping Lin 						    TEEC_NONE,
320c7de5349SHisping Lin 						    TEEC_NONE);
321c7de5349SHisping Lin 
322c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
323c7de5349SHisping Lin 					2,
324c7de5349SHisping Lin 					&TeecOperation,
325c7de5349SHisping Lin 					&ErrorOrigin);
326c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
327c7de5349SHisping Lin 		goto exit;
328c7de5349SHisping Lin exit:
329c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
330c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
331c7de5349SHisping Lin 
332c7de5349SHisping Lin 	return TeecResult;
333c7de5349SHisping Lin }
334c7de5349SHisping Lin 
335*34f2e8f6SHisping Lin static void trusty_notify_always_use_security(void)
336*34f2e8f6SHisping Lin {
337*34f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION)
338*34f2e8f6SHisping Lin 	TEEC_Result TeecResult;
339*34f2e8f6SHisping Lin 	TEEC_Context TeecContext;
340*34f2e8f6SHisping Lin 	TEEC_Session TeecSession;
341*34f2e8f6SHisping Lin 	uint32_t ErrorOrigin;
342*34f2e8f6SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
343*34f2e8f6SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
344*34f2e8f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
345*34f2e8f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
346*34f2e8f6SHisping Lin 
347*34f2e8f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
348*34f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
349*34f2e8f6SHisping Lin 		return;
350*34f2e8f6SHisping Lin 
351*34f2e8f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
352*34f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
353*34f2e8f6SHisping Lin 		return;
354*34f2e8f6SHisping Lin 
355*34f2e8f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
356*34f2e8f6SHisping Lin 				&TeecSession,
357*34f2e8f6SHisping Lin 				TeecUuid,
358*34f2e8f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
359*34f2e8f6SHisping Lin 				NULL,
360*34f2e8f6SHisping Lin 				NULL,
361*34f2e8f6SHisping Lin 				&ErrorOrigin);
362*34f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
363*34f2e8f6SHisping Lin 		return;
364*34f2e8f6SHisping Lin 
365*34f2e8f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
366*34f2e8f6SHisping Lin 						    TEEC_NONE,
367*34f2e8f6SHisping Lin 						    TEEC_NONE,
368*34f2e8f6SHisping Lin 						    TEEC_NONE);
369*34f2e8f6SHisping Lin 
370*34f2e8f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
371*34f2e8f6SHisping Lin 					9,
372*34f2e8f6SHisping Lin 					&TeecOperation,
373*34f2e8f6SHisping Lin 					&ErrorOrigin);
374*34f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
375*34f2e8f6SHisping Lin 		debug("notify always use security fail! please update optee!");
376*34f2e8f6SHisping Lin 
377*34f2e8f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
378*34f2e8f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
379*34f2e8f6SHisping Lin 
380*34f2e8f6SHisping Lin 	return;
381*34f2e8f6SHisping Lin #endif
382*34f2e8f6SHisping Lin }
383*34f2e8f6SHisping Lin 
384c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
385c7de5349SHisping Lin {
386c7de5349SHisping Lin 	char hs[9];
387c7de5349SHisping Lin 
388c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
389c7de5349SHisping Lin 
390c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
391c7de5349SHisping Lin }
392c7de5349SHisping Lin 
393ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
394ae8ec5e1SHisping Lin {
395c7de5349SHisping Lin 	char hs[9];
3963251364cSHisping Lin 
397c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
398ae8ec5e1SHisping Lin 
399c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
400ae8ec5e1SHisping Lin }
401ae8ec5e1SHisping Lin 
402ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
403ae8ec5e1SHisping Lin {
404c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
405c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
406ae8ec5e1SHisping Lin }
407ae8ec5e1SHisping Lin 
408ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
409ae8ec5e1SHisping Lin {
410c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
411c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
4126651d4c0SJason Zhu }
413ae8ec5e1SHisping Lin 
414c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
415c7de5349SHisping Lin {
416c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
417c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
418c7de5349SHisping Lin }
419ae8ec5e1SHisping Lin 
420c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
421c7de5349SHisping Lin {
422c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
423c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
424ae8ec5e1SHisping Lin }
425ae8ec5e1SHisping Lin 
426564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
427564654ebSJason Zhu 					      uint32_t size)
428564654ebSJason Zhu {
429c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
430c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
431564654ebSJason Zhu }
432564654ebSJason Zhu 
433564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
434564654ebSJason Zhu 					       uint32_t size)
435564654ebSJason Zhu {
436c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
437c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
438564654ebSJason Zhu }
439564654ebSJason Zhu 
440ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
441ae8ec5e1SHisping Lin {
442c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
443c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
444ae8ec5e1SHisping Lin }
445ae8ec5e1SHisping Lin 
446ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
447ae8ec5e1SHisping Lin {
448c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
449c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
450ae8ec5e1SHisping Lin }
451ae8ec5e1SHisping Lin 
452ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
453ae8ec5e1SHisping Lin {
454c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
455c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
456c7de5349SHisping Lin }
457c7de5349SHisping Lin 
458c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
459c7de5349SHisping Lin {
460c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
461c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
462c7de5349SHisping Lin }
463c7de5349SHisping Lin 
464c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
465c7de5349SHisping Lin {
466ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
467ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
468ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
469ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
470c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
471c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
472c7de5349SHisping Lin 
473ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
474ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
475ae8ec5e1SHisping Lin 
476f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
477f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
478f4e1db95SHisping Lin 		return TeecResult;
479ae8ec5e1SHisping Lin 
480ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
481f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
482f4e1db95SHisping Lin 		return TeecResult;
483ae8ec5e1SHisping Lin 
484ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
485ae8ec5e1SHisping Lin 				      &TeecSession,
486ae8ec5e1SHisping Lin 				      TeecUuid,
487ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
488ae8ec5e1SHisping Lin 				      NULL,
489c7de5349SHisping Lin 				      NULL,
490ae8ec5e1SHisping Lin 				      &ErrorOrigin);
491f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
492f4e1db95SHisping Lin 		return TeecResult;
493ae8ec5e1SHisping Lin 
494c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
495c7de5349SHisping Lin 						    TEEC_NONE,
496ae8ec5e1SHisping Lin 						    TEEC_NONE,
497ae8ec5e1SHisping Lin 						    TEEC_NONE);
498ae8ec5e1SHisping Lin 
499ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
500c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
501ae8ec5e1SHisping Lin 					&TeecOperation,
502ae8ec5e1SHisping Lin 					&ErrorOrigin);
503c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
504c7de5349SHisping Lin 		goto exit;
505f4e1db95SHisping Lin exit:
506ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
50746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
508ae8ec5e1SHisping Lin 
509ae8ec5e1SHisping Lin 	return TeecResult;
510ae8ec5e1SHisping Lin }
511ae8ec5e1SHisping Lin 
512c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
513c7de5349SHisping Lin 						   uint8_t is_write,
514c7de5349SHisping Lin 						   uint32_t *buf,
515c7de5349SHisping Lin 						   uint32_t length)
516ae8ec5e1SHisping Lin {
517ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
518ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
519ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
520ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
521c7de5349SHisping Lin 
522c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
523c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
524ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
525ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
526ae8ec5e1SHisping Lin 
527f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
528f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
529f4e1db95SHisping Lin 		return TeecResult;
530ae8ec5e1SHisping Lin 
531ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
532f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
533f4e1db95SHisping Lin 		return TeecResult;
534ae8ec5e1SHisping Lin 
535ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
536ae8ec5e1SHisping Lin 				&TeecSession,
537ae8ec5e1SHisping Lin 				TeecUuid,
538ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
539ae8ec5e1SHisping Lin 				NULL,
540c7de5349SHisping Lin 				NULL,
541ae8ec5e1SHisping Lin 				&ErrorOrigin);
542f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
543f4e1db95SHisping Lin 		return TeecResult;
544ae8ec5e1SHisping Lin 
545ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
546ae8ec5e1SHisping Lin 
547c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
548ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
549ae8ec5e1SHisping Lin 
550ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
551f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
552f4e1db95SHisping Lin 		goto exit;
553ae8ec5e1SHisping Lin 
554ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
555ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
556ae8ec5e1SHisping Lin 
557c7de5349SHisping Lin 	if (is_write) {
558c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
559ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
560c7de5349SHisping Lin 							    TEEC_NONE,
561ae8ec5e1SHisping Lin 							    TEEC_NONE,
562ae8ec5e1SHisping Lin 							    TEEC_NONE);
563ae8ec5e1SHisping Lin 
564c7de5349SHisping Lin 	} else {
565c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
566c7de5349SHisping Lin 							    TEEC_NONE,
567c7de5349SHisping Lin 							    TEEC_NONE,
568c7de5349SHisping Lin 							    TEEC_NONE);
569c7de5349SHisping Lin 	}
570c7de5349SHisping Lin 
571ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
572c7de5349SHisping Lin 					cmd,
573ae8ec5e1SHisping Lin 					&TeecOperation,
574ae8ec5e1SHisping Lin 					&ErrorOrigin);
575f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
576f4e1db95SHisping Lin 		goto exit;
577c7de5349SHisping Lin 
578c7de5349SHisping Lin 	if (!is_write)
579c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
580c7de5349SHisping Lin 
581f4e1db95SHisping Lin exit:
582ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
583ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
58446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
585ae8ec5e1SHisping Lin 
586ae8ec5e1SHisping Lin 	return TeecResult;
587ae8ec5e1SHisping Lin }
588ae8ec5e1SHisping Lin 
5896ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5906ef445a4SHisping Lin {
591c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
592c7de5349SHisping Lin 						  false, buf, length);
5936ef445a4SHisping Lin }
5946ef445a4SHisping Lin 
5956ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5966ef445a4SHisping Lin {
597c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
598c7de5349SHisping Lin 						  true, buf, length);
59916539616SHisping Lin }
60016539616SHisping Lin 
60116539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
60216539616SHisping Lin {
60316539616SHisping Lin 	TEEC_Result res;
604c7de5349SHisping Lin 
605c7de5349SHisping Lin 	res = trusty_base_end_security_data();
606c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
60716539616SHisping Lin 	return res;
60816539616SHisping Lin }
6092cd27853SHisping Lin 
6102cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
6112cd27853SHisping Lin {
612c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
613c7de5349SHisping Lin 						  false, buf, length);
6142cd27853SHisping Lin }
615c7de5349SHisping Lin 
6162cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
6172cd27853SHisping Lin {
618c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
619c7de5349SHisping Lin 						  true, buf, length);
6202cd27853SHisping Lin }
621095e2a82SHisping Lin 
622468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
623468df3b2SHisping Lin {
624468df3b2SHisping Lin 	uint32_t bootflag;
625c7de5349SHisping Lin 	TEEC_Result TeecResult;
626468df3b2SHisping Lin 
627f07e1686SHisping Lin 	*flag = 0;
628f07e1686SHisping Lin 
629c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
630c7de5349SHisping Lin 							false, &bootflag, 1);
631468df3b2SHisping Lin 
632468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
6330202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
6340202ee8aSHisping Lin 		if (bootflag == 0x00000001)
6350202ee8aSHisping Lin 			*flag = 1;
6360202ee8aSHisping Lin #else
637468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
638468df3b2SHisping Lin 			*flag = 1;
6390202ee8aSHisping Lin #endif
640468df3b2SHisping Lin 	}
641095e2a82SHisping Lin 	return TeecResult;
642095e2a82SHisping Lin }
6434aa61755SAndy Ye 
6441ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
6451ef63c75SHisping Lin {
6461ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
6471ef63c75SHisping Lin 						  true, buf, length);
6481ef63c75SHisping Lin }
6491ef63c75SHisping Lin 
650fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
651fbf29bfbSHisping Lin {
652fbf29bfbSHisping Lin 	uint32_t levelflag;
653fbf29bfbSHisping Lin 
654fbf29bfbSHisping Lin 	levelflag = flag;
655fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
656fbf29bfbSHisping Lin 						  true, &levelflag, 1);
657fbf29bfbSHisping Lin }
658fbf29bfbSHisping Lin 
659f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
660f39d4289SHisping Lin {
661f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
662f39d4289SHisping Lin 						  true, buf, length);
663f39d4289SHisping Lin }
664f39d4289SHisping Lin 
665*34f2e8f6SHisping Lin static void trusty_select_security_level(void)
6667504da74SHisping Lin {
6677504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
6687504da74SHisping Lin 	TEEC_Result TeecResult;
6697504da74SHisping Lin 
6707504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
6717504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
6727504da74SHisping Lin 		run_command("download", 0);
6737504da74SHisping Lin 		return;
6747504da74SHisping Lin 	}
6757504da74SHisping Lin 
6767504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
6777504da74SHisping Lin 		debug("optee select security level success!");
6787504da74SHisping Lin 	else
6797504da74SHisping Lin 		panic("optee select security level fail!");
6807504da74SHisping Lin 
6817504da74SHisping Lin 	return;
6827504da74SHisping Lin #endif
6837504da74SHisping Lin }
6847504da74SHisping Lin 
68551ac7005SHisping Lin void optee_client_init(void)
68651ac7005SHisping Lin {
68751ac7005SHisping Lin 	trusty_select_security_level();
688*34f2e8f6SHisping Lin 	trusty_notify_always_use_security();
68951ac7005SHisping Lin }
69051ac7005SHisping Lin 
691d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
692d5913350SHisping Lin {
693d5913350SHisping Lin 	TEEC_Result TeecResult;
694d5913350SHisping Lin 	TEEC_Context TeecContext;
695d5913350SHisping Lin 	TEEC_Session TeecSession;
696d5913350SHisping Lin 	uint32_t ErrorOrigin;
697d5913350SHisping Lin 
698d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
699d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
700d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
701d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
702d5913350SHisping Lin 
703d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
704d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
705d5913350SHisping Lin 		return TeecResult;
706d5913350SHisping Lin 
707d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
708d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
709d5913350SHisping Lin 		return TeecResult;
710d5913350SHisping Lin 
711d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
712d5913350SHisping Lin 				&TeecSession,
713d5913350SHisping Lin 				TeecUuid,
714d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
715d5913350SHisping Lin 				NULL,
716d5913350SHisping Lin 				NULL,
717d5913350SHisping Lin 				&ErrorOrigin);
718d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
719d5913350SHisping Lin 		return TeecResult;
720d5913350SHisping Lin 
721d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
722d5913350SHisping Lin 
723d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
724d5913350SHisping Lin 
725d5913350SHisping Lin 	SharedMem.size = byte_len;
726d5913350SHisping Lin 	SharedMem.flags = 0;
727d5913350SHisping Lin 
728d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
729d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
730d5913350SHisping Lin 		goto exit;
731d5913350SHisping Lin 
732d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
733d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
734d5913350SHisping Lin 
735d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
736d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
737d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
738d5913350SHisping Lin 						    TEEC_NONE,
739d5913350SHisping Lin 						    TEEC_NONE);
740d5913350SHisping Lin 
741d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
742d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
743d5913350SHisping Lin 					&TeecOperation,
744d5913350SHisping Lin 					&ErrorOrigin);
745d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
746d5913350SHisping Lin 		goto exit;
747d5913350SHisping Lin 
748d5913350SHisping Lin exit:
749d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
750d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
751d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
752d5913350SHisping Lin 
753d5913350SHisping Lin 	return TeecResult;
754d5913350SHisping Lin }
755d5913350SHisping Lin 
756d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
757d5913350SHisping Lin {
758d5913350SHisping Lin 	TEEC_Result TeecResult;
759d5913350SHisping Lin 	TEEC_Context TeecContext;
760d5913350SHisping Lin 	TEEC_Session TeecSession;
761d5913350SHisping Lin 	uint32_t ErrorOrigin;
762d5913350SHisping Lin 
763d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
764d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
765d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
766d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
767d5913350SHisping Lin 
768d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
769d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
770d5913350SHisping Lin 		return TeecResult;
771d5913350SHisping Lin 
772d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
773d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
774d5913350SHisping Lin 		return TeecResult;
775d5913350SHisping Lin 
776d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
777d5913350SHisping Lin 				&TeecSession,
778d5913350SHisping Lin 				TeecUuid,
779d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
780d5913350SHisping Lin 				NULL,
781d5913350SHisping Lin 				NULL,
782d5913350SHisping Lin 				&ErrorOrigin);
783d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
784d5913350SHisping Lin 		return TeecResult;
785d5913350SHisping Lin 
786d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
787d5913350SHisping Lin 
788d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
789d5913350SHisping Lin 
790d5913350SHisping Lin 	SharedMem.size = byte_len;
791d5913350SHisping Lin 	SharedMem.flags = 0;
792d5913350SHisping Lin 
793d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
794d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
795d5913350SHisping Lin 		goto exit;
796d5913350SHisping Lin 
797d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
798d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
799d5913350SHisping Lin 
800d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
801d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
802d5913350SHisping Lin 						    TEEC_NONE,
803d5913350SHisping Lin 						    TEEC_NONE);
804d5913350SHisping Lin 
805d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
806d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
807d5913350SHisping Lin 					&TeecOperation,
808d5913350SHisping Lin 					&ErrorOrigin);
809d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
810d5913350SHisping Lin 		goto exit;
811d5913350SHisping Lin 
812d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
813d5913350SHisping Lin 
814d5913350SHisping Lin exit:
815d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
816d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
817d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
818d5913350SHisping Lin 
819d5913350SHisping Lin 	return TeecResult;
820d5913350SHisping Lin }
821d5913350SHisping Lin 
82290e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,
823bb1ba6acSHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
824bb1ba6acSHisping Lin {
825bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
826bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
827bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
828bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
829bb1ba6acSHisping Lin 
830bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
831bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
832bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
833bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
834bb1ba6acSHisping Lin 
835bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
836bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
837bb1ba6acSHisping Lin 		return TeecResult;
838bb1ba6acSHisping Lin 
839bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
840bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
841bb1ba6acSHisping Lin 		return TeecResult;
842bb1ba6acSHisping Lin 
843bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
844bb1ba6acSHisping Lin 				&TeecSession,
845bb1ba6acSHisping Lin 				TeecUuid,
846bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
847bb1ba6acSHisping Lin 				NULL,
848bb1ba6acSHisping Lin 				NULL,
849bb1ba6acSHisping Lin 				&ErrorOrigin);
850bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
851bb1ba6acSHisping Lin 		return TeecResult;
852bb1ba6acSHisping Lin 
853bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
854bb1ba6acSHisping Lin 
855bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
856bb1ba6acSHisping Lin 
857bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
858bb1ba6acSHisping Lin 	SharedMem.flags = 0;
859bb1ba6acSHisping Lin 
860bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
861bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
862bb1ba6acSHisping Lin 		goto exit;
863bb1ba6acSHisping Lin 
864bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
865bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
866bb1ba6acSHisping Lin 
867bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
868bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
869bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
870bb1ba6acSHisping Lin 						    TEEC_NONE,
871bb1ba6acSHisping Lin 						    TEEC_NONE);
872bb1ba6acSHisping Lin 
873bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
87490e849a0Sxb.wang 					STORAGE_CMD_WRITE_OEM_OTP_KEY,
875bb1ba6acSHisping Lin 					&TeecOperation,
876bb1ba6acSHisping Lin 					&ErrorOrigin);
877bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
878bb1ba6acSHisping Lin 		goto exit;
879bb1ba6acSHisping Lin 
880bb1ba6acSHisping Lin exit:
881bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
882bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
883bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
884bb1ba6acSHisping Lin 
885bb1ba6acSHisping Lin 	return TeecResult;
886bb1ba6acSHisping Lin }
887bb1ba6acSHisping Lin 
8889deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value)
8899deb34f6SHisping Lin {
8909deb34f6SHisping Lin 	TEEC_Result TeecResult;
8919deb34f6SHisping Lin 	TEEC_Context TeecContext;
8929deb34f6SHisping Lin 	TEEC_Session TeecSession;
8939deb34f6SHisping Lin 	uint32_t ErrorOrigin;
8949deb34f6SHisping Lin 
8959deb34f6SHisping Lin 	*value = 0xFF;
8969deb34f6SHisping Lin 
8979deb34f6SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
8989deb34f6SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
8999deb34f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9009deb34f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
9019deb34f6SHisping Lin 
9029deb34f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
9039deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9049deb34f6SHisping Lin 		return TeecResult;
9059deb34f6SHisping Lin 
9069deb34f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9079deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9089deb34f6SHisping Lin 		return TeecResult;
9099deb34f6SHisping Lin 
9109deb34f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9119deb34f6SHisping Lin 				&TeecSession,
9129deb34f6SHisping Lin 				TeecUuid,
9139deb34f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
9149deb34f6SHisping Lin 				NULL,
9159deb34f6SHisping Lin 				NULL,
9169deb34f6SHisping Lin 				&ErrorOrigin);
9179deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
9189deb34f6SHisping Lin 		return TeecResult;
9199deb34f6SHisping Lin 
9209deb34f6SHisping Lin 	TeecOperation.params[0].value.a = key_id;
9219deb34f6SHisping Lin 
9229deb34f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
9239deb34f6SHisping Lin 						    TEEC_NONE,
9249deb34f6SHisping Lin 						    TEEC_NONE,
9259deb34f6SHisping Lin 						    TEEC_NONE);
9269deb34f6SHisping Lin 
9279deb34f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9289deb34f6SHisping Lin 					STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN,
9299deb34f6SHisping Lin 					&TeecOperation,
9309deb34f6SHisping Lin 					&ErrorOrigin);
9319deb34f6SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
9329deb34f6SHisping Lin 		*value = TeecOperation.params[0].value.b;
9339deb34f6SHisping Lin 
9349deb34f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
9359deb34f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9369deb34f6SHisping Lin 
9379deb34f6SHisping Lin 	return TeecResult;
9389deb34f6SHisping Lin }
9399deb34f6SHisping Lin 
94090e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)
941a405238aSHisping Lin {
942a405238aSHisping Lin 	TEEC_Result TeecResult;
943a405238aSHisping Lin 	TEEC_Context TeecContext;
944a405238aSHisping Lin 	TEEC_Session TeecSession;
945a405238aSHisping Lin 	uint32_t ErrorOrigin;
946a405238aSHisping Lin 
947a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
948a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
949a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
950a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
951a405238aSHisping Lin 
952a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
953a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
954a405238aSHisping Lin 		return TeecResult;
955a405238aSHisping Lin 
956a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
957a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
958a405238aSHisping Lin 		return TeecResult;
959a405238aSHisping Lin 
960a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
961a405238aSHisping Lin 				&TeecSession,
962a405238aSHisping Lin 				TeecUuid,
963a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
964a405238aSHisping Lin 				NULL,
965a405238aSHisping Lin 				NULL,
966a405238aSHisping Lin 				&ErrorOrigin);
967a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
968a405238aSHisping Lin 		return TeecResult;
969a405238aSHisping Lin 
970a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
971a405238aSHisping Lin 
972a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
973a405238aSHisping Lin 						    TEEC_NONE,
974a405238aSHisping Lin 						    TEEC_NONE,
975a405238aSHisping Lin 						    TEEC_NONE);
976a405238aSHisping Lin 
977a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
978a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
979a405238aSHisping Lin 					&TeecOperation,
980a405238aSHisping Lin 					&ErrorOrigin);
981a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
982a405238aSHisping Lin 		goto exit;
983a405238aSHisping Lin 
984a405238aSHisping Lin exit:
985a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
986a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
987a405238aSHisping Lin 
988a405238aSHisping Lin 	return TeecResult;
989a405238aSHisping Lin }
990a405238aSHisping Lin 
9912f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config,
9922f8c34bdSxb.wang 				   uint32_t src_phys_addr, uint32_t dst_phys_addr,
9932f8c34bdSxb.wang 				   uint32_t len)
994fc3694d6Sxb.wang {
995fc3694d6Sxb.wang 	TEEC_Result TeecResult;
996fc3694d6Sxb.wang 	TEEC_Context TeecContext;
997fc3694d6Sxb.wang 	TEEC_Session TeecSession;
998fc3694d6Sxb.wang 	TEEC_Operation TeecOperation = {0};
999fc3694d6Sxb.wang 	uint32_t ErrorOrigin;
1000fc3694d6Sxb.wang 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
1001fc3694d6Sxb.wang 	TEEC_SharedMemory SharedMem_config = {0};
1002fc3694d6Sxb.wang 
10032f8c34bdSxb.wang 	if (key_id != RK_OEM_OTP_KEY0 &&
10042f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY1 &&
10052f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY2 &&
10062f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY3 &&
10072f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY_FW)
1008fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1009fc3694d6Sxb.wang 
10102f8c34bdSxb.wang 	if (!config)
1011fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1012fc3694d6Sxb.wang 
1013fc3694d6Sxb.wang 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
1014fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1015fc3694d6Sxb.wang 
1016fc3694d6Sxb.wang 	if (config->mode >= RK_CIPHER_MODE_XTS)
1017fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1018fc3694d6Sxb.wang 
1019fc3694d6Sxb.wang 	if (config->operation != RK_MODE_ENCRYPT &&
1020fc3694d6Sxb.wang 	    config->operation != RK_MODE_DECRYPT)
1021fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1022fc3694d6Sxb.wang 
1023fc3694d6Sxb.wang 	if (config->key_len != 16 &&
1024fc3694d6Sxb.wang 	    config->key_len != 24 &&
1025fc3694d6Sxb.wang 	    config->key_len != 32)
1026fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1027fc3694d6Sxb.wang 
10282f8c34bdSxb.wang 	if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16)
10292f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10302f8c34bdSxb.wang 
10312f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126)
10322f8c34bdSxb.wang 	if (config->key_len == 24)
10332f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10342f8c34bdSxb.wang #endif
10352f8c34bdSxb.wang 
1036fc3694d6Sxb.wang 	if (len % AES_BLOCK_SIZE ||
1037fc3694d6Sxb.wang 	    len == 0)
1038fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1039fc3694d6Sxb.wang 
10402f8c34bdSxb.wang 	if (!src_phys_addr || !dst_phys_addr)
10412f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
10422f8c34bdSxb.wang 
1043fc3694d6Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
1044fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1045fc3694d6Sxb.wang 		return TeecResult;
1046fc3694d6Sxb.wang 
1047fc3694d6Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1048fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1049fc3694d6Sxb.wang 		return TeecResult;
1050fc3694d6Sxb.wang 
1051fc3694d6Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
1052fc3694d6Sxb.wang 				      &TeecSession,
1053fc3694d6Sxb.wang 				      &uuid,
1054fc3694d6Sxb.wang 				      TEEC_LOGIN_PUBLIC,
1055fc3694d6Sxb.wang 				      NULL,
1056fc3694d6Sxb.wang 				      NULL,
1057fc3694d6Sxb.wang 				      &ErrorOrigin);
1058fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1059fc3694d6Sxb.wang 		goto exit;
1060fc3694d6Sxb.wang 
1061fc3694d6Sxb.wang 	SharedMem_config.size = sizeof(rk_cipher_config);
1062fc3694d6Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
1063fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1064fc3694d6Sxb.wang 		goto exit;
1065fc3694d6Sxb.wang 
1066fc3694d6Sxb.wang 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
1067fc3694d6Sxb.wang 	TeecOperation.params[0].value.a       = key_id;
1068fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
1069fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
10702f8c34bdSxb.wang 	TeecOperation.params[2].value.a       = src_phys_addr;
10712f8c34bdSxb.wang 	TeecOperation.params[2].value.b       = len;
10722f8c34bdSxb.wang 	TeecOperation.params[3].value.a       = dst_phys_addr;
1073fc3694d6Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1074fc3694d6Sxb.wang 						    TEEC_MEMREF_TEMP_INPUT,
10752f8c34bdSxb.wang 						    TEEC_VALUE_INPUT,
10762f8c34bdSxb.wang 						    TEEC_VALUE_INPUT);
10772f8c34bdSxb.wang 
10782f8c34bdSxb.wang 	crypto_flush_cacheline(src_phys_addr, len);
10792f8c34bdSxb.wang 	crypto_flush_cacheline(dst_phys_addr, len);
10802f8c34bdSxb.wang 
1081fc3694d6Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10822f8c34bdSxb.wang 					CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER,
1083fc3694d6Sxb.wang 					&TeecOperation,
1084fc3694d6Sxb.wang 					&ErrorOrigin);
1085fc3694d6Sxb.wang 
1086a900eef3SHisping Lin 	crypto_invalidate_cacheline(dst_phys_addr, len);
1087a900eef3SHisping Lin 
1088fc3694d6Sxb.wang exit:
1089fc3694d6Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem_config);
1090fc3694d6Sxb.wang 	TEEC_CloseSession(&TeecSession);
1091fc3694d6Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
1092fc3694d6Sxb.wang 	return TeecResult;
1093fc3694d6Sxb.wang }
1094fc3694d6Sxb.wang 
10954aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
10964aa61755SAndy Ye {
10974aa61755SAndy Ye 	TEEC_Result TeecResult;
10984aa61755SAndy Ye 	TEEC_Context TeecContext;
10994aa61755SAndy Ye 	TEEC_Session TeecSession;
11004aa61755SAndy Ye 	uint32_t ErrorOrigin;
11014aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
11024aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
11034aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
11044aa61755SAndy Ye 				}
11054aa61755SAndy Ye 			     };
11064aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
11074aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
11083251364cSHisping Lin 	struct blk_desc *dev_desc;
11093251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
11106651d4c0SJason Zhu 	if (!dev_desc) {
11116651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
11126651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
11136651d4c0SJason Zhu 	}
11144aa61755SAndy Ye 
1115f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1116f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1117f4e1db95SHisping Lin 		return TeecResult;
11184aa61755SAndy Ye 
11194aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1120f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1121f4e1db95SHisping Lin 		return TeecResult;
11224aa61755SAndy Ye 
11233251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
11243251364cSHisping Lin 						TEEC_NONE,
11253251364cSHisping Lin 						TEEC_NONE,
11263251364cSHisping Lin 						TEEC_NONE);
11273251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1128b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1129b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1130b9a7e756SHisping Lin 	else
1131b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1132b9a7e756SHisping Lin 
11333251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
11343251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
11353251364cSHisping Lin #endif
11363251364cSHisping Lin 
11374aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
11384aa61755SAndy Ye 				      &TeecSession,
11394aa61755SAndy Ye 				      TeecUuid,
11404aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
11414aa61755SAndy Ye 				      NULL,
11423251364cSHisping Lin 					&TeecOperation,
11434aa61755SAndy Ye 				      &ErrorOrigin);
1144f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1145f4e1db95SHisping Lin 		return TeecResult;
11464aa61755SAndy Ye 
11474aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
11484aa61755SAndy Ye 
11494aa61755SAndy Ye 	SharedMem0.size = *dh_size;
11504aa61755SAndy Ye 	SharedMem0.flags = 0;
11514aa61755SAndy Ye 
11524aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1153f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1154f4e1db95SHisping Lin 		goto exit;
11554aa61755SAndy Ye 
11564aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11574aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11584aa61755SAndy Ye 
11594aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
11604aa61755SAndy Ye 						    TEEC_NONE,
11614aa61755SAndy Ye 						    TEEC_NONE,
11624aa61755SAndy Ye 						    TEEC_NONE);
11634aa61755SAndy Ye 
11644aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11654aa61755SAndy Ye 					143,
11664aa61755SAndy Ye 					&TeecOperation,
11674aa61755SAndy Ye 					&ErrorOrigin);
1168f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1169f4e1db95SHisping Lin 		goto exit;
11704aa61755SAndy Ye 
11714aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
11724aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1173f4e1db95SHisping Lin exit:
11744aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
11754aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1176f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11774aa61755SAndy Ye 
11784aa61755SAndy Ye 	return TeecResult;
11794aa61755SAndy Ye }
11804aa61755SAndy Ye 
11814aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
11824aa61755SAndy Ye {
11834aa61755SAndy Ye 	TEEC_Result TeecResult;
11844aa61755SAndy Ye 	TEEC_Context TeecContext;
11854aa61755SAndy Ye 	TEEC_Session TeecSession;
11864aa61755SAndy Ye 	uint32_t ErrorOrigin;
11874aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
11884aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
11894aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
11904aa61755SAndy Ye 				}
11914aa61755SAndy Ye 			     };
11924aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
11934aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
11943251364cSHisping Lin 	struct blk_desc *dev_desc;
11953251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
11966651d4c0SJason Zhu 	if (!dev_desc) {
11976651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
11986651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
11996651d4c0SJason Zhu 	}
12004aa61755SAndy Ye 
1201f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1202f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1203f4e1db95SHisping Lin 		return TeecResult;
12044aa61755SAndy Ye 
12054aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1206f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1207f4e1db95SHisping Lin 		return TeecResult;
12084aa61755SAndy Ye 
12093251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
12103251364cSHisping Lin 						TEEC_NONE,
12113251364cSHisping Lin 						TEEC_NONE,
12123251364cSHisping Lin 						TEEC_NONE);
12133251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1214b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1215b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1216b9a7e756SHisping Lin 	else
1217b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1218b9a7e756SHisping Lin 
12193251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
12203251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
12213251364cSHisping Lin #endif
12223251364cSHisping Lin 
12234aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
12244aa61755SAndy Ye 				      &TeecSession,
12254aa61755SAndy Ye 				      TeecUuid,
12264aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
12274aa61755SAndy Ye 				      NULL,
12283251364cSHisping Lin 					&TeecOperation,
12294aa61755SAndy Ye 				      &ErrorOrigin);
1230f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1231f4e1db95SHisping Lin 		return TeecResult;
12324aa61755SAndy Ye 
12334aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
12344aa61755SAndy Ye 
12354aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
12364aa61755SAndy Ye 	SharedMem0.flags = 0;
12374aa61755SAndy Ye 
12384aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1239f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1240f4e1db95SHisping Lin 		goto exit;
12414aa61755SAndy Ye 
12424aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12434aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12444aa61755SAndy Ye 
12454aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
12464aa61755SAndy Ye 						    TEEC_NONE,
12474aa61755SAndy Ye 						    TEEC_NONE,
12484aa61755SAndy Ye 						    TEEC_NONE);
12494aa61755SAndy Ye 
12504aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12514aa61755SAndy Ye 					144,
12524aa61755SAndy Ye 					&TeecOperation,
12534aa61755SAndy Ye 					&ErrorOrigin);
1254f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1255f4e1db95SHisping Lin 		goto exit;
12564aa61755SAndy Ye 
12574aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
12584aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1259f4e1db95SHisping Lin exit:
12604aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
12614aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1262f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12634aa61755SAndy Ye 
12644aa61755SAndy Ye 	return TeecResult;
12654aa61755SAndy Ye }
12664aa61755SAndy Ye 
12674aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
12684aa61755SAndy Ye 			      uint32_t *operation_size,
12694aa61755SAndy Ye 			      uint8_t *out,
12704aa61755SAndy Ye 			      uint32_t *out_len)
12714aa61755SAndy Ye {
12724aa61755SAndy Ye 	TEEC_Result TeecResult;
12734aa61755SAndy Ye 	TEEC_Context TeecContext;
12744aa61755SAndy Ye 	TEEC_Session TeecSession;
12754aa61755SAndy Ye 	uint32_t ErrorOrigin;
12764aa61755SAndy Ye 
12774aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
12784aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
12794aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
12804aa61755SAndy Ye 				}
12814aa61755SAndy Ye 			     };
12824aa61755SAndy Ye 
12834aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
12844aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
12853251364cSHisping Lin 	struct blk_desc *dev_desc;
12863251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
12876651d4c0SJason Zhu 	if (!dev_desc) {
12886651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
12896651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
12906651d4c0SJason Zhu 	}
12914aa61755SAndy Ye 
1292f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1293f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1294f4e1db95SHisping Lin 		return TeecResult;
12954aa61755SAndy Ye 
12964aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1297f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1298f4e1db95SHisping Lin 		return TeecResult;
12994aa61755SAndy Ye 
13003251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
13013251364cSHisping Lin 						TEEC_NONE,
13023251364cSHisping Lin 						TEEC_NONE,
13033251364cSHisping Lin 						TEEC_NONE);
13043251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1305b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1306b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1307b9a7e756SHisping Lin 	else
1308b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1309b9a7e756SHisping Lin 
13103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
13113251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
13123251364cSHisping Lin #endif
13133251364cSHisping Lin 
13144aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
13154aa61755SAndy Ye 				      &TeecSession,
13164aa61755SAndy Ye 				      TeecUuid,
13174aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
13184aa61755SAndy Ye 				      NULL,
13193251364cSHisping Lin 					&TeecOperation,
13204aa61755SAndy Ye 				      &ErrorOrigin);
1321f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1322f4e1db95SHisping Lin 		return TeecResult;
13234aa61755SAndy Ye 
13244aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
13254aa61755SAndy Ye 
13264aa61755SAndy Ye 	SharedMem0.size = *operation_size;
13274aa61755SAndy Ye 	SharedMem0.flags = 0;
13284aa61755SAndy Ye 
13294aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1330f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1331f4e1db95SHisping Lin 		goto exit;
13324aa61755SAndy Ye 
13334aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
13344aa61755SAndy Ye 
13354aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13364aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13374aa61755SAndy Ye 
13384aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
13394aa61755SAndy Ye 
13404aa61755SAndy Ye 	SharedMem1.size = *out_len;
13414aa61755SAndy Ye 	SharedMem1.flags = 0;
13424aa61755SAndy Ye 
13434aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1344f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1345f4e1db95SHisping Lin 		goto exit;
13464aa61755SAndy Ye 
13474aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
13484aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
13494aa61755SAndy Ye 
13504aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
13514aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
13524aa61755SAndy Ye 						    TEEC_NONE,
13534aa61755SAndy Ye 						    TEEC_NONE);
13544aa61755SAndy Ye 
13554aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13564aa61755SAndy Ye 					145,
13574aa61755SAndy Ye 					&TeecOperation,
13584aa61755SAndy Ye 					&ErrorOrigin);
1359f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1360f4e1db95SHisping Lin 		goto exit;
13614aa61755SAndy Ye 
13624aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
13634aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1364f4e1db95SHisping Lin exit:
13654aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
13664aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1367f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1368f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
13694aa61755SAndy Ye 
13704aa61755SAndy Ye 	return TeecResult;
13714aa61755SAndy Ye }
13724aa61755SAndy Ye 
13734aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
13744aa61755SAndy Ye {
13754aa61755SAndy Ye 	TEEC_Result TeecResult;
13764aa61755SAndy Ye 	TEEC_Context TeecContext;
13774aa61755SAndy Ye 	TEEC_Session TeecSession;
13784aa61755SAndy Ye 	uint32_t ErrorOrigin;
13794aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
13804aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
13814aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
13824aa61755SAndy Ye 				}
13834aa61755SAndy Ye 			     };
13844aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
13854aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
13863251364cSHisping Lin 	struct blk_desc *dev_desc;
13873251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
13886651d4c0SJason Zhu 	if (!dev_desc) {
13896651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
13906651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
13916651d4c0SJason Zhu 	}
1392f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1393f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1394f4e1db95SHisping Lin 		return TeecResult;
13954aa61755SAndy Ye 
13964aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1397f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1398f4e1db95SHisping Lin 		return TeecResult;
13994aa61755SAndy Ye 
14003251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
14013251364cSHisping Lin 						TEEC_NONE,
14023251364cSHisping Lin 						TEEC_NONE,
14033251364cSHisping Lin 						TEEC_NONE);
14043251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1405b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1406b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1407b9a7e756SHisping Lin 	else
1408b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1409b9a7e756SHisping Lin 
14103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
14113251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
14123251364cSHisping Lin #endif
14133251364cSHisping Lin 
14144aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
14154aa61755SAndy Ye 					&TeecSession,
14164aa61755SAndy Ye 					TeecUuid,
14174aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
14184aa61755SAndy Ye 					NULL,
14193251364cSHisping Lin 					&TeecOperation,
14204aa61755SAndy Ye 					&ErrorOrigin);
1421f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1422f4e1db95SHisping Lin 		return TeecResult;
14234aa61755SAndy Ye 
14244aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
14254aa61755SAndy Ye 
14264aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
14274aa61755SAndy Ye 	SharedMem0.flags = 0;
14284aa61755SAndy Ye 
14294aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1430f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1431f4e1db95SHisping Lin 		goto exit;
14324aa61755SAndy Ye 
14334aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
14344aa61755SAndy Ye 
14354aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
14364aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
14374aa61755SAndy Ye 
14384aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
14394aa61755SAndy Ye 						    TEEC_NONE,
14404aa61755SAndy Ye 						    TEEC_NONE,
14414aa61755SAndy Ye 						    TEEC_NONE);
14424aa61755SAndy Ye 
14434aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14444aa61755SAndy Ye 					146,
14454aa61755SAndy Ye 					&TeecOperation,
14464aa61755SAndy Ye 					&ErrorOrigin);
1447f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1448f4e1db95SHisping Lin 		goto exit;
1449f4e1db95SHisping Lin exit:
14504aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
14514aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1452f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14534aa61755SAndy Ye 
14544aa61755SAndy Ye 	return TeecResult;
14554aa61755SAndy Ye }
1456