mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /* mbed Microcontroller Library
AnnaBridge 189:f392fc9709a3 2 *
AnnaBridge 189:f392fc9709a3 3 * \copyright
AnnaBridge 189:f392fc9709a3 4
AnnaBridge 189:f392fc9709a3 5 * (c) 2018, Cypress Semiconductor Corporation
AnnaBridge 189:f392fc9709a3 6 * or a subsidiary of Cypress Semiconductor Corporation. All rights
AnnaBridge 189:f392fc9709a3 7 * reserved.
AnnaBridge 189:f392fc9709a3 8 *
AnnaBridge 189:f392fc9709a3 9 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 189:f392fc9709a3 10 *
AnnaBridge 189:f392fc9709a3 11 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 189:f392fc9709a3 12 * you may not use this file except in compliance with the License.
AnnaBridge 189:f392fc9709a3 13 * You may obtain a copy of the License at
AnnaBridge 189:f392fc9709a3 14 *
AnnaBridge 189:f392fc9709a3 15 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 189:f392fc9709a3 16 *
AnnaBridge 189:f392fc9709a3 17 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 189:f392fc9709a3 18 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 189:f392fc9709a3 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 189:f392fc9709a3 20 * See the License for the specific language governing permissions and
AnnaBridge 189:f392fc9709a3 21 * limitations under the License.
AnnaBridge 189:f392fc9709a3 22 */
AnnaBridge 189:f392fc9709a3 23
AnnaBridge 189:f392fc9709a3 24 #include "cyprotection.h"
AnnaBridge 189:f392fc9709a3 25
AnnaBridge 189:f392fc9709a3 26 /* configure SMPU */
AnnaBridge 189:f392fc9709a3 27 cy_en_prot_status_t smpu_protect(cy_smpu_region_config_t smpu_config_arr[], uint32_t arr_length)
AnnaBridge 189:f392fc9709a3 28 {
AnnaBridge 189:f392fc9709a3 29 cy_en_prot_status_t ret = CY_PROT_SUCCESS;
AnnaBridge 189:f392fc9709a3 30 uint32_t i;
AnnaBridge 189:f392fc9709a3 31 cy_stc_smpu_cfg_t smpu_cfg;
AnnaBridge 189:f392fc9709a3 32
AnnaBridge 189:f392fc9709a3 33 for (i = 0; i < arr_length; i++)
AnnaBridge 189:f392fc9709a3 34 {
AnnaBridge 189:f392fc9709a3 35 smpu_cfg.address = smpu_config_arr[i].address;
AnnaBridge 189:f392fc9709a3 36 smpu_cfg.regionSize = smpu_config_arr[i].regionSize;
AnnaBridge 189:f392fc9709a3 37 smpu_cfg.subregions = smpu_config_arr[i].subregions;
AnnaBridge 189:f392fc9709a3 38 smpu_cfg.userPermission = smpu_config_arr[i].userPermission;
AnnaBridge 189:f392fc9709a3 39 smpu_cfg.privPermission = smpu_config_arr[i].privPermission;
AnnaBridge 189:f392fc9709a3 40 smpu_cfg.secure = smpu_config_arr[i].secure;
AnnaBridge 189:f392fc9709a3 41 smpu_cfg.pcMatch = smpu_config_arr[i].pcMatch;
AnnaBridge 189:f392fc9709a3 42 smpu_cfg.pcMask = smpu_config_arr[i].pcMask;
AnnaBridge 189:f392fc9709a3 43 ret = Cy_Prot_ConfigSmpuSlaveStruct(smpu_config_arr[i].prot_region, &smpu_cfg);
AnnaBridge 189:f392fc9709a3 44 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 45 {
AnnaBridge 189:f392fc9709a3 46 break;
AnnaBridge 189:f392fc9709a3 47 }
AnnaBridge 189:f392fc9709a3 48 smpu_cfg.userPermission = smpu_config_arr[i].userMstPermission;
AnnaBridge 189:f392fc9709a3 49 smpu_cfg.privPermission = smpu_config_arr[i].privMstPermission;
AnnaBridge 189:f392fc9709a3 50 ret = Cy_Prot_ConfigSmpuMasterStruct(smpu_config_arr[i].prot_region, &smpu_cfg);
AnnaBridge 189:f392fc9709a3 51 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 52 {
AnnaBridge 189:f392fc9709a3 53 break;
AnnaBridge 189:f392fc9709a3 54 }
AnnaBridge 189:f392fc9709a3 55 ret = Cy_Prot_EnableSmpuSlaveStruct(smpu_config_arr[i].prot_region);
AnnaBridge 189:f392fc9709a3 56 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 57 {
AnnaBridge 189:f392fc9709a3 58 break;
AnnaBridge 189:f392fc9709a3 59 }
AnnaBridge 189:f392fc9709a3 60 ret = Cy_Prot_EnableSmpuMasterStruct(smpu_config_arr[i].prot_region);
AnnaBridge 189:f392fc9709a3 61 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 62 {
AnnaBridge 189:f392fc9709a3 63 break;
AnnaBridge 189:f392fc9709a3 64 }
AnnaBridge 189:f392fc9709a3 65 }
AnnaBridge 189:f392fc9709a3 66
AnnaBridge 189:f392fc9709a3 67 return ret;
AnnaBridge 189:f392fc9709a3 68 }
AnnaBridge 189:f392fc9709a3 69
AnnaBridge 189:f392fc9709a3 70 /* configure PPU Fixed Region */
AnnaBridge 189:f392fc9709a3 71 cy_en_prot_status_t ppu_fixed_rg_protect(cy_ppu_fixed_rg_cfg_t ppu_config_arr[], uint32_t arr_length)
AnnaBridge 189:f392fc9709a3 72 {
AnnaBridge 189:f392fc9709a3 73 cy_en_prot_status_t ret = CY_PROT_SUCCESS;
AnnaBridge 189:f392fc9709a3 74 uint32_t i;
AnnaBridge 189:f392fc9709a3 75 cy_stc_ppu_rg_cfg_t ppu_cfg;
AnnaBridge 189:f392fc9709a3 76
AnnaBridge 189:f392fc9709a3 77 for (i = 0; i < arr_length; i++)
AnnaBridge 189:f392fc9709a3 78 {
AnnaBridge 189:f392fc9709a3 79 ppu_cfg.userPermission = ppu_config_arr[i].userPermission;
AnnaBridge 189:f392fc9709a3 80 ppu_cfg.privPermission = ppu_config_arr[i].privPermission;
AnnaBridge 189:f392fc9709a3 81 ppu_cfg.secure = ppu_config_arr[i].secure;
AnnaBridge 189:f392fc9709a3 82 ppu_cfg.pcMatch = ppu_config_arr[i].pcMatch;
AnnaBridge 189:f392fc9709a3 83 ppu_cfg.pcMask = ppu_config_arr[i].pcMask;
AnnaBridge 189:f392fc9709a3 84 ret = Cy_Prot_ConfigPpuFixedRgSlaveStruct(ppu_config_arr[i].pPpuStr, &ppu_cfg);
AnnaBridge 189:f392fc9709a3 85 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 86 {
AnnaBridge 189:f392fc9709a3 87 break;
AnnaBridge 189:f392fc9709a3 88 }
AnnaBridge 189:f392fc9709a3 89 ppu_cfg.userPermission = ppu_config_arr[i].userMstPermission;
AnnaBridge 189:f392fc9709a3 90 ppu_cfg.privPermission = ppu_config_arr[i].privMstPermission;
AnnaBridge 189:f392fc9709a3 91 ppu_cfg.secure = ppu_config_arr[i].secureMst;
AnnaBridge 189:f392fc9709a3 92 ppu_cfg.pcMask = ppu_config_arr[i].pcMstMask;
AnnaBridge 189:f392fc9709a3 93 ret = Cy_Prot_ConfigPpuFixedRgMasterStruct(ppu_config_arr[i].pPpuStr, &ppu_cfg);
AnnaBridge 189:f392fc9709a3 94 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 95 {
AnnaBridge 189:f392fc9709a3 96 break;
AnnaBridge 189:f392fc9709a3 97 }
AnnaBridge 189:f392fc9709a3 98 ret = Cy_Prot_EnablePpuFixedRgSlaveStruct(ppu_config_arr[i].pPpuStr);
AnnaBridge 189:f392fc9709a3 99 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 100 {
AnnaBridge 189:f392fc9709a3 101 break;
AnnaBridge 189:f392fc9709a3 102 }
AnnaBridge 189:f392fc9709a3 103 ret = Cy_Prot_EnablePpuFixedRgMasterStruct(ppu_config_arr[i].pPpuStr);
AnnaBridge 189:f392fc9709a3 104 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 105 {
AnnaBridge 189:f392fc9709a3 106 break;
AnnaBridge 189:f392fc9709a3 107 }
AnnaBridge 189:f392fc9709a3 108 }
AnnaBridge 189:f392fc9709a3 109
AnnaBridge 189:f392fc9709a3 110 return ret;
AnnaBridge 189:f392fc9709a3 111 }
AnnaBridge 189:f392fc9709a3 112
AnnaBridge 189:f392fc9709a3 113 /* configure PPU Fixed Slave */
AnnaBridge 189:f392fc9709a3 114 cy_en_prot_status_t ppu_fixed_sl_protect(cy_ppu_fixed_sl_cfg_t ppu_config_arr[], uint32_t arr_length)
AnnaBridge 189:f392fc9709a3 115 {
AnnaBridge 189:f392fc9709a3 116 cy_en_prot_status_t ret = CY_PROT_SUCCESS;
AnnaBridge 189:f392fc9709a3 117 uint32_t i;
AnnaBridge 189:f392fc9709a3 118 cy_stc_ppu_sl_cfg_t ppu_cfg;
AnnaBridge 189:f392fc9709a3 119
AnnaBridge 189:f392fc9709a3 120 for (i = 0; i < arr_length; i++)
AnnaBridge 189:f392fc9709a3 121 {
AnnaBridge 189:f392fc9709a3 122 ppu_cfg.userPermission = ppu_config_arr[i].userPermission;
AnnaBridge 189:f392fc9709a3 123 ppu_cfg.privPermission = ppu_config_arr[i].privPermission;
AnnaBridge 189:f392fc9709a3 124 ppu_cfg.secure = ppu_config_arr[i].secure;
AnnaBridge 189:f392fc9709a3 125 ppu_cfg.pcMatch = ppu_config_arr[i].pcMatch;
AnnaBridge 189:f392fc9709a3 126 ppu_cfg.pcMask = ppu_config_arr[i].pcMask;
AnnaBridge 189:f392fc9709a3 127 ret = Cy_Prot_ConfigPpuFixedSlSlaveStruct(ppu_config_arr[i].pPpuStr, &ppu_cfg);
AnnaBridge 189:f392fc9709a3 128 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 129 {
AnnaBridge 189:f392fc9709a3 130 break;
AnnaBridge 189:f392fc9709a3 131 }
AnnaBridge 189:f392fc9709a3 132 ppu_cfg.userPermission = ppu_config_arr[i].userMstPermission;
AnnaBridge 189:f392fc9709a3 133 ppu_cfg.privPermission = ppu_config_arr[i].privMstPermission;
AnnaBridge 189:f392fc9709a3 134 ppu_cfg.secure = ppu_config_arr[i].secureMst;
AnnaBridge 189:f392fc9709a3 135 ppu_cfg.pcMask = ppu_config_arr[i].pcMstMask;
AnnaBridge 189:f392fc9709a3 136 ret = Cy_Prot_ConfigPpuFixedSlMasterStruct(ppu_config_arr[i].pPpuStr, &ppu_cfg);
AnnaBridge 189:f392fc9709a3 137 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 138 {
AnnaBridge 189:f392fc9709a3 139 break;
AnnaBridge 189:f392fc9709a3 140 }
AnnaBridge 189:f392fc9709a3 141 ret = Cy_Prot_EnablePpuFixedSlSlaveStruct(ppu_config_arr[i].pPpuStr);
AnnaBridge 189:f392fc9709a3 142 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 143 {
AnnaBridge 189:f392fc9709a3 144 break;
AnnaBridge 189:f392fc9709a3 145 }
AnnaBridge 189:f392fc9709a3 146 ret = Cy_Prot_EnablePpuFixedSlMasterStruct(ppu_config_arr[i].pPpuStr);
AnnaBridge 189:f392fc9709a3 147 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 148 {
AnnaBridge 189:f392fc9709a3 149 break;
AnnaBridge 189:f392fc9709a3 150 }
AnnaBridge 189:f392fc9709a3 151 }
AnnaBridge 189:f392fc9709a3 152
AnnaBridge 189:f392fc9709a3 153 return ret;
AnnaBridge 189:f392fc9709a3 154 }
AnnaBridge 189:f392fc9709a3 155
AnnaBridge 189:f392fc9709a3 156 /* configure PPU Programmable */
AnnaBridge 189:f392fc9709a3 157 cy_en_prot_status_t ppu_prog_protect(cy_ppu_prog_cfg_t ppu_config_arr[], uint32_t arr_length)
AnnaBridge 189:f392fc9709a3 158 {
AnnaBridge 189:f392fc9709a3 159 cy_en_prot_status_t ret = CY_PROT_SUCCESS;
AnnaBridge 189:f392fc9709a3 160 uint32_t i;
AnnaBridge 189:f392fc9709a3 161 cy_stc_ppu_prog_cfg_t ppu_cfg;
AnnaBridge 189:f392fc9709a3 162
AnnaBridge 189:f392fc9709a3 163 for (i = 0; i < arr_length; i++)
AnnaBridge 189:f392fc9709a3 164 {
AnnaBridge 189:f392fc9709a3 165 ppu_cfg.address = ppu_config_arr[i].address;
AnnaBridge 189:f392fc9709a3 166 ppu_cfg.regionSize = ppu_config_arr[i].regionSize;
AnnaBridge 189:f392fc9709a3 167 ppu_cfg.subregions = ppu_config_arr[i].subregions;
AnnaBridge 189:f392fc9709a3 168 ppu_cfg.userPermission = ppu_config_arr[i].userPermission;
AnnaBridge 189:f392fc9709a3 169 ppu_cfg.privPermission = ppu_config_arr[i].privPermission;
AnnaBridge 189:f392fc9709a3 170 ppu_cfg.secure = ppu_config_arr[i].secure;
AnnaBridge 189:f392fc9709a3 171 ppu_cfg.pcMatch = ppu_config_arr[i].pcMatch;
AnnaBridge 189:f392fc9709a3 172 ppu_cfg.pcMask = ppu_config_arr[i].pcMask;
AnnaBridge 189:f392fc9709a3 173 ret = Cy_Prot_ConfigPpuProgSlaveStruct(ppu_config_arr[i].pPpuStr, &ppu_cfg);
AnnaBridge 189:f392fc9709a3 174 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 175 {
AnnaBridge 189:f392fc9709a3 176 break;
AnnaBridge 189:f392fc9709a3 177 }
AnnaBridge 189:f392fc9709a3 178 ppu_cfg.userPermission = ppu_config_arr[i].userMstPermission;
AnnaBridge 189:f392fc9709a3 179 ppu_cfg.privPermission = ppu_config_arr[i].privMstPermission;
AnnaBridge 189:f392fc9709a3 180 ppu_cfg.secure = ppu_config_arr[i].secureMst;
AnnaBridge 189:f392fc9709a3 181 ppu_cfg.pcMask = ppu_config_arr[i].pcMstMask;
AnnaBridge 189:f392fc9709a3 182 ret = Cy_Prot_ConfigPpuProgMasterStruct(ppu_config_arr[i].pPpuStr, &ppu_cfg);
AnnaBridge 189:f392fc9709a3 183 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 184 {
AnnaBridge 189:f392fc9709a3 185 break;
AnnaBridge 189:f392fc9709a3 186 }
AnnaBridge 189:f392fc9709a3 187 ret = Cy_Prot_EnablePpuProgSlaveStruct(ppu_config_arr[i].pPpuStr);
AnnaBridge 189:f392fc9709a3 188 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 189 {
AnnaBridge 189:f392fc9709a3 190 break;
AnnaBridge 189:f392fc9709a3 191 }
AnnaBridge 189:f392fc9709a3 192 ret = Cy_Prot_EnablePpuProgMasterStruct(ppu_config_arr[i].pPpuStr);
AnnaBridge 189:f392fc9709a3 193 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 194 {
AnnaBridge 189:f392fc9709a3 195 break;
AnnaBridge 189:f392fc9709a3 196 }
AnnaBridge 189:f392fc9709a3 197 }
AnnaBridge 189:f392fc9709a3 198
AnnaBridge 189:f392fc9709a3 199 return ret;
AnnaBridge 189:f392fc9709a3 200 }
AnnaBridge 189:f392fc9709a3 201
AnnaBridge 189:f392fc9709a3 202 /* configure PPU Fixed Group */
AnnaBridge 189:f392fc9709a3 203 cy_en_prot_status_t ppu_fixed_gr_protect(cy_ppu_fixed_gr_cfg_t ppu_config_arr[], uint32_t arr_length)
AnnaBridge 189:f392fc9709a3 204 {
AnnaBridge 189:f392fc9709a3 205 cy_en_prot_status_t ret = CY_PROT_SUCCESS;
AnnaBridge 189:f392fc9709a3 206 uint32_t i;
AnnaBridge 189:f392fc9709a3 207 cy_stc_ppu_gr_cfg_t ppu_cfg;
AnnaBridge 189:f392fc9709a3 208
AnnaBridge 189:f392fc9709a3 209 for (i = 0; i < arr_length; i++)
AnnaBridge 189:f392fc9709a3 210 {
AnnaBridge 189:f392fc9709a3 211 ppu_cfg.userPermission = ppu_config_arr[i].userPermission;
AnnaBridge 189:f392fc9709a3 212 ppu_cfg.privPermission = ppu_config_arr[i].privPermission;
AnnaBridge 189:f392fc9709a3 213 ppu_cfg.secure = ppu_config_arr[i].secure;
AnnaBridge 189:f392fc9709a3 214 ppu_cfg.pcMatch = ppu_config_arr[i].pcMatch;
AnnaBridge 189:f392fc9709a3 215 ppu_cfg.pcMask = ppu_config_arr[i].pcMask;
AnnaBridge 189:f392fc9709a3 216 ret = Cy_Prot_ConfigPpuFixedGrSlaveStruct(ppu_config_arr[i].pPpuStr, &ppu_cfg);
AnnaBridge 189:f392fc9709a3 217 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 218 {
AnnaBridge 189:f392fc9709a3 219 break;
AnnaBridge 189:f392fc9709a3 220 }
AnnaBridge 189:f392fc9709a3 221 ppu_cfg.userPermission = ppu_config_arr[i].userMstPermission;
AnnaBridge 189:f392fc9709a3 222 ppu_cfg.privPermission = ppu_config_arr[i].privMstPermission;
AnnaBridge 189:f392fc9709a3 223 ppu_cfg.secure = ppu_config_arr[i].secureMst;
AnnaBridge 189:f392fc9709a3 224 ppu_cfg.pcMask = ppu_config_arr[i].pcMstMask;
AnnaBridge 189:f392fc9709a3 225 ret = Cy_Prot_ConfigPpuFixedGrMasterStruct(ppu_config_arr[i].pPpuStr, &ppu_cfg);
AnnaBridge 189:f392fc9709a3 226 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 227 {
AnnaBridge 189:f392fc9709a3 228 break;
AnnaBridge 189:f392fc9709a3 229 }
AnnaBridge 189:f392fc9709a3 230 ret = Cy_Prot_EnablePpuFixedGrSlaveStruct(ppu_config_arr[i].pPpuStr);
AnnaBridge 189:f392fc9709a3 231 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 232 {
AnnaBridge 189:f392fc9709a3 233 break;
AnnaBridge 189:f392fc9709a3 234 }
AnnaBridge 189:f392fc9709a3 235 ret = Cy_Prot_EnablePpuFixedGrMasterStruct(ppu_config_arr[i].pPpuStr);
AnnaBridge 189:f392fc9709a3 236 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 237 {
AnnaBridge 189:f392fc9709a3 238 break;
AnnaBridge 189:f392fc9709a3 239 }
AnnaBridge 189:f392fc9709a3 240 }
AnnaBridge 189:f392fc9709a3 241
AnnaBridge 189:f392fc9709a3 242 return ret;
AnnaBridge 189:f392fc9709a3 243 }
AnnaBridge 189:f392fc9709a3 244
AnnaBridge 189:f392fc9709a3 245 /* Set protection contexts for bus masters */
AnnaBridge 189:f392fc9709a3 246 cy_en_prot_status_t bus_masters_protect(cy_bus_master_config_t bus_masters_config_arr[], uint32_t arr_length)
AnnaBridge 189:f392fc9709a3 247 {
AnnaBridge 189:f392fc9709a3 248 cy_en_prot_status_t ret = CY_PROT_SUCCESS;
AnnaBridge 189:f392fc9709a3 249 uint32_t i;
AnnaBridge 189:f392fc9709a3 250
AnnaBridge 189:f392fc9709a3 251 for (i = 0; i < arr_length; i++)
AnnaBridge 189:f392fc9709a3 252 {
AnnaBridge 189:f392fc9709a3 253 ret = Cy_Prot_ConfigBusMaster(bus_masters_config_arr[i].busMaster, bus_masters_config_arr[i].privileged,
AnnaBridge 189:f392fc9709a3 254 bus_masters_config_arr[i].secure, bus_masters_config_arr[i].pcMask);
AnnaBridge 189:f392fc9709a3 255 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 256 {
AnnaBridge 189:f392fc9709a3 257 break;
AnnaBridge 189:f392fc9709a3 258 }
AnnaBridge 189:f392fc9709a3 259
AnnaBridge 189:f392fc9709a3 260 ret = Cy_Prot_SetActivePC(bus_masters_config_arr[i].busMaster, bus_masters_config_arr[i].act_pc);
AnnaBridge 189:f392fc9709a3 261 if (ret != CY_PROT_SUCCESS)
AnnaBridge 189:f392fc9709a3 262 {
AnnaBridge 189:f392fc9709a3 263 break;
AnnaBridge 189:f392fc9709a3 264 }
AnnaBridge 189:f392fc9709a3 265 }
AnnaBridge 189:f392fc9709a3 266
AnnaBridge 189:f392fc9709a3 267 return ret;
AnnaBridge 189:f392fc9709a3 268 }
AnnaBridge 189:f392fc9709a3 269
AnnaBridge 189:f392fc9709a3 270 /******************************************************************************
AnnaBridge 189:f392fc9709a3 271 * Function Name: isProtRangeMatched
AnnaBridge 189:f392fc9709a3 272 ******************************************************************************
AnnaBridge 189:f392fc9709a3 273 * Summary:
AnnaBridge 189:f392fc9709a3 274 * The function checks whether a memory region is closed by SMPU for a master
AnnaBridge 189:f392fc9709a3 275 *
AnnaBridge 189:f392fc9709a3 276 * Parameters:
AnnaBridge 189:f392fc9709a3 277 * uint32_t startAddrMem: memory address to be accessed
AnnaBridge 189:f392fc9709a3 278 * uint32_t memSize: memory size to be accessed
AnnaBridge 189:f392fc9709a3 279 * uint32_t startAddrSMPU: memory address from SMPU
AnnaBridge 189:f392fc9709a3 280 * cy_en_prot_size_t log2RegionSizeSMPU: memory size from SMPU
AnnaBridge 189:f392fc9709a3 281 * uint8_t regionDisableSMPU: disabled regions bitmap
AnnaBridge 189:f392fc9709a3 282 *
AnnaBridge 189:f392fc9709a3 283 * Return:
AnnaBridge 189:f392fc9709a3 284 * uint8_t rangeMatches (values: 0 (no) /1 (yes))
AnnaBridge 189:f392fc9709a3 285 *
AnnaBridge 189:f392fc9709a3 286 * Calls:
AnnaBridge 189:f392fc9709a3 287 * none
AnnaBridge 189:f392fc9709a3 288 *
AnnaBridge 189:f392fc9709a3 289 * Called by:
AnnaBridge 189:f392fc9709a3 290 * isAccessAllowedSMPU, isAccessAllowedMPU
AnnaBridge 189:f392fc9709a3 291 *
AnnaBridge 189:f392fc9709a3 292 * Note:
AnnaBridge 189:f392fc9709a3 293 *
AnnaBridge 189:f392fc9709a3 294 *
AnnaBridge 189:f392fc9709a3 295 *****************************************************************************/
AnnaBridge 189:f392fc9709a3 296 static uint8_t isProtRangeMatched(uint32_t startAddrMem, uint32_t memSize, uint32_t startAddrSMPU,
AnnaBridge 189:f392fc9709a3 297 cy_en_prot_size_t log2RegionSizeSMPU, uint8_t regionDisableSMPU)
AnnaBridge 189:f392fc9709a3 298 {
AnnaBridge 189:f392fc9709a3 299 uint8_t rangeMatches = 0;
AnnaBridge 189:f392fc9709a3 300 uint8_t i;
AnnaBridge 189:f392fc9709a3 301 uint64_t endAddrMem, endAddrSMPU;
AnnaBridge 189:f392fc9709a3 302 uint64_t subRangeStartAddr, subRangeEndAddr;
AnnaBridge 189:f392fc9709a3 303
AnnaBridge 189:f392fc9709a3 304 endAddrMem = startAddrMem + memSize;
AnnaBridge 189:f392fc9709a3 305 endAddrSMPU = startAddrSMPU + (1 << (log2RegionSizeSMPU + 1u));
AnnaBridge 189:f392fc9709a3 306
AnnaBridge 189:f392fc9709a3 307 if (((startAddrMem >= startAddrSMPU) && (startAddrMem <= endAddrSMPU)) ||
AnnaBridge 189:f392fc9709a3 308 ((startAddrSMPU >= startAddrMem) && (startAddrSMPU < endAddrMem)))
AnnaBridge 189:f392fc9709a3 309 {
AnnaBridge 189:f392fc9709a3 310 rangeMatches = 1;
AnnaBridge 189:f392fc9709a3 311 }
AnnaBridge 189:f392fc9709a3 312
AnnaBridge 189:f392fc9709a3 313 /* log2RegionSizeSMPU should be >= 7 according to spec */
AnnaBridge 189:f392fc9709a3 314 if ((rangeMatches == 1) && (log2RegionSizeSMPU > 1u))
AnnaBridge 189:f392fc9709a3 315 {
AnnaBridge 189:f392fc9709a3 316 rangeMatches = 0;
AnnaBridge 189:f392fc9709a3 317 for (i = 0; i < MPU_SMPU_SUBREGIONS_NUMB; i++)
AnnaBridge 189:f392fc9709a3 318 {
AnnaBridge 189:f392fc9709a3 319 if (regionDisableSMPU & (1 << i))
AnnaBridge 189:f392fc9709a3 320 {
AnnaBridge 189:f392fc9709a3 321 continue;
AnnaBridge 189:f392fc9709a3 322 }
AnnaBridge 189:f392fc9709a3 323 subRangeStartAddr = startAddrSMPU + i * (1 << (log2RegionSizeSMPU - 2u));
AnnaBridge 189:f392fc9709a3 324 subRangeEndAddr = startAddrSMPU + (i + 1) * (1 << (log2RegionSizeSMPU - 2u));
AnnaBridge 189:f392fc9709a3 325 if (((startAddrMem >= subRangeStartAddr) && (startAddrMem <= subRangeEndAddr)) ||
AnnaBridge 189:f392fc9709a3 326 ((subRangeStartAddr >= startAddrMem) && (subRangeStartAddr < endAddrMem)))
AnnaBridge 189:f392fc9709a3 327 {
AnnaBridge 189:f392fc9709a3 328 rangeMatches = 1;
AnnaBridge 189:f392fc9709a3 329 break;
AnnaBridge 189:f392fc9709a3 330 }
AnnaBridge 189:f392fc9709a3 331 }
AnnaBridge 189:f392fc9709a3 332 }
AnnaBridge 189:f392fc9709a3 333
AnnaBridge 189:f392fc9709a3 334 return rangeMatches;
AnnaBridge 189:f392fc9709a3 335 }
AnnaBridge 189:f392fc9709a3 336
AnnaBridge 189:f392fc9709a3 337 /******************************************************************************
AnnaBridge 189:f392fc9709a3 338 * Function Name: isAccessAllowedFixedRgPPU
AnnaBridge 189:f392fc9709a3 339 ******************************************************************************
AnnaBridge 189:f392fc9709a3 340 * Summary:
AnnaBridge 189:f392fc9709a3 341 * The function checks whether a peripheral region is closed by Fixed Region PPU
AnnaBridge 189:f392fc9709a3 342 *
AnnaBridge 189:f392fc9709a3 343 * Parameters:
AnnaBridge 189:f392fc9709a3 344 * uint32_t perStartAddr: peripheral region address to be accessed by master
AnnaBridge 189:f392fc9709a3 345 * uint32_t perSize: peripheral memory size to be accessed by master
AnnaBridge 189:f392fc9709a3 346 * uint8_t privModeFlag: Priviliged or nonproviliged master
AnnaBridge 189:f392fc9709a3 347 * uint8_t nsecureFlag: Non-secure or secure master
AnnaBridge 189:f392fc9709a3 348 * enum cy_en_prot_pc_t protectionCtx: Protection context of master
AnnaBridge 189:f392fc9709a3 349 * cy_en_prot_perm_t accessType
AnnaBridge 189:f392fc9709a3 350 *
AnnaBridge 189:f392fc9709a3 351 * Return:
AnnaBridge 189:f392fc9709a3 352 * uint8_t accessAllowed (values: 0 (no) /1 (yes))
AnnaBridge 189:f392fc9709a3 353 *
AnnaBridge 189:f392fc9709a3 354 * Calls:
AnnaBridge 189:f392fc9709a3 355 * isProtRangeMatched
AnnaBridge 189:f392fc9709a3 356 *
AnnaBridge 189:f392fc9709a3 357 * Called by:
AnnaBridge 189:f392fc9709a3 358 * isPeripheralAccessAllowed
AnnaBridge 189:f392fc9709a3 359 *
AnnaBridge 189:f392fc9709a3 360 * Note:
AnnaBridge 189:f392fc9709a3 361 *
AnnaBridge 189:f392fc9709a3 362 *
AnnaBridge 189:f392fc9709a3 363 *****************************************************************************/
AnnaBridge 189:f392fc9709a3 364 static uint8_t isAccessAllowedFixedRgPPU(uint32_t perStartAddr, uint32_t perSize,
AnnaBridge 189:f392fc9709a3 365 uint8_t privModeFlag, uint8_t nsecureFlag, enum cy_en_prot_pc_t protectionCtx, cy_en_prot_perm_t accessType)
AnnaBridge 189:f392fc9709a3 366 {
AnnaBridge 189:f392fc9709a3 367 uint8_t accessAllowed = 1;
AnnaBridge 189:f392fc9709a3 368 uint8_t i;
AnnaBridge 189:f392fc9709a3 369 uint32_t att0, addr0, ppuAddr;
AnnaBridge 189:f392fc9709a3 370 PERI_GR_PPU_RG_Type* pPpuRgStr;
AnnaBridge 189:f392fc9709a3 371 uint32_t startAddrPPU, pcMaskPPU;
AnnaBridge 189:f392fc9709a3 372 cy_en_prot_size_t log2RegionSizePPU;
AnnaBridge 189:f392fc9709a3 373 uint8_t pcMatchPPU, nonSecureFlagPPU, regionDisablePPU;
AnnaBridge 189:f392fc9709a3 374 cy_en_prot_perm_t permisionsPPU;
AnnaBridge 189:f392fc9709a3 375
AnnaBridge 189:f392fc9709a3 376 if (protectionCtx >= CY_PROT_PC1) /* if client is not in protection context 0 */
AnnaBridge 189:f392fc9709a3 377 {
AnnaBridge 189:f392fc9709a3 378 /* Matching process */
AnnaBridge 189:f392fc9709a3 379 for (i = CPUSS_PROT_PPU_FX_RG_STRUCT_NR; i > 0; i--)
AnnaBridge 189:f392fc9709a3 380 {
AnnaBridge 189:f392fc9709a3 381 ppuAddr = CPUSS_PROT_PPU_FX_RG_START_ADDR + (i - 1) * PERI_GR_PPU_RG_SECTION_SIZE;
AnnaBridge 189:f392fc9709a3 382 pPpuRgStr = (PERI_GR_PPU_RG_Type*) ppuAddr;
AnnaBridge 189:f392fc9709a3 383 addr0 = pPpuRgStr->ADDR0;
AnnaBridge 189:f392fc9709a3 384 att0 = pPpuRgStr->ATT0;
AnnaBridge 189:f392fc9709a3 385 if (_FLD2VAL(PERI_PPU_PR_ATT0_ENABLED, att0) > 0)
AnnaBridge 189:f392fc9709a3 386 {
AnnaBridge 189:f392fc9709a3 387 pcMatchPPU = _FLD2VAL(PERI_PPU_PR_ATT0_PC_MATCH, att0);
AnnaBridge 189:f392fc9709a3 388 pcMaskPPU = _FLD2VAL(PERI_PPU_PR_ATT0_PC_MASK_15_TO_1, att0);
AnnaBridge 189:f392fc9709a3 389 if (!pcMatchPPU || (pcMatchPPU && (pcMaskPPU & (1 << (protectionCtx - 1u)))))
AnnaBridge 189:f392fc9709a3 390 {
AnnaBridge 189:f392fc9709a3 391 startAddrPPU = _FLD2VAL(PERI_PPU_PR_ADDR0_ADDR24, addr0) << CY_PROT_ADDR_SHIFT;
AnnaBridge 189:f392fc9709a3 392 regionDisablePPU = _FLD2VAL(PERI_PPU_PR_ADDR0_SUBREGION_DISABLE, addr0);
AnnaBridge 189:f392fc9709a3 393 log2RegionSizePPU = _FLD2VAL(PERI_PPU_PR_ATT0_REGION_SIZE, att0);
AnnaBridge 189:f392fc9709a3 394 if (isProtRangeMatched(perStartAddr, perSize, startAddrPPU, log2RegionSizePPU, regionDisablePPU))
AnnaBridge 189:f392fc9709a3 395 {
AnnaBridge 189:f392fc9709a3 396 break;
AnnaBridge 189:f392fc9709a3 397 }
AnnaBridge 189:f392fc9709a3 398 }
AnnaBridge 189:f392fc9709a3 399 }
AnnaBridge 189:f392fc9709a3 400 }
AnnaBridge 189:f392fc9709a3 401
AnnaBridge 189:f392fc9709a3 402 if (i > 0)
AnnaBridge 189:f392fc9709a3 403 {
AnnaBridge 189:f392fc9709a3 404 /* Evaluation process */
AnnaBridge 189:f392fc9709a3 405 nonSecureFlagPPU = _FLD2VAL(PERI_PPU_PR_ATT0_NS, att0);
AnnaBridge 189:f392fc9709a3 406 if (privModeFlag)
AnnaBridge 189:f392fc9709a3 407 {
AnnaBridge 189:f392fc9709a3 408 permisionsPPU = ((att0 >> CY_PROT_ATT_PRIV_PERMISSION_SHIFT) & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 409 }
AnnaBridge 189:f392fc9709a3 410 else
AnnaBridge 189:f392fc9709a3 411 {
AnnaBridge 189:f392fc9709a3 412 permisionsPPU = (att0 & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 413 }
AnnaBridge 189:f392fc9709a3 414
AnnaBridge 189:f392fc9709a3 415 if ((!(pcMaskPPU & (1 << (protectionCtx - 1u)))) ||
AnnaBridge 189:f392fc9709a3 416 ((!nonSecureFlagPPU) && nsecureFlag) ||
AnnaBridge 189:f392fc9709a3 417 ((accessType & permisionsPPU) != accessType))
AnnaBridge 189:f392fc9709a3 418 {
AnnaBridge 189:f392fc9709a3 419 accessAllowed = 0;
AnnaBridge 189:f392fc9709a3 420 }
AnnaBridge 189:f392fc9709a3 421 }
AnnaBridge 189:f392fc9709a3 422 }
AnnaBridge 189:f392fc9709a3 423
AnnaBridge 189:f392fc9709a3 424 return accessAllowed;
AnnaBridge 189:f392fc9709a3 425 }
AnnaBridge 189:f392fc9709a3 426
AnnaBridge 189:f392fc9709a3 427 /******************************************************************************
AnnaBridge 189:f392fc9709a3 428 * Function Name: isAccessAllowedFixedSlPPU
AnnaBridge 189:f392fc9709a3 429 ******************************************************************************
AnnaBridge 189:f392fc9709a3 430 * Summary:
AnnaBridge 189:f392fc9709a3 431 * The function checks whether a peripheral region is closed by Fixed Slave PPU
AnnaBridge 189:f392fc9709a3 432 *
AnnaBridge 189:f392fc9709a3 433 * Parameters:
AnnaBridge 189:f392fc9709a3 434 * uint32_t perStartAddr: peripheral region address to be accessed by master
AnnaBridge 189:f392fc9709a3 435 * uint32_t perSize: peripheral memory size to be accessed by master
AnnaBridge 189:f392fc9709a3 436 * uint8_t privModeFlag: Priviliged or nonproviliged master
AnnaBridge 189:f392fc9709a3 437 * uint8_t nsecureFlag: Non-secure or secure master
AnnaBridge 189:f392fc9709a3 438 * enum cy_en_prot_pc_t protectionCtx: Protection context of master
AnnaBridge 189:f392fc9709a3 439 * cy_en_prot_perm_t accessType
AnnaBridge 189:f392fc9709a3 440 *
AnnaBridge 189:f392fc9709a3 441 * Return:
AnnaBridge 189:f392fc9709a3 442 * uint8_t accessAllowed (values: 0 (no) /1 (yes))
AnnaBridge 189:f392fc9709a3 443 *
AnnaBridge 189:f392fc9709a3 444 * Calls:
AnnaBridge 189:f392fc9709a3 445 * isProtRangeMatched
AnnaBridge 189:f392fc9709a3 446 *
AnnaBridge 189:f392fc9709a3 447 * Called by:
AnnaBridge 189:f392fc9709a3 448 * isPeripheralAccessAllowed
AnnaBridge 189:f392fc9709a3 449 *
AnnaBridge 189:f392fc9709a3 450 * Note:
AnnaBridge 189:f392fc9709a3 451 *
AnnaBridge 189:f392fc9709a3 452 *
AnnaBridge 189:f392fc9709a3 453 *****************************************************************************/
AnnaBridge 189:f392fc9709a3 454 static uint8_t isAccessAllowedFixedSlPPU(uint32_t perStartAddr, uint32_t perSize,
AnnaBridge 189:f392fc9709a3 455 uint8_t privModeFlag, uint8_t nsecureFlag, enum cy_en_prot_pc_t protectionCtx, cy_en_prot_perm_t accessType)
AnnaBridge 189:f392fc9709a3 456 {
AnnaBridge 189:f392fc9709a3 457 uint8_t accessAllowed = 1;
AnnaBridge 189:f392fc9709a3 458 uint8_t i, j;
AnnaBridge 189:f392fc9709a3 459 uint32_t att0, addr0;
AnnaBridge 189:f392fc9709a3 460 uint32_t grAddr0, ppuAddr;
AnnaBridge 189:f392fc9709a3 461 PERI_GR_PPU_SL_Type* pPpuSlStr;
AnnaBridge 189:f392fc9709a3 462 uint32_t startAddrPPU, pcMaskPPU;
AnnaBridge 189:f392fc9709a3 463 cy_en_prot_size_t log2RegionSizePPU;
AnnaBridge 189:f392fc9709a3 464 uint8_t pcMatchPPU, nonSecureFlagPPU, regionDisablePPU;
AnnaBridge 189:f392fc9709a3 465 cy_en_prot_perm_t permisionsPPU;
AnnaBridge 189:f392fc9709a3 466
AnnaBridge 189:f392fc9709a3 467 const uint32_t fixedRgMasks[CPUSS_PROT_PPU_GR_STRUCT_NR] = {
AnnaBridge 189:f392fc9709a3 468 0x0,
AnnaBridge 189:f392fc9709a3 469 PERI_PPU_GR_MMIO1_EXIST_BITMASK,
AnnaBridge 189:f392fc9709a3 470 PERI_PPU_GR_MMIO2_EXIST_BITMASK,
AnnaBridge 189:f392fc9709a3 471 PERI_PPU_GR_MMIO3_EXIST_BITMASK,
AnnaBridge 189:f392fc9709a3 472 PERI_PPU_GR_MMIO4_EXIST_BITMASK,
AnnaBridge 189:f392fc9709a3 473 0x0,
AnnaBridge 189:f392fc9709a3 474 PERI_PPU_GR_MMIO6_EXIST_BITMASK,
AnnaBridge 189:f392fc9709a3 475 0x0,
AnnaBridge 189:f392fc9709a3 476 0x0,
AnnaBridge 189:f392fc9709a3 477 PERI_PPU_GR_MMIO9_EXIST_BITMASK,
AnnaBridge 189:f392fc9709a3 478 PERI_PPU_GR_MMIO10_EXIST_BITMASK,
AnnaBridge 189:f392fc9709a3 479 0x0,
AnnaBridge 189:f392fc9709a3 480 0x0,
AnnaBridge 189:f392fc9709a3 481 0x0,
AnnaBridge 189:f392fc9709a3 482 0x0,
AnnaBridge 189:f392fc9709a3 483 0x0
AnnaBridge 189:f392fc9709a3 484 };
AnnaBridge 189:f392fc9709a3 485
AnnaBridge 189:f392fc9709a3 486 if (protectionCtx >= CY_PROT_PC1) /* if client is not in protection context 0 */
AnnaBridge 189:f392fc9709a3 487 {
AnnaBridge 189:f392fc9709a3 488 /* Matching process */
AnnaBridge 189:f392fc9709a3 489 for (i = CPUSS_PROT_PPU_GR_STRUCT_NR; i > 0; i--)
AnnaBridge 189:f392fc9709a3 490 {
AnnaBridge 189:f392fc9709a3 491 if (PERI_PPU_GR_MMIO_EXIST_BITMASK & (1<<(i - 1)))
AnnaBridge 189:f392fc9709a3 492 {
AnnaBridge 189:f392fc9709a3 493 grAddr0 = PERI->PPU_GR[i - 1].ADDR0;
AnnaBridge 189:f392fc9709a3 494 for (j = CPUSS_PROT_PPU_FX_SL_STRUCT_NR; j > 0; j--)
AnnaBridge 189:f392fc9709a3 495 {
AnnaBridge 189:f392fc9709a3 496 if (fixedRgMasks[i - 1] & (1<<(j - 1)))
AnnaBridge 189:f392fc9709a3 497 {
AnnaBridge 189:f392fc9709a3 498 ppuAddr = grAddr0 + (j - 1) * PERI_GR_PPU_RG_SECTION_SIZE;
AnnaBridge 189:f392fc9709a3 499 pPpuSlStr = (PERI_GR_PPU_SL_Type*) ppuAddr;
AnnaBridge 189:f392fc9709a3 500 addr0 = pPpuSlStr->ADDR0;
AnnaBridge 189:f392fc9709a3 501 att0 = pPpuSlStr->ATT0;
AnnaBridge 189:f392fc9709a3 502 if (_FLD2VAL(PERI_GR_PPU_SL_ATT0_ENABLED, att0) > 0)
AnnaBridge 189:f392fc9709a3 503 {
AnnaBridge 189:f392fc9709a3 504 pcMatchPPU = _FLD2VAL(PERI_GR_PPU_SL_ATT0_PC_MATCH, att0);
AnnaBridge 189:f392fc9709a3 505 pcMaskPPU = _FLD2VAL(PERI_GR_PPU_SL_ATT0_PC_MASK_15_TO_1, att0);
AnnaBridge 189:f392fc9709a3 506 if (!pcMatchPPU || (pcMatchPPU && (pcMaskPPU & (1 << (protectionCtx - 1u)))))
AnnaBridge 189:f392fc9709a3 507 {
AnnaBridge 189:f392fc9709a3 508 startAddrPPU = _FLD2VAL(PERI_GR_PPU_SL_ADDR0_ADDR24, addr0) << CY_PROT_ADDR_SHIFT;
AnnaBridge 189:f392fc9709a3 509 regionDisablePPU = _FLD2VAL(PERI_GR_PPU_SL_ADDR0_SUBREGION_DISABLE, addr0);
AnnaBridge 189:f392fc9709a3 510 log2RegionSizePPU = _FLD2VAL(PERI_GR_PPU_SL_ATT0_REGION_SIZE, att0);
AnnaBridge 189:f392fc9709a3 511 if (isProtRangeMatched(perStartAddr, perSize, startAddrPPU, log2RegionSizePPU, regionDisablePPU))
AnnaBridge 189:f392fc9709a3 512 {
AnnaBridge 189:f392fc9709a3 513 break;
AnnaBridge 189:f392fc9709a3 514 }
AnnaBridge 189:f392fc9709a3 515 }
AnnaBridge 189:f392fc9709a3 516 }
AnnaBridge 189:f392fc9709a3 517 }
AnnaBridge 189:f392fc9709a3 518 }
AnnaBridge 189:f392fc9709a3 519 if (j > 0)
AnnaBridge 189:f392fc9709a3 520 {
AnnaBridge 189:f392fc9709a3 521 break;
AnnaBridge 189:f392fc9709a3 522 }
AnnaBridge 189:f392fc9709a3 523 }
AnnaBridge 189:f392fc9709a3 524 }
AnnaBridge 189:f392fc9709a3 525
AnnaBridge 189:f392fc9709a3 526 if (i > 0)
AnnaBridge 189:f392fc9709a3 527 {
AnnaBridge 189:f392fc9709a3 528 /* Evaluation process */
AnnaBridge 189:f392fc9709a3 529 nonSecureFlagPPU = _FLD2VAL(PERI_GR_PPU_SL_ATT0_NS, att0);
AnnaBridge 189:f392fc9709a3 530 if (privModeFlag)
AnnaBridge 189:f392fc9709a3 531 {
AnnaBridge 189:f392fc9709a3 532 permisionsPPU = ((att0 >> CY_PROT_ATT_PRIV_PERMISSION_SHIFT) & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 533 }
AnnaBridge 189:f392fc9709a3 534 else
AnnaBridge 189:f392fc9709a3 535 {
AnnaBridge 189:f392fc9709a3 536 permisionsPPU = (att0 & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 537 }
AnnaBridge 189:f392fc9709a3 538
AnnaBridge 189:f392fc9709a3 539 if ((!(pcMaskPPU & (1 << (protectionCtx - 1u)))) ||
AnnaBridge 189:f392fc9709a3 540 ((!nonSecureFlagPPU) && nsecureFlag) ||
AnnaBridge 189:f392fc9709a3 541 ((accessType & permisionsPPU) != accessType))
AnnaBridge 189:f392fc9709a3 542 {
AnnaBridge 189:f392fc9709a3 543 accessAllowed = 0;
AnnaBridge 189:f392fc9709a3 544 }
AnnaBridge 189:f392fc9709a3 545 }
AnnaBridge 189:f392fc9709a3 546 }
AnnaBridge 189:f392fc9709a3 547
AnnaBridge 189:f392fc9709a3 548 return accessAllowed;
AnnaBridge 189:f392fc9709a3 549 }
AnnaBridge 189:f392fc9709a3 550
AnnaBridge 189:f392fc9709a3 551 /******************************************************************************
AnnaBridge 189:f392fc9709a3 552 * Function Name: isAccessAllowedProgPPU
AnnaBridge 189:f392fc9709a3 553 ******************************************************************************
AnnaBridge 189:f392fc9709a3 554 * Summary:
AnnaBridge 189:f392fc9709a3 555 * The function checks whether a peripheral region is closed by Programmable PPU
AnnaBridge 189:f392fc9709a3 556 *
AnnaBridge 189:f392fc9709a3 557 * Parameters:
AnnaBridge 189:f392fc9709a3 558 * uint32_t perStartAddr: peripheral region address to be accessed by master
AnnaBridge 189:f392fc9709a3 559 * uint32_t perSize: peripheral memory size to be accessed by master
AnnaBridge 189:f392fc9709a3 560 * uint8_t privModeFlag: Priviliged or nonproviliged master
AnnaBridge 189:f392fc9709a3 561 * uint8_t nsecureFlag: Non-secure or secure master
AnnaBridge 189:f392fc9709a3 562 * enum cy_en_prot_pc_t protectionCtx: Protection context of master
AnnaBridge 189:f392fc9709a3 563 * cy_en_prot_perm_t accessType
AnnaBridge 189:f392fc9709a3 564 *
AnnaBridge 189:f392fc9709a3 565 * Return:
AnnaBridge 189:f392fc9709a3 566 * uint8_t accessAllowed (values: 0 (no) /1 (yes))
AnnaBridge 189:f392fc9709a3 567 *
AnnaBridge 189:f392fc9709a3 568 * Calls:
AnnaBridge 189:f392fc9709a3 569 * isProtRangeMatched
AnnaBridge 189:f392fc9709a3 570 *
AnnaBridge 189:f392fc9709a3 571 * Called by:
AnnaBridge 189:f392fc9709a3 572 * isPeripheralAccessAllowed
AnnaBridge 189:f392fc9709a3 573 *
AnnaBridge 189:f392fc9709a3 574 * Note:
AnnaBridge 189:f392fc9709a3 575 *
AnnaBridge 189:f392fc9709a3 576 *
AnnaBridge 189:f392fc9709a3 577 *****************************************************************************/
AnnaBridge 189:f392fc9709a3 578 static uint8_t isAccessAllowedProgPPU(uint32_t perStartAddr, uint32_t perSize,
AnnaBridge 189:f392fc9709a3 579 uint8_t privModeFlag, uint8_t nsecureFlag, enum cy_en_prot_pc_t protectionCtx, cy_en_prot_perm_t accessType)
AnnaBridge 189:f392fc9709a3 580 {
AnnaBridge 189:f392fc9709a3 581 uint8_t accessAllowed = 1;
AnnaBridge 189:f392fc9709a3 582 uint8_t i;
AnnaBridge 189:f392fc9709a3 583 uint32_t att0, addr0;
AnnaBridge 189:f392fc9709a3 584 uint32_t startAddrPPU, pcMaskPPU;
AnnaBridge 189:f392fc9709a3 585 cy_en_prot_size_t log2RegionSizePPU;
AnnaBridge 189:f392fc9709a3 586 uint8_t pcMatchPPU, nonSecureFlagPPU, regionDisablePPU;
AnnaBridge 189:f392fc9709a3 587 cy_en_prot_perm_t permisionsPPU;
AnnaBridge 189:f392fc9709a3 588
AnnaBridge 189:f392fc9709a3 589 if (protectionCtx >= CY_PROT_PC1) /* if client is not in protection context 0 */
AnnaBridge 189:f392fc9709a3 590 {
AnnaBridge 189:f392fc9709a3 591 /* Matching process */
AnnaBridge 189:f392fc9709a3 592 for (i = CPUSS_PROT_PPU_PROG_STRUCT_NR; i > 0; i--)
AnnaBridge 189:f392fc9709a3 593 {
AnnaBridge 189:f392fc9709a3 594 addr0 = PERI->PPU_PR[i - 1].ADDR0;
AnnaBridge 189:f392fc9709a3 595 att0 = PERI->PPU_PR[i - 1].ATT0;
AnnaBridge 189:f392fc9709a3 596 if (_FLD2VAL(PERI_PPU_PR_ATT0_ENABLED, att0) > 0)
AnnaBridge 189:f392fc9709a3 597 {
AnnaBridge 189:f392fc9709a3 598 pcMatchPPU = _FLD2VAL(PERI_PPU_PR_ATT0_PC_MATCH, att0);
AnnaBridge 189:f392fc9709a3 599 pcMaskPPU = _FLD2VAL(PERI_PPU_PR_ATT0_PC_MASK_15_TO_1, att0);
AnnaBridge 189:f392fc9709a3 600 if (!pcMatchPPU || (pcMatchPPU && (pcMaskPPU & (1 << (protectionCtx - 1u)))))
AnnaBridge 189:f392fc9709a3 601 {
AnnaBridge 189:f392fc9709a3 602 startAddrPPU = _FLD2VAL(PERI_PPU_PR_ADDR0_ADDR24, addr0) << CY_PROT_ADDR_SHIFT;
AnnaBridge 189:f392fc9709a3 603 regionDisablePPU = _FLD2VAL(PERI_PPU_PR_ADDR0_SUBREGION_DISABLE, addr0);
AnnaBridge 189:f392fc9709a3 604 log2RegionSizePPU = _FLD2VAL(PERI_PPU_PR_ATT0_REGION_SIZE, att0);
AnnaBridge 189:f392fc9709a3 605 if (isProtRangeMatched(perStartAddr, perSize, startAddrPPU, log2RegionSizePPU, regionDisablePPU))
AnnaBridge 189:f392fc9709a3 606 {
AnnaBridge 189:f392fc9709a3 607 break;
AnnaBridge 189:f392fc9709a3 608 }
AnnaBridge 189:f392fc9709a3 609 }
AnnaBridge 189:f392fc9709a3 610 }
AnnaBridge 189:f392fc9709a3 611 }
AnnaBridge 189:f392fc9709a3 612
AnnaBridge 189:f392fc9709a3 613 if (i > 0)
AnnaBridge 189:f392fc9709a3 614 {
AnnaBridge 189:f392fc9709a3 615 /* Evaluation process */
AnnaBridge 189:f392fc9709a3 616 nonSecureFlagPPU = _FLD2VAL(PERI_PPU_PR_ATT0_NS, att0);
AnnaBridge 189:f392fc9709a3 617 if (privModeFlag)
AnnaBridge 189:f392fc9709a3 618 {
AnnaBridge 189:f392fc9709a3 619 permisionsPPU = ((att0 >> CY_PROT_ATT_PRIV_PERMISSION_SHIFT) & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 620 }
AnnaBridge 189:f392fc9709a3 621 else
AnnaBridge 189:f392fc9709a3 622 {
AnnaBridge 189:f392fc9709a3 623 permisionsPPU = (att0 & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 624 }
AnnaBridge 189:f392fc9709a3 625
AnnaBridge 189:f392fc9709a3 626 if ((!(pcMaskPPU & (1 << (protectionCtx - 1u)))) ||
AnnaBridge 189:f392fc9709a3 627 ((!nonSecureFlagPPU) && nsecureFlag) ||
AnnaBridge 189:f392fc9709a3 628 ((accessType & permisionsPPU) != accessType))
AnnaBridge 189:f392fc9709a3 629 {
AnnaBridge 189:f392fc9709a3 630 accessAllowed = 0;
AnnaBridge 189:f392fc9709a3 631 }
AnnaBridge 189:f392fc9709a3 632 }
AnnaBridge 189:f392fc9709a3 633 }
AnnaBridge 189:f392fc9709a3 634
AnnaBridge 189:f392fc9709a3 635 return accessAllowed;
AnnaBridge 189:f392fc9709a3 636 }
AnnaBridge 189:f392fc9709a3 637
AnnaBridge 189:f392fc9709a3 638 /******************************************************************************
AnnaBridge 189:f392fc9709a3 639 * Function Name: isAccessAllowedGrPPU
AnnaBridge 189:f392fc9709a3 640 ******************************************************************************
AnnaBridge 189:f392fc9709a3 641 * Summary:
AnnaBridge 189:f392fc9709a3 642 * The function checks whether a peripheral region is closed by Group PPU
AnnaBridge 189:f392fc9709a3 643 *
AnnaBridge 189:f392fc9709a3 644 * Parameters:
AnnaBridge 189:f392fc9709a3 645 * uint32_t perStartAddr: peripheral region address to be accessed by master
AnnaBridge 189:f392fc9709a3 646 * uint32_t perSize: peripheral memory size to be accessed by master
AnnaBridge 189:f392fc9709a3 647 * uint8_t privModeFlag: Priviliged or nonproviliged master
AnnaBridge 189:f392fc9709a3 648 * uint8_t nsecureFlag: Non-secure or secure master
AnnaBridge 189:f392fc9709a3 649 * enum cy_en_prot_pc_t protectionCtx: Protection context of master
AnnaBridge 189:f392fc9709a3 650 * cy_en_prot_perm_t accessType
AnnaBridge 189:f392fc9709a3 651 *
AnnaBridge 189:f392fc9709a3 652 * Return:
AnnaBridge 189:f392fc9709a3 653 * uint8_t accessAllowed (values: 0 (no) /1 (yes))
AnnaBridge 189:f392fc9709a3 654 *
AnnaBridge 189:f392fc9709a3 655 * Calls:
AnnaBridge 189:f392fc9709a3 656 * isProtRangeMatched
AnnaBridge 189:f392fc9709a3 657 *
AnnaBridge 189:f392fc9709a3 658 * Called by:
AnnaBridge 189:f392fc9709a3 659 * isPeripheralAccessAllowed
AnnaBridge 189:f392fc9709a3 660 *
AnnaBridge 189:f392fc9709a3 661 * Note:
AnnaBridge 189:f392fc9709a3 662 *
AnnaBridge 189:f392fc9709a3 663 *
AnnaBridge 189:f392fc9709a3 664 *****************************************************************************/
AnnaBridge 189:f392fc9709a3 665 static uint8_t isAccessAllowedGrPPU(uint32_t perStartAddr, uint32_t perSize,
AnnaBridge 189:f392fc9709a3 666 uint8_t privModeFlag, uint8_t nsecureFlag, enum cy_en_prot_pc_t protectionCtx, cy_en_prot_perm_t accessType)
AnnaBridge 189:f392fc9709a3 667 {
AnnaBridge 189:f392fc9709a3 668 uint8_t accessAllowed = 1;
AnnaBridge 189:f392fc9709a3 669 uint8_t i;
AnnaBridge 189:f392fc9709a3 670 uint32_t att0, addr0;
AnnaBridge 189:f392fc9709a3 671 uint32_t startAddrPPU, pcMaskPPU;
AnnaBridge 189:f392fc9709a3 672 cy_en_prot_size_t log2RegionSizePPU;
AnnaBridge 189:f392fc9709a3 673 uint8_t pcMatchPPU, nonSecureFlagPPU, regionDisablePPU;
AnnaBridge 189:f392fc9709a3 674 cy_en_prot_perm_t permisionsPPU;
AnnaBridge 189:f392fc9709a3 675
AnnaBridge 189:f392fc9709a3 676 if (protectionCtx >= CY_PROT_PC1) /* if client is not in protection context 0 */
AnnaBridge 189:f392fc9709a3 677 {
AnnaBridge 189:f392fc9709a3 678 /* Matching process */
AnnaBridge 189:f392fc9709a3 679 for (i = CPUSS_PROT_PPU_GR_STRUCT_NR; i > 0; i--)
AnnaBridge 189:f392fc9709a3 680 {
AnnaBridge 189:f392fc9709a3 681 if (PERI_PPU_GR_MMIO_EXIST_BITMASK & (1<<(i - 1)))
AnnaBridge 189:f392fc9709a3 682 {
AnnaBridge 189:f392fc9709a3 683 addr0 = PERI->PPU_GR[i - 1].ADDR0;
AnnaBridge 189:f392fc9709a3 684 att0 = PERI->PPU_GR[i - 1].ATT0;
AnnaBridge 189:f392fc9709a3 685 if (_FLD2VAL(PERI_PPU_GR_ATT0_ENABLED, att0) > 0)
AnnaBridge 189:f392fc9709a3 686 {
AnnaBridge 189:f392fc9709a3 687 pcMatchPPU = _FLD2VAL(PERI_PPU_GR_ATT0_PC_MATCH, att0);
AnnaBridge 189:f392fc9709a3 688 pcMaskPPU = _FLD2VAL(PERI_PPU_GR_ATT0_PC_MASK_15_TO_1, att0);
AnnaBridge 189:f392fc9709a3 689 if (!pcMatchPPU || (pcMatchPPU && (pcMaskPPU & (1 << (protectionCtx - 1u)))))
AnnaBridge 189:f392fc9709a3 690 {
AnnaBridge 189:f392fc9709a3 691 startAddrPPU = _FLD2VAL(PERI_PPU_GR_ADDR0_ADDR24, addr0) << CY_PROT_ADDR_SHIFT;
AnnaBridge 189:f392fc9709a3 692 regionDisablePPU = _FLD2VAL(PERI_PPU_GR_ADDR0_SUBREGION_DISABLE, addr0);
AnnaBridge 189:f392fc9709a3 693 log2RegionSizePPU = _FLD2VAL(PERI_PPU_GR_ATT0_REGION_SIZE, att0);
AnnaBridge 189:f392fc9709a3 694 if (isProtRangeMatched(perStartAddr, perSize, startAddrPPU, log2RegionSizePPU, regionDisablePPU))
AnnaBridge 189:f392fc9709a3 695 {
AnnaBridge 189:f392fc9709a3 696 break;
AnnaBridge 189:f392fc9709a3 697 }
AnnaBridge 189:f392fc9709a3 698 }
AnnaBridge 189:f392fc9709a3 699 }
AnnaBridge 189:f392fc9709a3 700 }
AnnaBridge 189:f392fc9709a3 701 }
AnnaBridge 189:f392fc9709a3 702
AnnaBridge 189:f392fc9709a3 703 if (i > 0)
AnnaBridge 189:f392fc9709a3 704 {
AnnaBridge 189:f392fc9709a3 705 /* Evaluation process */
AnnaBridge 189:f392fc9709a3 706 nonSecureFlagPPU = _FLD2VAL(PERI_PPU_GR_ATT0_NS, att0);
AnnaBridge 189:f392fc9709a3 707 if (privModeFlag)
AnnaBridge 189:f392fc9709a3 708 {
AnnaBridge 189:f392fc9709a3 709 permisionsPPU = ((att0 >> CY_PROT_ATT_PRIV_PERMISSION_SHIFT) & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 710 }
AnnaBridge 189:f392fc9709a3 711 else
AnnaBridge 189:f392fc9709a3 712 {
AnnaBridge 189:f392fc9709a3 713 permisionsPPU = (att0 & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 714 }
AnnaBridge 189:f392fc9709a3 715
AnnaBridge 189:f392fc9709a3 716 if ((!(pcMaskPPU & (1 << (protectionCtx - 1u)))) ||
AnnaBridge 189:f392fc9709a3 717 ((!nonSecureFlagPPU) && nsecureFlag) ||
AnnaBridge 189:f392fc9709a3 718 ((accessType & permisionsPPU) != accessType))
AnnaBridge 189:f392fc9709a3 719 {
AnnaBridge 189:f392fc9709a3 720 accessAllowed = 0;
AnnaBridge 189:f392fc9709a3 721 }
AnnaBridge 189:f392fc9709a3 722 }
AnnaBridge 189:f392fc9709a3 723 }
AnnaBridge 189:f392fc9709a3 724
AnnaBridge 189:f392fc9709a3 725 return accessAllowed;
AnnaBridge 189:f392fc9709a3 726 }
AnnaBridge 189:f392fc9709a3 727
AnnaBridge 189:f392fc9709a3 728 /******************************************************************************
AnnaBridge 189:f392fc9709a3 729 * Function Name: isPeripheralAccessAllowed
AnnaBridge 189:f392fc9709a3 730 ******************************************************************************
AnnaBridge 189:f392fc9709a3 731 * Summary:
AnnaBridge 189:f392fc9709a3 732 * Checks if the given peripheral region is protected by PPU
AnnaBridge 189:f392fc9709a3 733 *
AnnaBridge 189:f392fc9709a3 734 * Parameters:
AnnaBridge 189:f392fc9709a3 735 * uint32_t perStartAddr: peripheral region address to be accessed by master
AnnaBridge 189:f392fc9709a3 736 * uint32_t perSize: peripheral memory size to be accessed by master
AnnaBridge 189:f392fc9709a3 737 * uint8_t privModeFlag: Priviliged or nonproviliged master
AnnaBridge 189:f392fc9709a3 738 * uint8_t nsecureFlag: Non-secure or secure master
AnnaBridge 189:f392fc9709a3 739 * enum cy_en_prot_pc_t protectionCtx: Protection context of master
AnnaBridge 189:f392fc9709a3 740 * cy_en_prot_perm_t accessType
AnnaBridge 189:f392fc9709a3 741 *
AnnaBridge 189:f392fc9709a3 742 * Return:
AnnaBridge 189:f392fc9709a3 743 * uint8_t accessAllowed (values: 0 (no) /1 (yes))
AnnaBridge 189:f392fc9709a3 744 *
AnnaBridge 189:f392fc9709a3 745 * Calls:
AnnaBridge 189:f392fc9709a3 746 * isAccessAllowedGrPPU, isAccessAllowedProgPPU, isAccessAllowedFixedPPU,
AnnaBridge 189:f392fc9709a3 747 * isAccessAllowedRegionPPU
AnnaBridge 189:f392fc9709a3 748 *
AnnaBridge 189:f392fc9709a3 749 * Called by:
AnnaBridge 189:f392fc9709a3 750 * none
AnnaBridge 189:f392fc9709a3 751 *
AnnaBridge 189:f392fc9709a3 752 * Note:
AnnaBridge 189:f392fc9709a3 753 *
AnnaBridge 189:f392fc9709a3 754 *
AnnaBridge 189:f392fc9709a3 755 *****************************************************************************/
AnnaBridge 189:f392fc9709a3 756 uint8_t isPeripheralAccessAllowed(uint32_t perStartAddr, uint32_t perSize,
AnnaBridge 189:f392fc9709a3 757 uint8_t privModeFlag, uint8_t nsecureFlag, enum cy_en_prot_pc_t protectionCtx, cy_en_prot_perm_t accessType)
AnnaBridge 189:f392fc9709a3 758 {
AnnaBridge 189:f392fc9709a3 759 uint8_t accessAllowed;
AnnaBridge 189:f392fc9709a3 760
AnnaBridge 189:f392fc9709a3 761 accessAllowed = isAccessAllowedGrPPU(perStartAddr, perSize, privModeFlag, nsecureFlag, protectionCtx, accessType);
AnnaBridge 189:f392fc9709a3 762 if (accessAllowed)
AnnaBridge 189:f392fc9709a3 763 {
AnnaBridge 189:f392fc9709a3 764 accessAllowed = isAccessAllowedProgPPU(perStartAddr, perSize, privModeFlag, nsecureFlag, protectionCtx, accessType);
AnnaBridge 189:f392fc9709a3 765 }
AnnaBridge 189:f392fc9709a3 766 if (accessAllowed)
AnnaBridge 189:f392fc9709a3 767 {
AnnaBridge 189:f392fc9709a3 768 accessAllowed = isAccessAllowedFixedSlPPU(perStartAddr, perSize, privModeFlag, nsecureFlag, protectionCtx, accessType);
AnnaBridge 189:f392fc9709a3 769 }
AnnaBridge 189:f392fc9709a3 770 if (accessAllowed)
AnnaBridge 189:f392fc9709a3 771 {
AnnaBridge 189:f392fc9709a3 772 accessAllowed = isAccessAllowedFixedRgPPU(perStartAddr, perSize, privModeFlag, nsecureFlag, protectionCtx, accessType);
AnnaBridge 189:f392fc9709a3 773 }
AnnaBridge 189:f392fc9709a3 774
AnnaBridge 189:f392fc9709a3 775 return accessAllowed;
AnnaBridge 189:f392fc9709a3 776 }
AnnaBridge 189:f392fc9709a3 777
AnnaBridge 189:f392fc9709a3 778 /******************************************************************************
AnnaBridge 189:f392fc9709a3 779 * Function Name: isAccessAllowedSMPU
AnnaBridge 189:f392fc9709a3 780 ******************************************************************************
AnnaBridge 189:f392fc9709a3 781 * Summary:
AnnaBridge 189:f392fc9709a3 782 * The function checks whether a memory region is closed by SMPU for a master
AnnaBridge 189:f392fc9709a3 783 *
AnnaBridge 189:f392fc9709a3 784 * Parameters:
AnnaBridge 189:f392fc9709a3 785 * uint32_t memStartAddr: memory address to be accessed by master
AnnaBridge 189:f392fc9709a3 786 * uint32_t memSize: memory size to be accessed by master
AnnaBridge 189:f392fc9709a3 787 * uint8_t privModeFlag: Priviliged or nonproviliged master
AnnaBridge 189:f392fc9709a3 788 * uint8_t nsecureFlag: Non-secure or secure master
AnnaBridge 189:f392fc9709a3 789 * enum cy_en_prot_pc_t protectionCtx: Protection context of master
AnnaBridge 189:f392fc9709a3 790 * cy_en_prot_perm_t accessType
AnnaBridge 189:f392fc9709a3 791 *
AnnaBridge 189:f392fc9709a3 792 * Return:
AnnaBridge 189:f392fc9709a3 793 * uint8_t accessAllowed (values: 0 (no) /1 (yes))
AnnaBridge 189:f392fc9709a3 794 *
AnnaBridge 189:f392fc9709a3 795 * Calls:
AnnaBridge 189:f392fc9709a3 796 * isProtRangeMatched
AnnaBridge 189:f392fc9709a3 797 *
AnnaBridge 189:f392fc9709a3 798 * Called by:
AnnaBridge 189:f392fc9709a3 799 * CheckMemoryProtection
AnnaBridge 189:f392fc9709a3 800 *
AnnaBridge 189:f392fc9709a3 801 * Note:
AnnaBridge 189:f392fc9709a3 802 *
AnnaBridge 189:f392fc9709a3 803 *
AnnaBridge 189:f392fc9709a3 804 *****************************************************************************/
AnnaBridge 189:f392fc9709a3 805 static uint8_t isAccessAllowedSMPU(uint32_t memStartAddr, uint32_t memSize,
AnnaBridge 189:f392fc9709a3 806 uint8_t privModeFlag, uint8_t nsecureFlag, enum cy_en_prot_pc_t protectionCtx, cy_en_prot_perm_t accessType)
AnnaBridge 189:f392fc9709a3 807 {
AnnaBridge 189:f392fc9709a3 808 uint8_t accessAllowed = 1;
AnnaBridge 189:f392fc9709a3 809 uint8_t i;
AnnaBridge 189:f392fc9709a3 810 uint32_t att0, addr0;
AnnaBridge 189:f392fc9709a3 811 uint32_t startAddrSMPU, pcMaskSMPU;
AnnaBridge 189:f392fc9709a3 812 cy_en_prot_size_t log2RegionSizeSMPU;
AnnaBridge 189:f392fc9709a3 813 uint8_t pcMatchSMPU, nonSecureFlagSMPU, regionDisableSMPU;
AnnaBridge 189:f392fc9709a3 814 cy_en_prot_perm_t permisionsSMPU;
AnnaBridge 189:f392fc9709a3 815
AnnaBridge 189:f392fc9709a3 816 if (protectionCtx >= CY_PROT_PC1) /* if client is not in protection context 0 */
AnnaBridge 189:f392fc9709a3 817 {
AnnaBridge 189:f392fc9709a3 818 /* Matching process */
AnnaBridge 189:f392fc9709a3 819 /* SMPU with higher index has higher priority */
AnnaBridge 189:f392fc9709a3 820 for (i = CPUSS_PROT_SMPU_STRUCT_NR; i > 0; i--)
AnnaBridge 189:f392fc9709a3 821 {
AnnaBridge 189:f392fc9709a3 822 addr0 = PROT->SMPU.SMPU_STRUCT[i - 1].ADDR0;
AnnaBridge 189:f392fc9709a3 823 att0 = PROT->SMPU.SMPU_STRUCT[i - 1].ATT0;
AnnaBridge 189:f392fc9709a3 824 if (_FLD2VAL(PROT_SMPU_SMPU_STRUCT_ATT0_ENABLED, att0) > 0)
AnnaBridge 189:f392fc9709a3 825 {
AnnaBridge 189:f392fc9709a3 826 pcMatchSMPU = _FLD2VAL(PROT_SMPU_SMPU_STRUCT_ATT0_PC_MATCH, att0);
AnnaBridge 189:f392fc9709a3 827 pcMaskSMPU = _FLD2VAL(PROT_SMPU_SMPU_STRUCT_ATT0_PC_MASK_15_TO_1, att0);
AnnaBridge 189:f392fc9709a3 828 if (!pcMatchSMPU || (pcMatchSMPU && (pcMaskSMPU & (1 << (protectionCtx - 1u)))))
AnnaBridge 189:f392fc9709a3 829 {
AnnaBridge 189:f392fc9709a3 830 startAddrSMPU = _FLD2VAL(PROT_SMPU_SMPU_STRUCT_ADDR0_ADDR24, addr0) << CY_PROT_ADDR_SHIFT;
AnnaBridge 189:f392fc9709a3 831 regionDisableSMPU = _FLD2VAL(PROT_SMPU_SMPU_STRUCT_ADDR0_SUBREGION_DISABLE, addr0);
AnnaBridge 189:f392fc9709a3 832 log2RegionSizeSMPU = _FLD2VAL(PROT_SMPU_SMPU_STRUCT_ATT0_REGION_SIZE, att0);
AnnaBridge 189:f392fc9709a3 833 if (isProtRangeMatched(memStartAddr, memSize, startAddrSMPU, log2RegionSizeSMPU, regionDisableSMPU))
AnnaBridge 189:f392fc9709a3 834 {
AnnaBridge 189:f392fc9709a3 835 break;
AnnaBridge 189:f392fc9709a3 836 }
AnnaBridge 189:f392fc9709a3 837 }
AnnaBridge 189:f392fc9709a3 838 }
AnnaBridge 189:f392fc9709a3 839 }
AnnaBridge 189:f392fc9709a3 840
AnnaBridge 189:f392fc9709a3 841 if (i > 0)
AnnaBridge 189:f392fc9709a3 842 {
AnnaBridge 189:f392fc9709a3 843 /* Evaluation process */
AnnaBridge 189:f392fc9709a3 844 nonSecureFlagSMPU = _FLD2VAL(PROT_SMPU_SMPU_STRUCT_ATT0_NS, att0);
AnnaBridge 189:f392fc9709a3 845 if (privModeFlag)
AnnaBridge 189:f392fc9709a3 846 {
AnnaBridge 189:f392fc9709a3 847 permisionsSMPU = ((att0 >> CY_PROT_ATT_PRIV_PERMISSION_SHIFT) & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 848 }
AnnaBridge 189:f392fc9709a3 849 else
AnnaBridge 189:f392fc9709a3 850 {
AnnaBridge 189:f392fc9709a3 851 permisionsSMPU = (att0 & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 852 }
AnnaBridge 189:f392fc9709a3 853
AnnaBridge 189:f392fc9709a3 854 if ((!(pcMaskSMPU & (1 << (protectionCtx - 1u)))) ||
AnnaBridge 189:f392fc9709a3 855 ((!nonSecureFlagSMPU) && nsecureFlag) ||
AnnaBridge 189:f392fc9709a3 856 ((accessType & permisionsSMPU) != accessType))
AnnaBridge 189:f392fc9709a3 857 {
AnnaBridge 189:f392fc9709a3 858 accessAllowed = 0;
AnnaBridge 189:f392fc9709a3 859 }
AnnaBridge 189:f392fc9709a3 860 }
AnnaBridge 189:f392fc9709a3 861 }
AnnaBridge 189:f392fc9709a3 862
AnnaBridge 189:f392fc9709a3 863 return accessAllowed;
AnnaBridge 189:f392fc9709a3 864 }
AnnaBridge 189:f392fc9709a3 865
AnnaBridge 189:f392fc9709a3 866 /******************************************************************************
AnnaBridge 189:f392fc9709a3 867 * Function Name: isAccessAllowedMPU
AnnaBridge 189:f392fc9709a3 868 ******************************************************************************
AnnaBridge 189:f392fc9709a3 869 * Summary:
AnnaBridge 189:f392fc9709a3 870 * The function checks whether a memory region is closed by MPU for a master
AnnaBridge 189:f392fc9709a3 871 *
AnnaBridge 189:f392fc9709a3 872 * Parameters:
AnnaBridge 189:f392fc9709a3 873 * uint32_t memStartAddr: memory address to be accessed by master
AnnaBridge 189:f392fc9709a3 874 * uint32_t memSize: memory size to be accessed by master
AnnaBridge 189:f392fc9709a3 875 * uint8_t privModeFlag: Priviliged or nonproviliged master
AnnaBridge 189:f392fc9709a3 876 * uint8_t nsecureFlag: Non-secure or secure master
AnnaBridge 189:f392fc9709a3 877 * cy_en_prot_perm_t accessType
AnnaBridge 189:f392fc9709a3 878 *
AnnaBridge 189:f392fc9709a3 879 * Return:
AnnaBridge 189:f392fc9709a3 880 * uint8_t accessAllowed (values: 0 (no) /1 (yes))
AnnaBridge 189:f392fc9709a3 881 *
AnnaBridge 189:f392fc9709a3 882 * Calls:
AnnaBridge 189:f392fc9709a3 883 * isProtRangeMatched
AnnaBridge 189:f392fc9709a3 884 *
AnnaBridge 189:f392fc9709a3 885 * Called by:
AnnaBridge 189:f392fc9709a3 886 * CheckMemoryProtection
AnnaBridge 189:f392fc9709a3 887 *
AnnaBridge 189:f392fc9709a3 888 * Note:
AnnaBridge 189:f392fc9709a3 889 *
AnnaBridge 189:f392fc9709a3 890 *
AnnaBridge 189:f392fc9709a3 891 *****************************************************************************/
AnnaBridge 189:f392fc9709a3 892 static uint8_t isAccessAllowedMPU(uint32_t memStartAddr, uint32_t memSize,
AnnaBridge 189:f392fc9709a3 893 uint8_t privModeFlag, uint8_t nsecureFlag, cy_en_prot_perm_t accessType)
AnnaBridge 189:f392fc9709a3 894 {
AnnaBridge 189:f392fc9709a3 895 uint8_t accessAllowed = 1;
AnnaBridge 189:f392fc9709a3 896 uint8_t i;
AnnaBridge 189:f392fc9709a3 897 uint32_t att, addr;
AnnaBridge 189:f392fc9709a3 898 uint32_t startAddrMPU;
AnnaBridge 189:f392fc9709a3 899 cy_en_prot_size_t log2RegionSizeMPU;
AnnaBridge 189:f392fc9709a3 900 uint8_t nonSecureFlagMPU, regionDisableMPU;
AnnaBridge 189:f392fc9709a3 901 cy_en_prot_perm_t permisionsMPU;
AnnaBridge 189:f392fc9709a3 902
AnnaBridge 189:f392fc9709a3 903 /* Matching process */
AnnaBridge 189:f392fc9709a3 904 /* MPU with higher index has higher priority */
AnnaBridge 189:f392fc9709a3 905 for (i = CPUSS_PROT_MPU_STRUCT_NR; i > 0; i--)
AnnaBridge 189:f392fc9709a3 906 {
AnnaBridge 189:f392fc9709a3 907 addr = PROT->CYMPU[1].MPU_STRUCT[i - 1].ADDR;
AnnaBridge 189:f392fc9709a3 908 att = PROT->CYMPU[1].MPU_STRUCT[i - 1].ATT;
AnnaBridge 189:f392fc9709a3 909 if (_FLD2VAL(PROT_MPU_MPU_STRUCT_ATT_ENABLED, att) > 0)
AnnaBridge 189:f392fc9709a3 910 {
AnnaBridge 189:f392fc9709a3 911 startAddrMPU = _FLD2VAL(PROT_MPU_MPU_STRUCT_ADDR_ADDR24, addr) << CY_PROT_ADDR_SHIFT;
AnnaBridge 189:f392fc9709a3 912 regionDisableMPU = _FLD2VAL(PROT_MPU_MPU_STRUCT_ADDR_SUBREGION_DISABLE, addr);
AnnaBridge 189:f392fc9709a3 913 log2RegionSizeMPU = _FLD2VAL(PROT_MPU_MPU_STRUCT_ATT_REGION_SIZE, att);
AnnaBridge 189:f392fc9709a3 914 if (isProtRangeMatched(memStartAddr, memSize, startAddrMPU, log2RegionSizeMPU, regionDisableMPU))
AnnaBridge 189:f392fc9709a3 915 {
AnnaBridge 189:f392fc9709a3 916 break;
AnnaBridge 189:f392fc9709a3 917 }
AnnaBridge 189:f392fc9709a3 918 }
AnnaBridge 189:f392fc9709a3 919 }
AnnaBridge 189:f392fc9709a3 920
AnnaBridge 189:f392fc9709a3 921 if (i > 0)
AnnaBridge 189:f392fc9709a3 922 {
AnnaBridge 189:f392fc9709a3 923 /* Evaluation process */
AnnaBridge 189:f392fc9709a3 924 nonSecureFlagMPU = _FLD2VAL(PROT_MPU_MPU_STRUCT_ATT_NS, att);
AnnaBridge 189:f392fc9709a3 925 if (privModeFlag)
AnnaBridge 189:f392fc9709a3 926 {
AnnaBridge 189:f392fc9709a3 927 permisionsMPU = ((att >> CY_PROT_ATT_PRIV_PERMISSION_SHIFT) & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 928 }
AnnaBridge 189:f392fc9709a3 929 else
AnnaBridge 189:f392fc9709a3 930 {
AnnaBridge 189:f392fc9709a3 931 permisionsMPU = (att & CY_PROT_ATT_PERMISSION_MASK);
AnnaBridge 189:f392fc9709a3 932 }
AnnaBridge 189:f392fc9709a3 933
AnnaBridge 189:f392fc9709a3 934 if (((!nonSecureFlagMPU) && nsecureFlag) ||
AnnaBridge 189:f392fc9709a3 935 ((accessType & permisionsMPU) != accessType))
AnnaBridge 189:f392fc9709a3 936 {
AnnaBridge 189:f392fc9709a3 937 accessAllowed = 0;
AnnaBridge 189:f392fc9709a3 938 }
AnnaBridge 189:f392fc9709a3 939 }
AnnaBridge 189:f392fc9709a3 940
AnnaBridge 189:f392fc9709a3 941 return accessAllowed;
AnnaBridge 189:f392fc9709a3 942 }
AnnaBridge 189:f392fc9709a3 943
AnnaBridge 189:f392fc9709a3 944 /******************************************************************************
AnnaBridge 189:f392fc9709a3 945 * Function Name: isMemoryAccessAllowed
AnnaBridge 189:f392fc9709a3 946 ******************************************************************************
AnnaBridge 189:f392fc9709a3 947 * Summary:
AnnaBridge 189:f392fc9709a3 948 * Checks if the given memory region is protected
AnnaBridge 189:f392fc9709a3 949 *
AnnaBridge 189:f392fc9709a3 950 * Parameters:
AnnaBridge 189:f392fc9709a3 951 * uint32_t memStartAddr: memory address to be accessed by master
AnnaBridge 189:f392fc9709a3 952 * uint32_t memSize: memory size to be accessed by master
AnnaBridge 189:f392fc9709a3 953 * uint8_t privModeFlag: Priviliged or nonproviliged master
AnnaBridge 189:f392fc9709a3 954 * uint8_t nsecureFlag: Non-secure or secure master
AnnaBridge 189:f392fc9709a3 955 * enum cy_en_prot_pc_t protectionCtx: Protection context of master
AnnaBridge 189:f392fc9709a3 956 * cy_en_prot_perm_t accessType
AnnaBridge 189:f392fc9709a3 957 *
AnnaBridge 189:f392fc9709a3 958 * Return:
AnnaBridge 189:f392fc9709a3 959 * uint8_t accessAllowed (values: 0 (no) /1 (yes))
AnnaBridge 189:f392fc9709a3 960 *
AnnaBridge 189:f392fc9709a3 961 * Calls:
AnnaBridge 189:f392fc9709a3 962 * CheckEnabledMPUProtection, isAccessAllowedSMPU
AnnaBridge 189:f392fc9709a3 963 *
AnnaBridge 189:f392fc9709a3 964 * Called by:
AnnaBridge 189:f392fc9709a3 965 * none
AnnaBridge 189:f392fc9709a3 966 *
AnnaBridge 189:f392fc9709a3 967 * Note:
AnnaBridge 189:f392fc9709a3 968 *
AnnaBridge 189:f392fc9709a3 969 *
AnnaBridge 189:f392fc9709a3 970 *****************************************************************************/
AnnaBridge 189:f392fc9709a3 971 uint8_t isMemoryAccessAllowed(uint32_t memStartAddr, uint32_t memSize,
AnnaBridge 189:f392fc9709a3 972 uint8_t privModeFlag, uint8_t nsecureFlag, enum cy_en_prot_pc_t protectionCtx, cy_en_prot_perm_t accessType)
AnnaBridge 189:f392fc9709a3 973 {
AnnaBridge 189:f392fc9709a3 974 uint8_t accessAllowed;
AnnaBridge 189:f392fc9709a3 975
AnnaBridge 189:f392fc9709a3 976 accessAllowed = isAccessAllowedMPU(memStartAddr, memSize, privModeFlag, nsecureFlag, accessType);
AnnaBridge 189:f392fc9709a3 977 if (accessAllowed)
AnnaBridge 189:f392fc9709a3 978 {
AnnaBridge 189:f392fc9709a3 979 accessAllowed = isAccessAllowedSMPU(memStartAddr, memSize, privModeFlag, nsecureFlag, protectionCtx, accessType);
AnnaBridge 189:f392fc9709a3 980 }
AnnaBridge 189:f392fc9709a3 981
AnnaBridge 189:f392fc9709a3 982 return accessAllowed;
AnnaBridge 189:f392fc9709a3 983 }