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