xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision b2858095789a25b1c699d6a281d4334c9ffe75c3)
1ae8ec5e1SHisping Lin /*
2ae8ec5e1SHisping Lin  * Copyright 2017, Rockchip Electronics Co., Ltd
3ae8ec5e1SHisping Lin  * hisping lin, <hisping.lin@rock-chips.com>
4ae8ec5e1SHisping Lin  *
5ae8ec5e1SHisping Lin  * SPDX-License-Identifier:	GPL-2.0+
6ae8ec5e1SHisping Lin  */
7ae8ec5e1SHisping Lin 
8ae8ec5e1SHisping Lin #include <common.h>
9bb1ba6acSHisping Lin #include <optee_include/OpteeClientInterface.h>
10ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h>
11ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h>
1278ef5fbdSqiujian #include <optee_include/tee_api_defines.h>
133251364cSHisping Lin #include <boot_rkimg.h>
14a7df4868Stony.xu #include <stdlib.h>
151e8c0e44STony Xu #include <attestation_key.h>
16a7df4868Stony.xu 
17a7df4868Stony.xu #define	BOOT_FROM_EMMC	(1 << 1)
18c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH		0
19c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH	1
20c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP		2
21c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH		3
22c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH		4
23c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG		5
241ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY	9
25fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG	10
26f39d4289SHisping Lin #define STORAGE_CMD_WRITE_OEM_HUK		11
27d5913350SHisping Lin #define STORAGE_CMD_WRITE_OEM_NS_OTP		12
28d5913350SHisping Lin #define STORAGE_CMD_READ_OEM_NS_OTP		13
2990e849a0Sxb.wang #define STORAGE_CMD_WRITE_OEM_OTP_KEY		14
30a405238aSHisping Lin #define STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK	15
319deb34f6SHisping Lin #define STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN	16
3210f41197SHisping Lin #define STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN	20
33a828eba9SHisping Lin #define STORAGE_CMD_WRITE_OEM_HDCP_KEY	21
34e8bc2655SHisping Lin #define STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN	22
35bfd9cea4SHisping Lin #define STORAGE_CMD_SET_OEM_HDCP_KEY_MASK	23
361ac64e8aSHisping Lin #define STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA	24
37fc383442SHisping Lin #define STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN	25
38ae8ec5e1SHisping Lin 
392f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER	0x00000002
40fc3694d6Sxb.wang 
41fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID	{ 0x0cacdb5d, 0x4fea, 0x466c, \
42fc3694d6Sxb.wang 		{ 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } }
43fc3694d6Sxb.wang 
44ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
45ae8ec5e1SHisping Lin {
46ae8ec5e1SHisping Lin 	if (in > 9)
47ae8ec5e1SHisping Lin 		return in + 55;
48ae8ec5e1SHisping Lin 	else
49ae8ec5e1SHisping Lin 		return in + 48;
50ae8ec5e1SHisping Lin }
51ae8ec5e1SHisping Lin 
52c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
53ae8ec5e1SHisping Lin {
54ae8ec5e1SHisping Lin 	uint32_t i = 0;
55ae8ec5e1SHisping Lin 
56ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
57ae8ec5e1SHisping Lin 		return 0;
58ae8ec5e1SHisping Lin 
59ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
60ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
61ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
62ae8ec5e1SHisping Lin 	}
63ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
64ae8ec5e1SHisping Lin 
65ae8ec5e1SHisping Lin 	return blen * 2;
66ae8ec5e1SHisping Lin }
67ae8ec5e1SHisping Lin 
682f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size)
692f8c34bdSxb.wang {
702f8c34bdSxb.wang 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
712f8c34bdSxb.wang 	ulong aligned_input, aligned_len;
722f8c34bdSxb.wang 
732f8c34bdSxb.wang 	if (!addr || !size)
742f8c34bdSxb.wang 		return;
752f8c34bdSxb.wang 
762f8c34bdSxb.wang 	/* Must flush dcache before crypto DMA fetch data region */
772f8c34bdSxb.wang 	aligned_input = round_down(addr, alignment);
782f8c34bdSxb.wang 	aligned_len = round_up(size + (addr - aligned_input), alignment);
792f8c34bdSxb.wang 	flush_cache(aligned_input, aligned_len);
802f8c34bdSxb.wang }
812f8c34bdSxb.wang 
82a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
83a900eef3SHisping Lin {
84a900eef3SHisping Lin 	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
85a900eef3SHisping Lin 	ulong aligned_input, aligned_len;
86a900eef3SHisping Lin 
87a900eef3SHisping Lin 	if (!addr || !size)
88a900eef3SHisping Lin 		return;
89a900eef3SHisping Lin 
90a900eef3SHisping Lin 	/* Must invalidate dcache after crypto DMA write data region */
91a900eef3SHisping Lin 	aligned_input = round_down(addr, alignment);
92a900eef3SHisping Lin 	aligned_len = round_up(size + (addr - aligned_input), alignment);
93a900eef3SHisping Lin 	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
94a900eef3SHisping Lin }
95a900eef3SHisping Lin 
96c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
97c7de5349SHisping Lin 						uint32_t filename_size,
98c7de5349SHisping Lin 						uint8_t *data,
99c7de5349SHisping Lin 						uint32_t data_size)
100ae8ec5e1SHisping Lin {
101ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
102ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
103ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
104ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
105ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
106ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
107ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
108ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
1093251364cSHisping Lin 	struct blk_desc *dev_desc;
1103251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
1116651d4c0SJason Zhu 	if (!dev_desc) {
1126651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
1136651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
1146651d4c0SJason Zhu 	}
1153251364cSHisping Lin 
116f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
117f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
118f4e1db95SHisping Lin 		return TeecResult;
119ae8ec5e1SHisping Lin 
120ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
121f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
122f4e1db95SHisping Lin 		return TeecResult;
123ae8ec5e1SHisping Lin 
1243251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1253251364cSHisping Lin 						    TEEC_NONE,
1263251364cSHisping Lin 						    TEEC_NONE,
1273251364cSHisping Lin 						    TEEC_NONE);
1283251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
129f3c7fe23SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc
130f3c7fe23SHisping Lin 		TeecOperation.params[0].value.a = 1;
131f3c7fe23SHisping Lin 	else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs
132b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
133b9a7e756SHisping Lin 	else
134b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
135f3c7fe23SHisping Lin 
1363251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
1373251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
1383251364cSHisping Lin #endif
1393251364cSHisping Lin 
140ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
141ae8ec5e1SHisping Lin 				&TeecSession,
142ae8ec5e1SHisping Lin 				TeecUuid,
143ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
144ae8ec5e1SHisping Lin 				NULL,
1453251364cSHisping Lin 				&TeecOperation,
146ae8ec5e1SHisping Lin 				&ErrorOrigin);
147f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
148f4e1db95SHisping Lin 		return TeecResult;
149ae8ec5e1SHisping Lin 
150ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
151ae8ec5e1SHisping Lin 
152c7de5349SHisping Lin 	SharedMem0.size = filename_size;
153ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
154ae8ec5e1SHisping Lin 
155ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
156f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
157f4e1db95SHisping Lin 		goto exit;
158ae8ec5e1SHisping Lin 
159c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
160ae8ec5e1SHisping Lin 
161ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
162ae8ec5e1SHisping Lin 
163c7de5349SHisping Lin 	SharedMem1.size = data_size;
164c7de5349SHisping Lin 	SharedMem1.flags = 0;
165c7de5349SHisping Lin 
166c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
167c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
168c7de5349SHisping Lin 		goto exit;
169c7de5349SHisping Lin 
170c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
171c7de5349SHisping Lin 
172c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
173c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
174c7de5349SHisping Lin 
175c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
176c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
177c7de5349SHisping Lin 
178c7de5349SHisping Lin 
179c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
180c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
181c7de5349SHisping Lin 						TEEC_NONE,
182c7de5349SHisping Lin 						TEEC_NONE);
183c7de5349SHisping Lin 
184c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
185c7de5349SHisping Lin 					1,
186c7de5349SHisping Lin 					&TeecOperation,
187c7de5349SHisping Lin 					&ErrorOrigin);
188c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
189c7de5349SHisping Lin 		goto exit;
190c7de5349SHisping Lin exit:
191c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
192c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
193c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
194c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
195c7de5349SHisping Lin 
196c7de5349SHisping Lin 	return TeecResult;
197c7de5349SHisping Lin }
198c7de5349SHisping Lin 
199c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
200c7de5349SHisping Lin 					       uint32_t filename_size,
201c7de5349SHisping Lin 					       uint8_t *data,
202c7de5349SHisping Lin 					       uint32_t data_size)
203c7de5349SHisping Lin {
204c7de5349SHisping Lin 	TEEC_Result TeecResult;
205c7de5349SHisping Lin 	TEEC_Context TeecContext;
206c7de5349SHisping Lin 	TEEC_Session TeecSession;
207c7de5349SHisping Lin 	uint32_t ErrorOrigin;
208c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
209c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
210c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
211c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
212c7de5349SHisping Lin 
213c7de5349SHisping Lin 	struct blk_desc *dev_desc;
214c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
215c7de5349SHisping Lin 	if (!dev_desc) {
216c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
217c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
218c7de5349SHisping Lin 	}
219c7de5349SHisping Lin 
220c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
221c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
222c7de5349SHisping Lin 		return TeecResult;
223c7de5349SHisping Lin 
224c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
225c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
226c7de5349SHisping Lin 		return TeecResult;
227c7de5349SHisping Lin 
228c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
229c7de5349SHisping Lin 						TEEC_NONE,
230c7de5349SHisping Lin 						TEEC_NONE,
231c7de5349SHisping Lin 						TEEC_NONE);
232c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
233f3c7fe23SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc
234f3c7fe23SHisping Lin 		TeecOperation.params[0].value.a = 1;
235f3c7fe23SHisping Lin 	else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs
236c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
237c7de5349SHisping Lin 	else
238c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
239f3c7fe23SHisping Lin 
240c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
241c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
242c7de5349SHisping Lin #endif
243c7de5349SHisping Lin 
244c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
245c7de5349SHisping Lin 				&TeecSession,
246c7de5349SHisping Lin 				TeecUuid,
247c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
248c7de5349SHisping Lin 				NULL,
249c7de5349SHisping Lin 				&TeecOperation,
250c7de5349SHisping Lin 				&ErrorOrigin);
251c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
252c7de5349SHisping Lin 		return TeecResult;
253c7de5349SHisping Lin 
254c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
255c7de5349SHisping Lin 
256c7de5349SHisping Lin 	SharedMem0.size = filename_size;
257c7de5349SHisping Lin 	SharedMem0.flags = 0;
258c7de5349SHisping Lin 
259c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
260c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
261c7de5349SHisping Lin 		goto exit;
262c7de5349SHisping Lin 
263c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
264c7de5349SHisping Lin 
265c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
266c7de5349SHisping Lin 
267c7de5349SHisping Lin 	SharedMem1.size = data_size;
268ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
269ae8ec5e1SHisping Lin 
270ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
271f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
272f4e1db95SHisping Lin 		goto exit;
273ae8ec5e1SHisping Lin 
274ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
275ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
276ae8ec5e1SHisping Lin 
277ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
278ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
279ae8ec5e1SHisping Lin 
280ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
281ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
282ae8ec5e1SHisping Lin 						TEEC_NONE,
283ae8ec5e1SHisping Lin 						TEEC_NONE);
284ae8ec5e1SHisping Lin 
285ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
286ae8ec5e1SHisping Lin 					0,
287ae8ec5e1SHisping Lin 					&TeecOperation,
288ae8ec5e1SHisping Lin 					&ErrorOrigin);
28946b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
290c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
291f4e1db95SHisping Lin exit:
292ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
293ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
294ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
29546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
296ae8ec5e1SHisping Lin 
297ae8ec5e1SHisping Lin 	return TeecResult;
298ae8ec5e1SHisping Lin }
299ae8ec5e1SHisping Lin 
300c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
301c7de5349SHisping Lin {
302c7de5349SHisping Lin 	TEEC_Result TeecResult;
303c7de5349SHisping Lin 	TEEC_Context TeecContext;
304c7de5349SHisping Lin 	TEEC_Session TeecSession;
305c7de5349SHisping Lin 	uint32_t ErrorOrigin;
306c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
307c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
308c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
309c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
310c7de5349SHisping Lin 
311c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
312c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
313c7de5349SHisping Lin 		return TeecResult;
314c7de5349SHisping Lin 
315c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
316c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
317c7de5349SHisping Lin 		return TeecResult;
318c7de5349SHisping Lin 
319c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
320c7de5349SHisping Lin 				&TeecSession,
321c7de5349SHisping Lin 				TeecUuid,
322c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
323c7de5349SHisping Lin 				NULL,
324c7de5349SHisping Lin 				NULL,
325c7de5349SHisping Lin 				&ErrorOrigin);
326c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
327c7de5349SHisping Lin 		return TeecResult;
328c7de5349SHisping Lin 
329c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
330c7de5349SHisping Lin 						    TEEC_NONE,
331c7de5349SHisping Lin 						    TEEC_NONE,
332c7de5349SHisping Lin 						    TEEC_NONE);
333c7de5349SHisping Lin 
334c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
335c7de5349SHisping Lin 					2,
336c7de5349SHisping Lin 					&TeecOperation,
337c7de5349SHisping Lin 					&ErrorOrigin);
338c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
339c7de5349SHisping Lin 		goto exit;
340c7de5349SHisping Lin exit:
341c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
342c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
343c7de5349SHisping Lin 
344c7de5349SHisping Lin 	return TeecResult;
345c7de5349SHisping Lin }
346c7de5349SHisping Lin 
34734f2e8f6SHisping Lin static void trusty_notify_always_use_security(void)
34834f2e8f6SHisping Lin {
34934f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION)
35034f2e8f6SHisping Lin 	TEEC_Result TeecResult;
35134f2e8f6SHisping Lin 	TEEC_Context TeecContext;
35234f2e8f6SHisping Lin 	TEEC_Session TeecSession;
35334f2e8f6SHisping Lin 	uint32_t ErrorOrigin;
35434f2e8f6SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
35534f2e8f6SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
35634f2e8f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
35734f2e8f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
35834f2e8f6SHisping Lin 
35934f2e8f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
36034f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
36134f2e8f6SHisping Lin 		return;
36234f2e8f6SHisping Lin 
36334f2e8f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
36434f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
36534f2e8f6SHisping Lin 		return;
36634f2e8f6SHisping Lin 
36734f2e8f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
36834f2e8f6SHisping Lin 				&TeecSession,
36934f2e8f6SHisping Lin 				TeecUuid,
37034f2e8f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
37134f2e8f6SHisping Lin 				NULL,
37234f2e8f6SHisping Lin 				NULL,
37334f2e8f6SHisping Lin 				&ErrorOrigin);
37434f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
37534f2e8f6SHisping Lin 		return;
37634f2e8f6SHisping Lin 
37734f2e8f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
37834f2e8f6SHisping Lin 						    TEEC_NONE,
37934f2e8f6SHisping Lin 						    TEEC_NONE,
38034f2e8f6SHisping Lin 						    TEEC_NONE);
38134f2e8f6SHisping Lin 
38234f2e8f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
38334f2e8f6SHisping Lin 					9,
38434f2e8f6SHisping Lin 					&TeecOperation,
38534f2e8f6SHisping Lin 					&ErrorOrigin);
38634f2e8f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
38734f2e8f6SHisping Lin 		debug("notify always use security fail! please update optee!");
38834f2e8f6SHisping Lin 
38934f2e8f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
39034f2e8f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
39134f2e8f6SHisping Lin 
39234f2e8f6SHisping Lin 	return;
39334f2e8f6SHisping Lin #endif
39434f2e8f6SHisping Lin }
39534f2e8f6SHisping Lin 
396c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
397c7de5349SHisping Lin {
398c7de5349SHisping Lin 	char hs[9];
399c7de5349SHisping Lin 
400c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
401c7de5349SHisping Lin 
402c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
403c7de5349SHisping Lin }
404c7de5349SHisping Lin 
405ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
406ae8ec5e1SHisping Lin {
407c7de5349SHisping Lin 	char hs[9];
4083251364cSHisping Lin 
409c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
410ae8ec5e1SHisping Lin 
411c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
412ae8ec5e1SHisping Lin }
413ae8ec5e1SHisping Lin 
414ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
415ae8ec5e1SHisping Lin {
416c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
417c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
418ae8ec5e1SHisping Lin }
419ae8ec5e1SHisping Lin 
420ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
421ae8ec5e1SHisping Lin {
422c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
423c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
4246651d4c0SJason Zhu }
425ae8ec5e1SHisping Lin 
426c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
427c7de5349SHisping Lin {
428c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
429c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
430c7de5349SHisping Lin }
431ae8ec5e1SHisping Lin 
432c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
433c7de5349SHisping Lin {
434c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
435c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
436ae8ec5e1SHisping Lin }
437ae8ec5e1SHisping Lin 
438564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
439564654ebSJason Zhu 					      uint32_t size)
440564654ebSJason Zhu {
441c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
442c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
443564654ebSJason Zhu }
444564654ebSJason Zhu 
445564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
446564654ebSJason Zhu 					       uint32_t size)
447564654ebSJason Zhu {
448c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
449c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
450564654ebSJason Zhu }
451564654ebSJason Zhu 
452ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
453ae8ec5e1SHisping Lin {
454c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
455c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
456ae8ec5e1SHisping Lin }
457ae8ec5e1SHisping Lin 
458ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
459ae8ec5e1SHisping Lin {
460c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
461c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
462ae8ec5e1SHisping Lin }
463ae8ec5e1SHisping Lin 
464ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
465ae8ec5e1SHisping Lin {
466c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
467c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
468c7de5349SHisping Lin }
469c7de5349SHisping Lin 
470c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
471c7de5349SHisping Lin {
472c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
473c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
474c7de5349SHisping Lin }
475c7de5349SHisping Lin 
476c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
477c7de5349SHisping Lin {
478ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
479ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
480ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
481ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
482c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
483c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
484c7de5349SHisping Lin 
485ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
486ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
487ae8ec5e1SHisping Lin 
488f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
489f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
490f4e1db95SHisping Lin 		return TeecResult;
491ae8ec5e1SHisping Lin 
492ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
493f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
494f4e1db95SHisping Lin 		return TeecResult;
495ae8ec5e1SHisping Lin 
496ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
497ae8ec5e1SHisping Lin 				      &TeecSession,
498ae8ec5e1SHisping Lin 				      TeecUuid,
499ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
500ae8ec5e1SHisping Lin 				      NULL,
501c7de5349SHisping Lin 				      NULL,
502ae8ec5e1SHisping Lin 				      &ErrorOrigin);
503f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
504f4e1db95SHisping Lin 		return TeecResult;
505ae8ec5e1SHisping Lin 
506c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
507c7de5349SHisping Lin 						    TEEC_NONE,
508ae8ec5e1SHisping Lin 						    TEEC_NONE,
509ae8ec5e1SHisping Lin 						    TEEC_NONE);
510ae8ec5e1SHisping Lin 
511ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
512c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
513ae8ec5e1SHisping Lin 					&TeecOperation,
514ae8ec5e1SHisping Lin 					&ErrorOrigin);
515c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
516c7de5349SHisping Lin 		goto exit;
517f4e1db95SHisping Lin exit:
518ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
51946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
520ae8ec5e1SHisping Lin 
521ae8ec5e1SHisping Lin 	return TeecResult;
522ae8ec5e1SHisping Lin }
523ae8ec5e1SHisping Lin 
524c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
525c7de5349SHisping Lin 						   uint8_t is_write,
526c7de5349SHisping Lin 						   uint32_t *buf,
527c7de5349SHisping Lin 						   uint32_t length)
528ae8ec5e1SHisping Lin {
529ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
530ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
531ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
532ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
533c7de5349SHisping Lin 
534c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
535c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
536ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
537ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
538ae8ec5e1SHisping Lin 
539f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
540f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
541f4e1db95SHisping Lin 		return TeecResult;
542ae8ec5e1SHisping Lin 
543ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
544f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
545f4e1db95SHisping Lin 		return TeecResult;
546ae8ec5e1SHisping Lin 
547ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
548ae8ec5e1SHisping Lin 				&TeecSession,
549ae8ec5e1SHisping Lin 				TeecUuid,
550ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
551ae8ec5e1SHisping Lin 				NULL,
552c7de5349SHisping Lin 				NULL,
553ae8ec5e1SHisping Lin 				&ErrorOrigin);
554f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
555f4e1db95SHisping Lin 		return TeecResult;
556ae8ec5e1SHisping Lin 
557ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
558ae8ec5e1SHisping Lin 
559c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
560ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
561ae8ec5e1SHisping Lin 
562ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
563f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
564f4e1db95SHisping Lin 		goto exit;
565ae8ec5e1SHisping Lin 
566ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
567ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
568ae8ec5e1SHisping Lin 
569c7de5349SHisping Lin 	if (is_write) {
570c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
571ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
572c7de5349SHisping Lin 							    TEEC_NONE,
573ae8ec5e1SHisping Lin 							    TEEC_NONE,
574ae8ec5e1SHisping Lin 							    TEEC_NONE);
575ae8ec5e1SHisping Lin 
576c7de5349SHisping Lin 	} else {
577c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
578c7de5349SHisping Lin 							    TEEC_NONE,
579c7de5349SHisping Lin 							    TEEC_NONE,
580c7de5349SHisping Lin 							    TEEC_NONE);
581c7de5349SHisping Lin 	}
582c7de5349SHisping Lin 
583ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
584c7de5349SHisping Lin 					cmd,
585ae8ec5e1SHisping Lin 					&TeecOperation,
586ae8ec5e1SHisping Lin 					&ErrorOrigin);
587f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
588f4e1db95SHisping Lin 		goto exit;
589c7de5349SHisping Lin 
590c7de5349SHisping Lin 	if (!is_write)
591c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
592c7de5349SHisping Lin 
593f4e1db95SHisping Lin exit:
594ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
595ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
59646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
597ae8ec5e1SHisping Lin 
598ae8ec5e1SHisping Lin 	return TeecResult;
599ae8ec5e1SHisping Lin }
600ae8ec5e1SHisping Lin 
6016ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
6026ef445a4SHisping Lin {
603c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
604c7de5349SHisping Lin 						  false, buf, length);
6056ef445a4SHisping Lin }
6066ef445a4SHisping Lin 
6076ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
6086ef445a4SHisping Lin {
609c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
610c7de5349SHisping Lin 						  true, buf, length);
61116539616SHisping Lin }
61216539616SHisping Lin 
61316539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
61416539616SHisping Lin {
61516539616SHisping Lin 	TEEC_Result res;
616c7de5349SHisping Lin 
617c7de5349SHisping Lin 	res = trusty_base_end_security_data();
618c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
61916539616SHisping Lin 	return res;
62016539616SHisping Lin }
6212cd27853SHisping Lin 
6222cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
6232cd27853SHisping Lin {
624c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
625c7de5349SHisping Lin 						  false, buf, length);
6262cd27853SHisping Lin }
627c7de5349SHisping Lin 
6282cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
6292cd27853SHisping Lin {
630c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
631c7de5349SHisping Lin 						  true, buf, length);
6322cd27853SHisping Lin }
633095e2a82SHisping Lin 
634468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
635468df3b2SHisping Lin {
636468df3b2SHisping Lin 	uint32_t bootflag;
637c7de5349SHisping Lin 	TEEC_Result TeecResult;
638468df3b2SHisping Lin 
639f07e1686SHisping Lin 	*flag = 0;
640f07e1686SHisping Lin 
641c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
642c7de5349SHisping Lin 							false, &bootflag, 1);
643468df3b2SHisping Lin 
644468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
6450202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
6460202ee8aSHisping Lin 		if (bootflag == 0x00000001)
6470202ee8aSHisping Lin 			*flag = 1;
6480202ee8aSHisping Lin #else
649468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
650468df3b2SHisping Lin 			*flag = 1;
6510202ee8aSHisping Lin #endif
652468df3b2SHisping Lin 	}
653095e2a82SHisping Lin 	return TeecResult;
654095e2a82SHisping Lin }
6554aa61755SAndy Ye 
6561ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
6571ef63c75SHisping Lin {
6581ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
6591ef63c75SHisping Lin 						  true, buf, length);
6601ef63c75SHisping Lin }
6611ef63c75SHisping Lin 
66210f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value)
66310f41197SHisping Lin {
66410f41197SHisping Lin 	TEEC_Result TeecResult;
66510f41197SHisping Lin 	TEEC_Context TeecContext;
66610f41197SHisping Lin 	TEEC_Session TeecSession;
66710f41197SHisping Lin 	uint32_t ErrorOrigin;
66810f41197SHisping Lin 
66910f41197SHisping Lin 	*value = 0;
67010f41197SHisping Lin 
67110f41197SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
67210f41197SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
67310f41197SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
67410f41197SHisping Lin 	TEEC_Operation TeecOperation = {0};
67510f41197SHisping Lin 
67610f41197SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
67710f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
67810f41197SHisping Lin 		return TeecResult;
67910f41197SHisping Lin 
68010f41197SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
68110f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
68210f41197SHisping Lin 		return TeecResult;
68310f41197SHisping Lin 
68410f41197SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
68510f41197SHisping Lin 				&TeecSession,
68610f41197SHisping Lin 				TeecUuid,
68710f41197SHisping Lin 				TEEC_LOGIN_PUBLIC,
68810f41197SHisping Lin 				NULL,
68910f41197SHisping Lin 				NULL,
69010f41197SHisping Lin 				&ErrorOrigin);
69110f41197SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
69210f41197SHisping Lin 		return TeecResult;
69310f41197SHisping Lin 
69410f41197SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
69510f41197SHisping Lin 						    TEEC_NONE,
69610f41197SHisping Lin 						    TEEC_NONE,
69710f41197SHisping Lin 						    TEEC_NONE);
69810f41197SHisping Lin 
69910f41197SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
70010f41197SHisping Lin 					STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN,
70110f41197SHisping Lin 					&TeecOperation,
70210f41197SHisping Lin 					&ErrorOrigin);
70310f41197SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
70410f41197SHisping Lin 		*value = TeecOperation.params[0].value.a;
70510f41197SHisping Lin 
70610f41197SHisping Lin 	TEEC_CloseSession(&TeecSession);
70710f41197SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
70810f41197SHisping Lin 
70910f41197SHisping Lin 	return TeecResult;
71010f41197SHisping Lin }
71110f41197SHisping Lin 
7121ac64e8aSHisping Lin uint32_t trusty_write_oem_encrypt_data(uint32_t *buf, uint32_t length)
7131ac64e8aSHisping Lin {
7141ac64e8aSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA,
7151ac64e8aSHisping Lin 						  true, buf, length);
7161ac64e8aSHisping Lin }
7171ac64e8aSHisping Lin 
718fc383442SHisping Lin uint32_t trusty_oem_encrypt_data_is_written(uint8_t *value)
719fc383442SHisping Lin {
720fc383442SHisping Lin 	TEEC_Result TeecResult;
721fc383442SHisping Lin 	TEEC_Context TeecContext;
722fc383442SHisping Lin 	TEEC_Session TeecSession;
723fc383442SHisping Lin 	uint32_t ErrorOrigin;
724fc383442SHisping Lin 
725fc383442SHisping Lin 	*value = 0;
726fc383442SHisping Lin 
727fc383442SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
728fc383442SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
729fc383442SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
730fc383442SHisping Lin 	TEEC_Operation TeecOperation = {0};
731fc383442SHisping Lin 
732fc383442SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
733fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
734fc383442SHisping Lin 		return TeecResult;
735fc383442SHisping Lin 
736fc383442SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
737fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
738fc383442SHisping Lin 		return TeecResult;
739fc383442SHisping Lin 
740fc383442SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
741fc383442SHisping Lin 				&TeecSession,
742fc383442SHisping Lin 				TeecUuid,
743fc383442SHisping Lin 				TEEC_LOGIN_PUBLIC,
744fc383442SHisping Lin 				NULL,
745fc383442SHisping Lin 				NULL,
746fc383442SHisping Lin 				&ErrorOrigin);
747fc383442SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
748fc383442SHisping Lin 		return TeecResult;
749fc383442SHisping Lin 
750fc383442SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
751fc383442SHisping Lin 						    TEEC_NONE,
752fc383442SHisping Lin 						    TEEC_NONE,
753fc383442SHisping Lin 						    TEEC_NONE);
754fc383442SHisping Lin 
755fc383442SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
756fc383442SHisping Lin 					STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN,
757fc383442SHisping Lin 					&TeecOperation,
758fc383442SHisping Lin 					&ErrorOrigin);
759fc383442SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
760fc383442SHisping Lin 		*value = TeecOperation.params[0].value.a;
761fc383442SHisping Lin 
762fc383442SHisping Lin 	TEEC_CloseSession(&TeecSession);
763fc383442SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
764fc383442SHisping Lin 
765fc383442SHisping Lin 	return TeecResult;
766fc383442SHisping Lin }
767fc383442SHisping Lin 
768fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
769fbf29bfbSHisping Lin {
770fbf29bfbSHisping Lin 	uint32_t levelflag;
771fbf29bfbSHisping Lin 
772fbf29bfbSHisping Lin 	levelflag = flag;
773fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
774fbf29bfbSHisping Lin 						  true, &levelflag, 1);
775fbf29bfbSHisping Lin }
776fbf29bfbSHisping Lin 
777f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
778f39d4289SHisping Lin {
779f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
780f39d4289SHisping Lin 						  true, buf, length);
781f39d4289SHisping Lin }
782f39d4289SHisping Lin 
78334f2e8f6SHisping Lin static void trusty_select_security_level(void)
7847504da74SHisping Lin {
785*b2858095SHisping Lin #ifdef CONFIG_OPTEE_SECURITY_LEVEL
7867504da74SHisping Lin 	TEEC_Result TeecResult;
7877504da74SHisping Lin 
7887504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
7897504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
7907504da74SHisping Lin 		run_command("download", 0);
7917504da74SHisping Lin 		return;
7927504da74SHisping Lin 	}
7937504da74SHisping Lin 
7947504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
7957504da74SHisping Lin 		debug("optee select security level success!");
796*b2858095SHisping Lin 	else if (TeecResult == TEEC_ERROR_NOT_SUPPORTED)
797*b2858095SHisping Lin 		debug("optee not support security level!");
7987504da74SHisping Lin 	else
7997504da74SHisping Lin 		panic("optee select security level fail!");
8007504da74SHisping Lin 
8017504da74SHisping Lin 	return;
8027504da74SHisping Lin #endif
8037504da74SHisping Lin }
8047504da74SHisping Lin 
80551ac7005SHisping Lin void optee_client_init(void)
80651ac7005SHisping Lin {
80751ac7005SHisping Lin 	trusty_select_security_level();
80834f2e8f6SHisping Lin 	trusty_notify_always_use_security();
80951ac7005SHisping Lin }
81051ac7005SHisping Lin 
811d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
812d5913350SHisping Lin {
813d5913350SHisping Lin 	TEEC_Result TeecResult;
814d5913350SHisping Lin 	TEEC_Context TeecContext;
815d5913350SHisping Lin 	TEEC_Session TeecSession;
816d5913350SHisping Lin 	uint32_t ErrorOrigin;
817d5913350SHisping Lin 
818d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
819d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
820d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
821d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
822d5913350SHisping Lin 
823d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
824d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
825d5913350SHisping Lin 		return TeecResult;
826d5913350SHisping Lin 
827d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
828d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
829d5913350SHisping Lin 		return TeecResult;
830d5913350SHisping Lin 
831d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
832d5913350SHisping Lin 				&TeecSession,
833d5913350SHisping Lin 				TeecUuid,
834d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
835d5913350SHisping Lin 				NULL,
836d5913350SHisping Lin 				NULL,
837d5913350SHisping Lin 				&ErrorOrigin);
838d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
839d5913350SHisping Lin 		return TeecResult;
840d5913350SHisping Lin 
841d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
842d5913350SHisping Lin 
843d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
844d5913350SHisping Lin 
845d5913350SHisping Lin 	SharedMem.size = byte_len;
846d5913350SHisping Lin 	SharedMem.flags = 0;
847d5913350SHisping Lin 
848d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
849d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
850d5913350SHisping Lin 		goto exit;
851d5913350SHisping Lin 
852d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
853d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
854d5913350SHisping Lin 
855d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
856d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
857d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
858d5913350SHisping Lin 						    TEEC_NONE,
859d5913350SHisping Lin 						    TEEC_NONE);
860d5913350SHisping Lin 
861d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
862d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
863d5913350SHisping Lin 					&TeecOperation,
864d5913350SHisping Lin 					&ErrorOrigin);
865d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
866d5913350SHisping Lin 		goto exit;
867d5913350SHisping Lin 
868d5913350SHisping Lin exit:
869d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
870d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
871d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
872d5913350SHisping Lin 
873d5913350SHisping Lin 	return TeecResult;
874d5913350SHisping Lin }
875d5913350SHisping Lin 
876d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
877d5913350SHisping Lin {
878d5913350SHisping Lin 	TEEC_Result TeecResult;
879d5913350SHisping Lin 	TEEC_Context TeecContext;
880d5913350SHisping Lin 	TEEC_Session TeecSession;
881d5913350SHisping Lin 	uint32_t ErrorOrigin;
882d5913350SHisping Lin 
883d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
884d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
885d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
886d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
887d5913350SHisping Lin 
888d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
889d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
890d5913350SHisping Lin 		return TeecResult;
891d5913350SHisping Lin 
892d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
893d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
894d5913350SHisping Lin 		return TeecResult;
895d5913350SHisping Lin 
896d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
897d5913350SHisping Lin 				&TeecSession,
898d5913350SHisping Lin 				TeecUuid,
899d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
900d5913350SHisping Lin 				NULL,
901d5913350SHisping Lin 				NULL,
902d5913350SHisping Lin 				&ErrorOrigin);
903d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
904d5913350SHisping Lin 		return TeecResult;
905d5913350SHisping Lin 
906d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
907d5913350SHisping Lin 
908d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
909d5913350SHisping Lin 
910d5913350SHisping Lin 	SharedMem.size = byte_len;
911d5913350SHisping Lin 	SharedMem.flags = 0;
912d5913350SHisping Lin 
913d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
914d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
915d5913350SHisping Lin 		goto exit;
916d5913350SHisping Lin 
917d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
918d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
919d5913350SHisping Lin 
920d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
921d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
922d5913350SHisping Lin 						    TEEC_NONE,
923d5913350SHisping Lin 						    TEEC_NONE);
924d5913350SHisping Lin 
925d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
926d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
927d5913350SHisping Lin 					&TeecOperation,
928d5913350SHisping Lin 					&ErrorOrigin);
929d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
930d5913350SHisping Lin 		goto exit;
931d5913350SHisping Lin 
932d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
933d5913350SHisping Lin 
934d5913350SHisping Lin exit:
935d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
936d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
937d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
938d5913350SHisping Lin 
939d5913350SHisping Lin 	return TeecResult;
940d5913350SHisping Lin }
941d5913350SHisping Lin 
94290e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id,
943bb1ba6acSHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
944bb1ba6acSHisping Lin {
945bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
946bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
947bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
948bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
949bb1ba6acSHisping Lin 
950bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
951bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
952bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
953bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
954bb1ba6acSHisping Lin 
955bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
956bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
957bb1ba6acSHisping Lin 		return TeecResult;
958bb1ba6acSHisping Lin 
959bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
960bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
961bb1ba6acSHisping Lin 		return TeecResult;
962bb1ba6acSHisping Lin 
963bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
964bb1ba6acSHisping Lin 				&TeecSession,
965bb1ba6acSHisping Lin 				TeecUuid,
966bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
967bb1ba6acSHisping Lin 				NULL,
968bb1ba6acSHisping Lin 				NULL,
969bb1ba6acSHisping Lin 				&ErrorOrigin);
970bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
971bb1ba6acSHisping Lin 		return TeecResult;
972bb1ba6acSHisping Lin 
973bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
974bb1ba6acSHisping Lin 
975bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
976bb1ba6acSHisping Lin 
977bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
978bb1ba6acSHisping Lin 	SharedMem.flags = 0;
979bb1ba6acSHisping Lin 
980bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
981bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
982bb1ba6acSHisping Lin 		goto exit;
983bb1ba6acSHisping Lin 
984bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
985bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
986bb1ba6acSHisping Lin 
987bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
988bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
989bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
990bb1ba6acSHisping Lin 						    TEEC_NONE,
991bb1ba6acSHisping Lin 						    TEEC_NONE);
992bb1ba6acSHisping Lin 
993bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
99490e849a0Sxb.wang 					STORAGE_CMD_WRITE_OEM_OTP_KEY,
995bb1ba6acSHisping Lin 					&TeecOperation,
996bb1ba6acSHisping Lin 					&ErrorOrigin);
997bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
998bb1ba6acSHisping Lin 		goto exit;
999bb1ba6acSHisping Lin 
1000bb1ba6acSHisping Lin exit:
1001bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1002bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
1003bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1004bb1ba6acSHisping Lin 
1005bb1ba6acSHisping Lin 	return TeecResult;
1006bb1ba6acSHisping Lin }
1007bb1ba6acSHisping Lin 
10089deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value)
10099deb34f6SHisping Lin {
10109deb34f6SHisping Lin 	TEEC_Result TeecResult;
10119deb34f6SHisping Lin 	TEEC_Context TeecContext;
10129deb34f6SHisping Lin 	TEEC_Session TeecSession;
10139deb34f6SHisping Lin 	uint32_t ErrorOrigin;
10149deb34f6SHisping Lin 
10159deb34f6SHisping Lin 	*value = 0xFF;
10169deb34f6SHisping Lin 
10179deb34f6SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
10189deb34f6SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
10199deb34f6SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
10209deb34f6SHisping Lin 	TEEC_Operation TeecOperation = {0};
10219deb34f6SHisping Lin 
10229deb34f6SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
10239deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10249deb34f6SHisping Lin 		return TeecResult;
10259deb34f6SHisping Lin 
10269deb34f6SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
10279deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10289deb34f6SHisping Lin 		return TeecResult;
10299deb34f6SHisping Lin 
10309deb34f6SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
10319deb34f6SHisping Lin 				&TeecSession,
10329deb34f6SHisping Lin 				TeecUuid,
10339deb34f6SHisping Lin 				TEEC_LOGIN_PUBLIC,
10349deb34f6SHisping Lin 				NULL,
10359deb34f6SHisping Lin 				NULL,
10369deb34f6SHisping Lin 				&ErrorOrigin);
10379deb34f6SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
10389deb34f6SHisping Lin 		return TeecResult;
10399deb34f6SHisping Lin 
10409deb34f6SHisping Lin 	TeecOperation.params[0].value.a = key_id;
10419deb34f6SHisping Lin 
10429deb34f6SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
10439deb34f6SHisping Lin 						    TEEC_NONE,
10449deb34f6SHisping Lin 						    TEEC_NONE,
10459deb34f6SHisping Lin 						    TEEC_NONE);
10469deb34f6SHisping Lin 
10479deb34f6SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10489deb34f6SHisping Lin 					STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN,
10499deb34f6SHisping Lin 					&TeecOperation,
10509deb34f6SHisping Lin 					&ErrorOrigin);
10519deb34f6SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
10529deb34f6SHisping Lin 		*value = TeecOperation.params[0].value.b;
10539deb34f6SHisping Lin 
10549deb34f6SHisping Lin 	TEEC_CloseSession(&TeecSession);
10559deb34f6SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10569deb34f6SHisping Lin 
10579deb34f6SHisping Lin 	return TeecResult;
10589deb34f6SHisping Lin }
10599deb34f6SHisping Lin 
106090e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id)
1061a405238aSHisping Lin {
1062a405238aSHisping Lin 	TEEC_Result TeecResult;
1063a405238aSHisping Lin 	TEEC_Context TeecContext;
1064a405238aSHisping Lin 	TEEC_Session TeecSession;
1065a405238aSHisping Lin 	uint32_t ErrorOrigin;
1066a405238aSHisping Lin 
1067a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1068a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1069a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1070a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
1071a405238aSHisping Lin 
1072a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1073a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1074a405238aSHisping Lin 		return TeecResult;
1075a405238aSHisping Lin 
1076a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1077a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1078a405238aSHisping Lin 		return TeecResult;
1079a405238aSHisping Lin 
1080a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1081a405238aSHisping Lin 				&TeecSession,
1082a405238aSHisping Lin 				TeecUuid,
1083a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
1084a405238aSHisping Lin 				NULL,
1085a405238aSHisping Lin 				NULL,
1086a405238aSHisping Lin 				&ErrorOrigin);
1087a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1088a405238aSHisping Lin 		return TeecResult;
1089a405238aSHisping Lin 
1090a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
1091a405238aSHisping Lin 
1092a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1093a405238aSHisping Lin 						    TEEC_NONE,
1094a405238aSHisping Lin 						    TEEC_NONE,
1095a405238aSHisping Lin 						    TEEC_NONE);
1096a405238aSHisping Lin 
1097a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1098a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
1099a405238aSHisping Lin 					&TeecOperation,
1100a405238aSHisping Lin 					&ErrorOrigin);
1101a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1102a405238aSHisping Lin 		goto exit;
1103a405238aSHisping Lin 
1104a405238aSHisping Lin exit:
1105a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
1106a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1107a405238aSHisping Lin 
1108a405238aSHisping Lin 	return TeecResult;
1109a405238aSHisping Lin }
1110a405238aSHisping Lin 
11112f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config,
11122f8c34bdSxb.wang 				   uint32_t src_phys_addr, uint32_t dst_phys_addr,
11132f8c34bdSxb.wang 				   uint32_t len)
1114fc3694d6Sxb.wang {
1115fc3694d6Sxb.wang 	TEEC_Result TeecResult;
1116fc3694d6Sxb.wang 	TEEC_Context TeecContext;
1117fc3694d6Sxb.wang 	TEEC_Session TeecSession;
1118fc3694d6Sxb.wang 	TEEC_Operation TeecOperation = {0};
1119fc3694d6Sxb.wang 	uint32_t ErrorOrigin;
1120fc3694d6Sxb.wang 	TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID;
1121fc3694d6Sxb.wang 	TEEC_SharedMemory SharedMem_config = {0};
1122fc3694d6Sxb.wang 
11232f8c34bdSxb.wang 	if (key_id != RK_OEM_OTP_KEY0 &&
11242f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY1 &&
11252f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY2 &&
11262f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY3 &&
11272f8c34bdSxb.wang 	    key_id != RK_OEM_OTP_KEY_FW)
1128fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1129fc3694d6Sxb.wang 
11302f8c34bdSxb.wang 	if (!config)
1131fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1132fc3694d6Sxb.wang 
1133fc3694d6Sxb.wang 	if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4)
1134fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1135fc3694d6Sxb.wang 
1136fc3694d6Sxb.wang 	if (config->mode >= RK_CIPHER_MODE_XTS)
1137fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1138fc3694d6Sxb.wang 
1139fc3694d6Sxb.wang 	if (config->operation != RK_MODE_ENCRYPT &&
1140fc3694d6Sxb.wang 	    config->operation != RK_MODE_DECRYPT)
1141fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1142fc3694d6Sxb.wang 
1143fc3694d6Sxb.wang 	if (config->key_len != 16 &&
1144fc3694d6Sxb.wang 	    config->key_len != 24 &&
1145fc3694d6Sxb.wang 	    config->key_len != 32)
1146fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1147fc3694d6Sxb.wang 
11482f8c34bdSxb.wang 	if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16)
11492f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11502f8c34bdSxb.wang 
11512f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126)
11522f8c34bdSxb.wang 	if (config->key_len == 24)
11532f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11542f8c34bdSxb.wang #endif
11552f8c34bdSxb.wang 
1156fc3694d6Sxb.wang 	if (len % AES_BLOCK_SIZE ||
1157fc3694d6Sxb.wang 	    len == 0)
1158fc3694d6Sxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
1159fc3694d6Sxb.wang 
11602f8c34bdSxb.wang 	if (!src_phys_addr || !dst_phys_addr)
11612f8c34bdSxb.wang 		return TEEC_ERROR_BAD_PARAMETERS;
11622f8c34bdSxb.wang 
1163fc3694d6Sxb.wang 	TeecResult = OpteeClientApiLibInitialize();
1164fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1165fc3694d6Sxb.wang 		return TeecResult;
1166fc3694d6Sxb.wang 
1167fc3694d6Sxb.wang 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1168fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1169fc3694d6Sxb.wang 		return TeecResult;
1170fc3694d6Sxb.wang 
1171fc3694d6Sxb.wang 	TeecResult = TEEC_OpenSession(&TeecContext,
1172fc3694d6Sxb.wang 				      &TeecSession,
1173fc3694d6Sxb.wang 				      &uuid,
1174fc3694d6Sxb.wang 				      TEEC_LOGIN_PUBLIC,
1175fc3694d6Sxb.wang 				      NULL,
1176fc3694d6Sxb.wang 				      NULL,
1177fc3694d6Sxb.wang 				      &ErrorOrigin);
1178fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1179fc3694d6Sxb.wang 		goto exit;
1180fc3694d6Sxb.wang 
1181fc3694d6Sxb.wang 	SharedMem_config.size = sizeof(rk_cipher_config);
1182fc3694d6Sxb.wang 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config);
1183fc3694d6Sxb.wang 	if (TeecResult != TEEC_SUCCESS)
1184fc3694d6Sxb.wang 		goto exit;
1185fc3694d6Sxb.wang 
1186fc3694d6Sxb.wang 	memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config));
1187fc3694d6Sxb.wang 	TeecOperation.params[0].value.a       = key_id;
1188fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer;
1189fc3694d6Sxb.wang 	TeecOperation.params[1].tmpref.size   = SharedMem_config.size;
11902f8c34bdSxb.wang 	TeecOperation.params[2].value.a       = src_phys_addr;
11912f8c34bdSxb.wang 	TeecOperation.params[2].value.b       = len;
11922f8c34bdSxb.wang 	TeecOperation.params[3].value.a       = dst_phys_addr;
1193fc3694d6Sxb.wang 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1194fc3694d6Sxb.wang 						    TEEC_MEMREF_TEMP_INPUT,
11952f8c34bdSxb.wang 						    TEEC_VALUE_INPUT,
11962f8c34bdSxb.wang 						    TEEC_VALUE_INPUT);
11972f8c34bdSxb.wang 
11982f8c34bdSxb.wang 	crypto_flush_cacheline(src_phys_addr, len);
11992f8c34bdSxb.wang 	crypto_flush_cacheline(dst_phys_addr, len);
12002f8c34bdSxb.wang 
1201fc3694d6Sxb.wang 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12022f8c34bdSxb.wang 					CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER,
1203fc3694d6Sxb.wang 					&TeecOperation,
1204fc3694d6Sxb.wang 					&ErrorOrigin);
1205fc3694d6Sxb.wang 
1206a900eef3SHisping Lin 	crypto_invalidate_cacheline(dst_phys_addr, len);
1207a900eef3SHisping Lin 
1208fc3694d6Sxb.wang exit:
1209fc3694d6Sxb.wang 	TEEC_ReleaseSharedMemory(&SharedMem_config);
1210fc3694d6Sxb.wang 	TEEC_CloseSession(&TeecSession);
1211fc3694d6Sxb.wang 	TEEC_FinalizeContext(&TeecContext);
1212fc3694d6Sxb.wang 	return TeecResult;
1213fc3694d6Sxb.wang }
1214fc3694d6Sxb.wang 
1215a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id,
1216a828eba9SHisping Lin 				  uint8_t *byte_buf, uint32_t byte_len)
1217a828eba9SHisping Lin {
1218a828eba9SHisping Lin 	TEEC_Result TeecResult;
1219a828eba9SHisping Lin 	TEEC_Context TeecContext;
1220a828eba9SHisping Lin 	TEEC_Session TeecSession;
1221a828eba9SHisping Lin 	uint32_t ErrorOrigin;
1222a828eba9SHisping Lin 
1223a828eba9SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1224a828eba9SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1225a828eba9SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1226a828eba9SHisping Lin 	TEEC_Operation TeecOperation = {0};
1227a828eba9SHisping Lin 
1228a828eba9SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1229a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1230a828eba9SHisping Lin 		return TeecResult;
1231a828eba9SHisping Lin 
1232a828eba9SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1233a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1234a828eba9SHisping Lin 		return TeecResult;
1235a828eba9SHisping Lin 
1236a828eba9SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1237a828eba9SHisping Lin 				&TeecSession,
1238a828eba9SHisping Lin 				TeecUuid,
1239a828eba9SHisping Lin 				TEEC_LOGIN_PUBLIC,
1240a828eba9SHisping Lin 				NULL,
1241a828eba9SHisping Lin 				NULL,
1242a828eba9SHisping Lin 				&ErrorOrigin);
1243a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1244a828eba9SHisping Lin 		return TeecResult;
1245a828eba9SHisping Lin 
1246a828eba9SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1247a828eba9SHisping Lin 
1248a828eba9SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
1249a828eba9SHisping Lin 
1250a828eba9SHisping Lin 	SharedMem.size = byte_len;
1251a828eba9SHisping Lin 	SharedMem.flags = 0;
1252a828eba9SHisping Lin 
1253a828eba9SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
1254a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1255a828eba9SHisping Lin 		goto exit;
1256a828eba9SHisping Lin 
1257a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
1258a828eba9SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
1259a828eba9SHisping Lin 
1260a828eba9SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
1261a828eba9SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1262a828eba9SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
1263a828eba9SHisping Lin 						    TEEC_NONE,
1264a828eba9SHisping Lin 						    TEEC_NONE);
1265a828eba9SHisping Lin 
1266a828eba9SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1267a828eba9SHisping Lin 					STORAGE_CMD_WRITE_OEM_HDCP_KEY,
1268a828eba9SHisping Lin 					&TeecOperation,
1269a828eba9SHisping Lin 					&ErrorOrigin);
1270a828eba9SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1271a828eba9SHisping Lin 		goto exit;
1272a828eba9SHisping Lin 
1273a828eba9SHisping Lin exit:
1274a828eba9SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
1275a828eba9SHisping Lin 	TEEC_CloseSession(&TeecSession);
1276a828eba9SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1277a828eba9SHisping Lin 
1278a828eba9SHisping Lin 	return TeecResult;
1279a828eba9SHisping Lin }
1280a828eba9SHisping Lin 
1281e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value)
1282e8bc2655SHisping Lin {
1283e8bc2655SHisping Lin 	TEEC_Result TeecResult;
1284e8bc2655SHisping Lin 	TEEC_Context TeecContext;
1285e8bc2655SHisping Lin 	TEEC_Session TeecSession;
1286e8bc2655SHisping Lin 	uint32_t ErrorOrigin;
1287e8bc2655SHisping Lin 
1288e8bc2655SHisping Lin 	*value = 0xFF;
1289e8bc2655SHisping Lin 
1290e8bc2655SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1291e8bc2655SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1292e8bc2655SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1293e8bc2655SHisping Lin 	TEEC_Operation TeecOperation = {0};
1294e8bc2655SHisping Lin 
1295e8bc2655SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1296e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1297e8bc2655SHisping Lin 		return TeecResult;
1298e8bc2655SHisping Lin 
1299e8bc2655SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1300e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1301e8bc2655SHisping Lin 		return TeecResult;
1302e8bc2655SHisping Lin 
1303e8bc2655SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1304e8bc2655SHisping Lin 				&TeecSession,
1305e8bc2655SHisping Lin 				TeecUuid,
1306e8bc2655SHisping Lin 				TEEC_LOGIN_PUBLIC,
1307e8bc2655SHisping Lin 				NULL,
1308e8bc2655SHisping Lin 				NULL,
1309e8bc2655SHisping Lin 				&ErrorOrigin);
1310e8bc2655SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1311e8bc2655SHisping Lin 		return TeecResult;
1312e8bc2655SHisping Lin 
1313e8bc2655SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1314e8bc2655SHisping Lin 
1315e8bc2655SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
1316e8bc2655SHisping Lin 						    TEEC_NONE,
1317e8bc2655SHisping Lin 						    TEEC_NONE,
1318e8bc2655SHisping Lin 						    TEEC_NONE);
1319e8bc2655SHisping Lin 
1320e8bc2655SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1321e8bc2655SHisping Lin 					STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN,
1322e8bc2655SHisping Lin 					&TeecOperation,
1323e8bc2655SHisping Lin 					&ErrorOrigin);
1324e8bc2655SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1325e8bc2655SHisping Lin 		*value = TeecOperation.params[0].value.b;
1326e8bc2655SHisping Lin 
1327e8bc2655SHisping Lin 	TEEC_CloseSession(&TeecSession);
1328e8bc2655SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1329e8bc2655SHisping Lin 
1330e8bc2655SHisping Lin 	return TeecResult;
1331e8bc2655SHisping Lin }
1332e8bc2655SHisping Lin 
1333bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id)
1334bfd9cea4SHisping Lin {
1335bfd9cea4SHisping Lin 	TEEC_Result TeecResult;
1336bfd9cea4SHisping Lin 	TEEC_Context TeecContext;
1337bfd9cea4SHisping Lin 	TEEC_Session TeecSession;
1338bfd9cea4SHisping Lin 	uint32_t ErrorOrigin;
1339bfd9cea4SHisping Lin 
1340bfd9cea4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
1341bfd9cea4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1342bfd9cea4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1343bfd9cea4SHisping Lin 	TEEC_Operation TeecOperation = {0};
1344bfd9cea4SHisping Lin 
1345bfd9cea4SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1346bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1347bfd9cea4SHisping Lin 		return TeecResult;
1348bfd9cea4SHisping Lin 
1349bfd9cea4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1350bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1351bfd9cea4SHisping Lin 		return TeecResult;
1352bfd9cea4SHisping Lin 
1353bfd9cea4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1354bfd9cea4SHisping Lin 				&TeecSession,
1355bfd9cea4SHisping Lin 				TeecUuid,
1356bfd9cea4SHisping Lin 				TEEC_LOGIN_PUBLIC,
1357bfd9cea4SHisping Lin 				NULL,
1358bfd9cea4SHisping Lin 				NULL,
1359bfd9cea4SHisping Lin 				&ErrorOrigin);
1360bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1361bfd9cea4SHisping Lin 		return TeecResult;
1362bfd9cea4SHisping Lin 
1363bfd9cea4SHisping Lin 	TeecOperation.params[0].value.a = key_id;
1364bfd9cea4SHisping Lin 
1365bfd9cea4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1366bfd9cea4SHisping Lin 						    TEEC_NONE,
1367bfd9cea4SHisping Lin 						    TEEC_NONE,
1368bfd9cea4SHisping Lin 						    TEEC_NONE);
1369bfd9cea4SHisping Lin 
1370bfd9cea4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1371bfd9cea4SHisping Lin 					STORAGE_CMD_SET_OEM_HDCP_KEY_MASK,
1372bfd9cea4SHisping Lin 					&TeecOperation,
1373bfd9cea4SHisping Lin 					&ErrorOrigin);
1374bfd9cea4SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1375bfd9cea4SHisping Lin 		goto exit;
1376bfd9cea4SHisping Lin 
1377bfd9cea4SHisping Lin exit:
1378bfd9cea4SHisping Lin 	TEEC_CloseSession(&TeecSession);
1379bfd9cea4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1380bfd9cea4SHisping Lin 
1381bfd9cea4SHisping Lin 	return TeecResult;
1382bfd9cea4SHisping Lin }
1383bfd9cea4SHisping Lin 
13844d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void)
13854d4c5043SHisping Lin {
13864d4c5043SHisping Lin 	TEEC_Result TeecResult;
13874d4c5043SHisping Lin 	TEEC_Context TeecContext;
13884d4c5043SHisping Lin 	TEEC_Session TeecSession;
13894d4c5043SHisping Lin 	uint32_t ErrorOrigin;
13904d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
13914d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
13924d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
13934d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
13944d4c5043SHisping Lin 	const uint8_t transfer_inout[] = "Transfer data test.";
13954d4c5043SHisping Lin 
13964d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
13974d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
13984d4c5043SHisping Lin 		return TeecResult;
13994d4c5043SHisping Lin 
14004d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
14014d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14024d4c5043SHisping Lin 		return TeecResult;
14034d4c5043SHisping Lin 
14044d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
14054d4c5043SHisping Lin 						TEEC_NONE,
14064d4c5043SHisping Lin 						TEEC_NONE,
14074d4c5043SHisping Lin 						TEEC_NONE);
14084d4c5043SHisping Lin 
14094d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
14104d4c5043SHisping Lin 				&TeecSession,
14114d4c5043SHisping Lin 				TeecUuid,
14124d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
14134d4c5043SHisping Lin 				NULL,
14144d4c5043SHisping Lin 				&TeecOperation,
14154d4c5043SHisping Lin 				&ErrorOrigin);
14164d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14174d4c5043SHisping Lin 		return TeecResult;
14184d4c5043SHisping Lin 
14194d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
14204d4c5043SHisping Lin 
14214d4c5043SHisping Lin 	SharedMem0.size = sizeof(transfer_inout);
14224d4c5043SHisping Lin 	SharedMem0.flags = 0;
14234d4c5043SHisping Lin 
14244d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
14254d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14264d4c5043SHisping Lin 		goto exit;
14274d4c5043SHisping Lin 
14284d4c5043SHisping Lin 	memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size);
14294d4c5043SHisping Lin 
14304d4c5043SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
14314d4c5043SHisping Lin 
14324d4c5043SHisping Lin 	SharedMem1.size = sizeof(transfer_inout);
14334d4c5043SHisping Lin 	SharedMem1.flags = 0;
14344d4c5043SHisping Lin 
14354d4c5043SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
14364d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14374d4c5043SHisping Lin 		goto exit;
14384d4c5043SHisping Lin 
14394d4c5043SHisping Lin 	TeecOperation.params[0].value.a = 66;
14404d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer;
14414d4c5043SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem0.size;
14424d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer;
14434d4c5043SHisping Lin 	TeecOperation.params[2].tmpref.size = SharedMem1.size;
14444d4c5043SHisping Lin 
14454d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
14464d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_INPUT,
14474d4c5043SHisping Lin 						TEEC_MEMREF_TEMP_OUTPUT,
14484d4c5043SHisping Lin 						TEEC_NONE);
14494d4c5043SHisping Lin 
14504d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14514d4c5043SHisping Lin 					102,
14524d4c5043SHisping Lin 					&TeecOperation,
14534d4c5043SHisping Lin 					&ErrorOrigin);
14544d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14554d4c5043SHisping Lin 		goto exit;
14564d4c5043SHisping Lin 
14574d4c5043SHisping Lin 	//Check the result
14584d4c5043SHisping Lin 	if (TeecOperation.params[0].value.a == 66 + 1 &&
14594d4c5043SHisping Lin 	    TeecOperation.params[0].value.b == TeecOperation.params[0].value.a)
14604d4c5043SHisping Lin 		printf("test value : Pass!\n");
14614d4c5043SHisping Lin 	else
14624d4c5043SHisping Lin 		printf("test value : Fail! (mismatch values)\n");
14634d4c5043SHisping Lin 
14644d4c5043SHisping Lin 	if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0)
14654d4c5043SHisping Lin 		printf("test buffer : Pass!\n");
14664d4c5043SHisping Lin 	else
14674d4c5043SHisping Lin 		printf("test buffer : Fail! (mismatch buffer)\n");
14684d4c5043SHisping Lin 
14694d4c5043SHisping Lin exit:
14704d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
14714d4c5043SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
14724d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
14734d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
14744d4c5043SHisping Lin 
14754d4c5043SHisping Lin 	return TeecResult;
14764d4c5043SHisping Lin }
14774d4c5043SHisping Lin 
14784d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void)
14794d4c5043SHisping Lin {
14804d4c5043SHisping Lin 	TEEC_Result TeecResult;
14814d4c5043SHisping Lin 	TEEC_Context TeecContext;
14824d4c5043SHisping Lin 	TEEC_Session TeecSession;
14834d4c5043SHisping Lin 	uint32_t ErrorOrigin;
14844d4c5043SHisping Lin 	TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d,
14854d4c5043SHisping Lin 		{ 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} };
14864d4c5043SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
14874d4c5043SHisping Lin 	TEEC_Operation TeecOperation = {0};
14884d4c5043SHisping Lin 
14894d4c5043SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
14904d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14914d4c5043SHisping Lin 		return TeecResult;
14924d4c5043SHisping Lin 
14934d4c5043SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
14944d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
14954d4c5043SHisping Lin 		return TeecResult;
14964d4c5043SHisping Lin 
14974d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
14984d4c5043SHisping Lin 						TEEC_NONE,
14994d4c5043SHisping Lin 						TEEC_NONE,
15004d4c5043SHisping Lin 						TEEC_NONE);
15014d4c5043SHisping Lin 
15024d4c5043SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
15034d4c5043SHisping Lin 				&TeecSession,
15044d4c5043SHisping Lin 				TeecUuid,
15054d4c5043SHisping Lin 				TEEC_LOGIN_PUBLIC,
15064d4c5043SHisping Lin 				NULL,
15074d4c5043SHisping Lin 				&TeecOperation,
15084d4c5043SHisping Lin 				&ErrorOrigin);
15094d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
15104d4c5043SHisping Lin 		return TeecResult;
15114d4c5043SHisping Lin 
15124d4c5043SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
15134d4c5043SHisping Lin 						TEEC_NONE,
15144d4c5043SHisping Lin 						TEEC_NONE,
15154d4c5043SHisping Lin 						TEEC_NONE);
15164d4c5043SHisping Lin 
15174d4c5043SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
15184d4c5043SHisping Lin 					103,
15194d4c5043SHisping Lin 					&TeecOperation,
15204d4c5043SHisping Lin 					&ErrorOrigin);
15214d4c5043SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
15224d4c5043SHisping Lin 		goto exit;
15234d4c5043SHisping Lin 
15244d4c5043SHisping Lin exit:
15254d4c5043SHisping Lin 	TEEC_CloseSession(&TeecSession);
15264d4c5043SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
15274d4c5043SHisping Lin 
15284d4c5043SHisping Lin 	return TeecResult;
15294d4c5043SHisping Lin }
15304d4c5043SHisping Lin 
15314aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
15324aa61755SAndy Ye {
15334aa61755SAndy Ye 	TEEC_Result TeecResult;
15344aa61755SAndy Ye 	TEEC_Context TeecContext;
15354aa61755SAndy Ye 	TEEC_Session TeecSession;
15364aa61755SAndy Ye 	uint32_t ErrorOrigin;
15374aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
15384aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
15394aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
15404aa61755SAndy Ye 				}
15414aa61755SAndy Ye 			     };
15424aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
15434aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
15443251364cSHisping Lin 	struct blk_desc *dev_desc;
15453251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
15466651d4c0SJason Zhu 	if (!dev_desc) {
15476651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
15486651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
15496651d4c0SJason Zhu 	}
15504aa61755SAndy Ye 
1551f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1552f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1553f4e1db95SHisping Lin 		return TeecResult;
15544aa61755SAndy Ye 
15554aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1556f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1557f4e1db95SHisping Lin 		return TeecResult;
15584aa61755SAndy Ye 
15593251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
15603251364cSHisping Lin 						TEEC_NONE,
15613251364cSHisping Lin 						TEEC_NONE,
15623251364cSHisping Lin 						TEEC_NONE);
15633251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1564b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1565b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1566b9a7e756SHisping Lin 	else
1567b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1568b9a7e756SHisping Lin 
15693251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
15703251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
15713251364cSHisping Lin #endif
15723251364cSHisping Lin 
15734aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
15744aa61755SAndy Ye 				      &TeecSession,
15754aa61755SAndy Ye 				      TeecUuid,
15764aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
15774aa61755SAndy Ye 				      NULL,
15783251364cSHisping Lin 					&TeecOperation,
15794aa61755SAndy Ye 				      &ErrorOrigin);
1580f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1581f4e1db95SHisping Lin 		return TeecResult;
15824aa61755SAndy Ye 
15834aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
15844aa61755SAndy Ye 
15854aa61755SAndy Ye 	SharedMem0.size = *dh_size;
15864aa61755SAndy Ye 	SharedMem0.flags = 0;
15874aa61755SAndy Ye 
15884aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1589f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1590f4e1db95SHisping Lin 		goto exit;
15914aa61755SAndy Ye 
15924aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
15934aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
15944aa61755SAndy Ye 
15954aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
15964aa61755SAndy Ye 						    TEEC_NONE,
15974aa61755SAndy Ye 						    TEEC_NONE,
15984aa61755SAndy Ye 						    TEEC_NONE);
15994aa61755SAndy Ye 
16004aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16014aa61755SAndy Ye 					143,
16024aa61755SAndy Ye 					&TeecOperation,
16034aa61755SAndy Ye 					&ErrorOrigin);
1604f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1605f4e1db95SHisping Lin 		goto exit;
16064aa61755SAndy Ye 
16074aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
16084aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
1609f4e1db95SHisping Lin exit:
16104aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
16114aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1612f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
16134aa61755SAndy Ye 
16144aa61755SAndy Ye 	return TeecResult;
16154aa61755SAndy Ye }
16164aa61755SAndy Ye 
16174aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
16184aa61755SAndy Ye {
16194aa61755SAndy Ye 	TEEC_Result TeecResult;
16204aa61755SAndy Ye 	TEEC_Context TeecContext;
16214aa61755SAndy Ye 	TEEC_Session TeecSession;
16224aa61755SAndy Ye 	uint32_t ErrorOrigin;
16234aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
16244aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
16254aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
16264aa61755SAndy Ye 				}
16274aa61755SAndy Ye 			     };
16284aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
16294aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
16303251364cSHisping Lin 	struct blk_desc *dev_desc;
16313251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
16326651d4c0SJason Zhu 	if (!dev_desc) {
16336651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
16346651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
16356651d4c0SJason Zhu 	}
16364aa61755SAndy Ye 
1637f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1638f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1639f4e1db95SHisping Lin 		return TeecResult;
16404aa61755SAndy Ye 
16414aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1642f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1643f4e1db95SHisping Lin 		return TeecResult;
16444aa61755SAndy Ye 
16453251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
16463251364cSHisping Lin 						TEEC_NONE,
16473251364cSHisping Lin 						TEEC_NONE,
16483251364cSHisping Lin 						TEEC_NONE);
16493251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1650b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1651b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1652b9a7e756SHisping Lin 	else
1653b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1654b9a7e756SHisping Lin 
16553251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
16563251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
16573251364cSHisping Lin #endif
16583251364cSHisping Lin 
16594aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
16604aa61755SAndy Ye 				      &TeecSession,
16614aa61755SAndy Ye 				      TeecUuid,
16624aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
16634aa61755SAndy Ye 				      NULL,
16643251364cSHisping Lin 					&TeecOperation,
16654aa61755SAndy Ye 				      &ErrorOrigin);
1666f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1667f4e1db95SHisping Lin 		return TeecResult;
16684aa61755SAndy Ye 
16694aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
16704aa61755SAndy Ye 
16714aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
16724aa61755SAndy Ye 	SharedMem0.flags = 0;
16734aa61755SAndy Ye 
16744aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1675f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1676f4e1db95SHisping Lin 		goto exit;
16774aa61755SAndy Ye 
16784aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
16794aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
16804aa61755SAndy Ye 
16814aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
16824aa61755SAndy Ye 						    TEEC_NONE,
16834aa61755SAndy Ye 						    TEEC_NONE,
16844aa61755SAndy Ye 						    TEEC_NONE);
16854aa61755SAndy Ye 
16864aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
16874aa61755SAndy Ye 					144,
16884aa61755SAndy Ye 					&TeecOperation,
16894aa61755SAndy Ye 					&ErrorOrigin);
1690f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1691f4e1db95SHisping Lin 		goto exit;
16924aa61755SAndy Ye 
16934aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
16944aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1695f4e1db95SHisping Lin exit:
16964aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
16974aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1698f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
16994aa61755SAndy Ye 
17004aa61755SAndy Ye 	return TeecResult;
17014aa61755SAndy Ye }
17024aa61755SAndy Ye 
17034aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
17044aa61755SAndy Ye 			      uint32_t *operation_size,
17054aa61755SAndy Ye 			      uint8_t *out,
17064aa61755SAndy Ye 			      uint32_t *out_len)
17074aa61755SAndy Ye {
17084aa61755SAndy Ye 	TEEC_Result TeecResult;
17094aa61755SAndy Ye 	TEEC_Context TeecContext;
17104aa61755SAndy Ye 	TEEC_Session TeecSession;
17114aa61755SAndy Ye 	uint32_t ErrorOrigin;
17124aa61755SAndy Ye 
17134aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
17144aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
17154aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
17164aa61755SAndy Ye 				}
17174aa61755SAndy Ye 			     };
17184aa61755SAndy Ye 
17194aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
17204aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
17213251364cSHisping Lin 	struct blk_desc *dev_desc;
17223251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
17236651d4c0SJason Zhu 	if (!dev_desc) {
17246651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
17256651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
17266651d4c0SJason Zhu 	}
17274aa61755SAndy Ye 
1728f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1729f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1730f4e1db95SHisping Lin 		return TeecResult;
17314aa61755SAndy Ye 
17324aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1733f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1734f4e1db95SHisping Lin 		return TeecResult;
17354aa61755SAndy Ye 
17363251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
17373251364cSHisping Lin 						TEEC_NONE,
17383251364cSHisping Lin 						TEEC_NONE,
17393251364cSHisping Lin 						TEEC_NONE);
17403251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1741b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1742b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1743b9a7e756SHisping Lin 	else
1744b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1745b9a7e756SHisping Lin 
17463251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
17473251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
17483251364cSHisping Lin #endif
17493251364cSHisping Lin 
17504aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
17514aa61755SAndy Ye 				      &TeecSession,
17524aa61755SAndy Ye 				      TeecUuid,
17534aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
17544aa61755SAndy Ye 				      NULL,
17553251364cSHisping Lin 					&TeecOperation,
17564aa61755SAndy Ye 				      &ErrorOrigin);
1757f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1758f4e1db95SHisping Lin 		return TeecResult;
17594aa61755SAndy Ye 
17604aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
17614aa61755SAndy Ye 
17624aa61755SAndy Ye 	SharedMem0.size = *operation_size;
17634aa61755SAndy Ye 	SharedMem0.flags = 0;
17644aa61755SAndy Ye 
17654aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1766f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1767f4e1db95SHisping Lin 		goto exit;
17684aa61755SAndy Ye 
17694aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
17704aa61755SAndy Ye 
17714aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
17724aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
17734aa61755SAndy Ye 
17744aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
17754aa61755SAndy Ye 
17764aa61755SAndy Ye 	SharedMem1.size = *out_len;
17774aa61755SAndy Ye 	SharedMem1.flags = 0;
17784aa61755SAndy Ye 
17794aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1780f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1781f4e1db95SHisping Lin 		goto exit;
17824aa61755SAndy Ye 
17834aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
17844aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
17854aa61755SAndy Ye 
17864aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
17874aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
17884aa61755SAndy Ye 						    TEEC_NONE,
17894aa61755SAndy Ye 						    TEEC_NONE);
17904aa61755SAndy Ye 
17914aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
17924aa61755SAndy Ye 					145,
17934aa61755SAndy Ye 					&TeecOperation,
17944aa61755SAndy Ye 					&ErrorOrigin);
1795f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1796f4e1db95SHisping Lin 		goto exit;
17974aa61755SAndy Ye 
17984aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
17994aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1800f4e1db95SHisping Lin exit:
18014aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18024aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1803f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1804f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18054aa61755SAndy Ye 
18064aa61755SAndy Ye 	return TeecResult;
18074aa61755SAndy Ye }
18084aa61755SAndy Ye 
18094aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
18104aa61755SAndy Ye {
18114aa61755SAndy Ye 	TEEC_Result TeecResult;
18124aa61755SAndy Ye 	TEEC_Context TeecContext;
18134aa61755SAndy Ye 	TEEC_Session TeecSession;
18144aa61755SAndy Ye 	uint32_t ErrorOrigin;
18154aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
18164aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
18174aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
18184aa61755SAndy Ye 				}
18194aa61755SAndy Ye 			     };
18204aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
18214aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
18223251364cSHisping Lin 	struct blk_desc *dev_desc;
18233251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
18246651d4c0SJason Zhu 	if (!dev_desc) {
18256651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
18266651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
18276651d4c0SJason Zhu 	}
1828f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1829f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1830f4e1db95SHisping Lin 		return TeecResult;
18314aa61755SAndy Ye 
18324aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1833f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1834f4e1db95SHisping Lin 		return TeecResult;
18354aa61755SAndy Ye 
18363251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
18373251364cSHisping Lin 						TEEC_NONE,
18383251364cSHisping Lin 						TEEC_NONE,
18393251364cSHisping Lin 						TEEC_NONE);
18403251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1841b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1842b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1843b9a7e756SHisping Lin 	else
1844b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1845b9a7e756SHisping Lin 
18463251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
18473251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
18483251364cSHisping Lin #endif
18493251364cSHisping Lin 
18504aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
18514aa61755SAndy Ye 					&TeecSession,
18524aa61755SAndy Ye 					TeecUuid,
18534aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
18544aa61755SAndy Ye 					NULL,
18553251364cSHisping Lin 					&TeecOperation,
18564aa61755SAndy Ye 					&ErrorOrigin);
1857f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1858f4e1db95SHisping Lin 		return TeecResult;
18594aa61755SAndy Ye 
18604aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
18614aa61755SAndy Ye 
18624aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
18634aa61755SAndy Ye 	SharedMem0.flags = 0;
18644aa61755SAndy Ye 
18654aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1866f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1867f4e1db95SHisping Lin 		goto exit;
18684aa61755SAndy Ye 
18694aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
18704aa61755SAndy Ye 
18714aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
18724aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
18734aa61755SAndy Ye 
18744aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
18754aa61755SAndy Ye 						    TEEC_NONE,
18764aa61755SAndy Ye 						    TEEC_NONE,
18774aa61755SAndy Ye 						    TEEC_NONE);
18784aa61755SAndy Ye 
18794aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
18804aa61755SAndy Ye 					146,
18814aa61755SAndy Ye 					&TeecOperation,
18824aa61755SAndy Ye 					&ErrorOrigin);
1883f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1884f4e1db95SHisping Lin 		goto exit;
1885f4e1db95SHisping Lin exit:
18864aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
18874aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1888f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
18894aa61755SAndy Ye 
18904aa61755SAndy Ye 	return TeecResult;
18914aa61755SAndy Ye }
1892