xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision fbf29bfb0ea377f5d1b9ff13bb8d396205b2019f)
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>
9ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h>
10ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h>
1178ef5fbdSqiujian #include <optee_include/tee_api_defines.h>
123251364cSHisping Lin #include <boot_rkimg.h>
13a7df4868Stony.xu #include <stdlib.h>
141e8c0e44STony Xu #include <attestation_key.h>
15a7df4868Stony.xu 
16a7df4868Stony.xu #define	BOOT_FROM_EMMC	(1 << 1)
17c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH		0
18c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH	1
19c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP		2
20c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH		3
21c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH		4
22c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG		5
231ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY	9
24*fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG	10
25ae8ec5e1SHisping Lin 
26ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
27ae8ec5e1SHisping Lin {
28ae8ec5e1SHisping Lin 	if (in > 9)
29ae8ec5e1SHisping Lin 		return in + 55;
30ae8ec5e1SHisping Lin 	else
31ae8ec5e1SHisping Lin 		return in + 48;
32ae8ec5e1SHisping Lin }
33ae8ec5e1SHisping Lin 
34c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
35ae8ec5e1SHisping Lin {
36ae8ec5e1SHisping Lin 	uint32_t i = 0;
37ae8ec5e1SHisping Lin 
38ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
39ae8ec5e1SHisping Lin 		return 0;
40ae8ec5e1SHisping Lin 
41ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
42ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
43ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
44ae8ec5e1SHisping Lin 	}
45ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
46ae8ec5e1SHisping Lin 
47ae8ec5e1SHisping Lin 	return blen * 2;
48ae8ec5e1SHisping Lin }
49ae8ec5e1SHisping Lin 
50c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
51c7de5349SHisping Lin 						uint32_t filename_size,
52c7de5349SHisping Lin 						uint8_t *data,
53c7de5349SHisping Lin 						uint32_t data_size)
54ae8ec5e1SHisping Lin {
55ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
56ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
57ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
58ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
59ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
60ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
61ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
62ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
633251364cSHisping Lin 	struct blk_desc *dev_desc;
643251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
656651d4c0SJason Zhu 	if (!dev_desc) {
666651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
676651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
686651d4c0SJason Zhu 	}
693251364cSHisping Lin 
70f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
71f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
72f4e1db95SHisping Lin 		return TeecResult;
73ae8ec5e1SHisping Lin 
74ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
75f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
76f4e1db95SHisping Lin 		return TeecResult;
77ae8ec5e1SHisping Lin 
783251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
793251364cSHisping Lin 						    TEEC_NONE,
803251364cSHisping Lin 						    TEEC_NONE,
813251364cSHisping Lin 						    TEEC_NONE);
823251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
83b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
84b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
85b9a7e756SHisping Lin 	else
86b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
873251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
883251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
893251364cSHisping Lin #endif
903251364cSHisping Lin 
91ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
92ae8ec5e1SHisping Lin 				&TeecSession,
93ae8ec5e1SHisping Lin 				TeecUuid,
94ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
95ae8ec5e1SHisping Lin 				NULL,
963251364cSHisping Lin 				&TeecOperation,
97ae8ec5e1SHisping Lin 				&ErrorOrigin);
98f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
99f4e1db95SHisping Lin 		return TeecResult;
100ae8ec5e1SHisping Lin 
101ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
102ae8ec5e1SHisping Lin 
103c7de5349SHisping Lin 	SharedMem0.size = filename_size;
104ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
105ae8ec5e1SHisping Lin 
106ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
107f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
108f4e1db95SHisping Lin 		goto exit;
109ae8ec5e1SHisping Lin 
110c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
111ae8ec5e1SHisping Lin 
112ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
113ae8ec5e1SHisping Lin 
114c7de5349SHisping Lin 	SharedMem1.size = data_size;
115c7de5349SHisping Lin 	SharedMem1.flags = 0;
116c7de5349SHisping Lin 
117c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
118c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
119c7de5349SHisping Lin 		goto exit;
120c7de5349SHisping Lin 
121c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
122c7de5349SHisping Lin 
123c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
124c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
125c7de5349SHisping Lin 
126c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
127c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
128c7de5349SHisping Lin 
129c7de5349SHisping Lin 
130c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
131c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
132c7de5349SHisping Lin 						TEEC_NONE,
133c7de5349SHisping Lin 						TEEC_NONE);
134c7de5349SHisping Lin 
135c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
136c7de5349SHisping Lin 					1,
137c7de5349SHisping Lin 					&TeecOperation,
138c7de5349SHisping Lin 					&ErrorOrigin);
139c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
140c7de5349SHisping Lin 		goto exit;
141c7de5349SHisping Lin exit:
142c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
143c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
144c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
145c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
146c7de5349SHisping Lin 
147c7de5349SHisping Lin 	return TeecResult;
148c7de5349SHisping Lin }
149c7de5349SHisping Lin 
150c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
151c7de5349SHisping Lin 					       uint32_t filename_size,
152c7de5349SHisping Lin 					       uint8_t *data,
153c7de5349SHisping Lin 					       uint32_t data_size)
154c7de5349SHisping Lin {
155c7de5349SHisping Lin 	TEEC_Result TeecResult;
156c7de5349SHisping Lin 	TEEC_Context TeecContext;
157c7de5349SHisping Lin 	TEEC_Session TeecSession;
158c7de5349SHisping Lin 	uint32_t ErrorOrigin;
159c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
160c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
161c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
162c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
163c7de5349SHisping Lin 
164c7de5349SHisping Lin 	struct blk_desc *dev_desc;
165c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
166c7de5349SHisping Lin 	if (!dev_desc) {
167c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
168c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
169c7de5349SHisping Lin 	}
170c7de5349SHisping Lin 
171c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
172c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
173c7de5349SHisping Lin 		return TeecResult;
174c7de5349SHisping Lin 
175c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
176c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
177c7de5349SHisping Lin 		return TeecResult;
178c7de5349SHisping Lin 
179c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
180c7de5349SHisping Lin 						TEEC_NONE,
181c7de5349SHisping Lin 						TEEC_NONE,
182c7de5349SHisping Lin 						TEEC_NONE);
183c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
184c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
185c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
186c7de5349SHisping Lin 	else
187c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
188c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
189c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
190c7de5349SHisping Lin #endif
191c7de5349SHisping Lin 
192c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
193c7de5349SHisping Lin 				&TeecSession,
194c7de5349SHisping Lin 				TeecUuid,
195c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
196c7de5349SHisping Lin 				NULL,
197c7de5349SHisping Lin 				&TeecOperation,
198c7de5349SHisping Lin 				&ErrorOrigin);
199c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
200c7de5349SHisping Lin 		return TeecResult;
201c7de5349SHisping Lin 
202c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
203c7de5349SHisping Lin 
204c7de5349SHisping Lin 	SharedMem0.size = filename_size;
205c7de5349SHisping Lin 	SharedMem0.flags = 0;
206c7de5349SHisping Lin 
207c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
208c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
209c7de5349SHisping Lin 		goto exit;
210c7de5349SHisping Lin 
211c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
212c7de5349SHisping Lin 
213c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
214c7de5349SHisping Lin 
215c7de5349SHisping Lin 	SharedMem1.size = data_size;
216ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
217ae8ec5e1SHisping Lin 
218ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
219f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
220f4e1db95SHisping Lin 		goto exit;
221ae8ec5e1SHisping Lin 
222ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
223ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
224ae8ec5e1SHisping Lin 
225ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
226ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
227ae8ec5e1SHisping Lin 
228ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
229ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
230ae8ec5e1SHisping Lin 						TEEC_NONE,
231ae8ec5e1SHisping Lin 						TEEC_NONE);
232ae8ec5e1SHisping Lin 
233ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
234ae8ec5e1SHisping Lin 					0,
235ae8ec5e1SHisping Lin 					&TeecOperation,
236ae8ec5e1SHisping Lin 					&ErrorOrigin);
23746b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
238c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
239f4e1db95SHisping Lin exit:
240ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
241ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
242ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
24346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
244ae8ec5e1SHisping Lin 
245ae8ec5e1SHisping Lin 	return TeecResult;
246ae8ec5e1SHisping Lin }
247ae8ec5e1SHisping Lin 
248c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
249c7de5349SHisping Lin {
250c7de5349SHisping Lin 	TEEC_Result TeecResult;
251c7de5349SHisping Lin 	TEEC_Context TeecContext;
252c7de5349SHisping Lin 	TEEC_Session TeecSession;
253c7de5349SHisping Lin 	uint32_t ErrorOrigin;
254c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
255c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
256c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
257c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
258c7de5349SHisping Lin 
259c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
260c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
261c7de5349SHisping Lin 		return TeecResult;
262c7de5349SHisping Lin 
263c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
264c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
265c7de5349SHisping Lin 		return TeecResult;
266c7de5349SHisping Lin 
267c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
268c7de5349SHisping Lin 				&TeecSession,
269c7de5349SHisping Lin 				TeecUuid,
270c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
271c7de5349SHisping Lin 				NULL,
272c7de5349SHisping Lin 				NULL,
273c7de5349SHisping Lin 				&ErrorOrigin);
274c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
275c7de5349SHisping Lin 		return TeecResult;
276c7de5349SHisping Lin 
277c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
278c7de5349SHisping Lin 						    TEEC_NONE,
279c7de5349SHisping Lin 						    TEEC_NONE,
280c7de5349SHisping Lin 						    TEEC_NONE);
281c7de5349SHisping Lin 
282c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
283c7de5349SHisping Lin 					2,
284c7de5349SHisping Lin 					&TeecOperation,
285c7de5349SHisping Lin 					&ErrorOrigin);
286c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
287c7de5349SHisping Lin 		goto exit;
288c7de5349SHisping Lin exit:
289c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
290c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
291c7de5349SHisping Lin 
292c7de5349SHisping Lin 	return TeecResult;
293c7de5349SHisping Lin }
294c7de5349SHisping Lin 
295c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
296c7de5349SHisping Lin {
297c7de5349SHisping Lin 	char hs[9];
298c7de5349SHisping Lin 
299c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
300c7de5349SHisping Lin 
301c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
302c7de5349SHisping Lin }
303c7de5349SHisping Lin 
304ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
305ae8ec5e1SHisping Lin {
306c7de5349SHisping Lin 	char hs[9];
3073251364cSHisping Lin 
308c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
309ae8ec5e1SHisping Lin 
310c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
311ae8ec5e1SHisping Lin }
312ae8ec5e1SHisping Lin 
313ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
314ae8ec5e1SHisping Lin {
315c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
316c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
317ae8ec5e1SHisping Lin }
318ae8ec5e1SHisping Lin 
319ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
320ae8ec5e1SHisping Lin {
321c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
322c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
3236651d4c0SJason Zhu }
324ae8ec5e1SHisping Lin 
325c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
326c7de5349SHisping Lin {
327c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
328c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
329c7de5349SHisping Lin }
330ae8ec5e1SHisping Lin 
331c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
332c7de5349SHisping Lin {
333c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
334c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
335ae8ec5e1SHisping Lin }
336ae8ec5e1SHisping Lin 
337564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
338564654ebSJason Zhu 					      uint32_t size)
339564654ebSJason Zhu {
340c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
341c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
342564654ebSJason Zhu }
343564654ebSJason Zhu 
344564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
345564654ebSJason Zhu 					       uint32_t size)
346564654ebSJason Zhu {
347c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
348c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
349564654ebSJason Zhu }
350564654ebSJason Zhu 
351ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
352ae8ec5e1SHisping Lin {
353c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
354c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
355ae8ec5e1SHisping Lin }
356ae8ec5e1SHisping Lin 
357ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
358ae8ec5e1SHisping Lin {
359c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
360c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
361ae8ec5e1SHisping Lin }
362ae8ec5e1SHisping Lin 
363ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
364ae8ec5e1SHisping Lin {
365c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
366c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
367c7de5349SHisping Lin }
368c7de5349SHisping Lin 
369c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
370c7de5349SHisping Lin {
371c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
372c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
373c7de5349SHisping Lin }
374c7de5349SHisping Lin 
375c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
376c7de5349SHisping Lin {
377ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
378ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
379ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
380ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
381c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
382c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
383c7de5349SHisping Lin 
384ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
385ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
386ae8ec5e1SHisping Lin 
387f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
388f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
389f4e1db95SHisping Lin 		return TeecResult;
390ae8ec5e1SHisping Lin 
391ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
392f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
393f4e1db95SHisping Lin 		return TeecResult;
394ae8ec5e1SHisping Lin 
395ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
396ae8ec5e1SHisping Lin 				      &TeecSession,
397ae8ec5e1SHisping Lin 				      TeecUuid,
398ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
399ae8ec5e1SHisping Lin 				      NULL,
400c7de5349SHisping Lin 				      NULL,
401ae8ec5e1SHisping Lin 				      &ErrorOrigin);
402f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
403f4e1db95SHisping Lin 		return TeecResult;
404ae8ec5e1SHisping Lin 
405c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
406c7de5349SHisping Lin 						    TEEC_NONE,
407ae8ec5e1SHisping Lin 						    TEEC_NONE,
408ae8ec5e1SHisping Lin 						    TEEC_NONE);
409ae8ec5e1SHisping Lin 
410ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
411c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
412ae8ec5e1SHisping Lin 					&TeecOperation,
413ae8ec5e1SHisping Lin 					&ErrorOrigin);
414c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
415c7de5349SHisping Lin 		goto exit;
416f4e1db95SHisping Lin exit:
417ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
41846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
419ae8ec5e1SHisping Lin 
420ae8ec5e1SHisping Lin 	return TeecResult;
421ae8ec5e1SHisping Lin }
422ae8ec5e1SHisping Lin 
423c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
424c7de5349SHisping Lin 						   uint8_t is_write,
425c7de5349SHisping Lin 						   uint32_t *buf,
426c7de5349SHisping Lin 						   uint32_t length)
427ae8ec5e1SHisping Lin {
428ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
429ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
430ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
431ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
432c7de5349SHisping Lin 
433c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
434c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
435ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
436ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
437ae8ec5e1SHisping Lin 
438f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
439f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
440f4e1db95SHisping Lin 		return TeecResult;
441ae8ec5e1SHisping Lin 
442ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
443f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
444f4e1db95SHisping Lin 		return TeecResult;
445ae8ec5e1SHisping Lin 
446ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
447ae8ec5e1SHisping Lin 				&TeecSession,
448ae8ec5e1SHisping Lin 				TeecUuid,
449ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
450ae8ec5e1SHisping Lin 				NULL,
451c7de5349SHisping Lin 				NULL,
452ae8ec5e1SHisping Lin 				&ErrorOrigin);
453f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
454f4e1db95SHisping Lin 		return TeecResult;
455ae8ec5e1SHisping Lin 
456ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
457ae8ec5e1SHisping Lin 
458c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
459ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
460ae8ec5e1SHisping Lin 
461ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
462f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
463f4e1db95SHisping Lin 		goto exit;
464ae8ec5e1SHisping Lin 
465ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
466ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
467ae8ec5e1SHisping Lin 
468c7de5349SHisping Lin 	if (is_write) {
469c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
470ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
471c7de5349SHisping Lin 							    TEEC_NONE,
472ae8ec5e1SHisping Lin 							    TEEC_NONE,
473ae8ec5e1SHisping Lin 							    TEEC_NONE);
474ae8ec5e1SHisping Lin 
475c7de5349SHisping Lin 	} else {
476c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
477c7de5349SHisping Lin 							    TEEC_NONE,
478c7de5349SHisping Lin 							    TEEC_NONE,
479c7de5349SHisping Lin 							    TEEC_NONE);
480c7de5349SHisping Lin 	}
481c7de5349SHisping Lin 
482ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
483c7de5349SHisping Lin 					cmd,
484ae8ec5e1SHisping Lin 					&TeecOperation,
485ae8ec5e1SHisping Lin 					&ErrorOrigin);
486f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
487f4e1db95SHisping Lin 		goto exit;
488c7de5349SHisping Lin 
489c7de5349SHisping Lin 	if (!is_write)
490c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
491c7de5349SHisping Lin 
492f4e1db95SHisping Lin exit:
493ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
494ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
49546b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
496ae8ec5e1SHisping Lin 
497ae8ec5e1SHisping Lin 	return TeecResult;
498ae8ec5e1SHisping Lin }
499ae8ec5e1SHisping Lin 
5006ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5016ef445a4SHisping Lin {
502c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
503c7de5349SHisping Lin 						  false, buf, length);
5046ef445a4SHisping Lin }
5056ef445a4SHisping Lin 
5066ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5076ef445a4SHisping Lin {
508c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
509c7de5349SHisping Lin 						  true, buf, length);
51016539616SHisping Lin }
51116539616SHisping Lin 
51216539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
51316539616SHisping Lin {
51416539616SHisping Lin 	TEEC_Result res;
515c7de5349SHisping Lin 
516c7de5349SHisping Lin 	res = trusty_base_end_security_data();
517c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
51816539616SHisping Lin 	return res;
51916539616SHisping Lin }
5202cd27853SHisping Lin 
5212cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
5222cd27853SHisping Lin {
523c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
524c7de5349SHisping Lin 						  false, buf, length);
5252cd27853SHisping Lin }
526c7de5349SHisping Lin 
5272cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
5282cd27853SHisping Lin {
529c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
530c7de5349SHisping Lin 						  true, buf, length);
5312cd27853SHisping Lin }
532095e2a82SHisping Lin 
533468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
534468df3b2SHisping Lin {
535468df3b2SHisping Lin 	uint32_t bootflag;
536c7de5349SHisping Lin 	TEEC_Result TeecResult;
537468df3b2SHisping Lin 
538c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
539c7de5349SHisping Lin 							false, &bootflag, 1);
540468df3b2SHisping Lin 
541468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
5420202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
5430202ee8aSHisping Lin 		if (bootflag == 0x00000001)
5440202ee8aSHisping Lin 			*flag = 1;
5450202ee8aSHisping Lin #else
546468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
547468df3b2SHisping Lin 			*flag = 1;
5480202ee8aSHisping Lin #endif
549468df3b2SHisping Lin 	}
550095e2a82SHisping Lin 	return TeecResult;
551095e2a82SHisping Lin }
5524aa61755SAndy Ye 
5531ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
5541ef63c75SHisping Lin {
5551ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
5561ef63c75SHisping Lin 						  true, buf, length);
5571ef63c75SHisping Lin }
5581ef63c75SHisping Lin 
559*fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
560*fbf29bfbSHisping Lin {
561*fbf29bfbSHisping Lin 	uint32_t levelflag;
562*fbf29bfbSHisping Lin 
563*fbf29bfbSHisping Lin 	levelflag = flag;
564*fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
565*fbf29bfbSHisping Lin 						  true, &levelflag, 1);
566*fbf29bfbSHisping Lin }
567*fbf29bfbSHisping Lin 
5684aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
5694aa61755SAndy Ye {
5704aa61755SAndy Ye 	TEEC_Result TeecResult;
5714aa61755SAndy Ye 	TEEC_Context TeecContext;
5724aa61755SAndy Ye 	TEEC_Session TeecSession;
5734aa61755SAndy Ye 	uint32_t ErrorOrigin;
5744aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
5754aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
5764aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
5774aa61755SAndy Ye 				}
5784aa61755SAndy Ye 			     };
5794aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
5804aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
5813251364cSHisping Lin 	struct blk_desc *dev_desc;
5823251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
5836651d4c0SJason Zhu 	if (!dev_desc) {
5846651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
5856651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
5866651d4c0SJason Zhu 	}
5874aa61755SAndy Ye 
588f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
589f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
590f4e1db95SHisping Lin 		return TeecResult;
5914aa61755SAndy Ye 
5924aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
593f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
594f4e1db95SHisping Lin 		return TeecResult;
5954aa61755SAndy Ye 
5963251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
5973251364cSHisping Lin 						TEEC_NONE,
5983251364cSHisping Lin 						TEEC_NONE,
5993251364cSHisping Lin 						TEEC_NONE);
6003251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
601b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
602b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
603b9a7e756SHisping Lin 	else
604b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
605b9a7e756SHisping Lin 
6063251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6073251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6083251364cSHisping Lin #endif
6093251364cSHisping Lin 
6104aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
6114aa61755SAndy Ye 				      &TeecSession,
6124aa61755SAndy Ye 				      TeecUuid,
6134aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
6144aa61755SAndy Ye 				      NULL,
6153251364cSHisping Lin 					&TeecOperation,
6164aa61755SAndy Ye 				      &ErrorOrigin);
617f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
618f4e1db95SHisping Lin 		return TeecResult;
6194aa61755SAndy Ye 
6204aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
6214aa61755SAndy Ye 
6224aa61755SAndy Ye 	SharedMem0.size = *dh_size;
6234aa61755SAndy Ye 	SharedMem0.flags = 0;
6244aa61755SAndy Ye 
6254aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
626f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
627f4e1db95SHisping Lin 		goto exit;
6284aa61755SAndy Ye 
6294aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
6304aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
6314aa61755SAndy Ye 
6324aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
6334aa61755SAndy Ye 						    TEEC_NONE,
6344aa61755SAndy Ye 						    TEEC_NONE,
6354aa61755SAndy Ye 						    TEEC_NONE);
6364aa61755SAndy Ye 
6374aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
6384aa61755SAndy Ye 					143,
6394aa61755SAndy Ye 					&TeecOperation,
6404aa61755SAndy Ye 					&ErrorOrigin);
641f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
642f4e1db95SHisping Lin 		goto exit;
6434aa61755SAndy Ye 
6444aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
6454aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
646f4e1db95SHisping Lin exit:
6474aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
6484aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
649f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
6504aa61755SAndy Ye 
6514aa61755SAndy Ye 	return TeecResult;
6524aa61755SAndy Ye }
6534aa61755SAndy Ye 
6544aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
6554aa61755SAndy Ye {
6564aa61755SAndy Ye 	TEEC_Result TeecResult;
6574aa61755SAndy Ye 	TEEC_Context TeecContext;
6584aa61755SAndy Ye 	TEEC_Session TeecSession;
6594aa61755SAndy Ye 	uint32_t ErrorOrigin;
6604aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
6614aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
6624aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
6634aa61755SAndy Ye 				}
6644aa61755SAndy Ye 			     };
6654aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
6664aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
6673251364cSHisping Lin 	struct blk_desc *dev_desc;
6683251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
6696651d4c0SJason Zhu 	if (!dev_desc) {
6706651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
6716651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
6726651d4c0SJason Zhu 	}
6734aa61755SAndy Ye 
674f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
675f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
676f4e1db95SHisping Lin 		return TeecResult;
6774aa61755SAndy Ye 
6784aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
679f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
680f4e1db95SHisping Lin 		return TeecResult;
6814aa61755SAndy Ye 
6823251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6833251364cSHisping Lin 						TEEC_NONE,
6843251364cSHisping Lin 						TEEC_NONE,
6853251364cSHisping Lin 						TEEC_NONE);
6863251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
687b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
688b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
689b9a7e756SHisping Lin 	else
690b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
691b9a7e756SHisping Lin 
6923251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6933251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6943251364cSHisping Lin #endif
6953251364cSHisping Lin 
6964aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
6974aa61755SAndy Ye 				      &TeecSession,
6984aa61755SAndy Ye 				      TeecUuid,
6994aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
7004aa61755SAndy Ye 				      NULL,
7013251364cSHisping Lin 					&TeecOperation,
7024aa61755SAndy Ye 				      &ErrorOrigin);
703f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
704f4e1db95SHisping Lin 		return TeecResult;
7054aa61755SAndy Ye 
7064aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
7074aa61755SAndy Ye 
7084aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
7094aa61755SAndy Ye 	SharedMem0.flags = 0;
7104aa61755SAndy Ye 
7114aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
712f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
713f4e1db95SHisping Lin 		goto exit;
7144aa61755SAndy Ye 
7154aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
7164aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
7174aa61755SAndy Ye 
7184aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
7194aa61755SAndy Ye 						    TEEC_NONE,
7204aa61755SAndy Ye 						    TEEC_NONE,
7214aa61755SAndy Ye 						    TEEC_NONE);
7224aa61755SAndy Ye 
7234aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
7244aa61755SAndy Ye 					144,
7254aa61755SAndy Ye 					&TeecOperation,
7264aa61755SAndy Ye 					&ErrorOrigin);
727f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
728f4e1db95SHisping Lin 		goto exit;
7294aa61755SAndy Ye 
7304aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
7314aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
732f4e1db95SHisping Lin exit:
7334aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
7344aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
735f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
7364aa61755SAndy Ye 
7374aa61755SAndy Ye 	return TeecResult;
7384aa61755SAndy Ye }
7394aa61755SAndy Ye 
7404aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
7414aa61755SAndy Ye 			      uint32_t *operation_size,
7424aa61755SAndy Ye 			      uint8_t *out,
7434aa61755SAndy Ye 			      uint32_t *out_len)
7444aa61755SAndy Ye {
7454aa61755SAndy Ye 	TEEC_Result TeecResult;
7464aa61755SAndy Ye 	TEEC_Context TeecContext;
7474aa61755SAndy Ye 	TEEC_Session TeecSession;
7484aa61755SAndy Ye 	uint32_t ErrorOrigin;
7494aa61755SAndy Ye 
7504aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
7514aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
7524aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
7534aa61755SAndy Ye 				}
7544aa61755SAndy Ye 			     };
7554aa61755SAndy Ye 
7564aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
7574aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
7583251364cSHisping Lin 	struct blk_desc *dev_desc;
7593251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7606651d4c0SJason Zhu 	if (!dev_desc) {
7616651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7626651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7636651d4c0SJason Zhu 	}
7644aa61755SAndy Ye 
765f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
766f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
767f4e1db95SHisping Lin 		return TeecResult;
7684aa61755SAndy Ye 
7694aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
770f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
771f4e1db95SHisping Lin 		return TeecResult;
7724aa61755SAndy Ye 
7733251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7743251364cSHisping Lin 						TEEC_NONE,
7753251364cSHisping Lin 						TEEC_NONE,
7763251364cSHisping Lin 						TEEC_NONE);
7773251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
778b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
779b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
780b9a7e756SHisping Lin 	else
781b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
782b9a7e756SHisping Lin 
7833251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7843251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7853251364cSHisping Lin #endif
7863251364cSHisping Lin 
7874aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
7884aa61755SAndy Ye 				      &TeecSession,
7894aa61755SAndy Ye 				      TeecUuid,
7904aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
7914aa61755SAndy Ye 				      NULL,
7923251364cSHisping Lin 					&TeecOperation,
7934aa61755SAndy Ye 				      &ErrorOrigin);
794f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
795f4e1db95SHisping Lin 		return TeecResult;
7964aa61755SAndy Ye 
7974aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
7984aa61755SAndy Ye 
7994aa61755SAndy Ye 	SharedMem0.size = *operation_size;
8004aa61755SAndy Ye 	SharedMem0.flags = 0;
8014aa61755SAndy Ye 
8024aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
803f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
804f4e1db95SHisping Lin 		goto exit;
8054aa61755SAndy Ye 
8064aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
8074aa61755SAndy Ye 
8084aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
8094aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
8104aa61755SAndy Ye 
8114aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
8124aa61755SAndy Ye 
8134aa61755SAndy Ye 	SharedMem1.size = *out_len;
8144aa61755SAndy Ye 	SharedMem1.flags = 0;
8154aa61755SAndy Ye 
8164aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
817f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
818f4e1db95SHisping Lin 		goto exit;
8194aa61755SAndy Ye 
8204aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
8214aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
8224aa61755SAndy Ye 
8234aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
8244aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
8254aa61755SAndy Ye 						    TEEC_NONE,
8264aa61755SAndy Ye 						    TEEC_NONE);
8274aa61755SAndy Ye 
8284aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8294aa61755SAndy Ye 					145,
8304aa61755SAndy Ye 					&TeecOperation,
8314aa61755SAndy Ye 					&ErrorOrigin);
832f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
833f4e1db95SHisping Lin 		goto exit;
8344aa61755SAndy Ye 
8354aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
8364aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
837f4e1db95SHisping Lin exit:
8384aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
8394aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
840f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
841f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8424aa61755SAndy Ye 
8434aa61755SAndy Ye 	return TeecResult;
8444aa61755SAndy Ye }
8454aa61755SAndy Ye 
8464aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
8474aa61755SAndy Ye {
8484aa61755SAndy Ye 	TEEC_Result TeecResult;
8494aa61755SAndy Ye 	TEEC_Context TeecContext;
8504aa61755SAndy Ye 	TEEC_Session TeecSession;
8514aa61755SAndy Ye 	uint32_t ErrorOrigin;
8524aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
8534aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
8544aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
8554aa61755SAndy Ye 				}
8564aa61755SAndy Ye 			     };
8574aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
8584aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
8593251364cSHisping Lin 	struct blk_desc *dev_desc;
8603251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8616651d4c0SJason Zhu 	if (!dev_desc) {
8626651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8636651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8646651d4c0SJason Zhu 	}
865f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
866f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
867f4e1db95SHisping Lin 		return TeecResult;
8684aa61755SAndy Ye 
8694aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
870f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
871f4e1db95SHisping Lin 		return TeecResult;
8724aa61755SAndy Ye 
8733251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8743251364cSHisping Lin 						TEEC_NONE,
8753251364cSHisping Lin 						TEEC_NONE,
8763251364cSHisping Lin 						TEEC_NONE);
8773251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
878b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
879b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
880b9a7e756SHisping Lin 	else
881b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
882b9a7e756SHisping Lin 
8833251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8843251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8853251364cSHisping Lin #endif
8863251364cSHisping Lin 
8874aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
8884aa61755SAndy Ye 					&TeecSession,
8894aa61755SAndy Ye 					TeecUuid,
8904aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
8914aa61755SAndy Ye 					NULL,
8923251364cSHisping Lin 					&TeecOperation,
8934aa61755SAndy Ye 					&ErrorOrigin);
894f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
895f4e1db95SHisping Lin 		return TeecResult;
8964aa61755SAndy Ye 
8974aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
8984aa61755SAndy Ye 
8994aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
9004aa61755SAndy Ye 	SharedMem0.flags = 0;
9014aa61755SAndy Ye 
9024aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
903f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
904f4e1db95SHisping Lin 		goto exit;
9054aa61755SAndy Ye 
9064aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
9074aa61755SAndy Ye 
9084aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9094aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9104aa61755SAndy Ye 
9114aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
9124aa61755SAndy Ye 						    TEEC_NONE,
9134aa61755SAndy Ye 						    TEEC_NONE,
9144aa61755SAndy Ye 						    TEEC_NONE);
9154aa61755SAndy Ye 
9164aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9174aa61755SAndy Ye 					146,
9184aa61755SAndy Ye 					&TeecOperation,
9194aa61755SAndy Ye 					&ErrorOrigin);
920f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
921f4e1db95SHisping Lin 		goto exit;
922f4e1db95SHisping Lin exit:
9234aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
9244aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
925f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9264aa61755SAndy Ye 
9274aa61755SAndy Ye 	return TeecResult;
9284aa61755SAndy Ye }
929