1 /*
2 * Copyright (c) 2016-2023 Arm Limited. All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef __DRIVER_MPC_SIE_H__
18 #define __DRIVER_MPC_SIE_H__
19
20 #include "Driver_MPC_Common.h"
21 #include "mpc_sie_drv.h"
22
23 /*
24 * \brief Translates error codes from native API to CMSIS API.
25 *
26 * \param[in] err Error code to translate (\ref mpc_sie_error_t).
27 *
28 * \return Returns CMSIS error code.
29 */
mpc_sie_error_trans(enum mpc_sie_error_t err)30 static inline int32_t mpc_sie_error_trans(enum mpc_sie_error_t err)
31 {
32 switch(err) {
33 case MPC_SIE_ERR_NONE:
34 return ARM_DRIVER_OK;
35 case MPC_SIE_INVALID_ARG:
36 return ARM_DRIVER_ERROR_PARAMETER;
37 case MPC_SIE_NOT_INIT:
38 return ARM_MPC_ERR_NOT_INIT;
39 case MPC_SIE_ERR_NOT_IN_RANGE:
40 return ARM_MPC_ERR_NOT_IN_RANGE;
41 case MPC_SIE_ERR_NOT_ALIGNED:
42 return ARM_MPC_ERR_NOT_ALIGNED;
43 case MPC_SIE_ERR_INVALID_RANGE:
44 return ARM_MPC_ERR_INVALID_RANGE;
45 case MPC_SIE_ERR_RANGE_SEC_ATTR_NON_COMPATIBLE:
46 return ARM_MPC_ERR_RANGE_SEC_ATTR_NON_COMPATIBLE;
47 case MPC_SIE_UNSUPPORTED_HARDWARE_VERSION:
48 case MPC_SIE_ERR_GATING_NOT_PRESENT:
49 default:
50 return ARM_MPC_ERR_UNSPECIFIED;
51 }
52 }
53
54 /*
55 * \brief Macro for MPC SIE Driver
56 *
57 * \param[in] MPC_DEV Native driver device
58 * \ref mpc_sie_dev_t
59 * \param[out] MPC_DRIVER_NAME Resulting Driver name
60 */
61 #define ARM_DRIVER_MPC(MPC_DEV, MPC_DRIVER_NAME) \
62 static int32_t MPC_DRIVER_NAME##_Initialize(void) \
63 { \
64 enum mpc_sie_error_t ret; \
65 \
66 ret = mpc_sie_init(&MPC_DEV); \
67 \
68 return mpc_sie_error_trans(ret); \
69 } \
70 \
71 static int32_t MPC_DRIVER_NAME##_Uninitialize(void) \
72 { \
73 /* Nothing to be done */ \
74 return ARM_DRIVER_OK; \
75 } \
76 \
77 static int32_t MPC_DRIVER_NAME##_GetBlockSize(uint32_t *blk_size) \
78 { \
79 enum mpc_sie_error_t ret; \
80 \
81 ret = mpc_sie_get_block_size(&MPC_DEV, blk_size); \
82 \
83 return mpc_sie_error_trans(ret); \
84 } \
85 \
86 static int32_t MPC_DRIVER_NAME##_GetCtrlConfig(uint32_t *ctrl_val) \
87 { \
88 enum mpc_sie_error_t ret; \
89 \
90 ret = mpc_sie_get_ctrl(&MPC_DEV, ctrl_val); \
91 \
92 return mpc_sie_error_trans(ret); \
93 } \
94 \
95 static int32_t MPC_DRIVER_NAME##_SetCtrlConfig(uint32_t ctrl) \
96 { \
97 enum mpc_sie_error_t ret; \
98 \
99 ret = mpc_sie_set_ctrl(&MPC_DEV, ctrl); \
100 \
101 return mpc_sie_error_trans(ret); \
102 } \
103 \
104 static int32_t MPC_DRIVER_NAME##_GetRegionConfig(uintptr_t base, \
105 uintptr_t limit, \
106 ARM_MPC_SEC_ATTR *attr) \
107 { \
108 enum mpc_sie_error_t ret; \
109 \
110 ret = mpc_sie_get_region_config(&MPC_DEV, base, limit, \
111 (enum mpc_sie_sec_attr_t*)attr); \
112 \
113 return mpc_sie_error_trans(ret); \
114 } \
115 \
116 static int32_t MPC_DRIVER_NAME##_ConfigRegion(uintptr_t base, \
117 uintptr_t limit, \
118 ARM_MPC_SEC_ATTR attr) \
119 { \
120 enum mpc_sie_error_t ret; \
121 \
122 ret = mpc_sie_config_region(&MPC_DEV, base, limit, \
123 (enum mpc_sie_sec_attr_t)attr); \
124 \
125 return mpc_sie_error_trans(ret); \
126 } \
127 \
128 static int32_t MPC_DRIVER_NAME##_EnableInterrupt(void) \
129 { \
130 enum mpc_sie_error_t ret; \
131 \
132 ret = mpc_sie_irq_enable(&MPC_DEV); \
133 \
134 return mpc_sie_error_trans(ret); \
135 } \
136 \
137 static void MPC_DRIVER_NAME##_DisableInterrupt(void) \
138 { \
139 mpc_sie_irq_disable(&MPC_DEV); \
140 } \
141 \
142 \
143 static void MPC_DRIVER_NAME##_ClearInterrupt(void) \
144 { \
145 mpc_sie_clear_irq(&MPC_DEV); \
146 } \
147 \
148 static uint32_t MPC_DRIVER_NAME##_InterruptState(void) \
149 { \
150 return mpc_sie_irq_state(&MPC_DEV); \
151 } \
152 \
153 static int32_t MPC_DRIVER_NAME##_LockDown(void) \
154 { \
155 return mpc_sie_lock_down(&MPC_DEV); \
156 } \
157 \
158 /* MPC_DRIVER_NAME Driver CMSIS access structure */ \
159 ARM_DRIVER_MPC MPC_DRIVER_NAME = { \
160 .GetVersion = ARM_MPC_GetVersion, \
161 .Initialize = MPC_DRIVER_NAME##_Initialize, \
162 .Uninitialize = MPC_DRIVER_NAME##_Uninitialize, \
163 .GetBlockSize = MPC_DRIVER_NAME##_GetBlockSize, \
164 .GetCtrlConfig = MPC_DRIVER_NAME##_GetCtrlConfig, \
165 .SetCtrlConfig = MPC_DRIVER_NAME##_SetCtrlConfig, \
166 .ConfigRegion = MPC_DRIVER_NAME##_ConfigRegion, \
167 .GetRegionConfig = MPC_DRIVER_NAME##_GetRegionConfig, \
168 .EnableInterrupt = MPC_DRIVER_NAME##_EnableInterrupt, \
169 .DisableInterrupt = MPC_DRIVER_NAME##_DisableInterrupt, \
170 .ClearInterrupt = MPC_DRIVER_NAME##_ClearInterrupt, \
171 .InterruptState = MPC_DRIVER_NAME##_InterruptState, \
172 .LockDown = MPC_DRIVER_NAME##_LockDown, \
173 }
174
175 #endif /* __DRIVER_MPC_SIE_H__ */
176