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 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 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 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 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