xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientRPC.c (revision b122ee17db0f2af2fe4417d68a93f97f223bffb2)
1abdd2437Shisping /*
2abdd2437Shisping  * Copyright 2017, Rockchip Electronics Co., Ltd
3abdd2437Shisping  * hisping lin, <hisping.lin@rock-chips.com>
4abdd2437Shisping  *
5abdd2437Shisping  * SPDX-License-Identifier:	GPL-2.0+
6abdd2437Shisping  */
7abdd2437Shisping #include <common.h>
8abdd2437Shisping #include <stdlib.h>
9abdd2437Shisping #include <command.h>
10abdd2437Shisping #include <mmc.h>
11*b122ee17SHisping Lin #include <optee_include/OpteeClientLoadTa.h>
12abdd2437Shisping #include <optee_include/OpteeClientMem.h>
13abdd2437Shisping #include <optee_include/OpteeClientRPC.h>
14abdd2437Shisping #include <optee_include/teesmc.h>
151f25ada2SHisping Lin #include <optee_include/teesmc_v2.h>
16abdd2437Shisping #include <optee_include/teesmc_optee.h>
17abdd2437Shisping #include <optee_include/tee_rpc_types.h>
18abdd2437Shisping #include <optee_include/tee_rpc.h>
193251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
201f25ada2SHisping Lin #include <optee_include/OpteeClientRkFs.h>
213251364cSHisping Lin #endif
223251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
23df538e29SHisping Lin #include <optee_include/OpteeClientRkNewFs.h>
243251364cSHisping Lin #endif
25abdd2437Shisping 
26abdd2437Shisping /*
27abdd2437Shisping  * Memory allocation.
28abdd2437Shisping  * Currently treated the same for both arguments & payloads.
29abdd2437Shisping  */
30abdd2437Shisping TEEC_Result OpteeRpcAlloc(uint32_t Size, uint32_t *Address)
31abdd2437Shisping {
32abdd2437Shisping 	TEEC_Result TeecResult = TEEC_SUCCESS;
331f25ada2SHisping Lin 	size_t AllocAddress;
34abdd2437Shisping 
35abdd2437Shisping 	*Address = 0;
36abdd2437Shisping 
37abdd2437Shisping 	if (Size != 0) {
381f25ada2SHisping Lin 		AllocAddress = (size_t) OpteeClientMemAlloc(Size);
39abdd2437Shisping 
40abdd2437Shisping 		if (AllocAddress == 0)
41abdd2437Shisping 			TeecResult = TEEC_ERROR_OUT_OF_MEMORY;
42abdd2437Shisping 		else
43abdd2437Shisping 			*Address = AllocAddress;
44abdd2437Shisping 	}
45abdd2437Shisping 	return TeecResult;
46abdd2437Shisping }
47abdd2437Shisping 
48abdd2437Shisping /*
49abdd2437Shisping  * Memory free.
50abdd2437Shisping  * Currently treated the same for both arguments & payloads.
51abdd2437Shisping  */
52abdd2437Shisping TEEC_Result OpteeRpcFree(uint32_t Address)
53abdd2437Shisping {
541f25ada2SHisping Lin 	OpteeClientMemFree((void *)(size_t)Address);
55abdd2437Shisping 	return TEEC_SUCCESS;
56abdd2437Shisping }
57abdd2437Shisping 
581f25ada2SHisping Lin TEEC_Result OpteeRpcCmdLoadV2Ta(t_teesmc32_arg *TeeSmc32Arg)
591f25ada2SHisping Lin {
601f25ada2SHisping Lin 	TEEC_Result TeecResult = TEEC_SUCCESS;
611f25ada2SHisping Lin 	t_teesmc32_param *TeeSmc32Param = NULL;
62*b122ee17SHisping Lin 	int ta_found = 0;
63*b122ee17SHisping Lin 	size_t size = 0;
641f25ada2SHisping Lin 
651f25ada2SHisping Lin 	if (TeeSmc32Arg->num_params != 2) {
661f25ada2SHisping Lin 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
671f25ada2SHisping Lin 		goto Exit;
681f25ada2SHisping Lin 	}
691f25ada2SHisping Lin 
701f25ada2SHisping Lin 	TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
711f25ada2SHisping Lin 
72*b122ee17SHisping Lin 	size = TeeSmc32Param[1].u.memref.size;
73*b122ee17SHisping Lin 	ta_found = search_ta((void *)(size_t)&TeeSmc32Param[0].u.value,
74*b122ee17SHisping Lin 				(void *)(size_t)TeeSmc32Param[1].u.memref.buf_ptr, &size);
75*b122ee17SHisping Lin 	if (ta_found == TA_BINARY_FOUND) {
76*b122ee17SHisping Lin 		TeeSmc32Param[1].u.memref.size = size;
77*b122ee17SHisping Lin 		TeecResult = TEEC_SUCCESS;
781f25ada2SHisping Lin 	} else {
79*b122ee17SHisping Lin 		printf("  TA not found \n");
80*b122ee17SHisping Lin 		TeecResult = TEEC_ERROR_ITEM_NOT_FOUND;
811f25ada2SHisping Lin 	}
821f25ada2SHisping Lin 
831f25ada2SHisping Lin Exit:
841f25ada2SHisping Lin 	TeeSmc32Arg->ret = TeecResult;
851f25ada2SHisping Lin 	TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API;
861f25ada2SHisping Lin 
87*b122ee17SHisping Lin 	debug("TEEC: OpteeRpcCmdLoadV2Ta Exit : TeecResult=0x%X\n", TeecResult);
88abdd2437Shisping 
89abdd2437Shisping 	return TeecResult;
90abdd2437Shisping }
91abdd2437Shisping 
92abdd2437Shisping /*
93abdd2437Shisping  * Execute an RPMB storage operation.
94abdd2437Shisping  */
951f25ada2SHisping Lin 
96abdd2437Shisping uint16_t global_block_count;
97fd9c6bd7SJason Zhu #ifdef CONFIG_SUPPORT_EMMC_RPMB
98abdd2437Shisping TEEC_Result OpteeRpcCmdRpmb(t_teesmc32_arg *TeeSmc32Arg)
99abdd2437Shisping {
100abdd2437Shisping 	struct tee_rpc_rpmb_dev_info *DevInfo;
101abdd2437Shisping 	TEEC_Result EfiStatus;
102abdd2437Shisping 	uint16_t RequestMsgType, i;
103abdd2437Shisping 	EFI_RK_RPMB_DATA_PACKET *RequestPackets;
104abdd2437Shisping 	EFI_RK_RPMB_DATA_PACKET *ResponsePackets;
105abdd2437Shisping 	EFI_RK_RPMB_DATA_PACKET *tempPackets;
106abdd2437Shisping 	EFI_RK_RPMB_DATA_PACKET_BACK *RequestPackets_back;
107abdd2437Shisping 	EFI_RK_RPMB_DATA_PACKET_BACK *tempPackets_back;
108abdd2437Shisping 	struct tee_rpc_rpmb_cmd *RpmbRequest;
109abdd2437Shisping 	TEEC_Result TeecResult = TEEC_SUCCESS;
110abdd2437Shisping 	t_teesmc32_param *TeeSmc32Param;
111abdd2437Shisping 	struct mmc *mmc;
112abdd2437Shisping 
113efb93541SHisping Lin 	debug("TEEC: Entered RPMB RPC\n");
114abdd2437Shisping 
115abdd2437Shisping 	if (TeeSmc32Arg->num_params != 2) {
116abdd2437Shisping 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
117abdd2437Shisping 		goto Exit;
118abdd2437Shisping 	}
119abdd2437Shisping 
120abdd2437Shisping 	TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
1211f25ada2SHisping Lin 	RpmbRequest = (struct tee_rpc_rpmb_cmd *)(size_t)
122abdd2437Shisping 		TeeSmc32Param[0].u.memref.buf_ptr;
123abdd2437Shisping 	switch (RpmbRequest->cmd) {
124abdd2437Shisping 	case TEE_RPC_RPMB_CMD_DATA_REQ: {
125abdd2437Shisping 		RequestPackets = (EFI_RK_RPMB_DATA_PACKET *)(RpmbRequest + 1);
1261f25ada2SHisping Lin 		ResponsePackets = (EFI_RK_RPMB_DATA_PACKET *)(size_t)
127abdd2437Shisping 		TeeSmc32Param[1].u.memref.buf_ptr;
128abdd2437Shisping 
129abdd2437Shisping 		global_block_count =
130abdd2437Shisping 			(RpmbRequest->block_count == 0 ?
131abdd2437Shisping 			1 : RpmbRequest->block_count);
132abdd2437Shisping 		RequestPackets_back =
13317b5c290SHisping Lin 			memalign(CONFIG_SYS_CACHELINE_SIZE,
13417b5c290SHisping Lin 			sizeof(EFI_RK_RPMB_DATA_PACKET_BACK) * global_block_count);
135abdd2437Shisping 		memcpy(RequestPackets_back->stuff,
136abdd2437Shisping 			RequestPackets->stuff_bytes,
137abdd2437Shisping 			RPMB_STUFF_DATA_SIZE);
138abdd2437Shisping 		memcpy(RequestPackets_back->mac,
139abdd2437Shisping 			RequestPackets->key_mac,
140abdd2437Shisping 			RPMB_KEY_MAC_SIZE);
141abdd2437Shisping 		memcpy(RequestPackets_back->data,
142abdd2437Shisping 			RequestPackets->data,
143abdd2437Shisping 			RPMB_DATA_SIZE);
144abdd2437Shisping 		memcpy(RequestPackets_back->nonce,
145abdd2437Shisping 			RequestPackets->nonce,
146abdd2437Shisping 			RPMB_NONCE_SIZE);
147abdd2437Shisping 		RequestPackets_back->write_counter =
148abdd2437Shisping 			((RequestPackets->write_counter[3]) << 24) +
149abdd2437Shisping 			((RequestPackets->write_counter[2]) << 16) +
150abdd2437Shisping 			((RequestPackets->write_counter[1]) << 8) +
151abdd2437Shisping 			(RequestPackets->write_counter[0]);
152abdd2437Shisping 		RequestPackets_back->address =
153abdd2437Shisping 			((RequestPackets->address[1]) << 8) +
154abdd2437Shisping 			(RequestPackets->address[0]);
155abdd2437Shisping 		RequestPackets_back->block_count =
156abdd2437Shisping 			((RequestPackets->block_count[1]) << 8) +
157abdd2437Shisping 			(RequestPackets->block_count[0]);
158abdd2437Shisping 		RequestPackets_back->result =
159abdd2437Shisping 			((RequestPackets->op_result[1]) << 8) +
160abdd2437Shisping 			(RequestPackets->op_result[0]);
161abdd2437Shisping 		RequestPackets_back->request =
162abdd2437Shisping 			((RequestPackets->msg_type[1]) << 8) +
163abdd2437Shisping 			(RequestPackets->msg_type[0]);
164abdd2437Shisping 
165abdd2437Shisping 		RequestMsgType = RPMB_PACKET_DATA_TO_UINT16(
166abdd2437Shisping 				RequestPackets->msg_type);
167abdd2437Shisping 
168efb93541SHisping Lin 		debug("TEEC: RPMB Data request %d\n", RequestMsgType);
169abdd2437Shisping 
170abdd2437Shisping 		switch (RequestMsgType) {
171abdd2437Shisping 		case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_KEY_PROGRAM: {
17268ba9373SHisping Lin 			if (init_rpmb() != 0) {
173abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
174abdd2437Shisping 				break;
175abdd2437Shisping 			}
176abdd2437Shisping 
177abdd2437Shisping 			EfiStatus = do_programkey((struct s_rpmb *)
178abdd2437Shisping 				RequestPackets_back);
179abdd2437Shisping 
18068ba9373SHisping Lin 			if (finish_rpmb() != 0) {
181abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
182abdd2437Shisping 				break;
183abdd2437Shisping 			}
184abdd2437Shisping 
185abdd2437Shisping 			if (EfiStatus != 0) {
186abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
187abdd2437Shisping 				break;
188abdd2437Shisping 			}
189abdd2437Shisping 
190abdd2437Shisping 			break;
191abdd2437Shisping 		}
192abdd2437Shisping 
193abdd2437Shisping 		case TEE_RPC_RPMB_MSG_TYPE_REQ_WRITE_COUNTER_VAL_READ: {
19468ba9373SHisping Lin 			if (init_rpmb() != 0) {
195abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
196abdd2437Shisping 				break;
197abdd2437Shisping 			}
198abdd2437Shisping 
199abdd2437Shisping 			EfiStatus = do_readcounter((struct s_rpmb *)
200abdd2437Shisping 				RequestPackets_back);
20168ba9373SHisping Lin 
20268ba9373SHisping Lin 			if (finish_rpmb() != 0) {
203abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
204abdd2437Shisping 				break;
205abdd2437Shisping 			}
206abdd2437Shisping 
207a0d56fd8SHisping Lin 			TeecResult = TEEC_SUCCESS;
208abdd2437Shisping 			break;
209abdd2437Shisping 		}
210abdd2437Shisping 
211abdd2437Shisping 		case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_DATA_WRITE: {
21268ba9373SHisping Lin 			if (init_rpmb() != 0) {
213abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
214abdd2437Shisping 				break;
215abdd2437Shisping 			}
216abdd2437Shisping 
217abdd2437Shisping 			EfiStatus = do_authenticatedwrite((struct s_rpmb *)
218abdd2437Shisping 				RequestPackets_back);
21968ba9373SHisping Lin 
22068ba9373SHisping Lin 			if (finish_rpmb() != 0) {
221abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
222abdd2437Shisping 				break;
223abdd2437Shisping 			}
224abdd2437Shisping 
225abdd2437Shisping 			if (EfiStatus != 0) {
226abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
227abdd2437Shisping 				break;
228abdd2437Shisping 			}
229abdd2437Shisping 
230abdd2437Shisping 			break;
231abdd2437Shisping 		}
232abdd2437Shisping 
233abdd2437Shisping 		case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_DATA_READ: {
23468ba9373SHisping Lin 			if (init_rpmb() != 0) {
235abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
236abdd2437Shisping 				break;
237abdd2437Shisping 			}
238abdd2437Shisping 
239abdd2437Shisping 			EfiStatus = do_authenticatedread((struct s_rpmb *)
240abdd2437Shisping 				RequestPackets_back, global_block_count);
24168ba9373SHisping Lin 
24268ba9373SHisping Lin 			if (finish_rpmb() != 0) {
243abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
244abdd2437Shisping 				break;
245abdd2437Shisping 			}
246abdd2437Shisping 
247abdd2437Shisping 			if (EfiStatus != 0) {
248abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
249abdd2437Shisping 				break;
250abdd2437Shisping 			}
251abdd2437Shisping 
252abdd2437Shisping 			break;
253abdd2437Shisping 		}
254abdd2437Shisping 
255abdd2437Shisping 		default:
256abdd2437Shisping 			TeecResult = TEEC_ERROR_BAD_PARAMETERS;
257abdd2437Shisping 			break;
258abdd2437Shisping 		}
259efb93541SHisping Lin 		debug("TEEC: RPMB TeecResult %d\n", TeecResult);
260abdd2437Shisping 		break;
261abdd2437Shisping 	}
262abdd2437Shisping 
263abdd2437Shisping 	case TEE_RPC_RPMB_CMD_GET_DEV_INFO: {
26426690680SHisping Lin 		if (init_rpmb()) {
26526690680SHisping Lin 			TeecResult = TEEC_ERROR_GENERIC;
26626690680SHisping Lin 			goto Exit;
26726690680SHisping Lin 		}
26826690680SHisping Lin 
269abdd2437Shisping 		mmc = do_returnmmc();
27026690680SHisping Lin 		if (finish_rpmb()) {
27126690680SHisping Lin 			TeecResult = TEEC_ERROR_GENERIC;
27226690680SHisping Lin 			goto Exit;
27326690680SHisping Lin 		}
27426690680SHisping Lin 
27526690680SHisping Lin 		if (mmc == NULL) {
27626690680SHisping Lin 			TeecResult = TEEC_ERROR_GENERIC;
27726690680SHisping Lin 			goto Exit;
27826690680SHisping Lin 		}
279abdd2437Shisping 
2801f25ada2SHisping Lin 		DevInfo = (struct tee_rpc_rpmb_dev_info *)(size_t)
281abdd2437Shisping 		TeeSmc32Param[1].u.memref.buf_ptr;
282abdd2437Shisping 
283abdd2437Shisping 		DevInfo->cid[0] = (mmc->cid[0]) >> 24 & 0xff;
284abdd2437Shisping 		DevInfo->cid[1] = (mmc->cid[0]) >> 16 & 0xff;
285abdd2437Shisping 		DevInfo->cid[2] = (mmc->cid[0]) >> 8 & 0xff;
286abdd2437Shisping 		DevInfo->cid[3] = (mmc->cid[0]) & 0xff;
287abdd2437Shisping 		DevInfo->cid[4] = (mmc->cid[1]) >> 24 & 0xff;
288abdd2437Shisping 		DevInfo->cid[5] = (mmc->cid[1]) >> 16 & 0xff;
289abdd2437Shisping 		DevInfo->cid[6] = (mmc->cid[1]) >> 8 & 0xff;
290abdd2437Shisping 		DevInfo->cid[7] = (mmc->cid[1]) & 0xff;
291abdd2437Shisping 		DevInfo->cid[8] = (mmc->cid[2]) >> 24 & 0xff;
292abdd2437Shisping 		DevInfo->cid[9] = (mmc->cid[2]) >> 16 & 0xff;
293abdd2437Shisping 		DevInfo->cid[10] = (mmc->cid[2]) >> 8 & 0xff;
294abdd2437Shisping 		DevInfo->cid[11] = (mmc->cid[2]) & 0xff;
295abdd2437Shisping 		DevInfo->cid[12] = (mmc->cid[3]) >> 24 & 0xff;
296abdd2437Shisping 		DevInfo->cid[13] = (mmc->cid[3]) >> 16 & 0xff;
297abdd2437Shisping 		DevInfo->cid[14] = (mmc->cid[3]) >> 8 & 0xff;
298abdd2437Shisping 		DevInfo->cid[15] = (mmc->cid[3]) & 0xff;
299abdd2437Shisping 		DevInfo->rel_wr_sec_c = 1;
300abdd2437Shisping 		DevInfo->rpmb_size_mult =
301abdd2437Shisping 			(uint8_t)(mmc->capacity_rpmb / (128 * 1024));
302abdd2437Shisping 		DevInfo->ret_code = 0;
303abdd2437Shisping 
304abdd2437Shisping 		goto Exit;
305abdd2437Shisping 	}
306abdd2437Shisping 
307abdd2437Shisping 	default:
308abdd2437Shisping 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
309abdd2437Shisping 
310abdd2437Shisping 		goto Exit;
311abdd2437Shisping 	}
312abdd2437Shisping 
313abdd2437Shisping 	tempPackets = ResponsePackets;
314abdd2437Shisping 	tempPackets_back = RequestPackets_back;
315abdd2437Shisping 
316abdd2437Shisping 	for (i = 0; i < global_block_count; i++) {
317abdd2437Shisping 		memcpy(tempPackets->stuff_bytes,
318abdd2437Shisping 			tempPackets_back->stuff,
319abdd2437Shisping 			RPMB_STUFF_DATA_SIZE);
320abdd2437Shisping 		memcpy(tempPackets->key_mac,
321abdd2437Shisping 			tempPackets_back->mac,
322abdd2437Shisping 			RPMB_KEY_MAC_SIZE);
323abdd2437Shisping 		memcpy(tempPackets->data,
324abdd2437Shisping 			tempPackets_back->data,
325abdd2437Shisping 			RPMB_DATA_SIZE);
326abdd2437Shisping 		memcpy(tempPackets->nonce,
327abdd2437Shisping 			tempPackets_back->nonce,
328abdd2437Shisping 			RPMB_NONCE_SIZE);
329abdd2437Shisping 		tempPackets->write_counter[3] =
330abdd2437Shisping 			((tempPackets_back->write_counter) >> 24) & 0xFF;
331abdd2437Shisping 		tempPackets->write_counter[2] =
332abdd2437Shisping 			((tempPackets_back->write_counter) >> 16) & 0xFF;
333abdd2437Shisping 		tempPackets->write_counter[1] =
334abdd2437Shisping 			((tempPackets_back->write_counter) >> 8) & 0xFF;
335abdd2437Shisping 		tempPackets->write_counter[0] =
336abdd2437Shisping 			(tempPackets_back->write_counter) & 0xFF;
337abdd2437Shisping 		tempPackets->address[1] =
338abdd2437Shisping 			((tempPackets_back->address) >> 8) & 0xFF;
339abdd2437Shisping 		tempPackets->address[0] =
340abdd2437Shisping 			(tempPackets_back->address) & 0xFF;
341abdd2437Shisping 		tempPackets->block_count[1] =
342abdd2437Shisping 			((tempPackets_back->block_count) >> 8) & 0xFF;
343abdd2437Shisping 		tempPackets->block_count[0] =
344abdd2437Shisping 			(tempPackets_back->block_count) & 0xFF;
345abdd2437Shisping 		tempPackets->op_result[1] =
346abdd2437Shisping 			((tempPackets_back->result) >> 8) & 0xFF;
347abdd2437Shisping 		tempPackets->op_result[0] =
348abdd2437Shisping 			(tempPackets_back->result) & 0xFF;
349abdd2437Shisping 		tempPackets->msg_type[1] =
350abdd2437Shisping 			((tempPackets_back->request) >> 8) & 0xFF;
351abdd2437Shisping 		tempPackets->msg_type[0] =
352abdd2437Shisping 			(tempPackets_back->request) & 0xFF;
353abdd2437Shisping 		tempPackets++;
354abdd2437Shisping 		tempPackets_back++;
355abdd2437Shisping 	}
356abdd2437Shisping 
357abdd2437Shisping 	free(RequestPackets_back);
358abdd2437Shisping 
359abdd2437Shisping Exit:
360abdd2437Shisping 	TeeSmc32Arg->ret = TeecResult;
361abdd2437Shisping 	TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API;
362abdd2437Shisping 
363abdd2437Shisping 	return TeecResult;
364abdd2437Shisping }
365fd9c6bd7SJason Zhu #endif
366abdd2437Shisping 
367abdd2437Shisping /*
368abdd2437Shisping  * Execute a normal world local file system operation.
369abdd2437Shisping  */
370abdd2437Shisping TEEC_Result OpteeRpcCmdFs(t_teesmc32_arg *TeeSmc32Arg)
371abdd2437Shisping {
3721f25ada2SHisping Lin 	TEEC_Result TeecResult = TEEC_SUCCESS;
3731f25ada2SHisping Lin 	t_teesmc32_param *TeeSmc32Param;
374abdd2437Shisping 
3751f25ada2SHisping Lin 	TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
3763251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
377d079c1a5SHisping Lin 	TeecResult = OpteeClientRkFsProcess((void *)(size_t)TeeSmc32Param[0].u.memref.buf_ptr,
3781f25ada2SHisping Lin 							TeeSmc32Param[0].u.memref.size);
379a3cf1018SHisping Lin 	TeeSmc32Arg->ret = TEEC_SUCCESS;
3803251364cSHisping Lin #endif
3813251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
382df538e29SHisping Lin 	TeecResult = OpteeClientRkFsProcess((size_t)TeeSmc32Arg->num_params,
3833251364cSHisping Lin 							(struct tee_ioctl_param *)TeeSmc32Param);
384a3cf1018SHisping Lin 	TeeSmc32Arg->ret = TeecResult;
3853251364cSHisping Lin #endif
3861f25ada2SHisping Lin 	return TeecResult;
3871f25ada2SHisping Lin }
388abdd2437Shisping 
389abdd2437Shisping /*
390abdd2437Shisping  * TBD.
391abdd2437Shisping  */
392abdd2437Shisping TEEC_Result OpteeRpcCmdGetTime(t_teesmc32_arg *TeeSmc32Arg)
393abdd2437Shisping {
394abdd2437Shisping 	return TEEC_ERROR_NOT_IMPLEMENTED;
395abdd2437Shisping }
396abdd2437Shisping 
397abdd2437Shisping /*
398abdd2437Shisping  * TBD.
399abdd2437Shisping  */
400abdd2437Shisping TEEC_Result OpteeRpcCmdWaitMutex(t_teesmc32_arg *TeeSmc32Arg)
401abdd2437Shisping {
402abdd2437Shisping 	return TEEC_ERROR_NOT_IMPLEMENTED;
403abdd2437Shisping }
404abdd2437Shisping 
405abdd2437Shisping /*
406abdd2437Shisping  * Handle the callback from secure world.
407abdd2437Shisping  */
408abdd2437Shisping TEEC_Result OpteeRpcCallback(ARM_SMC_ARGS *ArmSmcArgs)
409abdd2437Shisping {
410abdd2437Shisping 	TEEC_Result TeecResult = TEEC_SUCCESS;
411abdd2437Shisping 
4121f25ada2SHisping Lin 	//printf("OpteeRpcCallback Enter: Arg0=0x%X, Arg1=0x%X, Arg2=0x%X\n",
4131f25ada2SHisping Lin 		//ArmSmcArgs->Arg0, ArmSmcArgs->Arg1, ArmSmcArgs->Arg2);
414abdd2437Shisping 
415abdd2437Shisping 	switch (TEESMC_RETURN_GET_RPC_FUNC(ArmSmcArgs->Arg0)) {
416abdd2437Shisping 	case TEESMC_RPC_FUNC_ALLOC_ARG: {
417efb93541SHisping Lin 		debug("TEEC: ArmSmcArgs->Arg1 = 0x%x \n", ArmSmcArgs->Arg1);
4181f25ada2SHisping Lin 		TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg2);
4191f25ada2SHisping Lin 		ArmSmcArgs->Arg5 = ArmSmcArgs->Arg2;
4201f25ada2SHisping Lin 		ArmSmcArgs->Arg1 = 0;
4211f25ada2SHisping Lin 		ArmSmcArgs->Arg4 = 0;
422abdd2437Shisping 		break;
423abdd2437Shisping 	}
424abdd2437Shisping 
425abdd2437Shisping 	case TEESMC_RPC_FUNC_ALLOC_PAYLOAD: {
426abdd2437Shisping 		TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1);
427abdd2437Shisping 		break;
428abdd2437Shisping 	}
429abdd2437Shisping 
430abdd2437Shisping 	case TEESMC_RPC_FUNC_FREE_ARG: {
4311f25ada2SHisping Lin 		TeecResult = OpteeRpcFree(ArmSmcArgs->Arg2);
432abdd2437Shisping 		break;
433abdd2437Shisping 	}
434abdd2437Shisping 
435abdd2437Shisping 	case TEESMC_RPC_FUNC_FREE_PAYLOAD: {
436abdd2437Shisping 		TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1);
437abdd2437Shisping 		break;
438abdd2437Shisping 	}
439abdd2437Shisping 
440abdd2437Shisping 	case TEESMC_RPC_FUNC_IRQ: {
441abdd2437Shisping 		break;
442abdd2437Shisping 	}
443abdd2437Shisping 
444abdd2437Shisping 	case TEESMC_RPC_FUNC_CMD: {
4451f25ada2SHisping Lin 		t_teesmc32_arg *TeeSmc32Arg =
446d156c9ffSHisping Lin 			(t_teesmc32_arg *)(size_t)((uint64_t)ArmSmcArgs->Arg1 << 32 | ArmSmcArgs->Arg2);
447efb93541SHisping Lin 		debug("TEEC: TeeSmc32Arg->cmd = 0x%x\n", TeeSmc32Arg->cmd);
448abdd2437Shisping 		switch (TeeSmc32Arg->cmd) {
4491f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_SHM_ALLOC_V2: {
4501f25ada2SHisping Lin 			uint32_t tempaddr;
4511f25ada2SHisping Lin 			uint32_t allocsize = TeeSmc32Arg->params[0].u.value.b;
4521f25ada2SHisping Lin 			TeecResult = OpteeRpcAlloc(allocsize, &tempaddr);
453efb93541SHisping Lin 			debug("TEEC: allocsize = 0x%x tempaddr = 0x%x\n", allocsize, tempaddr);
4541f25ada2SHisping Lin 			TeeSmc32Arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT_V2;
4551f25ada2SHisping Lin 			TeeSmc32Arg->params[0].u.memref.buf_ptr = tempaddr;
4561f25ada2SHisping Lin 			TeeSmc32Arg->params[0].u.memref.size = allocsize;
4571f25ada2SHisping Lin 			TeeSmc32Arg->params[0].u.memref.shm_ref = tempaddr;
4581f25ada2SHisping Lin 			TeeSmc32Arg->ret = TEE_SUCCESS;
4591f25ada2SHisping Lin 			break;
4601f25ada2SHisping Lin 		}
4611f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_SHM_FREE_V2: {
4621f25ada2SHisping Lin 			uint32_t tempaddr = TeeSmc32Arg->params[0].u.value.b;
4631f25ada2SHisping Lin 			TeecResult = OpteeRpcFree(tempaddr);
4641f25ada2SHisping Lin 			break;
4651f25ada2SHisping Lin 
4661f25ada2SHisping Lin 		}
467fd9c6bd7SJason Zhu #ifdef CONFIG_SUPPORT_EMMC_RPMB
4681f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_RPMB_V2: {
4691f25ada2SHisping Lin 			TeecResult = OpteeRpcCmdRpmb(TeeSmc32Arg);
4701f25ada2SHisping Lin 			break;
4711f25ada2SHisping Lin 		}
472fd9c6bd7SJason Zhu #endif
4733251364cSHisping Lin 		case OPTEE_MSG_RPC_CMD_FS_V2: {
4743251364cSHisping Lin 			TeecResult = OpteeRpcCmdFs(TeeSmc32Arg);
4753251364cSHisping Lin 			break;
4763251364cSHisping Lin 		}
4771f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_LOAD_TA_V2: {
4781f25ada2SHisping Lin 			TeecResult = OpteeRpcCmdLoadV2Ta(TeeSmc32Arg);
4791f25ada2SHisping Lin 			break;
4801f25ada2SHisping Lin 		}
481abdd2437Shisping 
482abdd2437Shisping 		default: {
483efb93541SHisping Lin 			printf("TEEC: ...unsupported RPC CMD: cmd=0x%X\n",
484abdd2437Shisping 				TeeSmc32Arg->cmd);
485abdd2437Shisping 			TeecResult = TEEC_ERROR_NOT_IMPLEMENTED;
486abdd2437Shisping 			break;
487abdd2437Shisping 		}
488abdd2437Shisping 	}
489abdd2437Shisping 
490abdd2437Shisping 		break;
491abdd2437Shisping 	}
492abdd2437Shisping 
493abdd2437Shisping 	case TEESMC_OPTEE_RPC_FUNC_ALLOC_PAYLOAD: {
494abdd2437Shisping 		TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1);
495abdd2437Shisping 		ArmSmcArgs->Arg2 = ArmSmcArgs->Arg1;
496abdd2437Shisping 		break;
497abdd2437Shisping 	}
498abdd2437Shisping 
499abdd2437Shisping 	case TEESMC_OPTEE_RPC_FUNC_FREE_PAYLOAD: {
500abdd2437Shisping 		TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1);
501abdd2437Shisping 		break;
502abdd2437Shisping 	}
503abdd2437Shisping 
504abdd2437Shisping 	default: {
505efb93541SHisping Lin 		printf("TEEC: ...unsupported RPC : Arg0=0x%X\n", ArmSmcArgs->Arg0);
506abdd2437Shisping 		TeecResult = TEEC_ERROR_NOT_IMPLEMENTED;
507abdd2437Shisping 		break;
508abdd2437Shisping 	}
509abdd2437Shisping 	}
510abdd2437Shisping 
511abdd2437Shisping 	ArmSmcArgs->Arg0 = TEESMC32_CALL_RETURN_FROM_RPC;
512efb93541SHisping Lin 	debug("TEEC: OpteeRpcCallback Exit : TeecResult=0x%X\n", TeecResult);
513abdd2437Shisping 
514abdd2437Shisping 	return TeecResult;
515abdd2437Shisping }
516