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
pta_dbg_grant_dbg_access(uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS])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
pta_dbg_access_invoke_cmd(void * pSessionContext __unused,uint32_t cmd_id,uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS])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
pta_dbg_access_open_session(uint32_t ptypes __unused,TEE_Param par[TEE_NUM_PARAMS]__unused,void ** session __unused)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