xref: /optee_os/core/pta/stm32mp/debug_access_pta.c (revision e339d8f54c627956f107cc1c8bc66c0e8606cd86)
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