xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientRPC.c (revision 395c77b5f9b45eba4468a378527c654ac1160fc0)
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>
8*395c77b5SHisping Lin #include <boot_rkimg.h>
9abdd2437Shisping #include <stdlib.h>
10abdd2437Shisping #include <command.h>
11abdd2437Shisping #include <mmc.h>
12b122ee17SHisping Lin #include <optee_include/OpteeClientLoadTa.h>
13abdd2437Shisping #include <optee_include/OpteeClientMem.h>
14abdd2437Shisping #include <optee_include/OpteeClientRPC.h>
15abdd2437Shisping #include <optee_include/teesmc.h>
161f25ada2SHisping Lin #include <optee_include/teesmc_v2.h>
17abdd2437Shisping #include <optee_include/teesmc_optee.h>
1810adce6aSHisping Lin #include <optee_include/tee_mmc_rpmb.h>
19*395c77b5SHisping Lin #include <optee_include/tee_ufs_rpmb.h>
20abdd2437Shisping #include <optee_include/tee_rpc_types.h>
21abdd2437Shisping #include <optee_include/tee_rpc.h>
223251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
231f25ada2SHisping Lin #include <optee_include/OpteeClientRkFs.h>
243251364cSHisping Lin #endif
253251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
26df538e29SHisping Lin #include <optee_include/OpteeClientRkNewFs.h>
273251364cSHisping Lin #endif
28abdd2437Shisping 
29abdd2437Shisping /*
30abdd2437Shisping  * Memory allocation.
31abdd2437Shisping  * Currently treated the same for both arguments & payloads.
32abdd2437Shisping  */
OpteeRpcAlloc(uint32_t Size,uint32_t * Address)33abdd2437Shisping TEEC_Result OpteeRpcAlloc(uint32_t Size, uint32_t *Address)
34abdd2437Shisping {
35abdd2437Shisping 	TEEC_Result TeecResult = TEEC_SUCCESS;
361f25ada2SHisping Lin 	size_t AllocAddress;
37abdd2437Shisping 
38abdd2437Shisping 	*Address = 0;
39abdd2437Shisping 
40abdd2437Shisping 	if (Size != 0) {
411f25ada2SHisping Lin 		AllocAddress = (size_t) OpteeClientMemAlloc(Size);
42abdd2437Shisping 
43abdd2437Shisping 		if (AllocAddress == 0)
44abdd2437Shisping 			TeecResult = TEEC_ERROR_OUT_OF_MEMORY;
45abdd2437Shisping 		else
46abdd2437Shisping 			*Address = AllocAddress;
47abdd2437Shisping 	}
48abdd2437Shisping 	return TeecResult;
49abdd2437Shisping }
50abdd2437Shisping 
51abdd2437Shisping /*
52abdd2437Shisping  * Memory free.
53abdd2437Shisping  * Currently treated the same for both arguments & payloads.
54abdd2437Shisping  */
OpteeRpcFree(uint32_t Address)55abdd2437Shisping TEEC_Result OpteeRpcFree(uint32_t Address)
56abdd2437Shisping {
571f25ada2SHisping Lin 	OpteeClientMemFree((void *)(size_t)Address);
58abdd2437Shisping 	return TEEC_SUCCESS;
59abdd2437Shisping }
60abdd2437Shisping 
OpteeRpcCmdLoadV2Ta(t_teesmc32_arg * TeeSmc32Arg)611f25ada2SHisping Lin TEEC_Result OpteeRpcCmdLoadV2Ta(t_teesmc32_arg *TeeSmc32Arg)
621f25ada2SHisping Lin {
631f25ada2SHisping Lin 	TEEC_Result TeecResult = TEEC_SUCCESS;
641f25ada2SHisping Lin 	t_teesmc32_param *TeeSmc32Param = NULL;
65b122ee17SHisping Lin 	int ta_found = 0;
66b122ee17SHisping Lin 	size_t size = 0;
671f25ada2SHisping Lin 
681f25ada2SHisping Lin 	if (TeeSmc32Arg->num_params != 2) {
691f25ada2SHisping Lin 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
701f25ada2SHisping Lin 		goto Exit;
711f25ada2SHisping Lin 	}
721f25ada2SHisping Lin 
731f25ada2SHisping Lin 	TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
741f25ada2SHisping Lin 
75b122ee17SHisping Lin 	size = TeeSmc32Param[1].u.memref.size;
76b122ee17SHisping Lin 	ta_found = search_ta((void *)(size_t)&TeeSmc32Param[0].u.value,
77b122ee17SHisping Lin 				(void *)(size_t)TeeSmc32Param[1].u.memref.buf_ptr, &size);
78b122ee17SHisping Lin 	if (ta_found == TA_BINARY_FOUND) {
79b122ee17SHisping Lin 		TeeSmc32Param[1].u.memref.size = size;
80b122ee17SHisping Lin 		TeecResult = TEEC_SUCCESS;
811f25ada2SHisping Lin 	} else {
82b122ee17SHisping Lin 		printf("  TA not found \n");
83b122ee17SHisping Lin 		TeecResult = TEEC_ERROR_ITEM_NOT_FOUND;
841f25ada2SHisping Lin 	}
851f25ada2SHisping Lin 
861f25ada2SHisping Lin Exit:
871f25ada2SHisping Lin 	TeeSmc32Arg->ret = TeecResult;
881f25ada2SHisping Lin 	TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API;
891f25ada2SHisping Lin 
90b122ee17SHisping Lin 	debug("TEEC: OpteeRpcCmdLoadV2Ta Exit : TeecResult=0x%X\n", TeecResult);
91abdd2437Shisping 
92abdd2437Shisping 	return TeecResult;
93abdd2437Shisping }
94abdd2437Shisping 
95abdd2437Shisping /*
96abdd2437Shisping  * Execute an RPMB storage operation.
97abdd2437Shisping  */
OpteeRpcCmdRpmb(t_teesmc32_arg * TeeSmc32Arg)98abdd2437Shisping TEEC_Result OpteeRpcCmdRpmb(t_teesmc32_arg *TeeSmc32Arg)
99abdd2437Shisping {
100*395c77b5SHisping Lin 	struct blk_desc *dev_desc;
101*395c77b5SHisping Lin 
102*395c77b5SHisping Lin 	dev_desc = rockchip_get_bootdev();
103*395c77b5SHisping Lin 	if (!dev_desc) {
104*395c77b5SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
105*395c77b5SHisping Lin 		return TEEC_ERROR_GENERIC;
106*395c77b5SHisping Lin 	}
107*395c77b5SHisping Lin 
108*395c77b5SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc
10910adce6aSHisping Lin 		return emmc_rpmb_process(TeeSmc32Arg);
110*395c77b5SHisping Lin 	else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs
111*395c77b5SHisping Lin 		return ufs_rpmb_process(TeeSmc32Arg);
112*395c77b5SHisping Lin 
113*395c77b5SHisping Lin 	printf("Device not support rpmb!\n");
114*395c77b5SHisping Lin 	return TEEC_ERROR_NOT_IMPLEMENTED;
115abdd2437Shisping }
116abdd2437Shisping 
117abdd2437Shisping /*
118abdd2437Shisping  * Execute a normal world local file system operation.
119abdd2437Shisping  */
OpteeRpcCmdFs(t_teesmc32_arg * TeeSmc32Arg)120abdd2437Shisping TEEC_Result OpteeRpcCmdFs(t_teesmc32_arg *TeeSmc32Arg)
121abdd2437Shisping {
1221f25ada2SHisping Lin 	TEEC_Result TeecResult = TEEC_SUCCESS;
1231f25ada2SHisping Lin 	t_teesmc32_param *TeeSmc32Param;
124abdd2437Shisping 
1251f25ada2SHisping Lin 	TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
1263251364cSHisping Lin #ifdef CONFIG_OPTEE_V1
127d079c1a5SHisping Lin 	TeecResult = OpteeClientRkFsProcess((void *)(size_t)TeeSmc32Param[0].u.memref.buf_ptr,
1281f25ada2SHisping Lin 							TeeSmc32Param[0].u.memref.size);
129a3cf1018SHisping Lin 	TeeSmc32Arg->ret = TEEC_SUCCESS;
1303251364cSHisping Lin #endif
1313251364cSHisping Lin #ifdef CONFIG_OPTEE_V2
132df538e29SHisping Lin 	TeecResult = OpteeClientRkFsProcess((size_t)TeeSmc32Arg->num_params,
1333251364cSHisping Lin 							(struct tee_ioctl_param *)TeeSmc32Param);
134a3cf1018SHisping Lin 	TeeSmc32Arg->ret = TeecResult;
1353251364cSHisping Lin #endif
1361f25ada2SHisping Lin 	return TeecResult;
1371f25ada2SHisping Lin }
138abdd2437Shisping 
139abdd2437Shisping /*
140abdd2437Shisping  * TBD.
141abdd2437Shisping  */
OpteeRpcCmdGetTime(t_teesmc32_arg * TeeSmc32Arg)142abdd2437Shisping TEEC_Result OpteeRpcCmdGetTime(t_teesmc32_arg *TeeSmc32Arg)
143abdd2437Shisping {
144abdd2437Shisping 	return TEEC_ERROR_NOT_IMPLEMENTED;
145abdd2437Shisping }
146abdd2437Shisping 
147abdd2437Shisping /*
148abdd2437Shisping  * TBD.
149abdd2437Shisping  */
OpteeRpcCmdWaitMutex(t_teesmc32_arg * TeeSmc32Arg)150abdd2437Shisping TEEC_Result OpteeRpcCmdWaitMutex(t_teesmc32_arg *TeeSmc32Arg)
151abdd2437Shisping {
152abdd2437Shisping 	return TEEC_ERROR_NOT_IMPLEMENTED;
153abdd2437Shisping }
154abdd2437Shisping 
155abdd2437Shisping /*
156abdd2437Shisping  * Handle the callback from secure world.
157abdd2437Shisping  */
OpteeRpcCallback(ARM_SMC_ARGS * ArmSmcArgs)158abdd2437Shisping TEEC_Result OpteeRpcCallback(ARM_SMC_ARGS *ArmSmcArgs)
159abdd2437Shisping {
160abdd2437Shisping 	TEEC_Result TeecResult = TEEC_SUCCESS;
161abdd2437Shisping 
1621f25ada2SHisping Lin 	//printf("OpteeRpcCallback Enter: Arg0=0x%X, Arg1=0x%X, Arg2=0x%X\n",
1631f25ada2SHisping Lin 		//ArmSmcArgs->Arg0, ArmSmcArgs->Arg1, ArmSmcArgs->Arg2);
164abdd2437Shisping 
165abdd2437Shisping 	switch (TEESMC_RETURN_GET_RPC_FUNC(ArmSmcArgs->Arg0)) {
166abdd2437Shisping 	case TEESMC_RPC_FUNC_ALLOC_ARG: {
167efb93541SHisping Lin 		debug("TEEC: ArmSmcArgs->Arg1 = 0x%x \n", ArmSmcArgs->Arg1);
1681f25ada2SHisping Lin 		TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg2);
1691f25ada2SHisping Lin 		ArmSmcArgs->Arg5 = ArmSmcArgs->Arg2;
1701f25ada2SHisping Lin 		ArmSmcArgs->Arg1 = 0;
1711f25ada2SHisping Lin 		ArmSmcArgs->Arg4 = 0;
172abdd2437Shisping 		break;
173abdd2437Shisping 	}
174abdd2437Shisping 
175abdd2437Shisping 	case TEESMC_RPC_FUNC_ALLOC_PAYLOAD: {
176abdd2437Shisping 		TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1);
177abdd2437Shisping 		break;
178abdd2437Shisping 	}
179abdd2437Shisping 
180abdd2437Shisping 	case TEESMC_RPC_FUNC_FREE_ARG: {
1811f25ada2SHisping Lin 		TeecResult = OpteeRpcFree(ArmSmcArgs->Arg2);
182abdd2437Shisping 		break;
183abdd2437Shisping 	}
184abdd2437Shisping 
185abdd2437Shisping 	case TEESMC_RPC_FUNC_FREE_PAYLOAD: {
186abdd2437Shisping 		TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1);
187abdd2437Shisping 		break;
188abdd2437Shisping 	}
189abdd2437Shisping 
190abdd2437Shisping 	case TEESMC_RPC_FUNC_IRQ: {
191abdd2437Shisping 		break;
192abdd2437Shisping 	}
193abdd2437Shisping 
194abdd2437Shisping 	case TEESMC_RPC_FUNC_CMD: {
1951f25ada2SHisping Lin 		t_teesmc32_arg *TeeSmc32Arg =
196d156c9ffSHisping Lin 			(t_teesmc32_arg *)(size_t)((uint64_t)ArmSmcArgs->Arg1 << 32 | ArmSmcArgs->Arg2);
197efb93541SHisping Lin 		debug("TEEC: TeeSmc32Arg->cmd = 0x%x\n", TeeSmc32Arg->cmd);
198abdd2437Shisping 		switch (TeeSmc32Arg->cmd) {
1991f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_SHM_ALLOC_V2: {
2001f25ada2SHisping Lin 			uint32_t tempaddr;
2011f25ada2SHisping Lin 			uint32_t allocsize = TeeSmc32Arg->params[0].u.value.b;
2021f25ada2SHisping Lin 			TeecResult = OpteeRpcAlloc(allocsize, &tempaddr);
203efb93541SHisping Lin 			debug("TEEC: allocsize = 0x%x tempaddr = 0x%x\n", allocsize, tempaddr);
2041f25ada2SHisping Lin 			TeeSmc32Arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT_V2;
2051f25ada2SHisping Lin 			TeeSmc32Arg->params[0].u.memref.buf_ptr = tempaddr;
2061f25ada2SHisping Lin 			TeeSmc32Arg->params[0].u.memref.size = allocsize;
2071f25ada2SHisping Lin 			TeeSmc32Arg->params[0].u.memref.shm_ref = tempaddr;
2081f25ada2SHisping Lin 			TeeSmc32Arg->ret = TEE_SUCCESS;
2091f25ada2SHisping Lin 			break;
2101f25ada2SHisping Lin 		}
2111f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_SHM_FREE_V2: {
2121f25ada2SHisping Lin 			uint32_t tempaddr = TeeSmc32Arg->params[0].u.value.b;
2131f25ada2SHisping Lin 			TeecResult = OpteeRpcFree(tempaddr);
2141f25ada2SHisping Lin 			break;
2151f25ada2SHisping Lin 
2161f25ada2SHisping Lin 		}
2171f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_RPMB_V2: {
2181f25ada2SHisping Lin 			TeecResult = OpteeRpcCmdRpmb(TeeSmc32Arg);
2191f25ada2SHisping Lin 			break;
2201f25ada2SHisping Lin 		}
2213251364cSHisping Lin 		case OPTEE_MSG_RPC_CMD_FS_V2: {
2223251364cSHisping Lin 			TeecResult = OpteeRpcCmdFs(TeeSmc32Arg);
2233251364cSHisping Lin 			break;
2243251364cSHisping Lin 		}
2251f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_LOAD_TA_V2: {
2261f25ada2SHisping Lin 			TeecResult = OpteeRpcCmdLoadV2Ta(TeeSmc32Arg);
2271f25ada2SHisping Lin 			break;
2281f25ada2SHisping Lin 		}
229abdd2437Shisping 
230abdd2437Shisping 		default: {
231efb93541SHisping Lin 			printf("TEEC: ...unsupported RPC CMD: cmd=0x%X\n",
232abdd2437Shisping 				TeeSmc32Arg->cmd);
233abdd2437Shisping 			TeecResult = TEEC_ERROR_NOT_IMPLEMENTED;
234abdd2437Shisping 			break;
235abdd2437Shisping 		}
236abdd2437Shisping 	}
237abdd2437Shisping 
238abdd2437Shisping 		break;
239abdd2437Shisping 	}
240abdd2437Shisping 
241abdd2437Shisping 	case TEESMC_OPTEE_RPC_FUNC_ALLOC_PAYLOAD: {
242abdd2437Shisping 		TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1);
243abdd2437Shisping 		ArmSmcArgs->Arg2 = ArmSmcArgs->Arg1;
244abdd2437Shisping 		break;
245abdd2437Shisping 	}
246abdd2437Shisping 
247abdd2437Shisping 	case TEESMC_OPTEE_RPC_FUNC_FREE_PAYLOAD: {
248abdd2437Shisping 		TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1);
249abdd2437Shisping 		break;
250abdd2437Shisping 	}
251abdd2437Shisping 
252abdd2437Shisping 	default: {
253efb93541SHisping Lin 		printf("TEEC: ...unsupported RPC : Arg0=0x%X\n", ArmSmcArgs->Arg0);
254abdd2437Shisping 		TeecResult = TEEC_ERROR_NOT_IMPLEMENTED;
255abdd2437Shisping 		break;
256abdd2437Shisping 	}
257abdd2437Shisping 	}
258abdd2437Shisping 
259abdd2437Shisping 	ArmSmcArgs->Arg0 = TEESMC32_CALL_RETURN_FROM_RPC;
260efb93541SHisping Lin 	debug("TEEC: OpteeRpcCallback Exit : TeecResult=0x%X\n", TeecResult);
261abdd2437Shisping 
262abdd2437Shisping 	return TeecResult;
263abdd2437Shisping }
264