xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision f07e1686b88062b32d38b5b1b7bfd4685ae29a67)
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
29bb1ba6acSHisping Lin #define STORAGE_CMD_WRITE_OEM_HR_OTP		14
30a405238aSHisping Lin #define STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK	15
31ae8ec5e1SHisping Lin 
32ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
33ae8ec5e1SHisping Lin {
34ae8ec5e1SHisping Lin 	if (in > 9)
35ae8ec5e1SHisping Lin 		return in + 55;
36ae8ec5e1SHisping Lin 	else
37ae8ec5e1SHisping Lin 		return in + 48;
38ae8ec5e1SHisping Lin }
39ae8ec5e1SHisping Lin 
40c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
41ae8ec5e1SHisping Lin {
42ae8ec5e1SHisping Lin 	uint32_t i = 0;
43ae8ec5e1SHisping Lin 
44ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
45ae8ec5e1SHisping Lin 		return 0;
46ae8ec5e1SHisping Lin 
47ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
48ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
49ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
50ae8ec5e1SHisping Lin 	}
51ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
52ae8ec5e1SHisping Lin 
53ae8ec5e1SHisping Lin 	return blen * 2;
54ae8ec5e1SHisping Lin }
55ae8ec5e1SHisping Lin 
56c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
57c7de5349SHisping Lin 						uint32_t filename_size,
58c7de5349SHisping Lin 						uint8_t *data,
59c7de5349SHisping Lin 						uint32_t data_size)
60ae8ec5e1SHisping Lin {
61ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
62ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
63ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
64ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
65ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
66ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
67ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
68ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
693251364cSHisping Lin 	struct blk_desc *dev_desc;
703251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
716651d4c0SJason Zhu 	if (!dev_desc) {
726651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
736651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
746651d4c0SJason Zhu 	}
753251364cSHisping Lin 
76f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
77f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
78f4e1db95SHisping Lin 		return TeecResult;
79ae8ec5e1SHisping Lin 
80ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
81f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
82f4e1db95SHisping Lin 		return TeecResult;
83ae8ec5e1SHisping Lin 
843251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
853251364cSHisping Lin 						    TEEC_NONE,
863251364cSHisping Lin 						    TEEC_NONE,
873251364cSHisping Lin 						    TEEC_NONE);
883251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
89b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
90b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
91b9a7e756SHisping Lin 	else
92b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
933251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
943251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
953251364cSHisping Lin #endif
963251364cSHisping Lin 
97ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
98ae8ec5e1SHisping Lin 				&TeecSession,
99ae8ec5e1SHisping Lin 				TeecUuid,
100ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
101ae8ec5e1SHisping Lin 				NULL,
1023251364cSHisping Lin 				&TeecOperation,
103ae8ec5e1SHisping Lin 				&ErrorOrigin);
104f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
105f4e1db95SHisping Lin 		return TeecResult;
106ae8ec5e1SHisping Lin 
107ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
108ae8ec5e1SHisping Lin 
109c7de5349SHisping Lin 	SharedMem0.size = filename_size;
110ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
111ae8ec5e1SHisping Lin 
112ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
113f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
114f4e1db95SHisping Lin 		goto exit;
115ae8ec5e1SHisping Lin 
116c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
117ae8ec5e1SHisping Lin 
118ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
119ae8ec5e1SHisping Lin 
120c7de5349SHisping Lin 	SharedMem1.size = data_size;
121c7de5349SHisping Lin 	SharedMem1.flags = 0;
122c7de5349SHisping Lin 
123c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
124c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
125c7de5349SHisping Lin 		goto exit;
126c7de5349SHisping Lin 
127c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
128c7de5349SHisping Lin 
129c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
130c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
131c7de5349SHisping Lin 
132c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
133c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
134c7de5349SHisping Lin 
135c7de5349SHisping Lin 
136c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
137c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
138c7de5349SHisping Lin 						TEEC_NONE,
139c7de5349SHisping Lin 						TEEC_NONE);
140c7de5349SHisping Lin 
141c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
142c7de5349SHisping Lin 					1,
143c7de5349SHisping Lin 					&TeecOperation,
144c7de5349SHisping Lin 					&ErrorOrigin);
145c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
146c7de5349SHisping Lin 		goto exit;
147c7de5349SHisping Lin exit:
148c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
149c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
150c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
151c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
152c7de5349SHisping Lin 
153c7de5349SHisping Lin 	return TeecResult;
154c7de5349SHisping Lin }
155c7de5349SHisping Lin 
156c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
157c7de5349SHisping Lin 					       uint32_t filename_size,
158c7de5349SHisping Lin 					       uint8_t *data,
159c7de5349SHisping Lin 					       uint32_t data_size)
160c7de5349SHisping Lin {
161c7de5349SHisping Lin 	TEEC_Result TeecResult;
162c7de5349SHisping Lin 	TEEC_Context TeecContext;
163c7de5349SHisping Lin 	TEEC_Session TeecSession;
164c7de5349SHisping Lin 	uint32_t ErrorOrigin;
165c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
166c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
167c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
168c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
169c7de5349SHisping Lin 
170c7de5349SHisping Lin 	struct blk_desc *dev_desc;
171c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
172c7de5349SHisping Lin 	if (!dev_desc) {
173c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
174c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
175c7de5349SHisping Lin 	}
176c7de5349SHisping Lin 
177c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
178c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
179c7de5349SHisping Lin 		return TeecResult;
180c7de5349SHisping Lin 
181c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
182c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
183c7de5349SHisping Lin 		return TeecResult;
184c7de5349SHisping Lin 
185c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
186c7de5349SHisping Lin 						TEEC_NONE,
187c7de5349SHisping Lin 						TEEC_NONE,
188c7de5349SHisping Lin 						TEEC_NONE);
189c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
190c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
191c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
192c7de5349SHisping Lin 	else
193c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
194c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
195c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
196c7de5349SHisping Lin #endif
197c7de5349SHisping Lin 
198c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
199c7de5349SHisping Lin 				&TeecSession,
200c7de5349SHisping Lin 				TeecUuid,
201c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
202c7de5349SHisping Lin 				NULL,
203c7de5349SHisping Lin 				&TeecOperation,
204c7de5349SHisping Lin 				&ErrorOrigin);
205c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
206c7de5349SHisping Lin 		return TeecResult;
207c7de5349SHisping Lin 
208c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
209c7de5349SHisping Lin 
210c7de5349SHisping Lin 	SharedMem0.size = filename_size;
211c7de5349SHisping Lin 	SharedMem0.flags = 0;
212c7de5349SHisping Lin 
213c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
214c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
215c7de5349SHisping Lin 		goto exit;
216c7de5349SHisping Lin 
217c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
218c7de5349SHisping Lin 
219c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
220c7de5349SHisping Lin 
221c7de5349SHisping Lin 	SharedMem1.size = data_size;
222ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
223ae8ec5e1SHisping Lin 
224ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
225f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
226f4e1db95SHisping Lin 		goto exit;
227ae8ec5e1SHisping Lin 
228ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
229ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
230ae8ec5e1SHisping Lin 
231ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
232ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
233ae8ec5e1SHisping Lin 
234ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
235ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
236ae8ec5e1SHisping Lin 						TEEC_NONE,
237ae8ec5e1SHisping Lin 						TEEC_NONE);
238ae8ec5e1SHisping Lin 
239ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
240ae8ec5e1SHisping Lin 					0,
241ae8ec5e1SHisping Lin 					&TeecOperation,
242ae8ec5e1SHisping Lin 					&ErrorOrigin);
24346b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
244c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
245f4e1db95SHisping Lin exit:
246ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
247ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
248ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
24946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
250ae8ec5e1SHisping Lin 
251ae8ec5e1SHisping Lin 	return TeecResult;
252ae8ec5e1SHisping Lin }
253ae8ec5e1SHisping Lin 
254c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
255c7de5349SHisping Lin {
256c7de5349SHisping Lin 	TEEC_Result TeecResult;
257c7de5349SHisping Lin 	TEEC_Context TeecContext;
258c7de5349SHisping Lin 	TEEC_Session TeecSession;
259c7de5349SHisping Lin 	uint32_t ErrorOrigin;
260c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
261c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
262c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
263c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
264c7de5349SHisping Lin 
265c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
266c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
267c7de5349SHisping Lin 		return TeecResult;
268c7de5349SHisping Lin 
269c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
270c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
271c7de5349SHisping Lin 		return TeecResult;
272c7de5349SHisping Lin 
273c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
274c7de5349SHisping Lin 				&TeecSession,
275c7de5349SHisping Lin 				TeecUuid,
276c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
277c7de5349SHisping Lin 				NULL,
278c7de5349SHisping Lin 				NULL,
279c7de5349SHisping Lin 				&ErrorOrigin);
280c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
281c7de5349SHisping Lin 		return TeecResult;
282c7de5349SHisping Lin 
283c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
284c7de5349SHisping Lin 						    TEEC_NONE,
285c7de5349SHisping Lin 						    TEEC_NONE,
286c7de5349SHisping Lin 						    TEEC_NONE);
287c7de5349SHisping Lin 
288c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
289c7de5349SHisping Lin 					2,
290c7de5349SHisping Lin 					&TeecOperation,
291c7de5349SHisping Lin 					&ErrorOrigin);
292c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
293c7de5349SHisping Lin 		goto exit;
294c7de5349SHisping Lin exit:
295c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
296c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
297c7de5349SHisping Lin 
298c7de5349SHisping Lin 	return TeecResult;
299c7de5349SHisping Lin }
300c7de5349SHisping Lin 
301c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
302c7de5349SHisping Lin {
303c7de5349SHisping Lin 	char hs[9];
304c7de5349SHisping Lin 
305c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
306c7de5349SHisping Lin 
307c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
308c7de5349SHisping Lin }
309c7de5349SHisping Lin 
310ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
311ae8ec5e1SHisping Lin {
312c7de5349SHisping Lin 	char hs[9];
3133251364cSHisping Lin 
314c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
315ae8ec5e1SHisping Lin 
316c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
317ae8ec5e1SHisping Lin }
318ae8ec5e1SHisping Lin 
319ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
320ae8ec5e1SHisping Lin {
321c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
322c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
323ae8ec5e1SHisping Lin }
324ae8ec5e1SHisping Lin 
325ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
326ae8ec5e1SHisping Lin {
327c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
328c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
3296651d4c0SJason Zhu }
330ae8ec5e1SHisping Lin 
331c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
332c7de5349SHisping Lin {
333c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
334c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
335c7de5349SHisping Lin }
336ae8ec5e1SHisping Lin 
337c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
338c7de5349SHisping Lin {
339c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
340c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
341ae8ec5e1SHisping Lin }
342ae8ec5e1SHisping Lin 
343564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
344564654ebSJason Zhu 					      uint32_t size)
345564654ebSJason Zhu {
346c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
347c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
348564654ebSJason Zhu }
349564654ebSJason Zhu 
350564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
351564654ebSJason Zhu 					       uint32_t size)
352564654ebSJason Zhu {
353c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
354c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
355564654ebSJason Zhu }
356564654ebSJason Zhu 
357ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
358ae8ec5e1SHisping Lin {
359c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
360c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
361ae8ec5e1SHisping Lin }
362ae8ec5e1SHisping Lin 
363ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
364ae8ec5e1SHisping Lin {
365c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
366c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
367ae8ec5e1SHisping Lin }
368ae8ec5e1SHisping Lin 
369ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
370ae8ec5e1SHisping Lin {
371c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
372c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
373c7de5349SHisping Lin }
374c7de5349SHisping Lin 
375c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
376c7de5349SHisping Lin {
377c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
378c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
379c7de5349SHisping Lin }
380c7de5349SHisping Lin 
381c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
382c7de5349SHisping Lin {
383ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
384ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
385ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
386ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
387c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
388c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
389c7de5349SHisping Lin 
390ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
391ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
392ae8ec5e1SHisping Lin 
393f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
394f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
395f4e1db95SHisping Lin 		return TeecResult;
396ae8ec5e1SHisping Lin 
397ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
398f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
399f4e1db95SHisping Lin 		return TeecResult;
400ae8ec5e1SHisping Lin 
401ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
402ae8ec5e1SHisping Lin 				      &TeecSession,
403ae8ec5e1SHisping Lin 				      TeecUuid,
404ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
405ae8ec5e1SHisping Lin 				      NULL,
406c7de5349SHisping Lin 				      NULL,
407ae8ec5e1SHisping Lin 				      &ErrorOrigin);
408f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
409f4e1db95SHisping Lin 		return TeecResult;
410ae8ec5e1SHisping Lin 
411c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
412c7de5349SHisping Lin 						    TEEC_NONE,
413ae8ec5e1SHisping Lin 						    TEEC_NONE,
414ae8ec5e1SHisping Lin 						    TEEC_NONE);
415ae8ec5e1SHisping Lin 
416ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
417c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
418ae8ec5e1SHisping Lin 					&TeecOperation,
419ae8ec5e1SHisping Lin 					&ErrorOrigin);
420c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
421c7de5349SHisping Lin 		goto exit;
422f4e1db95SHisping Lin exit:
423ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
42446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
425ae8ec5e1SHisping Lin 
426ae8ec5e1SHisping Lin 	return TeecResult;
427ae8ec5e1SHisping Lin }
428ae8ec5e1SHisping Lin 
429c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
430c7de5349SHisping Lin 						   uint8_t is_write,
431c7de5349SHisping Lin 						   uint32_t *buf,
432c7de5349SHisping Lin 						   uint32_t length)
433ae8ec5e1SHisping Lin {
434ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
435ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
436ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
437ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
438c7de5349SHisping Lin 
439c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
440c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
441ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
442ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
443ae8ec5e1SHisping Lin 
444f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
445f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
446f4e1db95SHisping Lin 		return TeecResult;
447ae8ec5e1SHisping Lin 
448ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
449f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
450f4e1db95SHisping Lin 		return TeecResult;
451ae8ec5e1SHisping Lin 
452ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
453ae8ec5e1SHisping Lin 				&TeecSession,
454ae8ec5e1SHisping Lin 				TeecUuid,
455ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
456ae8ec5e1SHisping Lin 				NULL,
457c7de5349SHisping Lin 				NULL,
458ae8ec5e1SHisping Lin 				&ErrorOrigin);
459f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
460f4e1db95SHisping Lin 		return TeecResult;
461ae8ec5e1SHisping Lin 
462ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
463ae8ec5e1SHisping Lin 
464c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
465ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
466ae8ec5e1SHisping Lin 
467ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
468f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
469f4e1db95SHisping Lin 		goto exit;
470ae8ec5e1SHisping Lin 
471ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
472ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
473ae8ec5e1SHisping Lin 
474c7de5349SHisping Lin 	if (is_write) {
475c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
476ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
477c7de5349SHisping Lin 							    TEEC_NONE,
478ae8ec5e1SHisping Lin 							    TEEC_NONE,
479ae8ec5e1SHisping Lin 							    TEEC_NONE);
480ae8ec5e1SHisping Lin 
481c7de5349SHisping Lin 	} else {
482c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
483c7de5349SHisping Lin 							    TEEC_NONE,
484c7de5349SHisping Lin 							    TEEC_NONE,
485c7de5349SHisping Lin 							    TEEC_NONE);
486c7de5349SHisping Lin 	}
487c7de5349SHisping Lin 
488ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
489c7de5349SHisping Lin 					cmd,
490ae8ec5e1SHisping Lin 					&TeecOperation,
491ae8ec5e1SHisping Lin 					&ErrorOrigin);
492f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
493f4e1db95SHisping Lin 		goto exit;
494c7de5349SHisping Lin 
495c7de5349SHisping Lin 	if (!is_write)
496c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
497c7de5349SHisping Lin 
498f4e1db95SHisping Lin exit:
499ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
500ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
50146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
502ae8ec5e1SHisping Lin 
503ae8ec5e1SHisping Lin 	return TeecResult;
504ae8ec5e1SHisping Lin }
505ae8ec5e1SHisping Lin 
5066ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5076ef445a4SHisping Lin {
508c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
509c7de5349SHisping Lin 						  false, buf, length);
5106ef445a4SHisping Lin }
5116ef445a4SHisping Lin 
5126ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5136ef445a4SHisping Lin {
514c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
515c7de5349SHisping Lin 						  true, buf, length);
51616539616SHisping Lin }
51716539616SHisping Lin 
51816539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
51916539616SHisping Lin {
52016539616SHisping Lin 	TEEC_Result res;
521c7de5349SHisping Lin 
522c7de5349SHisping Lin 	res = trusty_base_end_security_data();
523c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
52416539616SHisping Lin 	return res;
52516539616SHisping Lin }
5262cd27853SHisping Lin 
5272cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
5282cd27853SHisping Lin {
529c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
530c7de5349SHisping Lin 						  false, buf, length);
5312cd27853SHisping Lin }
532c7de5349SHisping Lin 
5332cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
5342cd27853SHisping Lin {
535c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
536c7de5349SHisping Lin 						  true, buf, length);
5372cd27853SHisping Lin }
538095e2a82SHisping Lin 
539468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
540468df3b2SHisping Lin {
541468df3b2SHisping Lin 	uint32_t bootflag;
542c7de5349SHisping Lin 	TEEC_Result TeecResult;
543468df3b2SHisping Lin 
544*f07e1686SHisping Lin 	*flag = 0;
545*f07e1686SHisping Lin 
546c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
547c7de5349SHisping Lin 							false, &bootflag, 1);
548468df3b2SHisping Lin 
549468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
5500202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
5510202ee8aSHisping Lin 		if (bootflag == 0x00000001)
5520202ee8aSHisping Lin 			*flag = 1;
5530202ee8aSHisping Lin #else
554468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
555468df3b2SHisping Lin 			*flag = 1;
5560202ee8aSHisping Lin #endif
557468df3b2SHisping Lin 	}
558095e2a82SHisping Lin 	return TeecResult;
559095e2a82SHisping Lin }
5604aa61755SAndy Ye 
5611ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
5621ef63c75SHisping Lin {
5631ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
5641ef63c75SHisping Lin 						  true, buf, length);
5651ef63c75SHisping Lin }
5661ef63c75SHisping Lin 
567fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
568fbf29bfbSHisping Lin {
569fbf29bfbSHisping Lin 	uint32_t levelflag;
570fbf29bfbSHisping Lin 
571fbf29bfbSHisping Lin 	levelflag = flag;
572fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
573fbf29bfbSHisping Lin 						  true, &levelflag, 1);
574fbf29bfbSHisping Lin }
575fbf29bfbSHisping Lin 
576f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
577f39d4289SHisping Lin {
578f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
579f39d4289SHisping Lin 						  true, buf, length);
580f39d4289SHisping Lin }
581f39d4289SHisping Lin 
5827504da74SHisping Lin void trusty_select_security_level(void)
5837504da74SHisping Lin {
5847504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
5857504da74SHisping Lin 	TEEC_Result TeecResult;
5867504da74SHisping Lin 
5877504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
5887504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
5897504da74SHisping Lin 		run_command("download", 0);
5907504da74SHisping Lin 		return;
5917504da74SHisping Lin 	}
5927504da74SHisping Lin 
5937504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
5947504da74SHisping Lin 		debug("optee select security level success!");
5957504da74SHisping Lin 	else
5967504da74SHisping Lin 		panic("optee select security level fail!");
5977504da74SHisping Lin 
5987504da74SHisping Lin 	return;
5997504da74SHisping Lin #endif
6007504da74SHisping Lin }
6017504da74SHisping Lin 
602d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
603d5913350SHisping Lin {
604d5913350SHisping Lin 	TEEC_Result TeecResult;
605d5913350SHisping Lin 	TEEC_Context TeecContext;
606d5913350SHisping Lin 	TEEC_Session TeecSession;
607d5913350SHisping Lin 	uint32_t ErrorOrigin;
608d5913350SHisping Lin 
609d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
610d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
611d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
612d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
613d5913350SHisping Lin 
614d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
615d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
616d5913350SHisping Lin 		return TeecResult;
617d5913350SHisping Lin 
618d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
619d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
620d5913350SHisping Lin 		return TeecResult;
621d5913350SHisping Lin 
622d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
623d5913350SHisping Lin 				&TeecSession,
624d5913350SHisping Lin 				TeecUuid,
625d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
626d5913350SHisping Lin 				NULL,
627d5913350SHisping Lin 				NULL,
628d5913350SHisping Lin 				&ErrorOrigin);
629d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
630d5913350SHisping Lin 		return TeecResult;
631d5913350SHisping Lin 
632d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
633d5913350SHisping Lin 
634d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
635d5913350SHisping Lin 
636d5913350SHisping Lin 	SharedMem.size = byte_len;
637d5913350SHisping Lin 	SharedMem.flags = 0;
638d5913350SHisping Lin 
639d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
640d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
641d5913350SHisping Lin 		goto exit;
642d5913350SHisping Lin 
643d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
644d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
645d5913350SHisping Lin 
646d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
647d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
648d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
649d5913350SHisping Lin 						    TEEC_NONE,
650d5913350SHisping Lin 						    TEEC_NONE);
651d5913350SHisping Lin 
652d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
653d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
654d5913350SHisping Lin 					&TeecOperation,
655d5913350SHisping Lin 					&ErrorOrigin);
656d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
657d5913350SHisping Lin 		goto exit;
658d5913350SHisping Lin 
659d5913350SHisping Lin exit:
660d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
661d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
662d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
663d5913350SHisping Lin 
664d5913350SHisping Lin 	return TeecResult;
665d5913350SHisping Lin }
666d5913350SHisping Lin 
667d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
668d5913350SHisping Lin {
669d5913350SHisping Lin 	TEEC_Result TeecResult;
670d5913350SHisping Lin 	TEEC_Context TeecContext;
671d5913350SHisping Lin 	TEEC_Session TeecSession;
672d5913350SHisping Lin 	uint32_t ErrorOrigin;
673d5913350SHisping Lin 
674d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
675d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
676d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
677d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
678d5913350SHisping Lin 
679d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
680d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
681d5913350SHisping Lin 		return TeecResult;
682d5913350SHisping Lin 
683d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
684d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
685d5913350SHisping Lin 		return TeecResult;
686d5913350SHisping Lin 
687d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
688d5913350SHisping Lin 				&TeecSession,
689d5913350SHisping Lin 				TeecUuid,
690d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
691d5913350SHisping Lin 				NULL,
692d5913350SHisping Lin 				NULL,
693d5913350SHisping Lin 				&ErrorOrigin);
694d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
695d5913350SHisping Lin 		return TeecResult;
696d5913350SHisping Lin 
697d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
698d5913350SHisping Lin 
699d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
700d5913350SHisping Lin 
701d5913350SHisping Lin 	SharedMem.size = byte_len;
702d5913350SHisping Lin 	SharedMem.flags = 0;
703d5913350SHisping Lin 
704d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
705d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
706d5913350SHisping Lin 		goto exit;
707d5913350SHisping Lin 
708d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
709d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
710d5913350SHisping Lin 
711d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
712d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
713d5913350SHisping Lin 						    TEEC_NONE,
714d5913350SHisping Lin 						    TEEC_NONE);
715d5913350SHisping Lin 
716d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
717d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
718d5913350SHisping Lin 					&TeecOperation,
719d5913350SHisping Lin 					&ErrorOrigin);
720d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
721d5913350SHisping Lin 		goto exit;
722d5913350SHisping Lin 
723d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
724d5913350SHisping Lin 
725d5913350SHisping Lin exit:
726d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
727d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
728d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
729d5913350SHisping Lin 
730d5913350SHisping Lin 	return TeecResult;
731d5913350SHisping Lin }
732d5913350SHisping Lin 
733bb1ba6acSHisping Lin uint32_t trusty_write_oem_hr_otp(enum RK_OEM_HR_OTP_KEYID key_id,
734bb1ba6acSHisping Lin 				 uint8_t *byte_buf, uint32_t byte_len)
735bb1ba6acSHisping Lin {
736bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
737bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
738bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
739bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
740bb1ba6acSHisping Lin 
741bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
742bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
743bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
744bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
745bb1ba6acSHisping Lin 
746bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
747bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
748bb1ba6acSHisping Lin 		return TeecResult;
749bb1ba6acSHisping Lin 
750bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
751bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
752bb1ba6acSHisping Lin 		return TeecResult;
753bb1ba6acSHisping Lin 
754bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
755bb1ba6acSHisping Lin 				&TeecSession,
756bb1ba6acSHisping Lin 				TeecUuid,
757bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
758bb1ba6acSHisping Lin 				NULL,
759bb1ba6acSHisping Lin 				NULL,
760bb1ba6acSHisping Lin 				&ErrorOrigin);
761bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
762bb1ba6acSHisping Lin 		return TeecResult;
763bb1ba6acSHisping Lin 
764bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
765bb1ba6acSHisping Lin 
766bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
767bb1ba6acSHisping Lin 
768bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
769bb1ba6acSHisping Lin 	SharedMem.flags = 0;
770bb1ba6acSHisping Lin 
771bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
772bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
773bb1ba6acSHisping Lin 		goto exit;
774bb1ba6acSHisping Lin 
775bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
776bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
777bb1ba6acSHisping Lin 
778bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
779bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
780bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
781bb1ba6acSHisping Lin 						    TEEC_NONE,
782bb1ba6acSHisping Lin 						    TEEC_NONE);
783bb1ba6acSHisping Lin 
784bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
785bb1ba6acSHisping Lin 					STORAGE_CMD_WRITE_OEM_HR_OTP,
786bb1ba6acSHisping Lin 					&TeecOperation,
787bb1ba6acSHisping Lin 					&ErrorOrigin);
788bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
789bb1ba6acSHisping Lin 		goto exit;
790bb1ba6acSHisping Lin 
791bb1ba6acSHisping Lin exit:
792bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
793bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
794bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
795bb1ba6acSHisping Lin 
796bb1ba6acSHisping Lin 	return TeecResult;
797bb1ba6acSHisping Lin }
798bb1ba6acSHisping Lin 
799a405238aSHisping Lin uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_HR_OTP_KEYID key_id)
800a405238aSHisping Lin {
801a405238aSHisping Lin 	TEEC_Result TeecResult;
802a405238aSHisping Lin 	TEEC_Context TeecContext;
803a405238aSHisping Lin 	TEEC_Session TeecSession;
804a405238aSHisping Lin 	uint32_t ErrorOrigin;
805a405238aSHisping Lin 
806a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
807a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
808a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
809a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
810a405238aSHisping Lin 
811a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
812a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
813a405238aSHisping Lin 		return TeecResult;
814a405238aSHisping Lin 
815a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
816a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
817a405238aSHisping Lin 		return TeecResult;
818a405238aSHisping Lin 
819a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
820a405238aSHisping Lin 				&TeecSession,
821a405238aSHisping Lin 				TeecUuid,
822a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
823a405238aSHisping Lin 				NULL,
824a405238aSHisping Lin 				NULL,
825a405238aSHisping Lin 				&ErrorOrigin);
826a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
827a405238aSHisping Lin 		return TeecResult;
828a405238aSHisping Lin 
829a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
830a405238aSHisping Lin 
831a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
832a405238aSHisping Lin 						    TEEC_NONE,
833a405238aSHisping Lin 						    TEEC_NONE,
834a405238aSHisping Lin 						    TEEC_NONE);
835a405238aSHisping Lin 
836a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
837a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
838a405238aSHisping Lin 					&TeecOperation,
839a405238aSHisping Lin 					&ErrorOrigin);
840a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
841a405238aSHisping Lin 		goto exit;
842a405238aSHisping Lin 
843a405238aSHisping Lin exit:
844a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
845a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
846a405238aSHisping Lin 
847a405238aSHisping Lin 	return TeecResult;
848a405238aSHisping Lin }
849a405238aSHisping Lin 
8504aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
8514aa61755SAndy Ye {
8524aa61755SAndy Ye 	TEEC_Result TeecResult;
8534aa61755SAndy Ye 	TEEC_Context TeecContext;
8544aa61755SAndy Ye 	TEEC_Session TeecSession;
8554aa61755SAndy Ye 	uint32_t ErrorOrigin;
8564aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
8574aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
8584aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
8594aa61755SAndy Ye 				}
8604aa61755SAndy Ye 			     };
8614aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
8624aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
8633251364cSHisping Lin 	struct blk_desc *dev_desc;
8643251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8656651d4c0SJason Zhu 	if (!dev_desc) {
8666651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8676651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8686651d4c0SJason Zhu 	}
8694aa61755SAndy Ye 
870f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
871f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
872f4e1db95SHisping Lin 		return TeecResult;
8734aa61755SAndy Ye 
8744aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
875f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
876f4e1db95SHisping Lin 		return TeecResult;
8774aa61755SAndy Ye 
8783251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8793251364cSHisping Lin 						TEEC_NONE,
8803251364cSHisping Lin 						TEEC_NONE,
8813251364cSHisping Lin 						TEEC_NONE);
8823251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
883b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
884b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
885b9a7e756SHisping Lin 	else
886b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
887b9a7e756SHisping Lin 
8883251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8893251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8903251364cSHisping Lin #endif
8913251364cSHisping Lin 
8924aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
8934aa61755SAndy Ye 				      &TeecSession,
8944aa61755SAndy Ye 				      TeecUuid,
8954aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
8964aa61755SAndy Ye 				      NULL,
8973251364cSHisping Lin 					&TeecOperation,
8984aa61755SAndy Ye 				      &ErrorOrigin);
899f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
900f4e1db95SHisping Lin 		return TeecResult;
9014aa61755SAndy Ye 
9024aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
9034aa61755SAndy Ye 
9044aa61755SAndy Ye 	SharedMem0.size = *dh_size;
9054aa61755SAndy Ye 	SharedMem0.flags = 0;
9064aa61755SAndy Ye 
9074aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
908f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
909f4e1db95SHisping Lin 		goto exit;
9104aa61755SAndy Ye 
9114aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9124aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9134aa61755SAndy Ye 
9144aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
9154aa61755SAndy Ye 						    TEEC_NONE,
9164aa61755SAndy Ye 						    TEEC_NONE,
9174aa61755SAndy Ye 						    TEEC_NONE);
9184aa61755SAndy Ye 
9194aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9204aa61755SAndy Ye 					143,
9214aa61755SAndy Ye 					&TeecOperation,
9224aa61755SAndy Ye 					&ErrorOrigin);
923f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
924f4e1db95SHisping Lin 		goto exit;
9254aa61755SAndy Ye 
9264aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
9274aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
928f4e1db95SHisping Lin exit:
9294aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
9304aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
931f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9324aa61755SAndy Ye 
9334aa61755SAndy Ye 	return TeecResult;
9344aa61755SAndy Ye }
9354aa61755SAndy Ye 
9364aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
9374aa61755SAndy Ye {
9384aa61755SAndy Ye 	TEEC_Result TeecResult;
9394aa61755SAndy Ye 	TEEC_Context TeecContext;
9404aa61755SAndy Ye 	TEEC_Session TeecSession;
9414aa61755SAndy Ye 	uint32_t ErrorOrigin;
9424aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
9434aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
9444aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
9454aa61755SAndy Ye 				}
9464aa61755SAndy Ye 			     };
9474aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
9484aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
9493251364cSHisping Lin 	struct blk_desc *dev_desc;
9503251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
9516651d4c0SJason Zhu 	if (!dev_desc) {
9526651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
9536651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
9546651d4c0SJason Zhu 	}
9554aa61755SAndy Ye 
956f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
957f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
958f4e1db95SHisping Lin 		return TeecResult;
9594aa61755SAndy Ye 
9604aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
961f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
962f4e1db95SHisping Lin 		return TeecResult;
9634aa61755SAndy Ye 
9643251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9653251364cSHisping Lin 						TEEC_NONE,
9663251364cSHisping Lin 						TEEC_NONE,
9673251364cSHisping Lin 						TEEC_NONE);
9683251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
969b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
970b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
971b9a7e756SHisping Lin 	else
972b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
973b9a7e756SHisping Lin 
9743251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9753251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9763251364cSHisping Lin #endif
9773251364cSHisping Lin 
9784aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
9794aa61755SAndy Ye 				      &TeecSession,
9804aa61755SAndy Ye 				      TeecUuid,
9814aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
9824aa61755SAndy Ye 				      NULL,
9833251364cSHisping Lin 					&TeecOperation,
9844aa61755SAndy Ye 				      &ErrorOrigin);
985f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
986f4e1db95SHisping Lin 		return TeecResult;
9874aa61755SAndy Ye 
9884aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
9894aa61755SAndy Ye 
9904aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
9914aa61755SAndy Ye 	SharedMem0.flags = 0;
9924aa61755SAndy Ye 
9934aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
994f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
995f4e1db95SHisping Lin 		goto exit;
9964aa61755SAndy Ye 
9974aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9984aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9994aa61755SAndy Ye 
10004aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
10014aa61755SAndy Ye 						    TEEC_NONE,
10024aa61755SAndy Ye 						    TEEC_NONE,
10034aa61755SAndy Ye 						    TEEC_NONE);
10044aa61755SAndy Ye 
10054aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10064aa61755SAndy Ye 					144,
10074aa61755SAndy Ye 					&TeecOperation,
10084aa61755SAndy Ye 					&ErrorOrigin);
1009f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1010f4e1db95SHisping Lin 		goto exit;
10114aa61755SAndy Ye 
10124aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
10134aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1014f4e1db95SHisping Lin exit:
10154aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
10164aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1017f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10184aa61755SAndy Ye 
10194aa61755SAndy Ye 	return TeecResult;
10204aa61755SAndy Ye }
10214aa61755SAndy Ye 
10224aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
10234aa61755SAndy Ye 			      uint32_t *operation_size,
10244aa61755SAndy Ye 			      uint8_t *out,
10254aa61755SAndy Ye 			      uint32_t *out_len)
10264aa61755SAndy Ye {
10274aa61755SAndy Ye 	TEEC_Result TeecResult;
10284aa61755SAndy Ye 	TEEC_Context TeecContext;
10294aa61755SAndy Ye 	TEEC_Session TeecSession;
10304aa61755SAndy Ye 	uint32_t ErrorOrigin;
10314aa61755SAndy Ye 
10324aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
10334aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
10344aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
10354aa61755SAndy Ye 				}
10364aa61755SAndy Ye 			     };
10374aa61755SAndy Ye 
10384aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
10394aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
10403251364cSHisping Lin 	struct blk_desc *dev_desc;
10413251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
10426651d4c0SJason Zhu 	if (!dev_desc) {
10436651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
10446651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
10456651d4c0SJason Zhu 	}
10464aa61755SAndy Ye 
1047f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1048f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1049f4e1db95SHisping Lin 		return TeecResult;
10504aa61755SAndy Ye 
10514aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1052f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1053f4e1db95SHisping Lin 		return TeecResult;
10544aa61755SAndy Ye 
10553251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
10563251364cSHisping Lin 						TEEC_NONE,
10573251364cSHisping Lin 						TEEC_NONE,
10583251364cSHisping Lin 						TEEC_NONE);
10593251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1060b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1061b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1062b9a7e756SHisping Lin 	else
1063b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1064b9a7e756SHisping Lin 
10653251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
10663251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
10673251364cSHisping Lin #endif
10683251364cSHisping Lin 
10694aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
10704aa61755SAndy Ye 				      &TeecSession,
10714aa61755SAndy Ye 				      TeecUuid,
10724aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
10734aa61755SAndy Ye 				      NULL,
10743251364cSHisping Lin 					&TeecOperation,
10754aa61755SAndy Ye 				      &ErrorOrigin);
1076f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1077f4e1db95SHisping Lin 		return TeecResult;
10784aa61755SAndy Ye 
10794aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
10804aa61755SAndy Ye 
10814aa61755SAndy Ye 	SharedMem0.size = *operation_size;
10824aa61755SAndy Ye 	SharedMem0.flags = 0;
10834aa61755SAndy Ye 
10844aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1085f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1086f4e1db95SHisping Lin 		goto exit;
10874aa61755SAndy Ye 
10884aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
10894aa61755SAndy Ye 
10904aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10914aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10924aa61755SAndy Ye 
10934aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
10944aa61755SAndy Ye 
10954aa61755SAndy Ye 	SharedMem1.size = *out_len;
10964aa61755SAndy Ye 	SharedMem1.flags = 0;
10974aa61755SAndy Ye 
10984aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1099f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1100f4e1db95SHisping Lin 		goto exit;
11014aa61755SAndy Ye 
11024aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
11034aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
11044aa61755SAndy Ye 
11054aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
11064aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
11074aa61755SAndy Ye 						    TEEC_NONE,
11084aa61755SAndy Ye 						    TEEC_NONE);
11094aa61755SAndy Ye 
11104aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11114aa61755SAndy Ye 					145,
11124aa61755SAndy Ye 					&TeecOperation,
11134aa61755SAndy Ye 					&ErrorOrigin);
1114f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1115f4e1db95SHisping Lin 		goto exit;
11164aa61755SAndy Ye 
11174aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
11184aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1119f4e1db95SHisping Lin exit:
11204aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
11214aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1122f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1123f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11244aa61755SAndy Ye 
11254aa61755SAndy Ye 	return TeecResult;
11264aa61755SAndy Ye }
11274aa61755SAndy Ye 
11284aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
11294aa61755SAndy Ye {
11304aa61755SAndy Ye 	TEEC_Result TeecResult;
11314aa61755SAndy Ye 	TEEC_Context TeecContext;
11324aa61755SAndy Ye 	TEEC_Session TeecSession;
11334aa61755SAndy Ye 	uint32_t ErrorOrigin;
11344aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
11354aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
11364aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
11374aa61755SAndy Ye 				}
11384aa61755SAndy Ye 			     };
11394aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
11404aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
11413251364cSHisping Lin 	struct blk_desc *dev_desc;
11423251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
11436651d4c0SJason Zhu 	if (!dev_desc) {
11446651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
11456651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
11466651d4c0SJason Zhu 	}
1147f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1148f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1149f4e1db95SHisping Lin 		return TeecResult;
11504aa61755SAndy Ye 
11514aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1152f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1153f4e1db95SHisping Lin 		return TeecResult;
11544aa61755SAndy Ye 
11553251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
11563251364cSHisping Lin 						TEEC_NONE,
11573251364cSHisping Lin 						TEEC_NONE,
11583251364cSHisping Lin 						TEEC_NONE);
11593251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1160b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1161b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1162b9a7e756SHisping Lin 	else
1163b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1164b9a7e756SHisping Lin 
11653251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
11663251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
11673251364cSHisping Lin #endif
11683251364cSHisping Lin 
11694aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
11704aa61755SAndy Ye 					&TeecSession,
11714aa61755SAndy Ye 					TeecUuid,
11724aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
11734aa61755SAndy Ye 					NULL,
11743251364cSHisping Lin 					&TeecOperation,
11754aa61755SAndy Ye 					&ErrorOrigin);
1176f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1177f4e1db95SHisping Lin 		return TeecResult;
11784aa61755SAndy Ye 
11794aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
11804aa61755SAndy Ye 
11814aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
11824aa61755SAndy Ye 	SharedMem0.flags = 0;
11834aa61755SAndy Ye 
11844aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1185f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1186f4e1db95SHisping Lin 		goto exit;
11874aa61755SAndy Ye 
11884aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
11894aa61755SAndy Ye 
11904aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11914aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11924aa61755SAndy Ye 
11934aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
11944aa61755SAndy Ye 						    TEEC_NONE,
11954aa61755SAndy Ye 						    TEEC_NONE,
11964aa61755SAndy Ye 						    TEEC_NONE);
11974aa61755SAndy Ye 
11984aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11994aa61755SAndy Ye 					146,
12004aa61755SAndy Ye 					&TeecOperation,
12014aa61755SAndy Ye 					&ErrorOrigin);
1202f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1203f4e1db95SHisping Lin 		goto exit;
1204f4e1db95SHisping Lin exit:
12054aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
12064aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1207f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12084aa61755SAndy Ye 
12094aa61755SAndy Ye 	return TeecResult;
12104aa61755SAndy Ye }
1211