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