xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision bb1ba6ac462e714ea2e30271e49073c93771d25f)
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>
9*bb1ba6acSHisping 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
29*bb1ba6acSHisping Lin #define STORAGE_CMD_WRITE_OEM_HR_OTP		14
30ae8ec5e1SHisping Lin 
31ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
32ae8ec5e1SHisping Lin {
33ae8ec5e1SHisping Lin 	if (in > 9)
34ae8ec5e1SHisping Lin 		return in + 55;
35ae8ec5e1SHisping Lin 	else
36ae8ec5e1SHisping Lin 		return in + 48;
37ae8ec5e1SHisping Lin }
38ae8ec5e1SHisping Lin 
39c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
40ae8ec5e1SHisping Lin {
41ae8ec5e1SHisping Lin 	uint32_t i = 0;
42ae8ec5e1SHisping Lin 
43ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
44ae8ec5e1SHisping Lin 		return 0;
45ae8ec5e1SHisping Lin 
46ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
47ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
48ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
49ae8ec5e1SHisping Lin 	}
50ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
51ae8ec5e1SHisping Lin 
52ae8ec5e1SHisping Lin 	return blen * 2;
53ae8ec5e1SHisping Lin }
54ae8ec5e1SHisping Lin 
55c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
56c7de5349SHisping Lin 						uint32_t filename_size,
57c7de5349SHisping Lin 						uint8_t *data,
58c7de5349SHisping Lin 						uint32_t data_size)
59ae8ec5e1SHisping Lin {
60ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
61ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
62ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
63ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
64ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
65ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
66ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
67ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
683251364cSHisping Lin 	struct blk_desc *dev_desc;
693251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
706651d4c0SJason Zhu 	if (!dev_desc) {
716651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
726651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
736651d4c0SJason Zhu 	}
743251364cSHisping Lin 
75f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
76f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
77f4e1db95SHisping Lin 		return TeecResult;
78ae8ec5e1SHisping Lin 
79ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
80f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
81f4e1db95SHisping Lin 		return TeecResult;
82ae8ec5e1SHisping Lin 
833251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
843251364cSHisping Lin 						    TEEC_NONE,
853251364cSHisping Lin 						    TEEC_NONE,
863251364cSHisping Lin 						    TEEC_NONE);
873251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
88b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
89b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
90b9a7e756SHisping Lin 	else
91b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
923251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
933251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
943251364cSHisping Lin #endif
953251364cSHisping Lin 
96ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
97ae8ec5e1SHisping Lin 				&TeecSession,
98ae8ec5e1SHisping Lin 				TeecUuid,
99ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
100ae8ec5e1SHisping Lin 				NULL,
1013251364cSHisping Lin 				&TeecOperation,
102ae8ec5e1SHisping Lin 				&ErrorOrigin);
103f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
104f4e1db95SHisping Lin 		return TeecResult;
105ae8ec5e1SHisping Lin 
106ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
107ae8ec5e1SHisping Lin 
108c7de5349SHisping Lin 	SharedMem0.size = filename_size;
109ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
110ae8ec5e1SHisping Lin 
111ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
112f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
113f4e1db95SHisping Lin 		goto exit;
114ae8ec5e1SHisping Lin 
115c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
116ae8ec5e1SHisping Lin 
117ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
118ae8ec5e1SHisping Lin 
119c7de5349SHisping Lin 	SharedMem1.size = data_size;
120c7de5349SHisping Lin 	SharedMem1.flags = 0;
121c7de5349SHisping Lin 
122c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
123c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
124c7de5349SHisping Lin 		goto exit;
125c7de5349SHisping Lin 
126c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
127c7de5349SHisping Lin 
128c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
129c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
130c7de5349SHisping Lin 
131c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
132c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
133c7de5349SHisping Lin 
134c7de5349SHisping Lin 
135c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
136c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
137c7de5349SHisping Lin 						TEEC_NONE,
138c7de5349SHisping Lin 						TEEC_NONE);
139c7de5349SHisping Lin 
140c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
141c7de5349SHisping Lin 					1,
142c7de5349SHisping Lin 					&TeecOperation,
143c7de5349SHisping Lin 					&ErrorOrigin);
144c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
145c7de5349SHisping Lin 		goto exit;
146c7de5349SHisping Lin exit:
147c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
148c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
149c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
150c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
151c7de5349SHisping Lin 
152c7de5349SHisping Lin 	return TeecResult;
153c7de5349SHisping Lin }
154c7de5349SHisping Lin 
155c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
156c7de5349SHisping Lin 					       uint32_t filename_size,
157c7de5349SHisping Lin 					       uint8_t *data,
158c7de5349SHisping Lin 					       uint32_t data_size)
159c7de5349SHisping Lin {
160c7de5349SHisping Lin 	TEEC_Result TeecResult;
161c7de5349SHisping Lin 	TEEC_Context TeecContext;
162c7de5349SHisping Lin 	TEEC_Session TeecSession;
163c7de5349SHisping Lin 	uint32_t ErrorOrigin;
164c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
165c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
166c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
167c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
168c7de5349SHisping Lin 
169c7de5349SHisping Lin 	struct blk_desc *dev_desc;
170c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
171c7de5349SHisping Lin 	if (!dev_desc) {
172c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
173c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
174c7de5349SHisping Lin 	}
175c7de5349SHisping Lin 
176c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
177c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
178c7de5349SHisping Lin 		return TeecResult;
179c7de5349SHisping Lin 
180c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
181c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
182c7de5349SHisping Lin 		return TeecResult;
183c7de5349SHisping Lin 
184c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
185c7de5349SHisping Lin 						TEEC_NONE,
186c7de5349SHisping Lin 						TEEC_NONE,
187c7de5349SHisping Lin 						TEEC_NONE);
188c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
189c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
190c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
191c7de5349SHisping Lin 	else
192c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
193c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
194c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
195c7de5349SHisping Lin #endif
196c7de5349SHisping Lin 
197c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
198c7de5349SHisping Lin 				&TeecSession,
199c7de5349SHisping Lin 				TeecUuid,
200c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
201c7de5349SHisping Lin 				NULL,
202c7de5349SHisping Lin 				&TeecOperation,
203c7de5349SHisping Lin 				&ErrorOrigin);
204c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
205c7de5349SHisping Lin 		return TeecResult;
206c7de5349SHisping Lin 
207c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
208c7de5349SHisping Lin 
209c7de5349SHisping Lin 	SharedMem0.size = filename_size;
210c7de5349SHisping Lin 	SharedMem0.flags = 0;
211c7de5349SHisping Lin 
212c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
213c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
214c7de5349SHisping Lin 		goto exit;
215c7de5349SHisping Lin 
216c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
217c7de5349SHisping Lin 
218c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
219c7de5349SHisping Lin 
220c7de5349SHisping Lin 	SharedMem1.size = data_size;
221ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
222ae8ec5e1SHisping Lin 
223ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
224f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
225f4e1db95SHisping Lin 		goto exit;
226ae8ec5e1SHisping Lin 
227ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
228ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
229ae8ec5e1SHisping Lin 
230ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
231ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
232ae8ec5e1SHisping Lin 
233ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
234ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
235ae8ec5e1SHisping Lin 						TEEC_NONE,
236ae8ec5e1SHisping Lin 						TEEC_NONE);
237ae8ec5e1SHisping Lin 
238ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
239ae8ec5e1SHisping Lin 					0,
240ae8ec5e1SHisping Lin 					&TeecOperation,
241ae8ec5e1SHisping Lin 					&ErrorOrigin);
24246b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
243c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
244f4e1db95SHisping Lin exit:
245ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
246ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
247ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
24846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
249ae8ec5e1SHisping Lin 
250ae8ec5e1SHisping Lin 	return TeecResult;
251ae8ec5e1SHisping Lin }
252ae8ec5e1SHisping Lin 
253c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
254c7de5349SHisping Lin {
255c7de5349SHisping Lin 	TEEC_Result TeecResult;
256c7de5349SHisping Lin 	TEEC_Context TeecContext;
257c7de5349SHisping Lin 	TEEC_Session TeecSession;
258c7de5349SHisping Lin 	uint32_t ErrorOrigin;
259c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
260c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
261c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
262c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
263c7de5349SHisping Lin 
264c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
265c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
266c7de5349SHisping Lin 		return TeecResult;
267c7de5349SHisping Lin 
268c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
269c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
270c7de5349SHisping Lin 		return TeecResult;
271c7de5349SHisping Lin 
272c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
273c7de5349SHisping Lin 				&TeecSession,
274c7de5349SHisping Lin 				TeecUuid,
275c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
276c7de5349SHisping Lin 				NULL,
277c7de5349SHisping Lin 				NULL,
278c7de5349SHisping Lin 				&ErrorOrigin);
279c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
280c7de5349SHisping Lin 		return TeecResult;
281c7de5349SHisping Lin 
282c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
283c7de5349SHisping Lin 						    TEEC_NONE,
284c7de5349SHisping Lin 						    TEEC_NONE,
285c7de5349SHisping Lin 						    TEEC_NONE);
286c7de5349SHisping Lin 
287c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
288c7de5349SHisping Lin 					2,
289c7de5349SHisping Lin 					&TeecOperation,
290c7de5349SHisping Lin 					&ErrorOrigin);
291c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
292c7de5349SHisping Lin 		goto exit;
293c7de5349SHisping Lin exit:
294c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
295c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
296c7de5349SHisping Lin 
297c7de5349SHisping Lin 	return TeecResult;
298c7de5349SHisping Lin }
299c7de5349SHisping Lin 
300c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
301c7de5349SHisping Lin {
302c7de5349SHisping Lin 	char hs[9];
303c7de5349SHisping Lin 
304c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
305c7de5349SHisping Lin 
306c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
307c7de5349SHisping Lin }
308c7de5349SHisping Lin 
309ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
310ae8ec5e1SHisping Lin {
311c7de5349SHisping Lin 	char hs[9];
3123251364cSHisping Lin 
313c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
314ae8ec5e1SHisping Lin 
315c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
316ae8ec5e1SHisping Lin }
317ae8ec5e1SHisping Lin 
318ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
319ae8ec5e1SHisping Lin {
320c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
321c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
322ae8ec5e1SHisping Lin }
323ae8ec5e1SHisping Lin 
324ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
325ae8ec5e1SHisping Lin {
326c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
327c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
3286651d4c0SJason Zhu }
329ae8ec5e1SHisping Lin 
330c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
331c7de5349SHisping Lin {
332c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
333c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
334c7de5349SHisping Lin }
335ae8ec5e1SHisping Lin 
336c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
337c7de5349SHisping Lin {
338c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
339c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
340ae8ec5e1SHisping Lin }
341ae8ec5e1SHisping Lin 
342564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
343564654ebSJason Zhu 					      uint32_t size)
344564654ebSJason Zhu {
345c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
346c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
347564654ebSJason Zhu }
348564654ebSJason Zhu 
349564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
350564654ebSJason Zhu 					       uint32_t size)
351564654ebSJason Zhu {
352c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
353c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
354564654ebSJason Zhu }
355564654ebSJason Zhu 
356ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
357ae8ec5e1SHisping Lin {
358c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
359c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
360ae8ec5e1SHisping Lin }
361ae8ec5e1SHisping Lin 
362ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
363ae8ec5e1SHisping Lin {
364c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
365c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
366ae8ec5e1SHisping Lin }
367ae8ec5e1SHisping Lin 
368ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
369ae8ec5e1SHisping Lin {
370c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
371c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
372c7de5349SHisping Lin }
373c7de5349SHisping Lin 
374c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
375c7de5349SHisping Lin {
376c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
377c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
378c7de5349SHisping Lin }
379c7de5349SHisping Lin 
380c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
381c7de5349SHisping Lin {
382ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
383ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
384ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
385ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
386c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
387c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
388c7de5349SHisping Lin 
389ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
390ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
391ae8ec5e1SHisping Lin 
392f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
393f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
394f4e1db95SHisping Lin 		return TeecResult;
395ae8ec5e1SHisping Lin 
396ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
397f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
398f4e1db95SHisping Lin 		return TeecResult;
399ae8ec5e1SHisping Lin 
400ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
401ae8ec5e1SHisping Lin 				      &TeecSession,
402ae8ec5e1SHisping Lin 				      TeecUuid,
403ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
404ae8ec5e1SHisping Lin 				      NULL,
405c7de5349SHisping Lin 				      NULL,
406ae8ec5e1SHisping Lin 				      &ErrorOrigin);
407f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
408f4e1db95SHisping Lin 		return TeecResult;
409ae8ec5e1SHisping Lin 
410c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
411c7de5349SHisping Lin 						    TEEC_NONE,
412ae8ec5e1SHisping Lin 						    TEEC_NONE,
413ae8ec5e1SHisping Lin 						    TEEC_NONE);
414ae8ec5e1SHisping Lin 
415ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
416c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
417ae8ec5e1SHisping Lin 					&TeecOperation,
418ae8ec5e1SHisping Lin 					&ErrorOrigin);
419c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
420c7de5349SHisping Lin 		goto exit;
421f4e1db95SHisping Lin exit:
422ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
42346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
424ae8ec5e1SHisping Lin 
425ae8ec5e1SHisping Lin 	return TeecResult;
426ae8ec5e1SHisping Lin }
427ae8ec5e1SHisping Lin 
428c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
429c7de5349SHisping Lin 						   uint8_t is_write,
430c7de5349SHisping Lin 						   uint32_t *buf,
431c7de5349SHisping Lin 						   uint32_t length)
432ae8ec5e1SHisping Lin {
433ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
434ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
435ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
436ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
437c7de5349SHisping Lin 
438c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
439c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
440ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
441ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
442ae8ec5e1SHisping Lin 
443f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
444f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
445f4e1db95SHisping Lin 		return TeecResult;
446ae8ec5e1SHisping Lin 
447ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
448f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
449f4e1db95SHisping Lin 		return TeecResult;
450ae8ec5e1SHisping Lin 
451ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
452ae8ec5e1SHisping Lin 				&TeecSession,
453ae8ec5e1SHisping Lin 				TeecUuid,
454ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
455ae8ec5e1SHisping Lin 				NULL,
456c7de5349SHisping Lin 				NULL,
457ae8ec5e1SHisping Lin 				&ErrorOrigin);
458f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
459f4e1db95SHisping Lin 		return TeecResult;
460ae8ec5e1SHisping Lin 
461ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
462ae8ec5e1SHisping Lin 
463c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
464ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
465ae8ec5e1SHisping Lin 
466ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
467f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
468f4e1db95SHisping Lin 		goto exit;
469ae8ec5e1SHisping Lin 
470ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
471ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
472ae8ec5e1SHisping Lin 
473c7de5349SHisping Lin 	if (is_write) {
474c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
475ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
476c7de5349SHisping Lin 							    TEEC_NONE,
477ae8ec5e1SHisping Lin 							    TEEC_NONE,
478ae8ec5e1SHisping Lin 							    TEEC_NONE);
479ae8ec5e1SHisping Lin 
480c7de5349SHisping Lin 	} else {
481c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
482c7de5349SHisping Lin 							    TEEC_NONE,
483c7de5349SHisping Lin 							    TEEC_NONE,
484c7de5349SHisping Lin 							    TEEC_NONE);
485c7de5349SHisping Lin 	}
486c7de5349SHisping Lin 
487ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
488c7de5349SHisping Lin 					cmd,
489ae8ec5e1SHisping Lin 					&TeecOperation,
490ae8ec5e1SHisping Lin 					&ErrorOrigin);
491f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
492f4e1db95SHisping Lin 		goto exit;
493c7de5349SHisping Lin 
494c7de5349SHisping Lin 	if (!is_write)
495c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
496c7de5349SHisping Lin 
497f4e1db95SHisping Lin exit:
498ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
499ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
50046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
501ae8ec5e1SHisping Lin 
502ae8ec5e1SHisping Lin 	return TeecResult;
503ae8ec5e1SHisping Lin }
504ae8ec5e1SHisping Lin 
5056ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5066ef445a4SHisping Lin {
507c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
508c7de5349SHisping Lin 						  false, buf, length);
5096ef445a4SHisping Lin }
5106ef445a4SHisping Lin 
5116ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5126ef445a4SHisping Lin {
513c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
514c7de5349SHisping Lin 						  true, buf, length);
51516539616SHisping Lin }
51616539616SHisping Lin 
51716539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
51816539616SHisping Lin {
51916539616SHisping Lin 	TEEC_Result res;
520c7de5349SHisping Lin 
521c7de5349SHisping Lin 	res = trusty_base_end_security_data();
522c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
52316539616SHisping Lin 	return res;
52416539616SHisping Lin }
5252cd27853SHisping Lin 
5262cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
5272cd27853SHisping Lin {
528c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
529c7de5349SHisping Lin 						  false, buf, length);
5302cd27853SHisping Lin }
531c7de5349SHisping Lin 
5322cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
5332cd27853SHisping Lin {
534c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
535c7de5349SHisping Lin 						  true, buf, length);
5362cd27853SHisping Lin }
537095e2a82SHisping Lin 
538468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
539468df3b2SHisping Lin {
540468df3b2SHisping Lin 	uint32_t bootflag;
541c7de5349SHisping Lin 	TEEC_Result TeecResult;
542468df3b2SHisping Lin 
543c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
544c7de5349SHisping Lin 							false, &bootflag, 1);
545468df3b2SHisping Lin 
546468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
5470202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
5480202ee8aSHisping Lin 		if (bootflag == 0x00000001)
5490202ee8aSHisping Lin 			*flag = 1;
5500202ee8aSHisping Lin #else
551468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
552468df3b2SHisping Lin 			*flag = 1;
5530202ee8aSHisping Lin #endif
554468df3b2SHisping Lin 	}
555095e2a82SHisping Lin 	return TeecResult;
556095e2a82SHisping Lin }
5574aa61755SAndy Ye 
5581ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
5591ef63c75SHisping Lin {
5601ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
5611ef63c75SHisping Lin 						  true, buf, length);
5621ef63c75SHisping Lin }
5631ef63c75SHisping Lin 
564fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
565fbf29bfbSHisping Lin {
566fbf29bfbSHisping Lin 	uint32_t levelflag;
567fbf29bfbSHisping Lin 
568fbf29bfbSHisping Lin 	levelflag = flag;
569fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
570fbf29bfbSHisping Lin 						  true, &levelflag, 1);
571fbf29bfbSHisping Lin }
572fbf29bfbSHisping Lin 
573f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
574f39d4289SHisping Lin {
575f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
576f39d4289SHisping Lin 						  true, buf, length);
577f39d4289SHisping Lin }
578f39d4289SHisping Lin 
5797504da74SHisping Lin void trusty_select_security_level(void)
5807504da74SHisping Lin {
5817504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
5827504da74SHisping Lin 	TEEC_Result TeecResult;
5837504da74SHisping Lin 
5847504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
5857504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
5867504da74SHisping Lin 		run_command("download", 0);
5877504da74SHisping Lin 		return;
5887504da74SHisping Lin 	}
5897504da74SHisping Lin 
5907504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
5917504da74SHisping Lin 		debug("optee select security level success!");
5927504da74SHisping Lin 	else
5937504da74SHisping Lin 		panic("optee select security level fail!");
5947504da74SHisping Lin 
5957504da74SHisping Lin 	return;
5967504da74SHisping Lin #endif
5977504da74SHisping Lin }
5987504da74SHisping Lin 
599d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
600d5913350SHisping Lin {
601d5913350SHisping Lin 	TEEC_Result TeecResult;
602d5913350SHisping Lin 	TEEC_Context TeecContext;
603d5913350SHisping Lin 	TEEC_Session TeecSession;
604d5913350SHisping Lin 	uint32_t ErrorOrigin;
605d5913350SHisping Lin 
606d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
607d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
608d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
609d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
610d5913350SHisping Lin 
611d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
612d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
613d5913350SHisping Lin 		return TeecResult;
614d5913350SHisping Lin 
615d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
616d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
617d5913350SHisping Lin 		return TeecResult;
618d5913350SHisping Lin 
619d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
620d5913350SHisping Lin 				&TeecSession,
621d5913350SHisping Lin 				TeecUuid,
622d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
623d5913350SHisping Lin 				NULL,
624d5913350SHisping Lin 				NULL,
625d5913350SHisping Lin 				&ErrorOrigin);
626d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
627d5913350SHisping Lin 		return TeecResult;
628d5913350SHisping Lin 
629d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
630d5913350SHisping Lin 
631d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
632d5913350SHisping Lin 
633d5913350SHisping Lin 	SharedMem.size = byte_len;
634d5913350SHisping Lin 	SharedMem.flags = 0;
635d5913350SHisping Lin 
636d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
637d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
638d5913350SHisping Lin 		goto exit;
639d5913350SHisping Lin 
640d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
641d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
642d5913350SHisping Lin 
643d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
644d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
645d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
646d5913350SHisping Lin 						    TEEC_NONE,
647d5913350SHisping Lin 						    TEEC_NONE);
648d5913350SHisping Lin 
649d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
650d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
651d5913350SHisping Lin 					&TeecOperation,
652d5913350SHisping Lin 					&ErrorOrigin);
653d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
654d5913350SHisping Lin 		goto exit;
655d5913350SHisping Lin 
656d5913350SHisping Lin exit:
657d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
658d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
659d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
660d5913350SHisping Lin 
661d5913350SHisping Lin 	return TeecResult;
662d5913350SHisping Lin }
663d5913350SHisping Lin 
664d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
665d5913350SHisping Lin {
666d5913350SHisping Lin 	TEEC_Result TeecResult;
667d5913350SHisping Lin 	TEEC_Context TeecContext;
668d5913350SHisping Lin 	TEEC_Session TeecSession;
669d5913350SHisping Lin 	uint32_t ErrorOrigin;
670d5913350SHisping Lin 
671d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
672d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
673d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
674d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
675d5913350SHisping Lin 
676d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
677d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
678d5913350SHisping Lin 		return TeecResult;
679d5913350SHisping Lin 
680d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
681d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
682d5913350SHisping Lin 		return TeecResult;
683d5913350SHisping Lin 
684d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
685d5913350SHisping Lin 				&TeecSession,
686d5913350SHisping Lin 				TeecUuid,
687d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
688d5913350SHisping Lin 				NULL,
689d5913350SHisping Lin 				NULL,
690d5913350SHisping Lin 				&ErrorOrigin);
691d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
692d5913350SHisping Lin 		return TeecResult;
693d5913350SHisping Lin 
694d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
695d5913350SHisping Lin 
696d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
697d5913350SHisping Lin 
698d5913350SHisping Lin 	SharedMem.size = byte_len;
699d5913350SHisping Lin 	SharedMem.flags = 0;
700d5913350SHisping Lin 
701d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
702d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
703d5913350SHisping Lin 		goto exit;
704d5913350SHisping Lin 
705d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
706d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
707d5913350SHisping Lin 
708d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
709d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
710d5913350SHisping Lin 						    TEEC_NONE,
711d5913350SHisping Lin 						    TEEC_NONE);
712d5913350SHisping Lin 
713d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
714d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
715d5913350SHisping Lin 					&TeecOperation,
716d5913350SHisping Lin 					&ErrorOrigin);
717d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
718d5913350SHisping Lin 		goto exit;
719d5913350SHisping Lin 
720d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
721d5913350SHisping Lin 
722d5913350SHisping Lin exit:
723d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
724d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
725d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
726d5913350SHisping Lin 
727d5913350SHisping Lin 	return TeecResult;
728d5913350SHisping Lin }
729d5913350SHisping Lin 
730*bb1ba6acSHisping Lin uint32_t trusty_write_oem_hr_otp(enum RK_OEM_HR_OTP_KEYID key_id,
731*bb1ba6acSHisping Lin 				 uint8_t *byte_buf, uint32_t byte_len)
732*bb1ba6acSHisping Lin {
733*bb1ba6acSHisping Lin 	TEEC_Result TeecResult;
734*bb1ba6acSHisping Lin 	TEEC_Context TeecContext;
735*bb1ba6acSHisping Lin 	TEEC_Session TeecSession;
736*bb1ba6acSHisping Lin 	uint32_t ErrorOrigin;
737*bb1ba6acSHisping Lin 
738*bb1ba6acSHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
739*bb1ba6acSHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
740*bb1ba6acSHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
741*bb1ba6acSHisping Lin 	TEEC_Operation TeecOperation = {0};
742*bb1ba6acSHisping Lin 
743*bb1ba6acSHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
744*bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
745*bb1ba6acSHisping Lin 		return TeecResult;
746*bb1ba6acSHisping Lin 
747*bb1ba6acSHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
748*bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
749*bb1ba6acSHisping Lin 		return TeecResult;
750*bb1ba6acSHisping Lin 
751*bb1ba6acSHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
752*bb1ba6acSHisping Lin 				&TeecSession,
753*bb1ba6acSHisping Lin 				TeecUuid,
754*bb1ba6acSHisping Lin 				TEEC_LOGIN_PUBLIC,
755*bb1ba6acSHisping Lin 				NULL,
756*bb1ba6acSHisping Lin 				NULL,
757*bb1ba6acSHisping Lin 				&ErrorOrigin);
758*bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
759*bb1ba6acSHisping Lin 		return TeecResult;
760*bb1ba6acSHisping Lin 
761*bb1ba6acSHisping Lin 	TeecOperation.params[0].value.a = key_id;
762*bb1ba6acSHisping Lin 
763*bb1ba6acSHisping Lin 	TEEC_SharedMemory SharedMem = {0};
764*bb1ba6acSHisping Lin 
765*bb1ba6acSHisping Lin 	SharedMem.size = byte_len;
766*bb1ba6acSHisping Lin 	SharedMem.flags = 0;
767*bb1ba6acSHisping Lin 
768*bb1ba6acSHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
769*bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
770*bb1ba6acSHisping Lin 		goto exit;
771*bb1ba6acSHisping Lin 
772*bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
773*bb1ba6acSHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
774*bb1ba6acSHisping Lin 
775*bb1ba6acSHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
776*bb1ba6acSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
777*bb1ba6acSHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
778*bb1ba6acSHisping Lin 						    TEEC_NONE,
779*bb1ba6acSHisping Lin 						    TEEC_NONE);
780*bb1ba6acSHisping Lin 
781*bb1ba6acSHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
782*bb1ba6acSHisping Lin 					STORAGE_CMD_WRITE_OEM_HR_OTP,
783*bb1ba6acSHisping Lin 					&TeecOperation,
784*bb1ba6acSHisping Lin 					&ErrorOrigin);
785*bb1ba6acSHisping Lin 	if (TeecResult != TEEC_SUCCESS)
786*bb1ba6acSHisping Lin 		goto exit;
787*bb1ba6acSHisping Lin 
788*bb1ba6acSHisping Lin exit:
789*bb1ba6acSHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
790*bb1ba6acSHisping Lin 	TEEC_CloseSession(&TeecSession);
791*bb1ba6acSHisping Lin 	TEEC_FinalizeContext(&TeecContext);
792*bb1ba6acSHisping Lin 
793*bb1ba6acSHisping Lin 	return TeecResult;
794*bb1ba6acSHisping Lin }
795*bb1ba6acSHisping Lin 
7964aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
7974aa61755SAndy Ye {
7984aa61755SAndy Ye 	TEEC_Result TeecResult;
7994aa61755SAndy Ye 	TEEC_Context TeecContext;
8004aa61755SAndy Ye 	TEEC_Session TeecSession;
8014aa61755SAndy Ye 	uint32_t ErrorOrigin;
8024aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
8034aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
8044aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
8054aa61755SAndy Ye 				}
8064aa61755SAndy Ye 			     };
8074aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
8084aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
8093251364cSHisping Lin 	struct blk_desc *dev_desc;
8103251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8116651d4c0SJason Zhu 	if (!dev_desc) {
8126651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8136651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8146651d4c0SJason Zhu 	}
8154aa61755SAndy Ye 
816f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
817f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
818f4e1db95SHisping Lin 		return TeecResult;
8194aa61755SAndy Ye 
8204aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
821f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
822f4e1db95SHisping Lin 		return TeecResult;
8234aa61755SAndy Ye 
8243251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8253251364cSHisping Lin 						TEEC_NONE,
8263251364cSHisping Lin 						TEEC_NONE,
8273251364cSHisping Lin 						TEEC_NONE);
8283251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
829b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
830b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
831b9a7e756SHisping Lin 	else
832b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
833b9a7e756SHisping Lin 
8343251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8353251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8363251364cSHisping Lin #endif
8373251364cSHisping Lin 
8384aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
8394aa61755SAndy Ye 				      &TeecSession,
8404aa61755SAndy Ye 				      TeecUuid,
8414aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
8424aa61755SAndy Ye 				      NULL,
8433251364cSHisping Lin 					&TeecOperation,
8444aa61755SAndy Ye 				      &ErrorOrigin);
845f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
846f4e1db95SHisping Lin 		return TeecResult;
8474aa61755SAndy Ye 
8484aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
8494aa61755SAndy Ye 
8504aa61755SAndy Ye 	SharedMem0.size = *dh_size;
8514aa61755SAndy Ye 	SharedMem0.flags = 0;
8524aa61755SAndy Ye 
8534aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
854f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
855f4e1db95SHisping Lin 		goto exit;
8564aa61755SAndy Ye 
8574aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
8584aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
8594aa61755SAndy Ye 
8604aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
8614aa61755SAndy Ye 						    TEEC_NONE,
8624aa61755SAndy Ye 						    TEEC_NONE,
8634aa61755SAndy Ye 						    TEEC_NONE);
8644aa61755SAndy Ye 
8654aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8664aa61755SAndy Ye 					143,
8674aa61755SAndy Ye 					&TeecOperation,
8684aa61755SAndy Ye 					&ErrorOrigin);
869f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
870f4e1db95SHisping Lin 		goto exit;
8714aa61755SAndy Ye 
8724aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
8734aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
874f4e1db95SHisping Lin exit:
8754aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
8764aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
877f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8784aa61755SAndy Ye 
8794aa61755SAndy Ye 	return TeecResult;
8804aa61755SAndy Ye }
8814aa61755SAndy Ye 
8824aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
8834aa61755SAndy Ye {
8844aa61755SAndy Ye 	TEEC_Result TeecResult;
8854aa61755SAndy Ye 	TEEC_Context TeecContext;
8864aa61755SAndy Ye 	TEEC_Session TeecSession;
8874aa61755SAndy Ye 	uint32_t ErrorOrigin;
8884aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
8894aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
8904aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
8914aa61755SAndy Ye 				}
8924aa61755SAndy Ye 			     };
8934aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
8944aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
8953251364cSHisping Lin 	struct blk_desc *dev_desc;
8963251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8976651d4c0SJason Zhu 	if (!dev_desc) {
8986651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8996651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
9006651d4c0SJason Zhu 	}
9014aa61755SAndy Ye 
902f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
903f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
904f4e1db95SHisping Lin 		return TeecResult;
9054aa61755SAndy Ye 
9064aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
907f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
908f4e1db95SHisping Lin 		return TeecResult;
9094aa61755SAndy Ye 
9103251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9113251364cSHisping Lin 						TEEC_NONE,
9123251364cSHisping Lin 						TEEC_NONE,
9133251364cSHisping Lin 						TEEC_NONE);
9143251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
915b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
916b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
917b9a7e756SHisping Lin 	else
918b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
919b9a7e756SHisping Lin 
9203251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9213251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9223251364cSHisping Lin #endif
9233251364cSHisping Lin 
9244aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
9254aa61755SAndy Ye 				      &TeecSession,
9264aa61755SAndy Ye 				      TeecUuid,
9274aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
9284aa61755SAndy Ye 				      NULL,
9293251364cSHisping Lin 					&TeecOperation,
9304aa61755SAndy Ye 				      &ErrorOrigin);
931f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
932f4e1db95SHisping Lin 		return TeecResult;
9334aa61755SAndy Ye 
9344aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
9354aa61755SAndy Ye 
9364aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
9374aa61755SAndy Ye 	SharedMem0.flags = 0;
9384aa61755SAndy Ye 
9394aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
940f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
941f4e1db95SHisping Lin 		goto exit;
9424aa61755SAndy Ye 
9434aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9444aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9454aa61755SAndy Ye 
9464aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
9474aa61755SAndy Ye 						    TEEC_NONE,
9484aa61755SAndy Ye 						    TEEC_NONE,
9494aa61755SAndy Ye 						    TEEC_NONE);
9504aa61755SAndy Ye 
9514aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9524aa61755SAndy Ye 					144,
9534aa61755SAndy Ye 					&TeecOperation,
9544aa61755SAndy Ye 					&ErrorOrigin);
955f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
956f4e1db95SHisping Lin 		goto exit;
9574aa61755SAndy Ye 
9584aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
9594aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
960f4e1db95SHisping Lin exit:
9614aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
9624aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
963f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9644aa61755SAndy Ye 
9654aa61755SAndy Ye 	return TeecResult;
9664aa61755SAndy Ye }
9674aa61755SAndy Ye 
9684aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
9694aa61755SAndy Ye 			      uint32_t *operation_size,
9704aa61755SAndy Ye 			      uint8_t *out,
9714aa61755SAndy Ye 			      uint32_t *out_len)
9724aa61755SAndy Ye {
9734aa61755SAndy Ye 	TEEC_Result TeecResult;
9744aa61755SAndy Ye 	TEEC_Context TeecContext;
9754aa61755SAndy Ye 	TEEC_Session TeecSession;
9764aa61755SAndy Ye 	uint32_t ErrorOrigin;
9774aa61755SAndy Ye 
9784aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
9794aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
9804aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
9814aa61755SAndy Ye 				}
9824aa61755SAndy Ye 			     };
9834aa61755SAndy Ye 
9844aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
9854aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
9863251364cSHisping Lin 	struct blk_desc *dev_desc;
9873251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
9886651d4c0SJason Zhu 	if (!dev_desc) {
9896651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
9906651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
9916651d4c0SJason Zhu 	}
9924aa61755SAndy Ye 
993f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
994f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
995f4e1db95SHisping Lin 		return TeecResult;
9964aa61755SAndy Ye 
9974aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
998f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
999f4e1db95SHisping Lin 		return TeecResult;
10004aa61755SAndy Ye 
10013251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
10023251364cSHisping Lin 						TEEC_NONE,
10033251364cSHisping Lin 						TEEC_NONE,
10043251364cSHisping Lin 						TEEC_NONE);
10053251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1006b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1007b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1008b9a7e756SHisping Lin 	else
1009b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1010b9a7e756SHisping Lin 
10113251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
10123251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
10133251364cSHisping Lin #endif
10143251364cSHisping Lin 
10154aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
10164aa61755SAndy Ye 				      &TeecSession,
10174aa61755SAndy Ye 				      TeecUuid,
10184aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
10194aa61755SAndy Ye 				      NULL,
10203251364cSHisping Lin 					&TeecOperation,
10214aa61755SAndy Ye 				      &ErrorOrigin);
1022f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1023f4e1db95SHisping Lin 		return TeecResult;
10244aa61755SAndy Ye 
10254aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
10264aa61755SAndy Ye 
10274aa61755SAndy Ye 	SharedMem0.size = *operation_size;
10284aa61755SAndy Ye 	SharedMem0.flags = 0;
10294aa61755SAndy Ye 
10304aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1031f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1032f4e1db95SHisping Lin 		goto exit;
10334aa61755SAndy Ye 
10344aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
10354aa61755SAndy Ye 
10364aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10374aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10384aa61755SAndy Ye 
10394aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
10404aa61755SAndy Ye 
10414aa61755SAndy Ye 	SharedMem1.size = *out_len;
10424aa61755SAndy Ye 	SharedMem1.flags = 0;
10434aa61755SAndy Ye 
10444aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1045f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1046f4e1db95SHisping Lin 		goto exit;
10474aa61755SAndy Ye 
10484aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
10494aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
10504aa61755SAndy Ye 
10514aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
10524aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
10534aa61755SAndy Ye 						    TEEC_NONE,
10544aa61755SAndy Ye 						    TEEC_NONE);
10554aa61755SAndy Ye 
10564aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10574aa61755SAndy Ye 					145,
10584aa61755SAndy Ye 					&TeecOperation,
10594aa61755SAndy Ye 					&ErrorOrigin);
1060f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1061f4e1db95SHisping Lin 		goto exit;
10624aa61755SAndy Ye 
10634aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
10644aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
1065f4e1db95SHisping Lin exit:
10664aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
10674aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1068f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1069f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10704aa61755SAndy Ye 
10714aa61755SAndy Ye 	return TeecResult;
10724aa61755SAndy Ye }
10734aa61755SAndy Ye 
10744aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
10754aa61755SAndy Ye {
10764aa61755SAndy Ye 	TEEC_Result TeecResult;
10774aa61755SAndy Ye 	TEEC_Context TeecContext;
10784aa61755SAndy Ye 	TEEC_Session TeecSession;
10794aa61755SAndy Ye 	uint32_t ErrorOrigin;
10804aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
10814aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
10824aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
10834aa61755SAndy Ye 				}
10844aa61755SAndy Ye 			     };
10854aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
10864aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
10873251364cSHisping Lin 	struct blk_desc *dev_desc;
10883251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
10896651d4c0SJason Zhu 	if (!dev_desc) {
10906651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
10916651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
10926651d4c0SJason Zhu 	}
1093f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1094f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1095f4e1db95SHisping Lin 		return TeecResult;
10964aa61755SAndy Ye 
10974aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1098f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1099f4e1db95SHisping Lin 		return TeecResult;
11004aa61755SAndy Ye 
11013251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
11023251364cSHisping Lin 						TEEC_NONE,
11033251364cSHisping Lin 						TEEC_NONE,
11043251364cSHisping Lin 						TEEC_NONE);
11053251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1106b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1107b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1108b9a7e756SHisping Lin 	else
1109b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1110b9a7e756SHisping Lin 
11113251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
11123251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
11133251364cSHisping Lin #endif
11143251364cSHisping Lin 
11154aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
11164aa61755SAndy Ye 					&TeecSession,
11174aa61755SAndy Ye 					TeecUuid,
11184aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
11194aa61755SAndy Ye 					NULL,
11203251364cSHisping Lin 					&TeecOperation,
11214aa61755SAndy Ye 					&ErrorOrigin);
1122f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1123f4e1db95SHisping Lin 		return TeecResult;
11244aa61755SAndy Ye 
11254aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
11264aa61755SAndy Ye 
11274aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
11284aa61755SAndy Ye 	SharedMem0.flags = 0;
11294aa61755SAndy Ye 
11304aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1131f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1132f4e1db95SHisping Lin 		goto exit;
11334aa61755SAndy Ye 
11344aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
11354aa61755SAndy Ye 
11364aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
11374aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
11384aa61755SAndy Ye 
11394aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
11404aa61755SAndy Ye 						    TEEC_NONE,
11414aa61755SAndy Ye 						    TEEC_NONE,
11424aa61755SAndy Ye 						    TEEC_NONE);
11434aa61755SAndy Ye 
11444aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
11454aa61755SAndy Ye 					146,
11464aa61755SAndy Ye 					&TeecOperation,
11474aa61755SAndy Ye 					&ErrorOrigin);
1148f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1149f4e1db95SHisping Lin 		goto exit;
1150f4e1db95SHisping Lin exit:
11514aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
11524aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1153f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
11544aa61755SAndy Ye 
11554aa61755SAndy Ye 	return TeecResult;
11564aa61755SAndy Ye }
1157