20#include "region_defs.h"
23#define FLASH_SECURE_ATTRIBUTION_REGION_SIZE SPU_FLASH_REGION_SIZE
24#define SRAM_SECURE_ATTRIBUTION_REGION_SIZE SPU_SRAM_REGION_SIZE
26#define FLASH_SECURE_ATTRIBUTION_REGIONS_START_ID 0
27#define SRAM_SECURE_ATTRIBUTION_REGIONS_START_ID 64
29#define NUM_FLASH_SECURE_ATTRIBUTION_REGIONS \
30 (FLASH_TOTAL_SIZE / FLASH_SECURE_ATTRIBUTION_REGION_SIZE)
31#define NUM_SRAM_SECURE_ATTRIBUTION_REGIONS \
32 (TOTAL_RAM_SIZE / SRAM_SECURE_ATTRIBUTION_REGION_SIZE)
34#define DEVICE_FLASH_BASE_ADDRESS FLASH_BASE_ADDRESS
35#define DEVICE_SRAM_BASE_ADDRESS SRAM_BASE_ADDRESS
37static int arr_flash[NUM_FLASH_SECURE_ATTRIBUTION_REGIONS];
38static int arr_ram[NUM_FLASH_SECURE_ATTRIBUTION_REGIONS];
47#define FLASH_NSC_REGION_FROM_ADDR(addr) \
48 ((uint32_t)addr / FLASH_SECURE_ATTRIBUTION_REGION_SIZE)
53#define FLASH_NSC_SIZE_FROM_ADDR(addr) (FLASH_SECURE_ATTRIBUTION_REGION_SIZE - (((uint32_t)(addr)) % FLASH_SECURE_ATTRIBUTION_REGION_SIZE))
61#define FLASH_NSC_SIZE_REG(size) ((31 - __builtin_clz(size)) - 4)
64void spu_enable_interrupts(
void)
66 nrf_spu_int_enable(NRF_SPU,
67 NRF_SPU_INT_FLASHACCERR_MASK |
68 NRF_SPU_INT_RAMACCERR_MASK |
69 NRF_SPU_INT_PERIPHACCERR_MASK);
72void spu_clear_events(
void)
74 nrf_spu_event_clear(NRF_SPU, NRF_SPU_EVENT_RAMACCERR);
75 nrf_spu_event_clear(NRF_SPU, NRF_SPU_EVENT_FLASHACCERR);
76 nrf_spu_event_clear(NRF_SPU, NRF_SPU_EVENT_PERIPHACCERR);
79void spu_regions_reset_all_secure(
void)
81 for (
size_t i = 0; i < NUM_FLASH_SECURE_ATTRIBUTION_REGIONS ; i++) {
82 nrf_spu_flashregion_set(NRF_SPU, i,
84 NRF_SPU_MEM_PERM_READ | NRF_SPU_MEM_PERM_WRITE | NRF_SPU_MEM_PERM_EXECUTE,
89 for (
size_t i = 0; i < NUM_SRAM_SECURE_ATTRIBUTION_REGIONS ; i++) {
90 nrf_spu_ramregion_set(NRF_SPU, i,
92 NRF_SPU_MEM_PERM_READ | NRF_SPU_MEM_PERM_WRITE | NRF_SPU_MEM_PERM_EXECUTE,
98void spu_regions_flash_config_non_secure(uint32_t start_addr, uint32_t limit_addr)
102 (start_addr - DEVICE_FLASH_BASE_ADDRESS) /
103 FLASH_SECURE_ATTRIBUTION_REGION_SIZE;
105 (limit_addr - DEVICE_FLASH_BASE_ADDRESS) /
106 FLASH_SECURE_ATTRIBUTION_REGION_SIZE;
109 for (
size_t i = start_id; i <= last_id; i++) {
110 nrf_spu_flashregion_set(NRF_SPU, i,
112 NRF_SPU_MEM_PERM_READ | NRF_SPU_MEM_PERM_WRITE | NRF_SPU_MEM_PERM_EXECUTE,
118void spu_regions_flash_config_non_secure_callable(uint32_t start_addr,
121 uint32_t nsc_size = FLASH_NSC_SIZE_FROM_ADDR(start_addr);
125 FLASH_SECURE_ATTRIBUTION_REGION_SIZE) == 0);
131 NRFX_ASSERT((nsc_size >= 32) && (nsc_size <= 4096));
133 nrf_spu_flashnsc_set(NRF_SPU, 0,
134 FLASH_NSC_SIZE_REG(nsc_size),
135 FLASH_NSC_REGION_FROM_ADDR(start_addr),
139uint32_t spu_regions_flash_get_base_address_in_region(uint32_t region_id)
141 return FLASH_BASE_ADDRESS +
142 ((region_id - FLASH_SECURE_ATTRIBUTION_REGIONS_START_ID) *
143 FLASH_SECURE_ATTRIBUTION_REGION_SIZE);
146uint32_t spu_regions_flash_get_last_address_in_region(uint32_t region_id)
148 return FLASH_BASE_ADDRESS +
149 ((region_id - FLASH_SECURE_ATTRIBUTION_REGIONS_START_ID + 1) *
150 FLASH_SECURE_ATTRIBUTION_REGION_SIZE) - 1;
153uint32_t spu_regions_flash_get_start_id(
void) {
155 return FLASH_SECURE_ATTRIBUTION_REGIONS_START_ID;
158uint32_t spu_regions_flash_get_last_id(
void) {
160 return FLASH_SECURE_ATTRIBUTION_REGIONS_START_ID +
161 NUM_FLASH_SECURE_ATTRIBUTION_REGIONS - 1;
164uint32_t spu_regions_flash_get_region_size(
void) {
166 return FLASH_SECURE_ATTRIBUTION_REGION_SIZE;
169void spu_regions_sram_config_non_secure(uint32_t start_addr, uint32_t limit_addr)
173 (start_addr - DEVICE_SRAM_BASE_ADDRESS) /
174 SRAM_SECURE_ATTRIBUTION_REGION_SIZE;
176 (limit_addr - DEVICE_SRAM_BASE_ADDRESS) /
177 SRAM_SECURE_ATTRIBUTION_REGION_SIZE;
180 for (
size_t i = start_id; i <= last_id; i++)
182 nrf_spu_ramregion_set(NRF_SPU, i,
184 NRF_SPU_MEM_PERM_READ | NRF_SPU_MEM_PERM_WRITE | NRF_SPU_MEM_PERM_EXECUTE,
190uint32_t spu_regions_sram_get_base_address_in_region(uint32_t region_id)
192 return SRAM_BASE_ADDRESS +
193 ((region_id - SRAM_SECURE_ATTRIBUTION_REGIONS_START_ID) *
194 SRAM_SECURE_ATTRIBUTION_REGION_SIZE);
197uint32_t spu_regions_sram_get_last_address_in_region(uint32_t region_id)
199 return SRAM_BASE_ADDRESS +
200 ((region_id - SRAM_SECURE_ATTRIBUTION_REGIONS_START_ID + 1) *
201 SRAM_SECURE_ATTRIBUTION_REGION_SIZE) - 1;
204uint32_t spu_regions_sram_get_start_id(
void) {
206 return SRAM_SECURE_ATTRIBUTION_REGIONS_START_ID;
209uint32_t spu_regions_sram_get_last_id(
void) {
211 return SRAM_SECURE_ATTRIBUTION_REGIONS_START_ID +
212 NUM_SRAM_SECURE_ATTRIBUTION_REGIONS - 1;
215uint32_t spu_regions_sram_get_region_size(
void) {
217 return SRAM_SECURE_ATTRIBUTION_REGION_SIZE;
220void spu_peripheral_config_secure(uint32_t periph_base_addr,
bool periph_lock)
223 const uint8_t periph_id = NRFX_PERIPHERAL_ID_GET(periph_base_addr);
227 SPU_PERIPHID_PERM_SECUREMAPPING_Msk) !=
228 (SPU_PERIPHID_PERM_SECUREMAPPING_NonSecure << SPU_PERIPHID_PERM_SECUREMAPPING_Pos));
230 nrf_spu_peripheral_set(NRF_SPU, periph_id,
236void spu_peripheral_config_non_secure(uint32_t periph_base_addr,
bool periph_lock)
239 const uint8_t periph_id = NRFX_PERIPHERAL_ID_GET(periph_base_addr);
243 SPU_PERIPHID_PERM_SECUREMAPPING_Msk) !=
244 (SPU_PERIPHID_PERM_SECUREMAPPING_Secure << SPU_PERIPHID_PERM_SECUREMAPPING_Pos));
246 nrf_spu_peripheral_set(NRF_SPU, periph_id,
#define NRFX_ASSERT(expression)
Macro for placing a runtime assertion.