1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (C) 2026, STMicroelectronics - All Rights Reserved 4 */ 5 6 #include <drivers/stm32_bsec.h> 7 #include <kernel/pseudo_ta.h> 8 #include <kernel/user_ta.h> 9 #include <pta_stm32mp_debug_access.h> 10 11 #define PTA_NAME "debug_access.pta" 12 13 static_assert(IS_ENABLED(CFG_STM32_BSEC)); 14 15 static TEE_Result pta_dbg_grant_dbg_access(uint32_t param_types, 16 TEE_Param params[TEE_NUM_PARAMS]) 17 { 18 const uint32_t ext_param = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 19 TEE_PARAM_TYPE_NONE, 20 TEE_PARAM_TYPE_NONE, 21 TEE_PARAM_TYPE_NONE); 22 unsigned int dbg_profile = params[0].value.a; 23 24 if (param_types != ext_param) 25 return TEE_ERROR_BAD_PARAMETERS; 26 27 switch (dbg_profile) { 28 case PTA_STM32_DEBUG_HDP_DBG_PROFILE: 29 if (!stm32_bsec_hdp_is_enabled()) 30 return TEE_ERROR_ACCESS_DENIED; 31 break; 32 case PTA_STM32_DEBUG_PERIPHERAL_DBG_PROFILE: 33 if (!stm32_bsec_coresight_is_enabled()) 34 return TEE_ERROR_ACCESS_DENIED; 35 break; 36 default: 37 return TEE_ERROR_NOT_SUPPORTED; 38 } 39 40 return TEE_SUCCESS; 41 } 42 43 static TEE_Result pta_dbg_access_invoke_cmd(void *pSessionContext __unused, 44 uint32_t cmd_id, 45 uint32_t param_types, 46 TEE_Param params[TEE_NUM_PARAMS]) 47 { 48 FMSG(PTA_NAME" command %#"PRIx32" ptypes %#"PRIx32, 49 cmd_id, param_types); 50 51 switch (cmd_id) { 52 case PTA_STM32_DEBUG_CMD_GRANT_DBG_ACCESS: 53 return pta_dbg_grant_dbg_access(param_types, params); 54 default: 55 return TEE_ERROR_NOT_SUPPORTED; 56 } 57 } 58 59 static TEE_Result 60 pta_dbg_access_open_session(uint32_t ptypes __unused, 61 TEE_Param par[TEE_NUM_PARAMS] __unused, 62 void **session __unused) 63 { 64 uint32_t login = to_ta_session(ts_get_current_session())->clnt_id.login; 65 66 if (login == TEE_LOGIN_REE_KERNEL) 67 return TEE_SUCCESS; 68 69 return TEE_ERROR_ACCESS_DENIED; 70 } 71 72 pseudo_ta_register(.uuid = PTA_STM32_DBG_ACCESS_UUID, .name = PTA_NAME, 73 .flags = PTA_DEFAULT_FLAGS | TA_FLAG_CONCURRENT | 74 TA_FLAG_DEVICE_ENUM, 75 .open_session_entry_point = pta_dbg_access_open_session, 76 .invoke_command_entry_point = pta_dbg_access_invoke_cmd); 77