1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright (c) 2014, STMicroelectronics International N.V.
4  * Copyright (c) 2022, Linaro Limited.
5  */
6 #include <compiler.h>
7 #include <tee_internal_api.h>
8 
to_gp11_param(uint32_t pt,const TEE_Param params[TEE_NUM_PARAMS],__GP11_TEE_Param gp11_params[TEE_NUM_PARAMS])9 static void to_gp11_param(uint32_t pt, const TEE_Param params[TEE_NUM_PARAMS],
10 			  __GP11_TEE_Param gp11_params[TEE_NUM_PARAMS])
11 {
12 	size_t n = 0;
13 
14 	for (n = 0; n < TEE_NUM_PARAMS; n++) {
15 		switch (TEE_PARAM_TYPE_GET(pt, n)) {
16 		case TEE_PARAM_TYPE_VALUE_INPUT:
17 		case TEE_PARAM_TYPE_VALUE_OUTPUT:
18 		case TEE_PARAM_TYPE_VALUE_INOUT:
19 			gp11_params[n].value.a = params[n].value.a;
20 			gp11_params[n].value.b = params[n].value.b;
21 			break;
22 		case TEE_PARAM_TYPE_MEMREF_INPUT:
23 		case TEE_PARAM_TYPE_MEMREF_OUTPUT:
24 		case TEE_PARAM_TYPE_MEMREF_INOUT:
25 			gp11_params[n].memref.buffer = params[n].memref.buffer;
26 			gp11_params[n].memref.size = params[n].memref.size;
27 			break;
28 		default:
29 			break;
30 		}
31 	}
32 }
33 
from_gp11_param(uint32_t pt,const __GP11_TEE_Param gp11_params[TEE_NUM_PARAMS],TEE_Param params[TEE_NUM_PARAMS])34 static void from_gp11_param(uint32_t pt,
35 			    const __GP11_TEE_Param gp11_params[TEE_NUM_PARAMS],
36 			    TEE_Param params[TEE_NUM_PARAMS])
37 {
38 	size_t n = 0;
39 
40 	for (n = 0; n < TEE_NUM_PARAMS; n++) {
41 		switch (TEE_PARAM_TYPE_GET(pt, n)) {
42 		case TEE_PARAM_TYPE_VALUE_INPUT:
43 		case TEE_PARAM_TYPE_VALUE_OUTPUT:
44 		case TEE_PARAM_TYPE_VALUE_INOUT:
45 			params[n].value.a = gp11_params[n].value.a;
46 			params[n].value.b = gp11_params[n].value.b;
47 			break;
48 		case TEE_PARAM_TYPE_MEMREF_INPUT:
49 		case TEE_PARAM_TYPE_MEMREF_OUTPUT:
50 		case TEE_PARAM_TYPE_MEMREF_INOUT:
51 			params[n].memref.buffer = gp11_params[n].memref.buffer;
52 			params[n].memref.size = gp11_params[n].memref.size;
53 			break;
54 		default:
55 			break;
56 		}
57 	}
58 }
59 
60 /*
61  * Legacy TAs will due to macros define __GP11_TA_OpenSessionEntryPoint()
62  * instead so call that function instead.
63  */
64 
__ta_open_sess(uint32_t pt,TEE_Param params[TEE_NUM_PARAMS],void ** sess_ctx,TEE_Result (* fp)(uint32_t,__GP11_TEE_Param[TEE_NUM_PARAMS],void **))65 TEE_Result __ta_open_sess(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS],
66 			  void **sess_ctx,
67 			  TEE_Result (*fp)(uint32_t,
68 					   __GP11_TEE_Param [TEE_NUM_PARAMS],
69 					   void **))
70 {
71 	__GP11_TEE_Param gp11_params[TEE_NUM_PARAMS] = { };
72 	TEE_Result res = TEE_SUCCESS;
73 
74 	to_gp11_param(pt, params, gp11_params);
75 	res = fp(pt, gp11_params, sess_ctx);
76 	from_gp11_param(pt, gp11_params, params);
77 
78 	return res;
79 }
80 
81 /*
82  * Legacy TAs will due to macros define __GP11_TA_InvokeCommandEntryPoint()
83  * instead so call that function instead.
84  */
85 
__ta_invoke_cmd(void * sess_ctx,uint32_t cmd_id,uint32_t pt,TEE_Param params[TEE_NUM_PARAMS],TEE_Result (* fp)(void *,uint32_t,uint32_t,__GP11_TEE_Param[TEE_NUM_PARAMS]))86 TEE_Result __ta_invoke_cmd(void *sess_ctx, uint32_t cmd_id, uint32_t pt,
87 			   TEE_Param params[TEE_NUM_PARAMS],
88 			   TEE_Result (*fp)(void *, uint32_t, uint32_t,
89 					    __GP11_TEE_Param [TEE_NUM_PARAMS]))
90 {
91 	__GP11_TEE_Param gp11_params[TEE_NUM_PARAMS] = { };
92 	TEE_Result res = TEE_SUCCESS;
93 
94 	to_gp11_param(pt, params, gp11_params);
95 	res = fp(sess_ctx, cmd_id, pt, gp11_params);
96 	from_gp11_param(pt, gp11_params, params);
97 
98 	return res;
99 }
100