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