xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientRPC.c (revision 1f25ada2a8eccef6ea3d9844a40d05d7ce7027d4)
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>
11abdd2437Shisping #include <optee_include/OpteeClientMem.h>
12abdd2437Shisping #include <optee_include/OpteeClientRPC.h>
13abdd2437Shisping #include <optee_include/teesmc.h>
14*1f25ada2SHisping Lin #include <optee_include/teesmc_v2.h>
15abdd2437Shisping #include <optee_include/teesmc_optee.h>
16abdd2437Shisping #include <optee_include/tee_rpc_types.h>
17abdd2437Shisping #include <optee_include/tee_rpc.h>
18abdd2437Shisping #include <optee_include/258be795-f9ca-40e6-a8699ce6886c5d5d.h>
19*1f25ada2SHisping Lin #include <optee_include/OpteeClientRkFs.h>
20abdd2437Shisping 
21abdd2437Shisping /*
22abdd2437Shisping  * Memory allocation.
23abdd2437Shisping  * Currently treated the same for both arguments & payloads.
24abdd2437Shisping  */
25abdd2437Shisping TEEC_Result OpteeRpcAlloc(uint32_t Size, uint32_t *Address)
26abdd2437Shisping {
27abdd2437Shisping 	TEEC_Result TeecResult = TEEC_SUCCESS;
28*1f25ada2SHisping Lin 	size_t AllocAddress;
29abdd2437Shisping 
30abdd2437Shisping 	*Address = 0;
31abdd2437Shisping 
32abdd2437Shisping 	if (Size != 0) {
33*1f25ada2SHisping Lin 		AllocAddress = (size_t) OpteeClientMemAlloc(Size);
34abdd2437Shisping 
35abdd2437Shisping 		if (AllocAddress == 0)
36abdd2437Shisping 			TeecResult = TEEC_ERROR_OUT_OF_MEMORY;
37abdd2437Shisping 		else
38abdd2437Shisping 			*Address = AllocAddress;
39abdd2437Shisping 	}
40abdd2437Shisping 	return TeecResult;
41abdd2437Shisping }
42abdd2437Shisping 
43abdd2437Shisping /*
44abdd2437Shisping  * Memory free.
45abdd2437Shisping  * Currently treated the same for both arguments & payloads.
46abdd2437Shisping  */
47abdd2437Shisping TEEC_Result OpteeRpcFree(uint32_t Address)
48abdd2437Shisping {
49*1f25ada2SHisping Lin 	OpteeClientMemFree((void *)(size_t)Address);
50abdd2437Shisping 	return TEEC_SUCCESS;
51abdd2437Shisping }
52abdd2437Shisping 
53abdd2437Shisping /*
54abdd2437Shisping  * Load a TA from storage into memory and provide it back to OpTEE.
55abdd2437Shisping  * Param[0] = IN: struct tee_rpc_load_ta_cmd
56abdd2437Shisping  * Param[1] = IN: all-zero OUT: TA Image allocated
57abdd2437Shisping  */
58abdd2437Shisping TEEC_Result OpteeRpcCmdLoadTa(t_teesmc32_arg *TeeSmc32Arg)
59abdd2437Shisping {
60abdd2437Shisping 	TEEC_Result TeecResult = TEEC_SUCCESS;
61abdd2437Shisping 	t_teesmc32_param *TeeSmc32Param = NULL;
62abdd2437Shisping 	struct tee_rpc_load_ta_cmd *TeeLoadTaCmd = NULL;
63abdd2437Shisping 	uint32_t TeeLoadTaCmdSize = 0;
64abdd2437Shisping 
65abdd2437Shisping 	if (TeeSmc32Arg->num_params != 2) {
66abdd2437Shisping 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
67abdd2437Shisping 		goto Exit;
68abdd2437Shisping 	}
69abdd2437Shisping 
70abdd2437Shisping 	TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
71abdd2437Shisping 	TeeLoadTaCmd = (struct tee_rpc_load_ta_cmd *)
72*1f25ada2SHisping Lin 					(size_t)TeeSmc32Param[0].u.memref.buf_ptr;
73abdd2437Shisping 	TeeLoadTaCmdSize = TeeSmc32Param[0].u.memref.size;
74abdd2437Shisping 
75abdd2437Shisping 	if ((TeeLoadTaCmd == NULL) ||
76abdd2437Shisping 		(TeeLoadTaCmdSize != sizeof(*TeeLoadTaCmd))) {
77abdd2437Shisping 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
78abdd2437Shisping 		goto Exit;
79abdd2437Shisping 	}
80abdd2437Shisping 
81abdd2437Shisping 	TEEC_Result Status = 0;
82abdd2437Shisping 	void *ImageData = NULL;
83abdd2437Shisping 	uint32_t ImageSize = 0;
84*1f25ada2SHisping Lin 	size_t AllocAddress = 0;
85abdd2437Shisping 
86abdd2437Shisping 	ImageData = (void *)keymaster_data;
87abdd2437Shisping 	ImageSize = keymaster_size;
88abdd2437Shisping 
89abdd2437Shisping 	if (Status != 0) {
90abdd2437Shisping 		TeecResult = TEEC_ERROR_ITEM_NOT_FOUND;
91abdd2437Shisping 		goto Exit;
92abdd2437Shisping 	}
93abdd2437Shisping 
94*1f25ada2SHisping Lin 	AllocAddress = (size_t) OpteeClientMemAlloc(ImageSize);
95abdd2437Shisping 
96abdd2437Shisping 	if (AllocAddress == 0) {
97abdd2437Shisping 		TeecResult = TEEC_ERROR_OUT_OF_MEMORY;
98abdd2437Shisping 		goto Exit;
99abdd2437Shisping 	}
100abdd2437Shisping 
101abdd2437Shisping 	memcpy((void *)AllocAddress, ImageData, ImageSize);
102abdd2437Shisping 
103*1f25ada2SHisping Lin 	debug("...TA loaded at 0x%zu of size 0x%X bytes\n",
104abdd2437Shisping 		AllocAddress, ImageSize);
105abdd2437Shisping 	debug("...AllocAddress[0] 0x%X ; AllocAddress[1] 0x%X bytes\n",
106abdd2437Shisping 		*(char *)AllocAddress, *(char *)(AllocAddress+1));
107abdd2437Shisping 
108*1f25ada2SHisping Lin 	TeeLoadTaCmd->va = AllocAddress;
109abdd2437Shisping 
110abdd2437Shisping 	TeeSmc32Param[1].u.memref.buf_ptr = AllocAddress;
111abdd2437Shisping 	TeeSmc32Param[1].u.memref.size = ImageSize;
112abdd2437Shisping 
113abdd2437Shisping Exit:
114abdd2437Shisping 	TeeSmc32Arg->ret = TeecResult;
115abdd2437Shisping 	TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API;
116abdd2437Shisping 
117abdd2437Shisping 	debug("OpteeRpcCmdLoadTa Exit : TeecResult=0x%X\n", TeecResult);
118abdd2437Shisping 
119abdd2437Shisping 	return TeecResult;
120abdd2437Shisping }
121abdd2437Shisping 
122*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V2
123*1f25ada2SHisping Lin TEEC_Result OpteeRpcCmdLoadV2Ta(t_teesmc32_arg *TeeSmc32Arg)
124*1f25ada2SHisping Lin {
125*1f25ada2SHisping Lin 	TEEC_Result TeecResult = TEEC_SUCCESS;
126*1f25ada2SHisping Lin 	t_teesmc32_param *TeeSmc32Param = NULL;
127*1f25ada2SHisping Lin 	uint8_t uuid[16];
128*1f25ada2SHisping Lin 	int i;
129*1f25ada2SHisping Lin 
130*1f25ada2SHisping Lin 	if (TeeSmc32Arg->num_params != 2) {
131*1f25ada2SHisping Lin 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
132*1f25ada2SHisping Lin 		goto Exit;
133*1f25ada2SHisping Lin 	}
134*1f25ada2SHisping Lin 
135*1f25ada2SHisping Lin 	TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
136*1f25ada2SHisping Lin 
137*1f25ada2SHisping Lin 	memcpy(uuid, (void *)&TeeSmc32Param[0].u.value, 16);
138*1f25ada2SHisping Lin 	for (i = 0; i < 16; i++)
139*1f25ada2SHisping Lin 		printf("uuid 0x%x", uuid[i]);
140*1f25ada2SHisping Lin 
141*1f25ada2SHisping Lin 	if (TeeSmc32Param[1].u.memref.buf_ptr == 0) {
142*1f25ada2SHisping Lin 		printf("return size of TA, keymaster_size = 0x%x", keymaster_size);
143*1f25ada2SHisping Lin 		TeeSmc32Param[1].u.memref.size = keymaster_size;
144*1f25ada2SHisping Lin 	} else {
145*1f25ada2SHisping Lin 		memcpy((void *)TeeSmc32Param[1].u.memref.buf_ptr,
146*1f25ada2SHisping Lin 			(void *)keymaster_data, TeeSmc32Param[1].u.memref.size);
147*1f25ada2SHisping Lin 		printf("memref.buf_ptr = 0x%llx; memref.size = 0x%llx",
148*1f25ada2SHisping Lin 			TeeSmc32Param[1].u.memref.buf_ptr,
149*1f25ada2SHisping Lin 			TeeSmc32Param[1].u.memref.size);
150*1f25ada2SHisping Lin 	}
151*1f25ada2SHisping Lin 
152*1f25ada2SHisping Lin Exit:
153*1f25ada2SHisping Lin 	TeeSmc32Arg->ret = TeecResult;
154*1f25ada2SHisping Lin 	TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API;
155*1f25ada2SHisping Lin 
156*1f25ada2SHisping Lin 	debug("OpteeRpcCmdLoadTa Exit : TeecResult=0x%X\n", TeecResult);
157*1f25ada2SHisping Lin 
158*1f25ada2SHisping Lin 	return TeecResult;
159*1f25ada2SHisping Lin }
160*1f25ada2SHisping Lin #endif
161*1f25ada2SHisping Lin 
162abdd2437Shisping /*
163abdd2437Shisping  * Free a previously loaded TA and release the memory
164abdd2437Shisping  * Param[0] = IN: TA Image to free
165abdd2437Shisping  *
166abdd2437Shisping  * Um, why is OpTEE holding on to this memory? The OS code suggests that OpTEE
167abdd2437Shisping  * is using the binary in place out of shared memory but I don't understand how
168abdd2437Shisping  * runtime modifications of the binary are being prevented if that's the case?
169abdd2437Shisping  */
170abdd2437Shisping TEEC_Result OpteeRpcCmdFreeTa(t_teesmc32_arg *TeeSmc32Arg)
171abdd2437Shisping {
172abdd2437Shisping 	TEEC_Result TeecResult = TEEC_SUCCESS;
173abdd2437Shisping 	t_teesmc32_param *TeeSmc32Param = NULL;
174abdd2437Shisping 	uint32_t ImageSize = 0;
175*1f25ada2SHisping Lin 	size_t AllocAddress = 0;
176abdd2437Shisping 
177abdd2437Shisping 	if (TeeSmc32Arg->num_params != 1) {
178abdd2437Shisping 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
179abdd2437Shisping 		goto Exit;
180abdd2437Shisping 	}
181abdd2437Shisping 
182abdd2437Shisping 	TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
183abdd2437Shisping 
184abdd2437Shisping 	AllocAddress = TeeSmc32Param[0].u.memref.buf_ptr;
185abdd2437Shisping 	ImageSize = TeeSmc32Param[0].u.memref.size;
186abdd2437Shisping 
187abdd2437Shisping 	debug("OpteeRpcCmdFreeTa Enter: AllocAddress=0x%X, ImageSize=0x%X\n",
188abdd2437Shisping 			(uint32_t) AllocAddress, (uint32_t) ImageSize);
189abdd2437Shisping 
190abdd2437Shisping 	if (AllocAddress == 0) {
191abdd2437Shisping 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
192abdd2437Shisping 		goto Exit;
193abdd2437Shisping 	}
194abdd2437Shisping 
195abdd2437Shisping 	OpteeClientMemFree((void *)AllocAddress);
196abdd2437Shisping 
197abdd2437Shisping Exit:
198abdd2437Shisping 	TeeSmc32Arg->ret = TeecResult;
199abdd2437Shisping 	TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API;
200abdd2437Shisping 
201abdd2437Shisping 	debug("OpteeRpcCmdFreeTa Exit : TeecResult=0x%X\n", TeecResult);
202abdd2437Shisping 
203abdd2437Shisping 	return TeecResult;
204abdd2437Shisping }
205abdd2437Shisping 
206abdd2437Shisping /*
207abdd2437Shisping  * Execute an RPMB storage operation.
208abdd2437Shisping  */
209*1f25ada2SHisping Lin 
210abdd2437Shisping uint16_t global_block_count;
211abdd2437Shisping TEEC_Result OpteeRpcCmdRpmb(t_teesmc32_arg *TeeSmc32Arg)
212abdd2437Shisping {
213abdd2437Shisping 	struct tee_rpc_rpmb_dev_info *DevInfo;
214abdd2437Shisping 	TEEC_Result EfiStatus;
215abdd2437Shisping 	uint16_t RequestMsgType, i;
216abdd2437Shisping 	EFI_RK_RPMB_DATA_PACKET *RequestPackets;
217abdd2437Shisping 	EFI_RK_RPMB_DATA_PACKET *ResponsePackets;
218abdd2437Shisping 	EFI_RK_RPMB_DATA_PACKET *tempPackets;
219abdd2437Shisping 	EFI_RK_RPMB_DATA_PACKET_BACK *RequestPackets_back;
220abdd2437Shisping 	EFI_RK_RPMB_DATA_PACKET_BACK *tempPackets_back;
221abdd2437Shisping 	struct tee_rpc_rpmb_cmd *RpmbRequest;
222abdd2437Shisping 	TEEC_Result TeecResult = TEEC_SUCCESS;
223abdd2437Shisping 	t_teesmc32_param *TeeSmc32Param;
224abdd2437Shisping 	struct mmc *mmc;
225abdd2437Shisping 
226abdd2437Shisping 	debug("Entered RPMB RPC\n");
227abdd2437Shisping 
228abdd2437Shisping 	if (TeeSmc32Arg->num_params != 2) {
229abdd2437Shisping 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
230abdd2437Shisping 		goto Exit;
231abdd2437Shisping 	}
232abdd2437Shisping 
233abdd2437Shisping 	TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
234*1f25ada2SHisping Lin 	RpmbRequest = (struct tee_rpc_rpmb_cmd *)(size_t)
235abdd2437Shisping 		TeeSmc32Param[0].u.memref.buf_ptr;
236abdd2437Shisping 	switch (RpmbRequest->cmd) {
237abdd2437Shisping 	case TEE_RPC_RPMB_CMD_DATA_REQ: {
238abdd2437Shisping 		RequestPackets = (EFI_RK_RPMB_DATA_PACKET *)(RpmbRequest + 1);
239*1f25ada2SHisping Lin 		ResponsePackets = (EFI_RK_RPMB_DATA_PACKET *)(size_t)
240abdd2437Shisping 		TeeSmc32Param[1].u.memref.buf_ptr;
241abdd2437Shisping 
242abdd2437Shisping 		global_block_count =
243abdd2437Shisping 			(RpmbRequest->block_count == 0 ?
244abdd2437Shisping 			1 : RpmbRequest->block_count);
245abdd2437Shisping 		RequestPackets_back =
246abdd2437Shisping 			malloc(sizeof(EFI_RK_RPMB_DATA_PACKET_BACK)
247abdd2437Shisping 			* global_block_count);
248abdd2437Shisping 		memcpy(RequestPackets_back->stuff,
249abdd2437Shisping 			RequestPackets->stuff_bytes,
250abdd2437Shisping 			RPMB_STUFF_DATA_SIZE);
251abdd2437Shisping 		memcpy(RequestPackets_back->mac,
252abdd2437Shisping 			RequestPackets->key_mac,
253abdd2437Shisping 			RPMB_KEY_MAC_SIZE);
254abdd2437Shisping 		memcpy(RequestPackets_back->data,
255abdd2437Shisping 			RequestPackets->data,
256abdd2437Shisping 			RPMB_DATA_SIZE);
257abdd2437Shisping 		memcpy(RequestPackets_back->nonce,
258abdd2437Shisping 			RequestPackets->nonce,
259abdd2437Shisping 			RPMB_NONCE_SIZE);
260abdd2437Shisping 		RequestPackets_back->write_counter =
261abdd2437Shisping 			((RequestPackets->write_counter[3]) << 24) +
262abdd2437Shisping 			((RequestPackets->write_counter[2]) << 16) +
263abdd2437Shisping 			((RequestPackets->write_counter[1]) << 8) +
264abdd2437Shisping 			(RequestPackets->write_counter[0]);
265abdd2437Shisping 		RequestPackets_back->address =
266abdd2437Shisping 			((RequestPackets->address[1]) << 8) +
267abdd2437Shisping 			(RequestPackets->address[0]);
268abdd2437Shisping 		RequestPackets_back->block_count =
269abdd2437Shisping 			((RequestPackets->block_count[1]) << 8) +
270abdd2437Shisping 			(RequestPackets->block_count[0]);
271abdd2437Shisping 		RequestPackets_back->result =
272abdd2437Shisping 			((RequestPackets->op_result[1]) << 8) +
273abdd2437Shisping 			(RequestPackets->op_result[0]);
274abdd2437Shisping 		RequestPackets_back->request =
275abdd2437Shisping 			((RequestPackets->msg_type[1]) << 8) +
276abdd2437Shisping 			(RequestPackets->msg_type[0]);
277abdd2437Shisping 
278abdd2437Shisping 		RequestMsgType = RPMB_PACKET_DATA_TO_UINT16(
279abdd2437Shisping 				RequestPackets->msg_type);
280abdd2437Shisping 
281abdd2437Shisping 		debug("RPMB Data request %d\n", RequestMsgType);
282abdd2437Shisping 
283abdd2437Shisping 		switch (RequestMsgType) {
284abdd2437Shisping 		case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_KEY_PROGRAM: {
285abdd2437Shisping 			EfiStatus = init_rpmb();
286abdd2437Shisping 			if (EfiStatus != 0) {
287abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
288abdd2437Shisping 				break;
289abdd2437Shisping 			}
290abdd2437Shisping 
291abdd2437Shisping 			EfiStatus = do_programkey((struct s_rpmb *)
292abdd2437Shisping 				RequestPackets_back);
293abdd2437Shisping 
294abdd2437Shisping 			if (EfiStatus != 0) {
295abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
296abdd2437Shisping 				break;
297abdd2437Shisping 			}
298abdd2437Shisping 
299abdd2437Shisping 			EfiStatus = finish_rpmb();
300abdd2437Shisping 			if (EfiStatus != 0) {
301abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
302abdd2437Shisping 				break;
303abdd2437Shisping 			}
304abdd2437Shisping 
305abdd2437Shisping 			break;
306abdd2437Shisping 		}
307abdd2437Shisping 
308abdd2437Shisping 		case TEE_RPC_RPMB_MSG_TYPE_REQ_WRITE_COUNTER_VAL_READ: {
309abdd2437Shisping 			EfiStatus = init_rpmb();
310abdd2437Shisping 			if (EfiStatus != 0) {
311abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
312abdd2437Shisping 				break;
313abdd2437Shisping 			}
314abdd2437Shisping 
315abdd2437Shisping 			EfiStatus = do_readcounter((struct s_rpmb *)
316abdd2437Shisping 				RequestPackets_back);
317abdd2437Shisping 			if (EfiStatus != 0) {
318abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
319abdd2437Shisping 				break;
320abdd2437Shisping 			}
321abdd2437Shisping 
322abdd2437Shisping 			EfiStatus = finish_rpmb();
323abdd2437Shisping 			if (EfiStatus != 0) {
324abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
325abdd2437Shisping 				break;
326abdd2437Shisping 			}
327abdd2437Shisping 
328abdd2437Shisping 			break;
329abdd2437Shisping 		}
330abdd2437Shisping 
331abdd2437Shisping 		case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_DATA_WRITE: {
332abdd2437Shisping 			EfiStatus = init_rpmb();
333abdd2437Shisping 			if (EfiStatus != 0) {
334abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
335abdd2437Shisping 				break;
336abdd2437Shisping 			}
337abdd2437Shisping 
338abdd2437Shisping 			EfiStatus = do_authenticatedwrite((struct s_rpmb *)
339abdd2437Shisping 				RequestPackets_back);
340abdd2437Shisping 			if (EfiStatus != 0) {
341abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
342abdd2437Shisping 				break;
343abdd2437Shisping 			}
344abdd2437Shisping 
345abdd2437Shisping 			EfiStatus = finish_rpmb();
346abdd2437Shisping 
347abdd2437Shisping 			if (EfiStatus != 0) {
348abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
349abdd2437Shisping 				break;
350abdd2437Shisping 			}
351abdd2437Shisping 
352abdd2437Shisping 			break;
353abdd2437Shisping 		}
354abdd2437Shisping 
355abdd2437Shisping 		case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_DATA_READ: {
356abdd2437Shisping 			EfiStatus = init_rpmb();
357abdd2437Shisping 			if (EfiStatus != 0) {
358abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
359abdd2437Shisping 				break;
360abdd2437Shisping 			}
361abdd2437Shisping 
362abdd2437Shisping 			EfiStatus = do_authenticatedread((struct s_rpmb *)
363abdd2437Shisping 				RequestPackets_back, global_block_count);
364abdd2437Shisping 			if (EfiStatus != 0) {
365abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
366abdd2437Shisping 				break;
367abdd2437Shisping 			}
368abdd2437Shisping 
369abdd2437Shisping 			EfiStatus = finish_rpmb();
370abdd2437Shisping 
371abdd2437Shisping 			if (EfiStatus != 0) {
372abdd2437Shisping 				TeecResult = TEEC_ERROR_GENERIC;
373abdd2437Shisping 				break;
374abdd2437Shisping 			}
375abdd2437Shisping 
376abdd2437Shisping 			break;
377abdd2437Shisping 		}
378abdd2437Shisping 
379abdd2437Shisping 		default:
380abdd2437Shisping 			TeecResult = TEEC_ERROR_BAD_PARAMETERS;
381abdd2437Shisping 			break;
382abdd2437Shisping 		}
383abdd2437Shisping 		debug("RPMB TeecResult %d\n", TeecResult);
384abdd2437Shisping 		break;
385abdd2437Shisping 	}
386abdd2437Shisping 
387abdd2437Shisping 	case TEE_RPC_RPMB_CMD_GET_DEV_INFO: {
388abdd2437Shisping 		mmc = do_returnmmc();
389abdd2437Shisping 
390*1f25ada2SHisping Lin 		DevInfo = (struct tee_rpc_rpmb_dev_info *)(size_t)
391abdd2437Shisping 		TeeSmc32Param[1].u.memref.buf_ptr;
392abdd2437Shisping 
393abdd2437Shisping 		DevInfo->cid[0] = (mmc->cid[0]) >> 24 & 0xff;
394abdd2437Shisping 		DevInfo->cid[1] = (mmc->cid[0]) >> 16 & 0xff;
395abdd2437Shisping 		DevInfo->cid[2] = (mmc->cid[0]) >> 8 & 0xff;
396abdd2437Shisping 		DevInfo->cid[3] = (mmc->cid[0]) & 0xff;
397abdd2437Shisping 		DevInfo->cid[4] = (mmc->cid[1]) >> 24 & 0xff;
398abdd2437Shisping 		DevInfo->cid[5] = (mmc->cid[1]) >> 16 & 0xff;
399abdd2437Shisping 		DevInfo->cid[6] = (mmc->cid[1]) >> 8 & 0xff;
400abdd2437Shisping 		DevInfo->cid[7] = (mmc->cid[1]) & 0xff;
401abdd2437Shisping 		DevInfo->cid[8] = (mmc->cid[2]) >> 24 & 0xff;
402abdd2437Shisping 		DevInfo->cid[9] = (mmc->cid[2]) >> 16 & 0xff;
403abdd2437Shisping 		DevInfo->cid[10] = (mmc->cid[2]) >> 8 & 0xff;
404abdd2437Shisping 		DevInfo->cid[11] = (mmc->cid[2]) & 0xff;
405abdd2437Shisping 		DevInfo->cid[12] = (mmc->cid[3]) >> 24 & 0xff;
406abdd2437Shisping 		DevInfo->cid[13] = (mmc->cid[3]) >> 16 & 0xff;
407abdd2437Shisping 		DevInfo->cid[14] = (mmc->cid[3]) >> 8 & 0xff;
408abdd2437Shisping 		DevInfo->cid[15] = (mmc->cid[3]) & 0xff;
409abdd2437Shisping 		DevInfo->rel_wr_sec_c = 1;
410abdd2437Shisping 		DevInfo->rpmb_size_mult =
411abdd2437Shisping 			(uint8_t)(mmc->capacity_rpmb / (128 * 1024));
412abdd2437Shisping 		DevInfo->ret_code = 0;
413abdd2437Shisping 
414abdd2437Shisping 		goto Exit;
415abdd2437Shisping 	}
416abdd2437Shisping 
417abdd2437Shisping 	default:
418abdd2437Shisping 		TeecResult = TEEC_ERROR_BAD_PARAMETERS;
419abdd2437Shisping 
420abdd2437Shisping 		goto Exit;
421abdd2437Shisping 	}
422abdd2437Shisping 
423abdd2437Shisping 	tempPackets = ResponsePackets;
424abdd2437Shisping 	tempPackets_back = RequestPackets_back;
425abdd2437Shisping 
426abdd2437Shisping 	for (i = 0; i < global_block_count; i++) {
427abdd2437Shisping 		memcpy(tempPackets->stuff_bytes,
428abdd2437Shisping 			tempPackets_back->stuff,
429abdd2437Shisping 			RPMB_STUFF_DATA_SIZE);
430abdd2437Shisping 		memcpy(tempPackets->key_mac,
431abdd2437Shisping 			tempPackets_back->mac,
432abdd2437Shisping 			RPMB_KEY_MAC_SIZE);
433abdd2437Shisping 		memcpy(tempPackets->data,
434abdd2437Shisping 			tempPackets_back->data,
435abdd2437Shisping 			RPMB_DATA_SIZE);
436abdd2437Shisping 		memcpy(tempPackets->nonce,
437abdd2437Shisping 			tempPackets_back->nonce,
438abdd2437Shisping 			RPMB_NONCE_SIZE);
439abdd2437Shisping 		tempPackets->write_counter[3] =
440abdd2437Shisping 			((tempPackets_back->write_counter) >> 24) & 0xFF;
441abdd2437Shisping 		tempPackets->write_counter[2] =
442abdd2437Shisping 			((tempPackets_back->write_counter) >> 16) & 0xFF;
443abdd2437Shisping 		tempPackets->write_counter[1] =
444abdd2437Shisping 			((tempPackets_back->write_counter) >> 8) & 0xFF;
445abdd2437Shisping 		tempPackets->write_counter[0] =
446abdd2437Shisping 			(tempPackets_back->write_counter) & 0xFF;
447abdd2437Shisping 		tempPackets->address[1] =
448abdd2437Shisping 			((tempPackets_back->address) >> 8) & 0xFF;
449abdd2437Shisping 		tempPackets->address[0] =
450abdd2437Shisping 			(tempPackets_back->address) & 0xFF;
451abdd2437Shisping 		tempPackets->block_count[1] =
452abdd2437Shisping 			((tempPackets_back->block_count) >> 8) & 0xFF;
453abdd2437Shisping 		tempPackets->block_count[0] =
454abdd2437Shisping 			(tempPackets_back->block_count) & 0xFF;
455abdd2437Shisping 		tempPackets->op_result[1] =
456abdd2437Shisping 			((tempPackets_back->result) >> 8) & 0xFF;
457abdd2437Shisping 		tempPackets->op_result[0] =
458abdd2437Shisping 			(tempPackets_back->result) & 0xFF;
459abdd2437Shisping 		tempPackets->msg_type[1] =
460abdd2437Shisping 			((tempPackets_back->request) >> 8) & 0xFF;
461abdd2437Shisping 		tempPackets->msg_type[0] =
462abdd2437Shisping 			(tempPackets_back->request) & 0xFF;
463abdd2437Shisping 		tempPackets++;
464abdd2437Shisping 		tempPackets_back++;
465abdd2437Shisping 	}
466abdd2437Shisping 
467abdd2437Shisping 	free(RequestPackets_back);
468abdd2437Shisping 
469abdd2437Shisping Exit:
470abdd2437Shisping 	TeeSmc32Arg->ret = TeecResult;
471abdd2437Shisping 	TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API;
472abdd2437Shisping 
473abdd2437Shisping 	return TeecResult;
474abdd2437Shisping }
475abdd2437Shisping 
476abdd2437Shisping /*
477abdd2437Shisping  * Execute a normal world local file system operation.
478abdd2437Shisping  */
479abdd2437Shisping TEEC_Result OpteeRpcCmdFs(t_teesmc32_arg *TeeSmc32Arg)
480abdd2437Shisping {
481*1f25ada2SHisping Lin 	TEEC_Result TeecResult = TEEC_SUCCESS;
482*1f25ada2SHisping Lin 	t_teesmc32_param *TeeSmc32Param;
483abdd2437Shisping 
484*1f25ada2SHisping Lin 	TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
485*1f25ada2SHisping Lin 	TeecResult = tee_supp_rk_fs_process((void *)(size_t)TeeSmc32Param[0].u.memref.buf_ptr,
486*1f25ada2SHisping Lin 							TeeSmc32Param[0].u.memref.size);
487*1f25ada2SHisping Lin 
488*1f25ada2SHisping Lin 	return TeecResult;
489*1f25ada2SHisping Lin }
490abdd2437Shisping 
491abdd2437Shisping /*
492abdd2437Shisping  * TBD.
493abdd2437Shisping  */
494abdd2437Shisping TEEC_Result OpteeRpcCmdGetTime(t_teesmc32_arg *TeeSmc32Arg)
495abdd2437Shisping {
496abdd2437Shisping 	return TEEC_ERROR_NOT_IMPLEMENTED;
497abdd2437Shisping }
498abdd2437Shisping 
499abdd2437Shisping /*
500abdd2437Shisping  * TBD.
501abdd2437Shisping  */
502abdd2437Shisping TEEC_Result OpteeRpcCmdWaitMutex(t_teesmc32_arg *TeeSmc32Arg)
503abdd2437Shisping {
504abdd2437Shisping 	return TEEC_ERROR_NOT_IMPLEMENTED;
505abdd2437Shisping }
506abdd2437Shisping 
507abdd2437Shisping /*
508abdd2437Shisping  * Handle the callback from secure world.
509abdd2437Shisping  */
510abdd2437Shisping TEEC_Result OpteeRpcCallback(ARM_SMC_ARGS *ArmSmcArgs)
511abdd2437Shisping {
512abdd2437Shisping 	TEEC_Result TeecResult = TEEC_SUCCESS;
513abdd2437Shisping 
514*1f25ada2SHisping Lin 	//printf("OpteeRpcCallback Enter: Arg0=0x%X, Arg1=0x%X, Arg2=0x%X\n",
515*1f25ada2SHisping Lin 		//ArmSmcArgs->Arg0, ArmSmcArgs->Arg1, ArmSmcArgs->Arg2);
516abdd2437Shisping 
517abdd2437Shisping 	switch (TEESMC_RETURN_GET_RPC_FUNC(ArmSmcArgs->Arg0)) {
518abdd2437Shisping 	case TEESMC_RPC_FUNC_ALLOC_ARG: {
519*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V1
520abdd2437Shisping 		TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1);
521*1f25ada2SHisping Lin #endif
522*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V2
523*1f25ada2SHisping Lin 		printf("ArmSmcArgs->Arg1 = 0x%x", ArmSmcArgs->Arg1);
524*1f25ada2SHisping Lin 		TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg2);
525*1f25ada2SHisping Lin 		ArmSmcArgs->Arg5 = ArmSmcArgs->Arg2;
526*1f25ada2SHisping Lin 		ArmSmcArgs->Arg1 = 0;
527*1f25ada2SHisping Lin 		ArmSmcArgs->Arg4 = 0;
528*1f25ada2SHisping Lin #endif
529abdd2437Shisping 		break;
530abdd2437Shisping 	}
531abdd2437Shisping 
532abdd2437Shisping 	case TEESMC_RPC_FUNC_ALLOC_PAYLOAD: {
533abdd2437Shisping 		TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1);
534abdd2437Shisping 		break;
535abdd2437Shisping 	}
536abdd2437Shisping 
537abdd2437Shisping 	case TEESMC_RPC_FUNC_FREE_ARG: {
538*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V1
539abdd2437Shisping 		TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1);
540*1f25ada2SHisping Lin #endif
541*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V2
542*1f25ada2SHisping Lin 		TeecResult = OpteeRpcFree(ArmSmcArgs->Arg2);
543*1f25ada2SHisping Lin #endif
544abdd2437Shisping 		break;
545abdd2437Shisping 	}
546abdd2437Shisping 
547abdd2437Shisping 	case TEESMC_RPC_FUNC_FREE_PAYLOAD: {
548abdd2437Shisping 		TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1);
549abdd2437Shisping 		break;
550abdd2437Shisping 	}
551abdd2437Shisping 
552abdd2437Shisping 	case TEESMC_RPC_FUNC_IRQ: {
553abdd2437Shisping 		break;
554abdd2437Shisping 	}
555abdd2437Shisping 
556abdd2437Shisping 	case TEESMC_RPC_FUNC_CMD: {
557*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V1
558abdd2437Shisping 		t_teesmc32_arg *TeeSmc32Arg =
559*1f25ada2SHisping Lin 			(t_teesmc32_arg *)(size_t)ArmSmcArgs->Arg1;
560*1f25ada2SHisping Lin #endif
561*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V2
562*1f25ada2SHisping Lin 		t_teesmc32_arg *TeeSmc32Arg =
563*1f25ada2SHisping Lin 			(t_teesmc32_arg *)((size_t)ArmSmcArgs->Arg1 << 32 | ArmSmcArgs->Arg2);
564*1f25ada2SHisping Lin 		printf("TeeSmc32Arg->cmd = 0x%x", TeeSmc32Arg->cmd);
565*1f25ada2SHisping Lin #endif
566abdd2437Shisping 		switch (TeeSmc32Arg->cmd) {
567*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V1
568abdd2437Shisping 		case TEE_RPC_LOAD_TA: {
569abdd2437Shisping 			TeecResult = OpteeRpcCmdLoadTa(TeeSmc32Arg);
570abdd2437Shisping 			break;
571abdd2437Shisping 		}
572abdd2437Shisping 
573abdd2437Shisping 		case TEE_RPC_FREE_TA: {
574abdd2437Shisping 			TeecResult = OpteeRpcCmdFreeTa(TeeSmc32Arg);
575abdd2437Shisping 			break;
576abdd2437Shisping 		}
577abdd2437Shisping 
578abdd2437Shisping 		case TEE_RPC_RPMB_CMD: {
579abdd2437Shisping 			TeecResult = OpteeRpcCmdRpmb(TeeSmc32Arg);
580abdd2437Shisping 			break;
581abdd2437Shisping 		}
582abdd2437Shisping 
583abdd2437Shisping 		case TEE_RPC_FS: {
584abdd2437Shisping 			TeecResult = OpteeRpcCmdFs(TeeSmc32Arg);
585*1f25ada2SHisping Lin 			TeeSmc32Arg->ret = TEEC_SUCCESS;
586abdd2437Shisping 			break;
587abdd2437Shisping 		}
588abdd2437Shisping 
589abdd2437Shisping 		case TEE_RPC_GET_TIME: {
590abdd2437Shisping 			TeecResult = OpteeRpcCmdGetTime(TeeSmc32Arg);
591abdd2437Shisping 			break;
592abdd2437Shisping 		}
593abdd2437Shisping 
594abdd2437Shisping 		case TEE_RPC_WAIT_MUTEX: {
595abdd2437Shisping 			TeecResult = OpteeRpcCmdWaitMutex(TeeSmc32Arg);
596abdd2437Shisping 			break;
597abdd2437Shisping 		}
598*1f25ada2SHisping Lin #endif
599*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V2
600*1f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_SHM_ALLOC_V2: {
601*1f25ada2SHisping Lin 			uint32_t tempaddr;
602*1f25ada2SHisping Lin 			uint32_t allocsize = TeeSmc32Arg->params[0].u.value.b;
603*1f25ada2SHisping Lin 			TeecResult = OpteeRpcAlloc(allocsize, &tempaddr);
604*1f25ada2SHisping Lin 			printf("allocsize = 0x%x tempaddr = 0x%x", allocsize, tempaddr);
605*1f25ada2SHisping Lin 			TeeSmc32Arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT_V2;
606*1f25ada2SHisping Lin 			TeeSmc32Arg->params[0].u.memref.buf_ptr = tempaddr;
607*1f25ada2SHisping Lin 			TeeSmc32Arg->params[0].u.memref.size = allocsize;
608*1f25ada2SHisping Lin 			TeeSmc32Arg->params[0].u.memref.shm_ref = tempaddr;
609*1f25ada2SHisping Lin 			TeeSmc32Arg->ret = TEE_SUCCESS;
610*1f25ada2SHisping Lin 			break;
611*1f25ada2SHisping Lin 		}
612*1f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_SHM_FREE_V2: {
613*1f25ada2SHisping Lin 			uint32_t tempaddr = TeeSmc32Arg->params[0].u.value.b;
614*1f25ada2SHisping Lin 			TeecResult = OpteeRpcFree(tempaddr);
615*1f25ada2SHisping Lin 			break;
616*1f25ada2SHisping Lin 
617*1f25ada2SHisping Lin 		}
618*1f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_RPMB_V2: {
619*1f25ada2SHisping Lin 			TeecResult = OpteeRpcCmdRpmb(TeeSmc32Arg);
620*1f25ada2SHisping Lin 			break;
621*1f25ada2SHisping Lin 		}
622*1f25ada2SHisping Lin 		case OPTEE_MSG_RPC_CMD_LOAD_TA_V2: {
623*1f25ada2SHisping Lin 			TeecResult = OpteeRpcCmdLoadV2Ta(TeeSmc32Arg);
624*1f25ada2SHisping Lin 			break;
625*1f25ada2SHisping Lin 		}
626*1f25ada2SHisping Lin #endif
627abdd2437Shisping 
628abdd2437Shisping 		default: {
629abdd2437Shisping 			printf("...unsupported RPC CMD: cmd=0x%X\n",
630abdd2437Shisping 				TeeSmc32Arg->cmd);
631abdd2437Shisping 			TeecResult = TEEC_ERROR_NOT_IMPLEMENTED;
632abdd2437Shisping 			break;
633abdd2437Shisping 		}
634abdd2437Shisping 	}
635abdd2437Shisping 
636abdd2437Shisping 		break;
637abdd2437Shisping 	}
638abdd2437Shisping 
639abdd2437Shisping 	case TEESMC_OPTEE_RPC_FUNC_ALLOC_PAYLOAD: {
640abdd2437Shisping 		TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1);
641abdd2437Shisping 		ArmSmcArgs->Arg2 = ArmSmcArgs->Arg1;
642abdd2437Shisping 		break;
643abdd2437Shisping 	}
644abdd2437Shisping 
645abdd2437Shisping 	case TEESMC_OPTEE_RPC_FUNC_FREE_PAYLOAD: {
646abdd2437Shisping 		TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1);
647abdd2437Shisping 		break;
648abdd2437Shisping 	}
649abdd2437Shisping 
650abdd2437Shisping 	default: {
651abdd2437Shisping 		printf("...unsupported RPC : Arg0=0x%X\n", ArmSmcArgs->Arg0);
652abdd2437Shisping 		TeecResult = TEEC_ERROR_NOT_IMPLEMENTED;
653abdd2437Shisping 		break;
654abdd2437Shisping 	}
655abdd2437Shisping 	}
656abdd2437Shisping 
657abdd2437Shisping 	ArmSmcArgs->Arg0 = TEESMC32_CALL_RETURN_FROM_RPC;
658abdd2437Shisping 	debug("OpteeRpcCallback Exit : TeecResult=0x%X\n", TeecResult);
659abdd2437Shisping 
660abdd2437Shisping 	return TeecResult;
661abdd2437Shisping }
662