xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision c7de5349c9abcd4e28cc34f9eb02efdc19b877b3)
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)
17*c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH		0
18*c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH	1
19*c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP		2
20*c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH		3
21*c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH		4
22*c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG		5
23ae8ec5e1SHisping Lin 
24ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
25ae8ec5e1SHisping Lin {
26ae8ec5e1SHisping Lin 	if (in > 9)
27ae8ec5e1SHisping Lin 		return in + 55;
28ae8ec5e1SHisping Lin 	else
29ae8ec5e1SHisping Lin 		return in + 48;
30ae8ec5e1SHisping Lin }
31ae8ec5e1SHisping Lin 
32*c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
33ae8ec5e1SHisping Lin {
34ae8ec5e1SHisping Lin 	uint32_t i = 0;
35ae8ec5e1SHisping Lin 
36ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
37ae8ec5e1SHisping Lin 		return 0;
38ae8ec5e1SHisping Lin 
39ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
40ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
41ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
42ae8ec5e1SHisping Lin 	}
43ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
44ae8ec5e1SHisping Lin 
45ae8ec5e1SHisping Lin 	return blen * 2;
46ae8ec5e1SHisping Lin }
47ae8ec5e1SHisping Lin 
48*c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
49*c7de5349SHisping Lin 						uint32_t filename_size,
50*c7de5349SHisping Lin 						uint8_t *data,
51*c7de5349SHisping Lin 						uint32_t data_size)
52ae8ec5e1SHisping Lin {
53ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
54ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
55ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
56ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
57ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
58ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
59ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
60ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
613251364cSHisping Lin 	struct blk_desc *dev_desc;
623251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
636651d4c0SJason Zhu 	if (!dev_desc) {
646651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
656651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
666651d4c0SJason Zhu 	}
673251364cSHisping Lin 
68f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
69f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
70f4e1db95SHisping Lin 		return TeecResult;
71ae8ec5e1SHisping Lin 
72ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
73f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
74f4e1db95SHisping Lin 		return TeecResult;
75ae8ec5e1SHisping Lin 
763251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
773251364cSHisping Lin 						    TEEC_NONE,
783251364cSHisping Lin 						    TEEC_NONE,
793251364cSHisping Lin 						    TEEC_NONE);
803251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
81b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
82b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
83b9a7e756SHisping Lin 	else
84b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
853251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
863251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
873251364cSHisping Lin #endif
883251364cSHisping Lin 
89ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
90ae8ec5e1SHisping Lin 				&TeecSession,
91ae8ec5e1SHisping Lin 				TeecUuid,
92ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
93ae8ec5e1SHisping Lin 				NULL,
943251364cSHisping Lin 				&TeecOperation,
95ae8ec5e1SHisping Lin 				&ErrorOrigin);
96f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
97f4e1db95SHisping Lin 		return TeecResult;
98ae8ec5e1SHisping Lin 
99ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
100ae8ec5e1SHisping Lin 
101*c7de5349SHisping Lin 	SharedMem0.size = filename_size;
102ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
103ae8ec5e1SHisping Lin 
104ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
105f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
106f4e1db95SHisping Lin 		goto exit;
107ae8ec5e1SHisping Lin 
108*c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
109ae8ec5e1SHisping Lin 
110ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
111ae8ec5e1SHisping Lin 
112*c7de5349SHisping Lin 	SharedMem1.size = data_size;
113*c7de5349SHisping Lin 	SharedMem1.flags = 0;
114*c7de5349SHisping Lin 
115*c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
116*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
117*c7de5349SHisping Lin 		goto exit;
118*c7de5349SHisping Lin 
119*c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
120*c7de5349SHisping Lin 
121*c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
122*c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
123*c7de5349SHisping Lin 
124*c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
125*c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
126*c7de5349SHisping Lin 
127*c7de5349SHisping Lin 
128*c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
129*c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
130*c7de5349SHisping Lin 						TEEC_NONE,
131*c7de5349SHisping Lin 						TEEC_NONE);
132*c7de5349SHisping Lin 
133*c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
134*c7de5349SHisping Lin 					1,
135*c7de5349SHisping Lin 					&TeecOperation,
136*c7de5349SHisping Lin 					&ErrorOrigin);
137*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
138*c7de5349SHisping Lin 		goto exit;
139*c7de5349SHisping Lin exit:
140*c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
141*c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
142*c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
143*c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
144*c7de5349SHisping Lin 
145*c7de5349SHisping Lin 	return TeecResult;
146*c7de5349SHisping Lin }
147*c7de5349SHisping Lin 
148*c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
149*c7de5349SHisping Lin 					       uint32_t filename_size,
150*c7de5349SHisping Lin 					       uint8_t *data,
151*c7de5349SHisping Lin 					       uint32_t data_size)
152*c7de5349SHisping Lin {
153*c7de5349SHisping Lin 	TEEC_Result TeecResult;
154*c7de5349SHisping Lin 	TEEC_Context TeecContext;
155*c7de5349SHisping Lin 	TEEC_Session TeecSession;
156*c7de5349SHisping Lin 	uint32_t ErrorOrigin;
157*c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
158*c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
159*c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
160*c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
161*c7de5349SHisping Lin 
162*c7de5349SHisping Lin 	struct blk_desc *dev_desc;
163*c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
164*c7de5349SHisping Lin 	if (!dev_desc) {
165*c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
166*c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
167*c7de5349SHisping Lin 	}
168*c7de5349SHisping Lin 
169*c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
170*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
171*c7de5349SHisping Lin 		return TeecResult;
172*c7de5349SHisping Lin 
173*c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
174*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
175*c7de5349SHisping Lin 		return TeecResult;
176*c7de5349SHisping Lin 
177*c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
178*c7de5349SHisping Lin 						TEEC_NONE,
179*c7de5349SHisping Lin 						TEEC_NONE,
180*c7de5349SHisping Lin 						TEEC_NONE);
181*c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
182*c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
183*c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
184*c7de5349SHisping Lin 	else
185*c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
186*c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
187*c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
188*c7de5349SHisping Lin #endif
189*c7de5349SHisping Lin 
190*c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
191*c7de5349SHisping Lin 				&TeecSession,
192*c7de5349SHisping Lin 				TeecUuid,
193*c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
194*c7de5349SHisping Lin 				NULL,
195*c7de5349SHisping Lin 				&TeecOperation,
196*c7de5349SHisping Lin 				&ErrorOrigin);
197*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
198*c7de5349SHisping Lin 		return TeecResult;
199*c7de5349SHisping Lin 
200*c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
201*c7de5349SHisping Lin 
202*c7de5349SHisping Lin 	SharedMem0.size = filename_size;
203*c7de5349SHisping Lin 	SharedMem0.flags = 0;
204*c7de5349SHisping Lin 
205*c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
206*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
207*c7de5349SHisping Lin 		goto exit;
208*c7de5349SHisping Lin 
209*c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
210*c7de5349SHisping Lin 
211*c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
212*c7de5349SHisping Lin 
213*c7de5349SHisping Lin 	SharedMem1.size = data_size;
214ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
215ae8ec5e1SHisping Lin 
216ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
217f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
218f4e1db95SHisping Lin 		goto exit;
219ae8ec5e1SHisping Lin 
220ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
221ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
222ae8ec5e1SHisping Lin 
223ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
224ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
225ae8ec5e1SHisping Lin 
226ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
227ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
228ae8ec5e1SHisping Lin 						TEEC_NONE,
229ae8ec5e1SHisping Lin 						TEEC_NONE);
230ae8ec5e1SHisping Lin 
231ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
232ae8ec5e1SHisping Lin 					0,
233ae8ec5e1SHisping Lin 					&TeecOperation,
234ae8ec5e1SHisping Lin 					&ErrorOrigin);
23546b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
236*c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
237f4e1db95SHisping Lin exit:
238ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
239ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
240ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
24146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
242ae8ec5e1SHisping Lin 
243ae8ec5e1SHisping Lin 	return TeecResult;
244ae8ec5e1SHisping Lin }
245ae8ec5e1SHisping Lin 
246*c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
247*c7de5349SHisping Lin {
248*c7de5349SHisping Lin 	TEEC_Result TeecResult;
249*c7de5349SHisping Lin 	TEEC_Context TeecContext;
250*c7de5349SHisping Lin 	TEEC_Session TeecSession;
251*c7de5349SHisping Lin 	uint32_t ErrorOrigin;
252*c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
253*c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
254*c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
255*c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
256*c7de5349SHisping Lin 
257*c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
258*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
259*c7de5349SHisping Lin 		return TeecResult;
260*c7de5349SHisping Lin 
261*c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
262*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
263*c7de5349SHisping Lin 		return TeecResult;
264*c7de5349SHisping Lin 
265*c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
266*c7de5349SHisping Lin 				&TeecSession,
267*c7de5349SHisping Lin 				TeecUuid,
268*c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
269*c7de5349SHisping Lin 				NULL,
270*c7de5349SHisping Lin 				NULL,
271*c7de5349SHisping Lin 				&ErrorOrigin);
272*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
273*c7de5349SHisping Lin 		return TeecResult;
274*c7de5349SHisping Lin 
275*c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
276*c7de5349SHisping Lin 						    TEEC_NONE,
277*c7de5349SHisping Lin 						    TEEC_NONE,
278*c7de5349SHisping Lin 						    TEEC_NONE);
279*c7de5349SHisping Lin 
280*c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
281*c7de5349SHisping Lin 					2,
282*c7de5349SHisping Lin 					&TeecOperation,
283*c7de5349SHisping Lin 					&ErrorOrigin);
284*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
285*c7de5349SHisping Lin 		goto exit;
286*c7de5349SHisping Lin exit:
287*c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
288*c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
289*c7de5349SHisping Lin 
290*c7de5349SHisping Lin 	return TeecResult;
291*c7de5349SHisping Lin }
292*c7de5349SHisping Lin 
293*c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
294*c7de5349SHisping Lin {
295*c7de5349SHisping Lin 	char hs[9];
296*c7de5349SHisping Lin 
297*c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
298*c7de5349SHisping Lin 
299*c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
300*c7de5349SHisping Lin }
301*c7de5349SHisping Lin 
302ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
303ae8ec5e1SHisping Lin {
304*c7de5349SHisping Lin 	char hs[9];
3053251364cSHisping Lin 
306*c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
307ae8ec5e1SHisping Lin 
308*c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
309ae8ec5e1SHisping Lin }
310ae8ec5e1SHisping Lin 
311ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
312ae8ec5e1SHisping Lin {
313*c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
314*c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
315ae8ec5e1SHisping Lin }
316ae8ec5e1SHisping Lin 
317ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
318ae8ec5e1SHisping Lin {
319*c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
320*c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
3216651d4c0SJason Zhu }
322ae8ec5e1SHisping Lin 
323*c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
324*c7de5349SHisping Lin {
325*c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
326*c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
327*c7de5349SHisping Lin }
328ae8ec5e1SHisping Lin 
329*c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
330*c7de5349SHisping Lin {
331*c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
332*c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
333ae8ec5e1SHisping Lin }
334ae8ec5e1SHisping Lin 
335564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
336564654ebSJason Zhu 					      uint32_t size)
337564654ebSJason Zhu {
338*c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
339*c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
340564654ebSJason Zhu }
341564654ebSJason Zhu 
342564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
343564654ebSJason Zhu 					       uint32_t size)
344564654ebSJason Zhu {
345*c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
346*c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
347564654ebSJason Zhu }
348564654ebSJason Zhu 
349ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
350ae8ec5e1SHisping Lin {
351*c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
352*c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
353ae8ec5e1SHisping Lin }
354ae8ec5e1SHisping Lin 
355ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
356ae8ec5e1SHisping Lin {
357*c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
358*c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
359ae8ec5e1SHisping Lin }
360ae8ec5e1SHisping Lin 
361ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
362ae8ec5e1SHisping Lin {
363*c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
364*c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
365*c7de5349SHisping Lin }
366*c7de5349SHisping Lin 
367*c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
368*c7de5349SHisping Lin {
369*c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
370*c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
371*c7de5349SHisping Lin }
372*c7de5349SHisping Lin 
373*c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
374*c7de5349SHisping Lin {
375ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
376ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
377ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
378ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
379*c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
380*c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
381*c7de5349SHisping Lin 
382ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
383ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
384ae8ec5e1SHisping Lin 
385f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
386f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
387f4e1db95SHisping Lin 		return TeecResult;
388ae8ec5e1SHisping Lin 
389ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
390f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
391f4e1db95SHisping Lin 		return TeecResult;
392ae8ec5e1SHisping Lin 
393ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
394ae8ec5e1SHisping Lin 				      &TeecSession,
395ae8ec5e1SHisping Lin 				      TeecUuid,
396ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
397ae8ec5e1SHisping Lin 				      NULL,
398*c7de5349SHisping Lin 				      NULL,
399ae8ec5e1SHisping Lin 				      &ErrorOrigin);
400f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
401f4e1db95SHisping Lin 		return TeecResult;
402ae8ec5e1SHisping Lin 
403*c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
404*c7de5349SHisping Lin 						    TEEC_NONE,
405ae8ec5e1SHisping Lin 						    TEEC_NONE,
406ae8ec5e1SHisping Lin 						    TEEC_NONE);
407ae8ec5e1SHisping Lin 
408ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
409*c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
410ae8ec5e1SHisping Lin 					&TeecOperation,
411ae8ec5e1SHisping Lin 					&ErrorOrigin);
412*c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
413*c7de5349SHisping Lin 		goto exit;
414f4e1db95SHisping Lin exit:
415ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
41646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
417ae8ec5e1SHisping Lin 
418ae8ec5e1SHisping Lin 	return TeecResult;
419ae8ec5e1SHisping Lin }
420ae8ec5e1SHisping Lin 
421*c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
422*c7de5349SHisping Lin 						   uint8_t is_write,
423*c7de5349SHisping Lin 						   uint32_t *buf,
424*c7de5349SHisping Lin 						   uint32_t length)
425ae8ec5e1SHisping Lin {
426ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
427ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
428ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
429ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
430*c7de5349SHisping Lin 
431*c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
432*c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
433ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
434ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
435ae8ec5e1SHisping Lin 
436f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
437f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
438f4e1db95SHisping Lin 		return TeecResult;
439ae8ec5e1SHisping Lin 
440ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
441f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
442f4e1db95SHisping Lin 		return TeecResult;
443ae8ec5e1SHisping Lin 
444ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
445ae8ec5e1SHisping Lin 				&TeecSession,
446ae8ec5e1SHisping Lin 				TeecUuid,
447ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
448ae8ec5e1SHisping Lin 				NULL,
449*c7de5349SHisping Lin 				NULL,
450ae8ec5e1SHisping Lin 				&ErrorOrigin);
451f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
452f4e1db95SHisping Lin 		return TeecResult;
453ae8ec5e1SHisping Lin 
454ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
455ae8ec5e1SHisping Lin 
456*c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
457ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
458ae8ec5e1SHisping Lin 
459ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
460f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
461f4e1db95SHisping Lin 		goto exit;
462ae8ec5e1SHisping Lin 
463ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
464ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
465ae8ec5e1SHisping Lin 
466*c7de5349SHisping Lin 	if (is_write) {
467*c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
468ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
469*c7de5349SHisping Lin 							    TEEC_NONE,
470ae8ec5e1SHisping Lin 							    TEEC_NONE,
471ae8ec5e1SHisping Lin 							    TEEC_NONE);
472ae8ec5e1SHisping Lin 
473*c7de5349SHisping Lin 	} else {
474*c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
475*c7de5349SHisping Lin 							    TEEC_NONE,
476*c7de5349SHisping Lin 							    TEEC_NONE,
477*c7de5349SHisping Lin 							    TEEC_NONE);
478*c7de5349SHisping Lin 	}
479*c7de5349SHisping Lin 
480ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
481*c7de5349SHisping Lin 					cmd,
482ae8ec5e1SHisping Lin 					&TeecOperation,
483ae8ec5e1SHisping Lin 					&ErrorOrigin);
484f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
485f4e1db95SHisping Lin 		goto exit;
486*c7de5349SHisping Lin 
487*c7de5349SHisping Lin 	if (!is_write)
488*c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
489*c7de5349SHisping Lin 
490f4e1db95SHisping Lin exit:
491ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
492ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
49346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
494ae8ec5e1SHisping Lin 
495ae8ec5e1SHisping Lin 	return TeecResult;
496ae8ec5e1SHisping Lin }
497ae8ec5e1SHisping Lin 
4986ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
4996ef445a4SHisping Lin {
500*c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
501*c7de5349SHisping Lin 						  false, buf, length);
5026ef445a4SHisping Lin }
5036ef445a4SHisping Lin 
5046ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5056ef445a4SHisping Lin {
506*c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
507*c7de5349SHisping Lin 						  true, buf, length);
50816539616SHisping Lin }
50916539616SHisping Lin 
51016539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
51116539616SHisping Lin {
51216539616SHisping Lin 	TEEC_Result res;
513*c7de5349SHisping Lin 
514*c7de5349SHisping Lin 	res = trusty_base_end_security_data();
515*c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
51616539616SHisping Lin 	return res;
51716539616SHisping Lin }
5182cd27853SHisping Lin 
5192cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
5202cd27853SHisping Lin {
521*c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
522*c7de5349SHisping Lin 						  false, buf, length);
5232cd27853SHisping Lin }
524*c7de5349SHisping Lin 
5252cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
5262cd27853SHisping Lin {
527*c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
528*c7de5349SHisping Lin 						  true, buf, length);
5292cd27853SHisping Lin }
530095e2a82SHisping Lin 
531468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
532468df3b2SHisping Lin {
533468df3b2SHisping Lin 	uint32_t bootflag;
534*c7de5349SHisping Lin 	TEEC_Result TeecResult;
535468df3b2SHisping Lin 
536*c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
537*c7de5349SHisping Lin 							false, &bootflag, 1);
538468df3b2SHisping Lin 
539468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
5400202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
5410202ee8aSHisping Lin 		if (bootflag == 0x00000001)
5420202ee8aSHisping Lin 			*flag = 1;
5430202ee8aSHisping Lin #else
544468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
545468df3b2SHisping Lin 			*flag = 1;
5460202ee8aSHisping Lin #endif
547468df3b2SHisping Lin 	}
548095e2a82SHisping Lin 	return TeecResult;
549095e2a82SHisping Lin }
5504aa61755SAndy Ye 
5514aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
5524aa61755SAndy Ye {
5534aa61755SAndy Ye 	TEEC_Result TeecResult;
5544aa61755SAndy Ye 	TEEC_Context TeecContext;
5554aa61755SAndy Ye 	TEEC_Session TeecSession;
5564aa61755SAndy Ye 	uint32_t ErrorOrigin;
5574aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
5584aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
5594aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
5604aa61755SAndy Ye 				}
5614aa61755SAndy Ye 			     };
5624aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
5634aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
5643251364cSHisping Lin 	struct blk_desc *dev_desc;
5653251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
5666651d4c0SJason Zhu 	if (!dev_desc) {
5676651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
5686651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
5696651d4c0SJason Zhu 	}
5704aa61755SAndy Ye 
571f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
572f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
573f4e1db95SHisping Lin 		return TeecResult;
5744aa61755SAndy Ye 
5754aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
576f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
577f4e1db95SHisping Lin 		return TeecResult;
5784aa61755SAndy Ye 
5793251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
5803251364cSHisping Lin 						TEEC_NONE,
5813251364cSHisping Lin 						TEEC_NONE,
5823251364cSHisping Lin 						TEEC_NONE);
5833251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
584b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
585b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
586b9a7e756SHisping Lin 	else
587b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
588b9a7e756SHisping Lin 
5893251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
5903251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
5913251364cSHisping Lin #endif
5923251364cSHisping Lin 
5934aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
5944aa61755SAndy Ye 				      &TeecSession,
5954aa61755SAndy Ye 				      TeecUuid,
5964aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
5974aa61755SAndy Ye 				      NULL,
5983251364cSHisping Lin 					&TeecOperation,
5994aa61755SAndy Ye 				      &ErrorOrigin);
600f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
601f4e1db95SHisping Lin 		return TeecResult;
6024aa61755SAndy Ye 
6034aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
6044aa61755SAndy Ye 
6054aa61755SAndy Ye 	SharedMem0.size = *dh_size;
6064aa61755SAndy Ye 	SharedMem0.flags = 0;
6074aa61755SAndy Ye 
6084aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
609f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
610f4e1db95SHisping Lin 		goto exit;
6114aa61755SAndy Ye 
6124aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
6134aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
6144aa61755SAndy Ye 
6154aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
6164aa61755SAndy Ye 						    TEEC_NONE,
6174aa61755SAndy Ye 						    TEEC_NONE,
6184aa61755SAndy Ye 						    TEEC_NONE);
6194aa61755SAndy Ye 
6204aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
6214aa61755SAndy Ye 					143,
6224aa61755SAndy Ye 					&TeecOperation,
6234aa61755SAndy Ye 					&ErrorOrigin);
624f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
625f4e1db95SHisping Lin 		goto exit;
6264aa61755SAndy Ye 
6274aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
6284aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
629f4e1db95SHisping Lin exit:
6304aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
6314aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
632f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
6334aa61755SAndy Ye 
6344aa61755SAndy Ye 	return TeecResult;
6354aa61755SAndy Ye }
6364aa61755SAndy Ye 
6374aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
6384aa61755SAndy Ye {
6394aa61755SAndy Ye 	TEEC_Result TeecResult;
6404aa61755SAndy Ye 	TEEC_Context TeecContext;
6414aa61755SAndy Ye 	TEEC_Session TeecSession;
6424aa61755SAndy Ye 	uint32_t ErrorOrigin;
6434aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
6444aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
6454aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
6464aa61755SAndy Ye 				}
6474aa61755SAndy Ye 			     };
6484aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
6494aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
6503251364cSHisping Lin 	struct blk_desc *dev_desc;
6513251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
6526651d4c0SJason Zhu 	if (!dev_desc) {
6536651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
6546651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
6556651d4c0SJason Zhu 	}
6564aa61755SAndy Ye 
657f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
658f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
659f4e1db95SHisping Lin 		return TeecResult;
6604aa61755SAndy Ye 
6614aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
662f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
663f4e1db95SHisping Lin 		return TeecResult;
6644aa61755SAndy Ye 
6653251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6663251364cSHisping Lin 						TEEC_NONE,
6673251364cSHisping Lin 						TEEC_NONE,
6683251364cSHisping Lin 						TEEC_NONE);
6693251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
670b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
671b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
672b9a7e756SHisping Lin 	else
673b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
674b9a7e756SHisping Lin 
6753251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6763251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6773251364cSHisping Lin #endif
6783251364cSHisping Lin 
6794aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
6804aa61755SAndy Ye 				      &TeecSession,
6814aa61755SAndy Ye 				      TeecUuid,
6824aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
6834aa61755SAndy Ye 				      NULL,
6843251364cSHisping Lin 					&TeecOperation,
6854aa61755SAndy Ye 				      &ErrorOrigin);
686f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
687f4e1db95SHisping Lin 		return TeecResult;
6884aa61755SAndy Ye 
6894aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
6904aa61755SAndy Ye 
6914aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
6924aa61755SAndy Ye 	SharedMem0.flags = 0;
6934aa61755SAndy Ye 
6944aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
695f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
696f4e1db95SHisping Lin 		goto exit;
6974aa61755SAndy Ye 
6984aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
6994aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
7004aa61755SAndy Ye 
7014aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
7024aa61755SAndy Ye 						    TEEC_NONE,
7034aa61755SAndy Ye 						    TEEC_NONE,
7044aa61755SAndy Ye 						    TEEC_NONE);
7054aa61755SAndy Ye 
7064aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
7074aa61755SAndy Ye 					144,
7084aa61755SAndy Ye 					&TeecOperation,
7094aa61755SAndy Ye 					&ErrorOrigin);
710f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
711f4e1db95SHisping Lin 		goto exit;
7124aa61755SAndy Ye 
7134aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
7144aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
715f4e1db95SHisping Lin exit:
7164aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
7174aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
718f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
7194aa61755SAndy Ye 
7204aa61755SAndy Ye 	return TeecResult;
7214aa61755SAndy Ye }
7224aa61755SAndy Ye 
7234aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
7244aa61755SAndy Ye 			      uint32_t *operation_size,
7254aa61755SAndy Ye 			      uint8_t *out,
7264aa61755SAndy Ye 			      uint32_t *out_len)
7274aa61755SAndy Ye {
7284aa61755SAndy Ye 	TEEC_Result TeecResult;
7294aa61755SAndy Ye 	TEEC_Context TeecContext;
7304aa61755SAndy Ye 	TEEC_Session TeecSession;
7314aa61755SAndy Ye 	uint32_t ErrorOrigin;
7324aa61755SAndy Ye 
7334aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
7344aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
7354aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
7364aa61755SAndy Ye 				}
7374aa61755SAndy Ye 			     };
7384aa61755SAndy Ye 
7394aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
7404aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
7413251364cSHisping Lin 	struct blk_desc *dev_desc;
7423251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7436651d4c0SJason Zhu 	if (!dev_desc) {
7446651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7456651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7466651d4c0SJason Zhu 	}
7474aa61755SAndy Ye 
748f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
749f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
750f4e1db95SHisping Lin 		return TeecResult;
7514aa61755SAndy Ye 
7524aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
753f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
754f4e1db95SHisping Lin 		return TeecResult;
7554aa61755SAndy Ye 
7563251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7573251364cSHisping Lin 						TEEC_NONE,
7583251364cSHisping Lin 						TEEC_NONE,
7593251364cSHisping Lin 						TEEC_NONE);
7603251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
761b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
762b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
763b9a7e756SHisping Lin 	else
764b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
765b9a7e756SHisping Lin 
7663251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7673251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7683251364cSHisping Lin #endif
7693251364cSHisping Lin 
7704aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
7714aa61755SAndy Ye 				      &TeecSession,
7724aa61755SAndy Ye 				      TeecUuid,
7734aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
7744aa61755SAndy Ye 				      NULL,
7753251364cSHisping Lin 					&TeecOperation,
7764aa61755SAndy Ye 				      &ErrorOrigin);
777f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
778f4e1db95SHisping Lin 		return TeecResult;
7794aa61755SAndy Ye 
7804aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
7814aa61755SAndy Ye 
7824aa61755SAndy Ye 	SharedMem0.size = *operation_size;
7834aa61755SAndy Ye 	SharedMem0.flags = 0;
7844aa61755SAndy Ye 
7854aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
786f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
787f4e1db95SHisping Lin 		goto exit;
7884aa61755SAndy Ye 
7894aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
7904aa61755SAndy Ye 
7914aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
7924aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
7934aa61755SAndy Ye 
7944aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
7954aa61755SAndy Ye 
7964aa61755SAndy Ye 	SharedMem1.size = *out_len;
7974aa61755SAndy Ye 	SharedMem1.flags = 0;
7984aa61755SAndy Ye 
7994aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
800f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
801f4e1db95SHisping Lin 		goto exit;
8024aa61755SAndy Ye 
8034aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
8044aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
8054aa61755SAndy Ye 
8064aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
8074aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
8084aa61755SAndy Ye 						    TEEC_NONE,
8094aa61755SAndy Ye 						    TEEC_NONE);
8104aa61755SAndy Ye 
8114aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8124aa61755SAndy Ye 					145,
8134aa61755SAndy Ye 					&TeecOperation,
8144aa61755SAndy Ye 					&ErrorOrigin);
815f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
816f4e1db95SHisping Lin 		goto exit;
8174aa61755SAndy Ye 
8184aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
8194aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
820f4e1db95SHisping Lin exit:
8214aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
8224aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
823f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
824f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8254aa61755SAndy Ye 
8264aa61755SAndy Ye 	return TeecResult;
8274aa61755SAndy Ye }
8284aa61755SAndy Ye 
8294aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
8304aa61755SAndy Ye {
8314aa61755SAndy Ye 	TEEC_Result TeecResult;
8324aa61755SAndy Ye 	TEEC_Context TeecContext;
8334aa61755SAndy Ye 	TEEC_Session TeecSession;
8344aa61755SAndy Ye 	uint32_t ErrorOrigin;
8354aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
8364aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
8374aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
8384aa61755SAndy Ye 				}
8394aa61755SAndy Ye 			     };
8404aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
8414aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
8423251364cSHisping Lin 	struct blk_desc *dev_desc;
8433251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8446651d4c0SJason Zhu 	if (!dev_desc) {
8456651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8466651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8476651d4c0SJason Zhu 	}
848f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
849f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
850f4e1db95SHisping Lin 		return TeecResult;
8514aa61755SAndy Ye 
8524aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
853f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
854f4e1db95SHisping Lin 		return TeecResult;
8554aa61755SAndy Ye 
8563251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8573251364cSHisping Lin 						TEEC_NONE,
8583251364cSHisping Lin 						TEEC_NONE,
8593251364cSHisping Lin 						TEEC_NONE);
8603251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
861b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
862b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
863b9a7e756SHisping Lin 	else
864b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
865b9a7e756SHisping Lin 
8663251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8673251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8683251364cSHisping Lin #endif
8693251364cSHisping Lin 
8704aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
8714aa61755SAndy Ye 					&TeecSession,
8724aa61755SAndy Ye 					TeecUuid,
8734aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
8744aa61755SAndy Ye 					NULL,
8753251364cSHisping Lin 					&TeecOperation,
8764aa61755SAndy Ye 					&ErrorOrigin);
877f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
878f4e1db95SHisping Lin 		return TeecResult;
8794aa61755SAndy Ye 
8804aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
8814aa61755SAndy Ye 
8824aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
8834aa61755SAndy Ye 	SharedMem0.flags = 0;
8844aa61755SAndy Ye 
8854aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
886f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
887f4e1db95SHisping Lin 		goto exit;
8884aa61755SAndy Ye 
8894aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
8904aa61755SAndy Ye 
8914aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
8924aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
8934aa61755SAndy Ye 
8944aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
8954aa61755SAndy Ye 						    TEEC_NONE,
8964aa61755SAndy Ye 						    TEEC_NONE,
8974aa61755SAndy Ye 						    TEEC_NONE);
8984aa61755SAndy Ye 
8994aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9004aa61755SAndy Ye 					146,
9014aa61755SAndy Ye 					&TeecOperation,
9024aa61755SAndy Ye 					&ErrorOrigin);
903f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
904f4e1db95SHisping Lin 		goto exit;
905f4e1db95SHisping Lin exit:
9064aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
9074aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
908f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9094aa61755SAndy Ye 
9104aa61755SAndy Ye 	return TeecResult;
9114aa61755SAndy Ye }
912