xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision d591335098d8b664a285ac9665dbb5d1d3fa48ca)
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
24fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG	10
25f39d4289SHisping Lin #define STORAGE_CMD_WRITE_OEM_HUK		11
26*d5913350SHisping Lin #define STORAGE_CMD_WRITE_OEM_NS_OTP		12
27*d5913350SHisping Lin #define STORAGE_CMD_READ_OEM_NS_OTP		13
28ae8ec5e1SHisping Lin 
29ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
30ae8ec5e1SHisping Lin {
31ae8ec5e1SHisping Lin 	if (in > 9)
32ae8ec5e1SHisping Lin 		return in + 55;
33ae8ec5e1SHisping Lin 	else
34ae8ec5e1SHisping Lin 		return in + 48;
35ae8ec5e1SHisping Lin }
36ae8ec5e1SHisping Lin 
37c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
38ae8ec5e1SHisping Lin {
39ae8ec5e1SHisping Lin 	uint32_t i = 0;
40ae8ec5e1SHisping Lin 
41ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
42ae8ec5e1SHisping Lin 		return 0;
43ae8ec5e1SHisping Lin 
44ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
45ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
46ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
47ae8ec5e1SHisping Lin 	}
48ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
49ae8ec5e1SHisping Lin 
50ae8ec5e1SHisping Lin 	return blen * 2;
51ae8ec5e1SHisping Lin }
52ae8ec5e1SHisping Lin 
53c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
54c7de5349SHisping Lin 						uint32_t filename_size,
55c7de5349SHisping Lin 						uint8_t *data,
56c7de5349SHisping Lin 						uint32_t data_size)
57ae8ec5e1SHisping Lin {
58ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
59ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
60ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
61ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
62ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
63ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
64ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
65ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
663251364cSHisping Lin 	struct blk_desc *dev_desc;
673251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
686651d4c0SJason Zhu 	if (!dev_desc) {
696651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
706651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
716651d4c0SJason Zhu 	}
723251364cSHisping Lin 
73f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
74f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
75f4e1db95SHisping Lin 		return TeecResult;
76ae8ec5e1SHisping Lin 
77ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
78f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
79f4e1db95SHisping Lin 		return TeecResult;
80ae8ec5e1SHisping Lin 
813251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
823251364cSHisping Lin 						    TEEC_NONE,
833251364cSHisping Lin 						    TEEC_NONE,
843251364cSHisping Lin 						    TEEC_NONE);
853251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
86b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
87b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
88b9a7e756SHisping Lin 	else
89b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
903251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
913251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
923251364cSHisping Lin #endif
933251364cSHisping Lin 
94ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
95ae8ec5e1SHisping Lin 				&TeecSession,
96ae8ec5e1SHisping Lin 				TeecUuid,
97ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
98ae8ec5e1SHisping Lin 				NULL,
993251364cSHisping Lin 				&TeecOperation,
100ae8ec5e1SHisping Lin 				&ErrorOrigin);
101f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
102f4e1db95SHisping Lin 		return TeecResult;
103ae8ec5e1SHisping Lin 
104ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
105ae8ec5e1SHisping Lin 
106c7de5349SHisping Lin 	SharedMem0.size = filename_size;
107ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
108ae8ec5e1SHisping Lin 
109ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
110f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
111f4e1db95SHisping Lin 		goto exit;
112ae8ec5e1SHisping Lin 
113c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
114ae8ec5e1SHisping Lin 
115ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
116ae8ec5e1SHisping Lin 
117c7de5349SHisping Lin 	SharedMem1.size = data_size;
118c7de5349SHisping Lin 	SharedMem1.flags = 0;
119c7de5349SHisping Lin 
120c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
121c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
122c7de5349SHisping Lin 		goto exit;
123c7de5349SHisping Lin 
124c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
125c7de5349SHisping Lin 
126c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
127c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
128c7de5349SHisping Lin 
129c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
130c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
131c7de5349SHisping Lin 
132c7de5349SHisping Lin 
133c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
134c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
135c7de5349SHisping Lin 						TEEC_NONE,
136c7de5349SHisping Lin 						TEEC_NONE);
137c7de5349SHisping Lin 
138c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
139c7de5349SHisping Lin 					1,
140c7de5349SHisping Lin 					&TeecOperation,
141c7de5349SHisping Lin 					&ErrorOrigin);
142c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
143c7de5349SHisping Lin 		goto exit;
144c7de5349SHisping Lin exit:
145c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
146c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
147c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
148c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
149c7de5349SHisping Lin 
150c7de5349SHisping Lin 	return TeecResult;
151c7de5349SHisping Lin }
152c7de5349SHisping Lin 
153c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
154c7de5349SHisping Lin 					       uint32_t filename_size,
155c7de5349SHisping Lin 					       uint8_t *data,
156c7de5349SHisping Lin 					       uint32_t data_size)
157c7de5349SHisping Lin {
158c7de5349SHisping Lin 	TEEC_Result TeecResult;
159c7de5349SHisping Lin 	TEEC_Context TeecContext;
160c7de5349SHisping Lin 	TEEC_Session TeecSession;
161c7de5349SHisping Lin 	uint32_t ErrorOrigin;
162c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
163c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
164c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
165c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
166c7de5349SHisping Lin 
167c7de5349SHisping Lin 	struct blk_desc *dev_desc;
168c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
169c7de5349SHisping Lin 	if (!dev_desc) {
170c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
171c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
172c7de5349SHisping Lin 	}
173c7de5349SHisping Lin 
174c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
175c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
176c7de5349SHisping Lin 		return TeecResult;
177c7de5349SHisping Lin 
178c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
179c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
180c7de5349SHisping Lin 		return TeecResult;
181c7de5349SHisping Lin 
182c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
183c7de5349SHisping Lin 						TEEC_NONE,
184c7de5349SHisping Lin 						TEEC_NONE,
185c7de5349SHisping Lin 						TEEC_NONE);
186c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
187c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
188c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
189c7de5349SHisping Lin 	else
190c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
191c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
192c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
193c7de5349SHisping Lin #endif
194c7de5349SHisping Lin 
195c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
196c7de5349SHisping Lin 				&TeecSession,
197c7de5349SHisping Lin 				TeecUuid,
198c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
199c7de5349SHisping Lin 				NULL,
200c7de5349SHisping Lin 				&TeecOperation,
201c7de5349SHisping Lin 				&ErrorOrigin);
202c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
203c7de5349SHisping Lin 		return TeecResult;
204c7de5349SHisping Lin 
205c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
206c7de5349SHisping Lin 
207c7de5349SHisping Lin 	SharedMem0.size = filename_size;
208c7de5349SHisping Lin 	SharedMem0.flags = 0;
209c7de5349SHisping Lin 
210c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
211c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
212c7de5349SHisping Lin 		goto exit;
213c7de5349SHisping Lin 
214c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
215c7de5349SHisping Lin 
216c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
217c7de5349SHisping Lin 
218c7de5349SHisping Lin 	SharedMem1.size = data_size;
219ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
220ae8ec5e1SHisping Lin 
221ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
222f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
223f4e1db95SHisping Lin 		goto exit;
224ae8ec5e1SHisping Lin 
225ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
226ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
227ae8ec5e1SHisping Lin 
228ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
229ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
230ae8ec5e1SHisping Lin 
231ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
232ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
233ae8ec5e1SHisping Lin 						TEEC_NONE,
234ae8ec5e1SHisping Lin 						TEEC_NONE);
235ae8ec5e1SHisping Lin 
236ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
237ae8ec5e1SHisping Lin 					0,
238ae8ec5e1SHisping Lin 					&TeecOperation,
239ae8ec5e1SHisping Lin 					&ErrorOrigin);
24046b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
241c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
242f4e1db95SHisping Lin exit:
243ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
244ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
245ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
24646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
247ae8ec5e1SHisping Lin 
248ae8ec5e1SHisping Lin 	return TeecResult;
249ae8ec5e1SHisping Lin }
250ae8ec5e1SHisping Lin 
251c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
252c7de5349SHisping Lin {
253c7de5349SHisping Lin 	TEEC_Result TeecResult;
254c7de5349SHisping Lin 	TEEC_Context TeecContext;
255c7de5349SHisping Lin 	TEEC_Session TeecSession;
256c7de5349SHisping Lin 	uint32_t ErrorOrigin;
257c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
258c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
259c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
260c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
261c7de5349SHisping Lin 
262c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
263c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
264c7de5349SHisping Lin 		return TeecResult;
265c7de5349SHisping Lin 
266c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
267c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
268c7de5349SHisping Lin 		return TeecResult;
269c7de5349SHisping Lin 
270c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
271c7de5349SHisping Lin 				&TeecSession,
272c7de5349SHisping Lin 				TeecUuid,
273c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
274c7de5349SHisping Lin 				NULL,
275c7de5349SHisping Lin 				NULL,
276c7de5349SHisping Lin 				&ErrorOrigin);
277c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
278c7de5349SHisping Lin 		return TeecResult;
279c7de5349SHisping Lin 
280c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
281c7de5349SHisping Lin 						    TEEC_NONE,
282c7de5349SHisping Lin 						    TEEC_NONE,
283c7de5349SHisping Lin 						    TEEC_NONE);
284c7de5349SHisping Lin 
285c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
286c7de5349SHisping Lin 					2,
287c7de5349SHisping Lin 					&TeecOperation,
288c7de5349SHisping Lin 					&ErrorOrigin);
289c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
290c7de5349SHisping Lin 		goto exit;
291c7de5349SHisping Lin exit:
292c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
293c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
294c7de5349SHisping Lin 
295c7de5349SHisping Lin 	return TeecResult;
296c7de5349SHisping Lin }
297c7de5349SHisping Lin 
298c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
299c7de5349SHisping Lin {
300c7de5349SHisping Lin 	char hs[9];
301c7de5349SHisping Lin 
302c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
303c7de5349SHisping Lin 
304c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
305c7de5349SHisping Lin }
306c7de5349SHisping Lin 
307ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
308ae8ec5e1SHisping Lin {
309c7de5349SHisping Lin 	char hs[9];
3103251364cSHisping Lin 
311c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
312ae8ec5e1SHisping Lin 
313c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
314ae8ec5e1SHisping Lin }
315ae8ec5e1SHisping Lin 
316ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
317ae8ec5e1SHisping Lin {
318c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
319c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
320ae8ec5e1SHisping Lin }
321ae8ec5e1SHisping Lin 
322ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
323ae8ec5e1SHisping Lin {
324c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
325c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
3266651d4c0SJason Zhu }
327ae8ec5e1SHisping Lin 
328c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
329c7de5349SHisping Lin {
330c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
331c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
332c7de5349SHisping Lin }
333ae8ec5e1SHisping Lin 
334c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
335c7de5349SHisping Lin {
336c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
337c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
338ae8ec5e1SHisping Lin }
339ae8ec5e1SHisping Lin 
340564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
341564654ebSJason Zhu 					      uint32_t size)
342564654ebSJason Zhu {
343c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
344c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
345564654ebSJason Zhu }
346564654ebSJason Zhu 
347564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
348564654ebSJason Zhu 					       uint32_t size)
349564654ebSJason Zhu {
350c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
351c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
352564654ebSJason Zhu }
353564654ebSJason Zhu 
354ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
355ae8ec5e1SHisping Lin {
356c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
357c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
358ae8ec5e1SHisping Lin }
359ae8ec5e1SHisping Lin 
360ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
361ae8ec5e1SHisping Lin {
362c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
363c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
364ae8ec5e1SHisping Lin }
365ae8ec5e1SHisping Lin 
366ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
367ae8ec5e1SHisping Lin {
368c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
369c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
370c7de5349SHisping Lin }
371c7de5349SHisping Lin 
372c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
373c7de5349SHisping Lin {
374c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
375c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
376c7de5349SHisping Lin }
377c7de5349SHisping Lin 
378c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
379c7de5349SHisping Lin {
380ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
381ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
382ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
383ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
384c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
385c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
386c7de5349SHisping Lin 
387ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
388ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
389ae8ec5e1SHisping Lin 
390f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
391f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
392f4e1db95SHisping Lin 		return TeecResult;
393ae8ec5e1SHisping Lin 
394ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
395f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
396f4e1db95SHisping Lin 		return TeecResult;
397ae8ec5e1SHisping Lin 
398ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
399ae8ec5e1SHisping Lin 				      &TeecSession,
400ae8ec5e1SHisping Lin 				      TeecUuid,
401ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
402ae8ec5e1SHisping Lin 				      NULL,
403c7de5349SHisping Lin 				      NULL,
404ae8ec5e1SHisping Lin 				      &ErrorOrigin);
405f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
406f4e1db95SHisping Lin 		return TeecResult;
407ae8ec5e1SHisping Lin 
408c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
409c7de5349SHisping Lin 						    TEEC_NONE,
410ae8ec5e1SHisping Lin 						    TEEC_NONE,
411ae8ec5e1SHisping Lin 						    TEEC_NONE);
412ae8ec5e1SHisping Lin 
413ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
414c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
415ae8ec5e1SHisping Lin 					&TeecOperation,
416ae8ec5e1SHisping Lin 					&ErrorOrigin);
417c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
418c7de5349SHisping Lin 		goto exit;
419f4e1db95SHisping Lin exit:
420ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
42146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
422ae8ec5e1SHisping Lin 
423ae8ec5e1SHisping Lin 	return TeecResult;
424ae8ec5e1SHisping Lin }
425ae8ec5e1SHisping Lin 
426c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
427c7de5349SHisping Lin 						   uint8_t is_write,
428c7de5349SHisping Lin 						   uint32_t *buf,
429c7de5349SHisping Lin 						   uint32_t length)
430ae8ec5e1SHisping Lin {
431ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
432ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
433ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
434ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
435c7de5349SHisping Lin 
436c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
437c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
438ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
439ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
440ae8ec5e1SHisping Lin 
441f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
442f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
443f4e1db95SHisping Lin 		return TeecResult;
444ae8ec5e1SHisping Lin 
445ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
446f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
447f4e1db95SHisping Lin 		return TeecResult;
448ae8ec5e1SHisping Lin 
449ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
450ae8ec5e1SHisping Lin 				&TeecSession,
451ae8ec5e1SHisping Lin 				TeecUuid,
452ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
453ae8ec5e1SHisping Lin 				NULL,
454c7de5349SHisping Lin 				NULL,
455ae8ec5e1SHisping Lin 				&ErrorOrigin);
456f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
457f4e1db95SHisping Lin 		return TeecResult;
458ae8ec5e1SHisping Lin 
459ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
460ae8ec5e1SHisping Lin 
461c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
462ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
463ae8ec5e1SHisping Lin 
464ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
465f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
466f4e1db95SHisping Lin 		goto exit;
467ae8ec5e1SHisping Lin 
468ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
469ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
470ae8ec5e1SHisping Lin 
471c7de5349SHisping Lin 	if (is_write) {
472c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
473ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
474c7de5349SHisping Lin 							    TEEC_NONE,
475ae8ec5e1SHisping Lin 							    TEEC_NONE,
476ae8ec5e1SHisping Lin 							    TEEC_NONE);
477ae8ec5e1SHisping Lin 
478c7de5349SHisping Lin 	} else {
479c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
480c7de5349SHisping Lin 							    TEEC_NONE,
481c7de5349SHisping Lin 							    TEEC_NONE,
482c7de5349SHisping Lin 							    TEEC_NONE);
483c7de5349SHisping Lin 	}
484c7de5349SHisping Lin 
485ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
486c7de5349SHisping Lin 					cmd,
487ae8ec5e1SHisping Lin 					&TeecOperation,
488ae8ec5e1SHisping Lin 					&ErrorOrigin);
489f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
490f4e1db95SHisping Lin 		goto exit;
491c7de5349SHisping Lin 
492c7de5349SHisping Lin 	if (!is_write)
493c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
494c7de5349SHisping Lin 
495f4e1db95SHisping Lin exit:
496ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
497ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
49846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
499ae8ec5e1SHisping Lin 
500ae8ec5e1SHisping Lin 	return TeecResult;
501ae8ec5e1SHisping Lin }
502ae8ec5e1SHisping Lin 
5036ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5046ef445a4SHisping Lin {
505c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
506c7de5349SHisping Lin 						  false, buf, length);
5076ef445a4SHisping Lin }
5086ef445a4SHisping Lin 
5096ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5106ef445a4SHisping Lin {
511c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
512c7de5349SHisping Lin 						  true, buf, length);
51316539616SHisping Lin }
51416539616SHisping Lin 
51516539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
51616539616SHisping Lin {
51716539616SHisping Lin 	TEEC_Result res;
518c7de5349SHisping Lin 
519c7de5349SHisping Lin 	res = trusty_base_end_security_data();
520c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
52116539616SHisping Lin 	return res;
52216539616SHisping Lin }
5232cd27853SHisping Lin 
5242cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
5252cd27853SHisping Lin {
526c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
527c7de5349SHisping Lin 						  false, buf, length);
5282cd27853SHisping Lin }
529c7de5349SHisping Lin 
5302cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
5312cd27853SHisping Lin {
532c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
533c7de5349SHisping Lin 						  true, buf, length);
5342cd27853SHisping Lin }
535095e2a82SHisping Lin 
536468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
537468df3b2SHisping Lin {
538468df3b2SHisping Lin 	uint32_t bootflag;
539c7de5349SHisping Lin 	TEEC_Result TeecResult;
540468df3b2SHisping Lin 
541c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
542c7de5349SHisping Lin 							false, &bootflag, 1);
543468df3b2SHisping Lin 
544468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
5450202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
5460202ee8aSHisping Lin 		if (bootflag == 0x00000001)
5470202ee8aSHisping Lin 			*flag = 1;
5480202ee8aSHisping Lin #else
549468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
550468df3b2SHisping Lin 			*flag = 1;
5510202ee8aSHisping Lin #endif
552468df3b2SHisping Lin 	}
553095e2a82SHisping Lin 	return TeecResult;
554095e2a82SHisping Lin }
5554aa61755SAndy Ye 
5561ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
5571ef63c75SHisping Lin {
5581ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
5591ef63c75SHisping Lin 						  true, buf, length);
5601ef63c75SHisping Lin }
5611ef63c75SHisping Lin 
562fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
563fbf29bfbSHisping Lin {
564fbf29bfbSHisping Lin 	uint32_t levelflag;
565fbf29bfbSHisping Lin 
566fbf29bfbSHisping Lin 	levelflag = flag;
567fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
568fbf29bfbSHisping Lin 						  true, &levelflag, 1);
569fbf29bfbSHisping Lin }
570fbf29bfbSHisping Lin 
571f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
572f39d4289SHisping Lin {
573f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
574f39d4289SHisping Lin 						  true, buf, length);
575f39d4289SHisping Lin }
576f39d4289SHisping Lin 
5777504da74SHisping Lin void trusty_select_security_level(void)
5787504da74SHisping Lin {
5797504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
5807504da74SHisping Lin 	TEEC_Result TeecResult;
5817504da74SHisping Lin 
5827504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
5837504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
5847504da74SHisping Lin 		run_command("download", 0);
5857504da74SHisping Lin 		return;
5867504da74SHisping Lin 	}
5877504da74SHisping Lin 
5887504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
5897504da74SHisping Lin 		debug("optee select security level success!");
5907504da74SHisping Lin 	else
5917504da74SHisping Lin 		panic("optee select security level fail!");
5927504da74SHisping Lin 
5937504da74SHisping Lin 	return;
5947504da74SHisping Lin #endif
5957504da74SHisping Lin }
5967504da74SHisping Lin 
597*d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
598*d5913350SHisping Lin {
599*d5913350SHisping Lin 	TEEC_Result TeecResult;
600*d5913350SHisping Lin 	TEEC_Context TeecContext;
601*d5913350SHisping Lin 	TEEC_Session TeecSession;
602*d5913350SHisping Lin 	uint32_t ErrorOrigin;
603*d5913350SHisping Lin 
604*d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
605*d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
606*d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
607*d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
608*d5913350SHisping Lin 
609*d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
610*d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
611*d5913350SHisping Lin 		return TeecResult;
612*d5913350SHisping Lin 
613*d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
614*d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
615*d5913350SHisping Lin 		return TeecResult;
616*d5913350SHisping Lin 
617*d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
618*d5913350SHisping Lin 				&TeecSession,
619*d5913350SHisping Lin 				TeecUuid,
620*d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
621*d5913350SHisping Lin 				NULL,
622*d5913350SHisping Lin 				NULL,
623*d5913350SHisping Lin 				&ErrorOrigin);
624*d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
625*d5913350SHisping Lin 		return TeecResult;
626*d5913350SHisping Lin 
627*d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
628*d5913350SHisping Lin 
629*d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
630*d5913350SHisping Lin 
631*d5913350SHisping Lin 	SharedMem.size = byte_len;
632*d5913350SHisping Lin 	SharedMem.flags = 0;
633*d5913350SHisping Lin 
634*d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
635*d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
636*d5913350SHisping Lin 		goto exit;
637*d5913350SHisping Lin 
638*d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
639*d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
640*d5913350SHisping Lin 
641*d5913350SHisping Lin 	memcpy(SharedMem.buffer, byte_buf, SharedMem.size);
642*d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
643*d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_INPUT,
644*d5913350SHisping Lin 						    TEEC_NONE,
645*d5913350SHisping Lin 						    TEEC_NONE);
646*d5913350SHisping Lin 
647*d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
648*d5913350SHisping Lin 					STORAGE_CMD_WRITE_OEM_NS_OTP,
649*d5913350SHisping Lin 					&TeecOperation,
650*d5913350SHisping Lin 					&ErrorOrigin);
651*d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
652*d5913350SHisping Lin 		goto exit;
653*d5913350SHisping Lin 
654*d5913350SHisping Lin exit:
655*d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
656*d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
657*d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
658*d5913350SHisping Lin 
659*d5913350SHisping Lin 	return TeecResult;
660*d5913350SHisping Lin }
661*d5913350SHisping Lin 
662*d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len)
663*d5913350SHisping Lin {
664*d5913350SHisping Lin 	TEEC_Result TeecResult;
665*d5913350SHisping Lin 	TEEC_Context TeecContext;
666*d5913350SHisping Lin 	TEEC_Session TeecSession;
667*d5913350SHisping Lin 	uint32_t ErrorOrigin;
668*d5913350SHisping Lin 
669*d5913350SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
670*d5913350SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
671*d5913350SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
672*d5913350SHisping Lin 	TEEC_Operation TeecOperation = {0};
673*d5913350SHisping Lin 
674*d5913350SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
675*d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
676*d5913350SHisping Lin 		return TeecResult;
677*d5913350SHisping Lin 
678*d5913350SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
679*d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
680*d5913350SHisping Lin 		return TeecResult;
681*d5913350SHisping Lin 
682*d5913350SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
683*d5913350SHisping Lin 				&TeecSession,
684*d5913350SHisping Lin 				TeecUuid,
685*d5913350SHisping Lin 				TEEC_LOGIN_PUBLIC,
686*d5913350SHisping Lin 				NULL,
687*d5913350SHisping Lin 				NULL,
688*d5913350SHisping Lin 				&ErrorOrigin);
689*d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
690*d5913350SHisping Lin 		return TeecResult;
691*d5913350SHisping Lin 
692*d5913350SHisping Lin 	TeecOperation.params[0].value.a = byte_off;
693*d5913350SHisping Lin 
694*d5913350SHisping Lin 	TEEC_SharedMemory SharedMem = {0};
695*d5913350SHisping Lin 
696*d5913350SHisping Lin 	SharedMem.size = byte_len;
697*d5913350SHisping Lin 	SharedMem.flags = 0;
698*d5913350SHisping Lin 
699*d5913350SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem);
700*d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
701*d5913350SHisping Lin 		goto exit;
702*d5913350SHisping Lin 
703*d5913350SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem.buffer;
704*d5913350SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem.size;
705*d5913350SHisping Lin 
706*d5913350SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
707*d5913350SHisping Lin 						    TEEC_MEMREF_TEMP_OUTPUT,
708*d5913350SHisping Lin 						    TEEC_NONE,
709*d5913350SHisping Lin 						    TEEC_NONE);
710*d5913350SHisping Lin 
711*d5913350SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
712*d5913350SHisping Lin 					STORAGE_CMD_READ_OEM_NS_OTP,
713*d5913350SHisping Lin 					&TeecOperation,
714*d5913350SHisping Lin 					&ErrorOrigin);
715*d5913350SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
716*d5913350SHisping Lin 		goto exit;
717*d5913350SHisping Lin 
718*d5913350SHisping Lin 	memcpy(byte_buf, SharedMem.buffer, SharedMem.size);
719*d5913350SHisping Lin 
720*d5913350SHisping Lin exit:
721*d5913350SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem);
722*d5913350SHisping Lin 	TEEC_CloseSession(&TeecSession);
723*d5913350SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
724*d5913350SHisping Lin 
725*d5913350SHisping Lin 	return TeecResult;
726*d5913350SHisping Lin }
727*d5913350SHisping Lin 
7284aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
7294aa61755SAndy Ye {
7304aa61755SAndy Ye 	TEEC_Result TeecResult;
7314aa61755SAndy Ye 	TEEC_Context TeecContext;
7324aa61755SAndy Ye 	TEEC_Session TeecSession;
7334aa61755SAndy Ye 	uint32_t ErrorOrigin;
7344aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
7354aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
7364aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
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 = *dh_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 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
7904aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
7914aa61755SAndy Ye 
7924aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
7934aa61755SAndy Ye 						    TEEC_NONE,
7944aa61755SAndy Ye 						    TEEC_NONE,
7954aa61755SAndy Ye 						    TEEC_NONE);
7964aa61755SAndy Ye 
7974aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
7984aa61755SAndy Ye 					143,
7994aa61755SAndy Ye 					&TeecOperation,
8004aa61755SAndy Ye 					&ErrorOrigin);
801f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
802f4e1db95SHisping Lin 		goto exit;
8034aa61755SAndy Ye 
8044aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
8054aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
806f4e1db95SHisping Lin exit:
8074aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
8084aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
809f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8104aa61755SAndy Ye 
8114aa61755SAndy Ye 	return TeecResult;
8124aa61755SAndy Ye }
8134aa61755SAndy Ye 
8144aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
8154aa61755SAndy Ye {
8164aa61755SAndy Ye 	TEEC_Result TeecResult;
8174aa61755SAndy Ye 	TEEC_Context TeecContext;
8184aa61755SAndy Ye 	TEEC_Session TeecSession;
8194aa61755SAndy Ye 	uint32_t ErrorOrigin;
8204aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
8214aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
8224aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
8234aa61755SAndy Ye 				}
8244aa61755SAndy Ye 			     };
8254aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
8264aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
8273251364cSHisping Lin 	struct blk_desc *dev_desc;
8283251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8296651d4c0SJason Zhu 	if (!dev_desc) {
8306651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8316651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8326651d4c0SJason Zhu 	}
8334aa61755SAndy Ye 
834f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
835f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
836f4e1db95SHisping Lin 		return TeecResult;
8374aa61755SAndy Ye 
8384aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
839f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
840f4e1db95SHisping Lin 		return TeecResult;
8414aa61755SAndy Ye 
8423251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8433251364cSHisping Lin 						TEEC_NONE,
8443251364cSHisping Lin 						TEEC_NONE,
8453251364cSHisping Lin 						TEEC_NONE);
8463251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
847b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
848b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
849b9a7e756SHisping Lin 	else
850b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
851b9a7e756SHisping Lin 
8523251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8533251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8543251364cSHisping Lin #endif
8553251364cSHisping Lin 
8564aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
8574aa61755SAndy Ye 				      &TeecSession,
8584aa61755SAndy Ye 				      TeecUuid,
8594aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
8604aa61755SAndy Ye 				      NULL,
8613251364cSHisping Lin 					&TeecOperation,
8624aa61755SAndy Ye 				      &ErrorOrigin);
863f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
864f4e1db95SHisping Lin 		return TeecResult;
8654aa61755SAndy Ye 
8664aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
8674aa61755SAndy Ye 
8684aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
8694aa61755SAndy Ye 	SharedMem0.flags = 0;
8704aa61755SAndy Ye 
8714aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
872f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
873f4e1db95SHisping Lin 		goto exit;
8744aa61755SAndy Ye 
8754aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
8764aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
8774aa61755SAndy Ye 
8784aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
8794aa61755SAndy Ye 						    TEEC_NONE,
8804aa61755SAndy Ye 						    TEEC_NONE,
8814aa61755SAndy Ye 						    TEEC_NONE);
8824aa61755SAndy Ye 
8834aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8844aa61755SAndy Ye 					144,
8854aa61755SAndy Ye 					&TeecOperation,
8864aa61755SAndy Ye 					&ErrorOrigin);
887f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
888f4e1db95SHisping Lin 		goto exit;
8894aa61755SAndy Ye 
8904aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
8914aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
892f4e1db95SHisping Lin exit:
8934aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
8944aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
895f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8964aa61755SAndy Ye 
8974aa61755SAndy Ye 	return TeecResult;
8984aa61755SAndy Ye }
8994aa61755SAndy Ye 
9004aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
9014aa61755SAndy Ye 			      uint32_t *operation_size,
9024aa61755SAndy Ye 			      uint8_t *out,
9034aa61755SAndy Ye 			      uint32_t *out_len)
9044aa61755SAndy Ye {
9054aa61755SAndy Ye 	TEEC_Result TeecResult;
9064aa61755SAndy Ye 	TEEC_Context TeecContext;
9074aa61755SAndy Ye 	TEEC_Session TeecSession;
9084aa61755SAndy Ye 	uint32_t ErrorOrigin;
9094aa61755SAndy Ye 
9104aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
9114aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
9124aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
9134aa61755SAndy Ye 				}
9144aa61755SAndy Ye 			     };
9154aa61755SAndy Ye 
9164aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
9174aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
9183251364cSHisping Lin 	struct blk_desc *dev_desc;
9193251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
9206651d4c0SJason Zhu 	if (!dev_desc) {
9216651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
9226651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
9236651d4c0SJason Zhu 	}
9244aa61755SAndy Ye 
925f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
926f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
927f4e1db95SHisping Lin 		return TeecResult;
9284aa61755SAndy Ye 
9294aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
930f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
931f4e1db95SHisping Lin 		return TeecResult;
9324aa61755SAndy Ye 
9333251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9343251364cSHisping Lin 						TEEC_NONE,
9353251364cSHisping Lin 						TEEC_NONE,
9363251364cSHisping Lin 						TEEC_NONE);
9373251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
938b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
939b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
940b9a7e756SHisping Lin 	else
941b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
942b9a7e756SHisping Lin 
9433251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9443251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9453251364cSHisping Lin #endif
9463251364cSHisping Lin 
9474aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
9484aa61755SAndy Ye 				      &TeecSession,
9494aa61755SAndy Ye 				      TeecUuid,
9504aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
9514aa61755SAndy Ye 				      NULL,
9523251364cSHisping Lin 					&TeecOperation,
9534aa61755SAndy Ye 				      &ErrorOrigin);
954f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
955f4e1db95SHisping Lin 		return TeecResult;
9564aa61755SAndy Ye 
9574aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
9584aa61755SAndy Ye 
9594aa61755SAndy Ye 	SharedMem0.size = *operation_size;
9604aa61755SAndy Ye 	SharedMem0.flags = 0;
9614aa61755SAndy Ye 
9624aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
963f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
964f4e1db95SHisping Lin 		goto exit;
9654aa61755SAndy Ye 
9664aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
9674aa61755SAndy Ye 
9684aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9694aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9704aa61755SAndy Ye 
9714aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
9724aa61755SAndy Ye 
9734aa61755SAndy Ye 	SharedMem1.size = *out_len;
9744aa61755SAndy Ye 	SharedMem1.flags = 0;
9754aa61755SAndy Ye 
9764aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
977f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
978f4e1db95SHisping Lin 		goto exit;
9794aa61755SAndy Ye 
9804aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
9814aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
9824aa61755SAndy Ye 
9834aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
9844aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
9854aa61755SAndy Ye 						    TEEC_NONE,
9864aa61755SAndy Ye 						    TEEC_NONE);
9874aa61755SAndy Ye 
9884aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9894aa61755SAndy Ye 					145,
9904aa61755SAndy Ye 					&TeecOperation,
9914aa61755SAndy Ye 					&ErrorOrigin);
992f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
993f4e1db95SHisping Lin 		goto exit;
9944aa61755SAndy Ye 
9954aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
9964aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
997f4e1db95SHisping Lin exit:
9984aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
9994aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
1000f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
1001f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10024aa61755SAndy Ye 
10034aa61755SAndy Ye 	return TeecResult;
10044aa61755SAndy Ye }
10054aa61755SAndy Ye 
10064aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
10074aa61755SAndy Ye {
10084aa61755SAndy Ye 	TEEC_Result TeecResult;
10094aa61755SAndy Ye 	TEEC_Context TeecContext;
10104aa61755SAndy Ye 	TEEC_Session TeecSession;
10114aa61755SAndy Ye 	uint32_t ErrorOrigin;
10124aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
10134aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
10144aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
10154aa61755SAndy Ye 				}
10164aa61755SAndy Ye 			     };
10174aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
10184aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
10193251364cSHisping Lin 	struct blk_desc *dev_desc;
10203251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
10216651d4c0SJason Zhu 	if (!dev_desc) {
10226651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
10236651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
10246651d4c0SJason Zhu 	}
1025f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
1026f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1027f4e1db95SHisping Lin 		return TeecResult;
10284aa61755SAndy Ye 
10294aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1030f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1031f4e1db95SHisping Lin 		return TeecResult;
10324aa61755SAndy Ye 
10333251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
10343251364cSHisping Lin 						TEEC_NONE,
10353251364cSHisping Lin 						TEEC_NONE,
10363251364cSHisping Lin 						TEEC_NONE);
10373251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
1038b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
1039b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
1040b9a7e756SHisping Lin 	else
1041b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
1042b9a7e756SHisping Lin 
10433251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
10443251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
10453251364cSHisping Lin #endif
10463251364cSHisping Lin 
10474aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
10484aa61755SAndy Ye 					&TeecSession,
10494aa61755SAndy Ye 					TeecUuid,
10504aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
10514aa61755SAndy Ye 					NULL,
10523251364cSHisping Lin 					&TeecOperation,
10534aa61755SAndy Ye 					&ErrorOrigin);
1054f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1055f4e1db95SHisping Lin 		return TeecResult;
10564aa61755SAndy Ye 
10574aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
10584aa61755SAndy Ye 
10594aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
10604aa61755SAndy Ye 	SharedMem0.flags = 0;
10614aa61755SAndy Ye 
10624aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1063f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1064f4e1db95SHisping Lin 		goto exit;
10654aa61755SAndy Ye 
10664aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
10674aa61755SAndy Ye 
10684aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10694aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10704aa61755SAndy Ye 
10714aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
10724aa61755SAndy Ye 						    TEEC_NONE,
10734aa61755SAndy Ye 						    TEEC_NONE,
10744aa61755SAndy Ye 						    TEEC_NONE);
10754aa61755SAndy Ye 
10764aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10774aa61755SAndy Ye 					146,
10784aa61755SAndy Ye 					&TeecOperation,
10794aa61755SAndy Ye 					&ErrorOrigin);
1080f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
1081f4e1db95SHisping Lin 		goto exit;
1082f4e1db95SHisping Lin exit:
10834aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
10844aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
1085f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10864aa61755SAndy Ye 
10874aa61755SAndy Ye 	return TeecResult;
10884aa61755SAndy Ye }
1089