xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision a405238ad6f00ec10405425d87a7b18bae43afad)
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
30*a405238aSHisping 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 
544c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
545c7de5349SHisping Lin 							false, &bootflag, 1);
546468df3b2SHisping Lin 
547468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
5480202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
5490202ee8aSHisping Lin 		if (bootflag == 0x00000001)
5500202ee8aSHisping Lin 			*flag = 1;
5510202ee8aSHisping Lin #else
552468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
553468df3b2SHisping Lin 			*flag = 1;
5540202ee8aSHisping Lin #endif
555468df3b2SHisping Lin 	}
556095e2a82SHisping Lin 	return TeecResult;
557095e2a82SHisping Lin }
5584aa61755SAndy Ye 
5591ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
5601ef63c75SHisping Lin {
5611ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
5621ef63c75SHisping Lin 						  true, buf, length);
5631ef63c75SHisping Lin }
5641ef63c75SHisping Lin 
565fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
566fbf29bfbSHisping Lin {
567fbf29bfbSHisping Lin 	uint32_t levelflag;
568fbf29bfbSHisping Lin 
569fbf29bfbSHisping Lin 	levelflag = flag;
570fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
571fbf29bfbSHisping Lin 						  true, &levelflag, 1);
572fbf29bfbSHisping Lin }
573fbf29bfbSHisping Lin 
574f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
575f39d4289SHisping Lin {
576f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
577f39d4289SHisping Lin 						  true, buf, length);
578f39d4289SHisping Lin }
579f39d4289SHisping Lin 
5807504da74SHisping Lin void trusty_select_security_level(void)
5817504da74SHisping Lin {
5827504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
5837504da74SHisping Lin 	TEEC_Result TeecResult;
5847504da74SHisping Lin 
5857504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
5867504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
5877504da74SHisping Lin 		run_command("download", 0);
5887504da74SHisping Lin 		return;
5897504da74SHisping Lin 	}
5907504da74SHisping Lin 
5917504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
5927504da74SHisping Lin 		debug("optee select security level success!");
5937504da74SHisping Lin 	else
5947504da74SHisping Lin 		panic("optee select security level fail!");
5957504da74SHisping Lin 
5967504da74SHisping Lin 	return;
5977504da74SHisping Lin #endif
5987504da74SHisping Lin }
5997504da74SHisping Lin 
600d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
601d5913350SHisping Lin {
602d5913350SHisping Lin 	TEEC_Result TeecResult;
603d5913350SHisping Lin 	TEEC_Context TeecContext;
604d5913350SHisping Lin 	TEEC_Session TeecSession;
605d5913350SHisping Lin 	uint32_t ErrorOrigin;
606d5913350SHisping Lin 
607d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
608d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
609d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
610d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
611d5913350SHisping Lin 
612d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
613d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
614d5913350SHisping Lin 		return TeecResult;
615d5913350SHisping Lin 
616d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
617d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
618d5913350SHisping Lin 		return TeecResult;
619d5913350SHisping Lin 
620d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
621d5913350SHisping Lin 				&TeecSession,
622d5913350SHisping Lin 				TeecUuid,
623d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
624d5913350SHisping Lin 				NULL,
625d5913350SHisping Lin 				NULL,
626d5913350SHisping Lin 				&ErrorOrigin);
627d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
628d5913350SHisping Lin 		return TeecResult;
629d5913350SHisping Lin 
630d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
631d5913350SHisping Lin 
632d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
633d5913350SHisping Lin 
634d5913350SHisping Lin 	SharedMem.size = byte_len;
635d5913350SHisping Lin 	SharedMem.flags = 0;
636d5913350SHisping Lin 
637d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
638d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
639d5913350SHisping Lin 		goto exit;
640d5913350SHisping Lin 
641d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
642d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
643d5913350SHisping Lin 
644d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
645d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
646d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
647d5913350SHisping Lin 						    TEEC_NONE,
648d5913350SHisping Lin 						    TEEC_NONE);
649d5913350SHisping Lin 
650d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
651d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
652d5913350SHisping Lin 					&TeecOperation,
653d5913350SHisping Lin 					&ErrorOrigin);
654d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
655d5913350SHisping Lin 		goto exit;
656d5913350SHisping Lin 
657d5913350SHisping Lin exit:
658d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
659d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
660d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
661d5913350SHisping Lin 
662d5913350SHisping Lin 	return TeecResult;
663d5913350SHisping Lin }
664d5913350SHisping Lin 
665d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
666d5913350SHisping Lin {
667d5913350SHisping Lin 	TEEC_Result TeecResult;
668d5913350SHisping Lin 	TEEC_Context TeecContext;
669d5913350SHisping Lin 	TEEC_Session TeecSession;
670d5913350SHisping Lin 	uint32_t ErrorOrigin;
671d5913350SHisping Lin 
672d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
673d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
674d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
675d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
676d5913350SHisping Lin 
677d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
678d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
679d5913350SHisping Lin 		return TeecResult;
680d5913350SHisping Lin 
681d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
682d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
683d5913350SHisping Lin 		return TeecResult;
684d5913350SHisping Lin 
685d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
686d5913350SHisping Lin 				&TeecSession,
687d5913350SHisping Lin 				TeecUuid,
688d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
689d5913350SHisping Lin 				NULL,
690d5913350SHisping Lin 				NULL,
691d5913350SHisping Lin 				&ErrorOrigin);
692d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
693d5913350SHisping Lin 		return TeecResult;
694d5913350SHisping Lin 
695d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
696d5913350SHisping Lin 
697d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
698d5913350SHisping Lin 
699d5913350SHisping Lin 	SharedMem.size = byte_len;
700d5913350SHisping Lin 	SharedMem.flags = 0;
701d5913350SHisping Lin 
702d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
703d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
704d5913350SHisping Lin 		goto exit;
705d5913350SHisping Lin 
706d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
707d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
708d5913350SHisping Lin 
709d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
710d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
711d5913350SHisping Lin 						    TEEC_NONE,
712d5913350SHisping Lin 						    TEEC_NONE);
713d5913350SHisping Lin 
714d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
715d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
716d5913350SHisping Lin 					&TeecOperation,
717d5913350SHisping Lin 					&ErrorOrigin);
718d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
719d5913350SHisping Lin 		goto exit;
720d5913350SHisping Lin 
721d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
722d5913350SHisping Lin 
723d5913350SHisping Lin exit:
724d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
725d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
726d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
727d5913350SHisping Lin 
728d5913350SHisping Lin 	return TeecResult;
729d5913350SHisping Lin }
730d5913350SHisping Lin 
731bb1ba6acSHisping Lin uint32_t trusty_write_oem_hr_otp(enum RK_OEM_HR_OTP_KEYID key_id,
732bb1ba6acSHisping Lin 				 uint8_t *byte_buf, uint32_t byte_len)
733bb1ba6acSHisping Lin {
734bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
735bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
736bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
737bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
738bb1ba6acSHisping Lin 
739bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
740bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
741bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
742bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
743bb1ba6acSHisping Lin 
744bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
745bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
746bb1ba6acSHisping Lin 		return TeecResult;
747bb1ba6acSHisping Lin 
748bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
749bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
750bb1ba6acSHisping Lin 		return TeecResult;
751bb1ba6acSHisping Lin 
752bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
753bb1ba6acSHisping Lin 				&TeecSession,
754bb1ba6acSHisping Lin 				TeecUuid,
755bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
756bb1ba6acSHisping Lin 				NULL,
757bb1ba6acSHisping Lin 				NULL,
758bb1ba6acSHisping Lin 				&ErrorOrigin);
759bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
760bb1ba6acSHisping Lin 		return TeecResult;
761bb1ba6acSHisping Lin 
762bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
763bb1ba6acSHisping Lin 
764bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
765bb1ba6acSHisping Lin 
766bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
767bb1ba6acSHisping Lin 	SharedMem.flags = 0;
768bb1ba6acSHisping Lin 
769bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
770bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
771bb1ba6acSHisping Lin 		goto exit;
772bb1ba6acSHisping Lin 
773bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
774bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
775bb1ba6acSHisping Lin 
776bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
777bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
778bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
779bb1ba6acSHisping Lin 						    TEEC_NONE,
780bb1ba6acSHisping Lin 						    TEEC_NONE);
781bb1ba6acSHisping Lin 
782bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
783bb1ba6acSHisping Lin 					STORAGE_CMD_WRITE_OEM_HR_OTP,
784bb1ba6acSHisping Lin 					&TeecOperation,
785bb1ba6acSHisping Lin 					&ErrorOrigin);
786bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
787bb1ba6acSHisping Lin 		goto exit;
788bb1ba6acSHisping Lin 
789bb1ba6acSHisping Lin exit:
790bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
791bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
792bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
793bb1ba6acSHisping Lin 
794bb1ba6acSHisping Lin 	return TeecResult;
795bb1ba6acSHisping Lin }
796bb1ba6acSHisping Lin 
797*a405238aSHisping Lin uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_HR_OTP_KEYID key_id)
798*a405238aSHisping Lin {
799*a405238aSHisping Lin 	TEEC_Result TeecResult;
800*a405238aSHisping Lin 	TEEC_Context TeecContext;
801*a405238aSHisping Lin 	TEEC_Session TeecSession;
802*a405238aSHisping Lin 	uint32_t ErrorOrigin;
803*a405238aSHisping Lin 
804*a405238aSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
805*a405238aSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
806*a405238aSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
807*a405238aSHisping Lin 	TEEC_Operation TeecOperation = {0};
808*a405238aSHisping Lin 
809*a405238aSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
810*a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
811*a405238aSHisping Lin 		return TeecResult;
812*a405238aSHisping Lin 
813*a405238aSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
814*a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
815*a405238aSHisping Lin 		return TeecResult;
816*a405238aSHisping Lin 
817*a405238aSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
818*a405238aSHisping Lin 				&TeecSession,
819*a405238aSHisping Lin 				TeecUuid,
820*a405238aSHisping Lin 				TEEC_LOGIN_PUBLIC,
821*a405238aSHisping Lin 				NULL,
822*a405238aSHisping Lin 				NULL,
823*a405238aSHisping Lin 				&ErrorOrigin);
824*a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
825*a405238aSHisping Lin 		return TeecResult;
826*a405238aSHisping Lin 
827*a405238aSHisping Lin 	TeecOperation.params[0].value.a = key_id;
828*a405238aSHisping Lin 
829*a405238aSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
830*a405238aSHisping Lin 						    TEEC_NONE,
831*a405238aSHisping Lin 						    TEEC_NONE,
832*a405238aSHisping Lin 						    TEEC_NONE);
833*a405238aSHisping Lin 
834*a405238aSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
835*a405238aSHisping Lin 					STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK,
836*a405238aSHisping Lin 					&TeecOperation,
837*a405238aSHisping Lin 					&ErrorOrigin);
838*a405238aSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
839*a405238aSHisping Lin 		goto exit;
840*a405238aSHisping Lin 
841*a405238aSHisping Lin exit:
842*a405238aSHisping Lin 	TEEC_CloseSession(&TeecSession);
843*a405238aSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
844*a405238aSHisping Lin 
845*a405238aSHisping Lin 	return TeecResult;
846*a405238aSHisping Lin }
847*a405238aSHisping Lin 
8484aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
8494aa61755SAndy Ye {
8504aa61755SAndy Ye 	TEEC_Result TeecResult;
8514aa61755SAndy Ye 	TEEC_Context TeecContext;
8524aa61755SAndy Ye 	TEEC_Session TeecSession;
8534aa61755SAndy Ye 	uint32_t ErrorOrigin;
8544aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
8554aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
8564aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
8574aa61755SAndy Ye 				}
8584aa61755SAndy Ye 			     };
8594aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
8604aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
8613251364cSHisping Lin 	struct blk_desc *dev_desc;
8623251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8636651d4c0SJason Zhu 	if (!dev_desc) {
8646651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8656651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8666651d4c0SJason Zhu 	}
8674aa61755SAndy Ye 
868f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
869f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
870f4e1db95SHisping Lin 		return TeecResult;
8714aa61755SAndy Ye 
8724aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
873f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
874f4e1db95SHisping Lin 		return TeecResult;
8754aa61755SAndy Ye 
8763251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8773251364cSHisping Lin 						TEEC_NONE,
8783251364cSHisping Lin 						TEEC_NONE,
8793251364cSHisping Lin 						TEEC_NONE);
8803251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
881b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
882b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
883b9a7e756SHisping Lin 	else
884b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
885b9a7e756SHisping Lin 
8863251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8873251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8883251364cSHisping Lin #endif
8893251364cSHisping Lin 
8904aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
8914aa61755SAndy Ye 				      &TeecSession,
8924aa61755SAndy Ye 				      TeecUuid,
8934aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
8944aa61755SAndy Ye 				      NULL,
8953251364cSHisping Lin 					&TeecOperation,
8964aa61755SAndy Ye 				      &ErrorOrigin);
897f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
898f4e1db95SHisping Lin 		return TeecResult;
8994aa61755SAndy Ye 
9004aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
9014aa61755SAndy Ye 
9024aa61755SAndy Ye 	SharedMem0.size = *dh_size;
9034aa61755SAndy Ye 	SharedMem0.flags = 0;
9044aa61755SAndy Ye 
9054aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
906f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
907f4e1db95SHisping Lin 		goto exit;
9084aa61755SAndy Ye 
9094aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9104aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9114aa61755SAndy Ye 
9124aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
9134aa61755SAndy Ye 						    TEEC_NONE,
9144aa61755SAndy Ye 						    TEEC_NONE,
9154aa61755SAndy Ye 						    TEEC_NONE);
9164aa61755SAndy Ye 
9174aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9184aa61755SAndy Ye 					143,
9194aa61755SAndy Ye 					&TeecOperation,
9204aa61755SAndy Ye 					&ErrorOrigin);
921f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
922f4e1db95SHisping Lin 		goto exit;
9234aa61755SAndy Ye 
9244aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
9254aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
926f4e1db95SHisping Lin exit:
9274aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
9284aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
929f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9304aa61755SAndy Ye 
9314aa61755SAndy Ye 	return TeecResult;
9324aa61755SAndy Ye }
9334aa61755SAndy Ye 
9344aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
9354aa61755SAndy Ye {
9364aa61755SAndy Ye 	TEEC_Result TeecResult;
9374aa61755SAndy Ye 	TEEC_Context TeecContext;
9384aa61755SAndy Ye 	TEEC_Session TeecSession;
9394aa61755SAndy Ye 	uint32_t ErrorOrigin;
9404aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
9414aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
9424aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
9434aa61755SAndy Ye 				}
9444aa61755SAndy Ye 			     };
9454aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
9464aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
9473251364cSHisping Lin 	struct blk_desc *dev_desc;
9483251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
9496651d4c0SJason Zhu 	if (!dev_desc) {
9506651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
9516651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
9526651d4c0SJason Zhu 	}
9534aa61755SAndy Ye 
954f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
955f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
956f4e1db95SHisping Lin 		return TeecResult;
9574aa61755SAndy Ye 
9584aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
959f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
960f4e1db95SHisping Lin 		return TeecResult;
9614aa61755SAndy Ye 
9623251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9633251364cSHisping Lin 						TEEC_NONE,
9643251364cSHisping Lin 						TEEC_NONE,
9653251364cSHisping Lin 						TEEC_NONE);
9663251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
967b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
968b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
969b9a7e756SHisping Lin 	else
970b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
971b9a7e756SHisping Lin 
9723251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9733251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9743251364cSHisping Lin #endif
9753251364cSHisping Lin 
9764aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
9774aa61755SAndy Ye 				      &TeecSession,
9784aa61755SAndy Ye 				      TeecUuid,
9794aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
9804aa61755SAndy Ye 				      NULL,
9813251364cSHisping Lin 					&TeecOperation,
9824aa61755SAndy Ye 				      &ErrorOrigin);
983f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
984f4e1db95SHisping Lin 		return TeecResult;
9854aa61755SAndy Ye 
9864aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
9874aa61755SAndy Ye 
9884aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
9894aa61755SAndy Ye 	SharedMem0.flags = 0;
9904aa61755SAndy Ye 
9914aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
992f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
993f4e1db95SHisping Lin 		goto exit;
9944aa61755SAndy Ye 
9954aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9964aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9974aa61755SAndy Ye 
9984aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
9994aa61755SAndy Ye 						    TEEC_NONE,
10004aa61755SAndy Ye 						    TEEC_NONE,
10014aa61755SAndy Ye 						    TEEC_NONE);
10024aa61755SAndy Ye 
10034aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10044aa61755SAndy Ye 					144,
10054aa61755SAndy Ye 					&TeecOperation,
10064aa61755SAndy Ye 					&ErrorOrigin);
1007f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1008f4e1db95SHisping Lin 		goto exit;
10094aa61755SAndy Ye 
10104aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
10114aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
1012f4e1db95SHisping Lin exit:
10134aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
10144aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1015f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10164aa61755SAndy Ye 
10174aa61755SAndy Ye 	return TeecResult;
10184aa61755SAndy Ye }
10194aa61755SAndy Ye 
10204aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
10214aa61755SAndy Ye 			      uint32_t *operation_size,
10224aa61755SAndy Ye 			      uint8_t *out,
10234aa61755SAndy Ye 			      uint32_t *out_len)
10244aa61755SAndy Ye {
10254aa61755SAndy Ye 	TEEC_Result TeecResult;
10264aa61755SAndy Ye 	TEEC_Context TeecContext;
10274aa61755SAndy Ye 	TEEC_Session TeecSession;
10284aa61755SAndy Ye 	uint32_t ErrorOrigin;
10294aa61755SAndy Ye 
10304aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
10314aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
10324aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
10334aa61755SAndy Ye 				}
10344aa61755SAndy Ye 			     };
10354aa61755SAndy Ye 
10364aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
10374aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
10383251364cSHisping Lin 	struct blk_desc *dev_desc;
10393251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
10406651d4c0SJason Zhu 	if (!dev_desc) {
10416651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
10426651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
10436651d4c0SJason Zhu 	}
10444aa61755SAndy Ye 
1045f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1046f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1047f4e1db95SHisping Lin 		return TeecResult;
10484aa61755SAndy Ye 
10494aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1050f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1051f4e1db95SHisping Lin 		return TeecResult;
10524aa61755SAndy Ye 
10533251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
10543251364cSHisping Lin 						TEEC_NONE,
10553251364cSHisping Lin 						TEEC_NONE,
10563251364cSHisping Lin 						TEEC_NONE);
10573251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1058b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1059b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1060b9a7e756SHisping Lin 	else
1061b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1062b9a7e756SHisping Lin 
10633251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
10643251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
10653251364cSHisping Lin #endif
10663251364cSHisping Lin 
10674aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
10684aa61755SAndy Ye 				      &TeecSession,
10694aa61755SAndy Ye 				      TeecUuid,
10704aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
10714aa61755SAndy Ye 				      NULL,
10723251364cSHisping Lin 					&TeecOperation,
10734aa61755SAndy Ye 				      &ErrorOrigin);
1074f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1075f4e1db95SHisping Lin 		return TeecResult;
10764aa61755SAndy Ye 
10774aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
10784aa61755SAndy Ye 
10794aa61755SAndy Ye 	SharedMem0.size = *operation_size;
10804aa61755SAndy Ye 	SharedMem0.flags = 0;
10814aa61755SAndy Ye 
10824aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1083f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1084f4e1db95SHisping Lin 		goto exit;
10854aa61755SAndy Ye 
10864aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
10874aa61755SAndy Ye 
10884aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10894aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10904aa61755SAndy Ye 
10914aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
10924aa61755SAndy Ye 
10934aa61755SAndy Ye 	SharedMem1.size = *out_len;
10944aa61755SAndy Ye 	SharedMem1.flags = 0;
10954aa61755SAndy Ye 
10964aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1097f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1098f4e1db95SHisping Lin 		goto exit;
10994aa61755SAndy Ye 
11004aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
11014aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
11024aa61755SAndy Ye 
11034aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
11044aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
11054aa61755SAndy Ye 						    TEEC_NONE,
11064aa61755SAndy Ye 						    TEEC_NONE);
11074aa61755SAndy Ye 
11084aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11094aa61755SAndy Ye 					145,
11104aa61755SAndy Ye 					&TeecOperation,
11114aa61755SAndy Ye 					&ErrorOrigin);
1112f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1113f4e1db95SHisping Lin 		goto exit;
11144aa61755SAndy Ye 
11154aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
11164aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1117f4e1db95SHisping Lin exit:
11184aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
11194aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1120f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1121f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11224aa61755SAndy Ye 
11234aa61755SAndy Ye 	return TeecResult;
11244aa61755SAndy Ye }
11254aa61755SAndy Ye 
11264aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
11274aa61755SAndy Ye {
11284aa61755SAndy Ye 	TEEC_Result TeecResult;
11294aa61755SAndy Ye 	TEEC_Context TeecContext;
11304aa61755SAndy Ye 	TEEC_Session TeecSession;
11314aa61755SAndy Ye 	uint32_t ErrorOrigin;
11324aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
11334aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
11344aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
11354aa61755SAndy Ye 				}
11364aa61755SAndy Ye 			     };
11374aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
11384aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
11393251364cSHisping Lin 	struct blk_desc *dev_desc;
11403251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
11416651d4c0SJason Zhu 	if (!dev_desc) {
11426651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
11436651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
11446651d4c0SJason Zhu 	}
1145f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1146f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1147f4e1db95SHisping Lin 		return TeecResult;
11484aa61755SAndy Ye 
11494aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1150f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1151f4e1db95SHisping Lin 		return TeecResult;
11524aa61755SAndy Ye 
11533251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
11543251364cSHisping Lin 						TEEC_NONE,
11553251364cSHisping Lin 						TEEC_NONE,
11563251364cSHisping Lin 						TEEC_NONE);
11573251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1158b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1159b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1160b9a7e756SHisping Lin 	else
1161b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1162b9a7e756SHisping Lin 
11633251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
11643251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
11653251364cSHisping Lin #endif
11663251364cSHisping Lin 
11674aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
11684aa61755SAndy Ye 					&TeecSession,
11694aa61755SAndy Ye 					TeecUuid,
11704aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
11714aa61755SAndy Ye 					NULL,
11723251364cSHisping Lin 					&TeecOperation,
11734aa61755SAndy Ye 					&ErrorOrigin);
1174f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1175f4e1db95SHisping Lin 		return TeecResult;
11764aa61755SAndy Ye 
11774aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
11784aa61755SAndy Ye 
11794aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
11804aa61755SAndy Ye 	SharedMem0.flags = 0;
11814aa61755SAndy Ye 
11824aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1183f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1184f4e1db95SHisping Lin 		goto exit;
11854aa61755SAndy Ye 
11864aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
11874aa61755SAndy Ye 
11884aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11894aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11904aa61755SAndy Ye 
11914aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
11924aa61755SAndy Ye 						    TEEC_NONE,
11934aa61755SAndy Ye 						    TEEC_NONE,
11944aa61755SAndy Ye 						    TEEC_NONE);
11954aa61755SAndy Ye 
11964aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11974aa61755SAndy Ye 					146,
11984aa61755SAndy Ye 					&TeecOperation,
11994aa61755SAndy Ye 					&ErrorOrigin);
1200f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1201f4e1db95SHisping Lin 		goto exit;
1202f4e1db95SHisping Lin exit:
12034aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
12044aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1205f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
12064aa61755SAndy Ye 
12074aa61755SAndy Ye 	return TeecResult;
12084aa61755SAndy Ye }
1209