ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_mpu.c
Go to the documentation of this file.
1
22
23#include "ra8_mpu.h"
24
25#include <stddef.h>
26#include <stdint.h>
27
28#include "ra8_attributes.h"
29#include "ra8_check.h"
30#include "ra8_err.h"
31#include "ra8_hw_intrinsics.h"
32#include "ra8_mpu_regs.h"
33
34static const char* s_tag = "MPU";
35
47
59typedef enum : uintptr_t {
60 k_ra8_mpu_shcsr_addr = 0xE000ED24U,
62
63typedef enum : uint32_t {
66
67/* Test whether `value` is a positive power of two -- see implementation for details. */
68RA8_INTERNAL static inline bool internal_is_pow2(uint32_t value)
69{
70 return (value != 0U) && ((value & (value - 1U)) == 0U);
71}
72
73/* Map a (priv, unpriv) permission pair onto the Armv8-M AP code -- see implementation for details. */
75{
76 /* Arm Cortex-M85 TRM "MPU_RBAR" -- AP[1:0] table. */
77 if (priv == k_ra8_mpu_perm_rw && unpriv == k_ra8_mpu_perm_none) {
79 }
80 if (priv == k_ra8_mpu_perm_rw && unpriv == k_ra8_mpu_perm_rw) {
81 return (uint8_t)k_ra8_mpu_ap_priv_rw_unpriv_rw;
82 }
83 if (priv == k_ra8_mpu_perm_ro && unpriv == k_ra8_mpu_perm_none) {
85 }
86 if (priv == k_ra8_mpu_perm_ro && unpriv == k_ra8_mpu_perm_ro) {
87 return (uint8_t)k_ra8_mpu_ap_priv_ro_unpriv_ro;
88 }
89 return (uint8_t)k_ra8_mpu_ap_invalid;
90}
91
92/* Read the implemented region count from `MPU_TYPE -- see implementation for details. */
94{
95 /* Arm Cortex-M85 TRM "MPU_TYPE": DREGION lives in bits 15:8. */
96 const uint32_t type = ra8_mpu_regs()->TYPE;
97 return (uint8_t)((type & (uint32_t)k_ra8_mpu_type_dregion_mask) >>
99}
100
101/* Validate a single region descriptor -- see implementation for details. */
103{
104 if (!internal_is_pow2(r->size) || r->size < (uint32_t)k_ra8_mpu_min_region_size) {
106 }
107 if ((r->base & (uintptr_t)(r->size - 1U)) != 0U) {
109 }
110 if (internal_encode_ap(r->priv, r->unpriv) == (uint8_t)k_ra8_mpu_ap_invalid) {
112 }
113 return k_ra8_ok;
114}
115
116/* Build the MPU_RBAR value for a region descriptor -- see implementation for details. */
118{
119 /* Arm Cortex-M85 TRM "MPU_RBAR": BASE[31:5] | SH[4:3] | AP[2:1] | XN[0]. */
120 const uint32_t base = (uint32_t)r->base & (uint32_t)k_ra8_mpu_rbar_base_mask;
121 const uint32_t ap =
122 ((uint32_t)internal_encode_ap(r->priv, r->unpriv) << (uint32_t)k_ra8_mpu_rbar_ap_shift) &
123 (uint32_t)k_ra8_mpu_rbar_ap_mask;
124 const uint32_t sh = ((uint32_t)r->shareable << (uint32_t)k_ra8_mpu_rbar_sh_shift) &
125 (uint32_t)k_ra8_mpu_rbar_sh_mask;
126 const uint32_t xn = r->executable ? 0U : (uint32_t)k_ra8_mpu_rbar_xn_mask;
127 return base | sh | ap | xn;
128}
129
130/* Build the MPU_RLAR value for a region descriptor -- see implementation for details. */
132{
133 /* Arm Cortex-M85 TRM "MPU_RLAR": LIMIT[31:5] | AttrIndx[3:1] | EN[0]. */
134 const uint32_t limit_inclusive = (uint32_t)(r->base + r->size - 1U);
135 const uint32_t limit = limit_inclusive & (uint32_t)k_ra8_mpu_rlar_limit_mask;
136 const uint32_t idx = ((uint32_t)r->attr_idx << (uint32_t)k_ra8_mpu_rlar_attridx_shift) &
138 return limit | idx | (uint32_t)k_ra8_mpu_rlar_en_mask;
139}
140
141/* Write a single region's RBAR/RLAR pair via MPU_RNR selection -- see implementation for details. */
142RA8_INTERNAL static void internal_program_region(uint8_t region, const ra8_mpu_region_t* r)
143{
144 volatile r_mpu_regs_t* mpu = ra8_mpu_regs();
145 mpu->RNR = (uint32_t)region;
146 mpu->RBAR = internal_build_rbar(r);
147 mpu->RLAR = internal_build_rlar(r);
148}
149
150/* Disable a single region by clearing RLAR -- see implementation for details. */
151RA8_INTERNAL static void internal_clear_region(uint8_t region)
152{
153 volatile r_mpu_regs_t* mpu = ra8_mpu_regs();
154 mpu->RNR = (uint32_t)region;
155 mpu->RLAR = 0U;
156}
157
158/* Sole writer of MPU_CTRL for wholesale (re)configuration -- see implementation for details. */
159RA8_INTERNAL static void internal_write_ctrl(uint32_t ctrl)
160{
161 /* Arm Cortex-M85 TRM "MPU_CTRL": ENABLE[0] | HFNMIENA[1] | PRIVDEFENA[2]. */
162 ra8_mpu_regs()->CTRL = ctrl;
163}
164
165/* Write the MAIR0/MAIR1 attribute-indirection pair -- see implementation for details. */
166RA8_INTERNAL static void internal_write_mair(uint32_t mair0, uint32_t mair1)
167{
168 volatile r_mpu_regs_t* mpu = ra8_mpu_regs();
169 /* Arm Cortex-M85 TRM "MPU_MAIR0 / MPU_MAIR1": attribute-indirection bytes. */
170 mpu->MAIR0 = mair0;
171 mpu->MAIR1 = mair1;
172}
173
174/* Build the MPU_CTRL value from the static config -- see implementation for details. */
176{
177 uint32_t ctrl = (uint32_t)k_ra8_mpu_ctrl_enable;
178 if (cfg->privdefena) {
179 ctrl |= (uint32_t)k_ra8_mpu_ctrl_privdefena;
180 }
181 if (cfg->hfnmiena) {
182 ctrl |= (uint32_t)k_ra8_mpu_ctrl_hfnmiena;
183 }
184 return ctrl;
185}
186
187/* Validate the whole config block before any register write -- see implementation for details. */
189{
190 const uint8_t implemented = internal_dregion_count();
191 if (cfg->region_count > implemented) {
193 }
194 if (cfg->region_count > 0U && cfg->regions == nullptr) {
195 return k_ra8_err_null_ptr;
196 }
197 for (uint8_t i = 0U; i < cfg->region_count; ++i) {
198 const ra8_err_t err = internal_validate_region(&cfg->regions[i]);
199 if (err != k_ra8_ok) {
200 return err;
201 }
202 }
203 return k_ra8_ok;
204}
205
207{
208 RA8_CHECK_NULL_PTR(cfg, s_tag, "cfg must not be nullptr");
209 const ra8_err_t verr = internal_validate_cfg(cfg);
210 if (verr != k_ra8_ok) {
211 return verr;
212 }
213
214 /* Arm Cortex-M85 TRM "MPU_CTRL": disable before reprogramming. */
216 internal_write_mair(cfg->mair0, cfg->mair1);
217
218 for (uint8_t i = 0U; i < cfg->region_count; ++i) {
219 internal_program_region(i, &cfg->regions[i]);
220 }
221 const uint8_t implemented = internal_dregion_count();
222 for (uint8_t i = cfg->region_count; i < implemented; ++i) {
224 }
226
227 /* Enable MemManage fault dispatch via SHCSR.MEMFAULTENA (bit 16).
228 * Without this bit, every MPU permission violation silently escalates
229 * to HardFault -- the strong MemManage_Handler the application
230 * installed never runs. Armv8-M ARM "B3.2.10 SHCSR, System Handler
231 * Control and State Register" + Cortex-M85 TRM SCB+0x24. The MPU is
232 * useless as a runtime safety mechanism without this enable; making
233 * it the default of ra8_mpu_configure means every consumer gets
234 * working MemFault delivery without having to know about the
235 * separate SHCSR concern. Callers that genuinely want
236 * MemFault->HardFault escalation can clear SHCSR.MEMFAULTENA
237 * themselves after the configure call. */
238 volatile uint32_t* shcsr = (volatile uint32_t*)k_ra8_mpu_shcsr_addr;
239 *shcsr |= (uint32_t)k_ra8_mpu_shcsr_memfaultena;
240 return k_ra8_ok;
241}
242
244{
245 volatile r_mpu_regs_t* mpu = ra8_mpu_regs();
246 /* Arm Cortex-M85 TRM "MPU_CTRL.ENABLE" -- bit 0. */
247 mpu->CTRL = mpu->CTRL | (uint32_t)k_ra8_mpu_ctrl_enable;
248 return k_ra8_ok;
249}
250
252{
253 volatile r_mpu_regs_t* mpu = ra8_mpu_regs();
254 /* Arm Cortex-M85 TRM "MPU_CTRL.ENABLE" -- bit 0. */
255 mpu->CTRL = mpu->CTRL & ~(uint32_t)k_ra8_mpu_ctrl_enable;
256 return k_ra8_ok;
257}
258
259ra8_err_t ra8_mpu_set_region(uint8_t region, const ra8_mpu_region_t* region_cfg)
260{
261 RA8_CHECK_NULL_PTR(region_cfg, s_tag, "region_cfg must not be nullptr");
262 if (region >= internal_dregion_count()) {
264 }
265 const ra8_err_t verr = internal_validate_region(region_cfg);
266 if (verr != k_ra8_ok) {
267 return verr;
268 }
269 internal_program_region(region, region_cfg);
270 return k_ra8_ok;
271}
272
273/* =============================================================================
274 * Canonical boot memory-attribute map (issue #576)
275 * =============================================================================
276 * The fixed 5-region map every RA8D2 image needs out of reset. This is the one
277 * source of truth the reset path routes through instead of the raw
278 * MAIR/RBAR/RLAR/CTRL pokes each app's system_init.c used to duplicate.
279 */
280
288typedef enum : uintptr_t {
295
304typedef enum : uint32_t {
311
326 /* 0: MRAM code -- RO + executable, Normal inner/outer WB/WA cacheable. */
327 {
328 .base = (uintptr_t)k_ra8_mpu_boot_base_mram,
329 .size = (uint32_t)k_ra8_mpu_boot_size_mram,
330 .priv = k_ra8_mpu_perm_ro,
331 .unpriv = k_ra8_mpu_perm_ro,
332 .executable = true,
333 .shareable = k_ra8_mpu_share_non,
334 .attr_idx = k_ra8_mpu_attr_idx_0,
335 },
336 /* 1: M85-private SRAM0+1 -- RW/XN, Normal WB/WA cacheable. */
337 {
338 .base = (uintptr_t)k_ra8_mpu_boot_base_sram,
339 .size = (uint32_t)k_ra8_mpu_boot_size_sram,
340 .priv = k_ra8_mpu_perm_rw,
341 .unpriv = k_ra8_mpu_perm_rw,
342 .executable = false,
343 .shareable = k_ra8_mpu_share_non,
344 .attr_idx = k_ra8_mpu_attr_idx_0,
345 },
346 /* 2: External SDRAM -- RW/XN, Normal WB/WA cacheable. */
347 {
348 .base = (uintptr_t)k_ra8_mpu_boot_base_sdram,
349 .size = (uint32_t)k_ra8_mpu_boot_size_sdram,
350 .priv = k_ra8_mpu_perm_rw,
351 .unpriv = k_ra8_mpu_perm_rw,
352 .executable = false,
353 .shareable = k_ra8_mpu_share_non,
354 .attr_idx = k_ra8_mpu_attr_idx_0,
355 },
356 /* 3: Peripheral window -- RW/XN, Device-nGnRE (AttrIdx 2). */
357 {
358 .base = (uintptr_t)k_ra8_mpu_boot_base_peri,
359 .size = (uint32_t)k_ra8_mpu_boot_size_peri,
360 .priv = k_ra8_mpu_perm_rw,
361 .unpriv = k_ra8_mpu_perm_rw,
362 .executable = false,
363 .shareable = k_ra8_mpu_share_non,
364 .attr_idx = k_ra8_mpu_attr_idx_2,
365 },
366 /* 4: Shared M85<->M33 SRAM2+3 (640 KiB) -- RW/XN, Normal non-cacheable
367 (AttrIdx 1) so the mailbox + CPU1 RAM stay coherent across cores. */
368 {
369 .base = (uintptr_t)k_ra8_mpu_boot_base_shram,
370 .size = (uint32_t)k_ra8_mpu_boot_size_shram,
371 .priv = k_ra8_mpu_perm_rw,
372 .unpriv = k_ra8_mpu_perm_rw,
373 .executable = false,
374 .shareable = k_ra8_mpu_share_non,
375 .attr_idx = k_ra8_mpu_attr_idx_1,
376 },
377};
378
379/* The boot map must be 5 regions, every base 32-byte aligned and every size a
380 non-zero 32-byte multiple -- the Armv8-M RBAR/RLAR granularity. Region 4 is
381 intentionally 640 KiB (not a power of two). */
382static_assert((sizeof(s_ra8_mpu_boot_regions) / sizeof(s_ra8_mpu_boot_regions[0])) ==
384 "boot map must hold exactly k_ra8_mpu_boot_region_count regions");
385static_assert(((uint32_t)k_ra8_mpu_boot_base_mram & ((uint32_t)k_ra8_mpu_min_region_size - 1U)) ==
386 0U,
387 "boot MRAM base must be 32-byte aligned");
388static_assert(((uint32_t)k_ra8_mpu_boot_base_sram & ((uint32_t)k_ra8_mpu_min_region_size - 1U)) ==
389 0U,
390 "boot SRAM base must be 32-byte aligned");
391static_assert(((uint32_t)k_ra8_mpu_boot_base_sdram & ((uint32_t)k_ra8_mpu_min_region_size - 1U)) ==
392 0U,
393 "boot SDRAM base must be 32-byte aligned");
394static_assert(((uint32_t)k_ra8_mpu_boot_base_peri & ((uint32_t)k_ra8_mpu_min_region_size - 1U)) ==
395 0U,
396 "boot peripheral base must be 32-byte aligned");
397static_assert(((uint32_t)k_ra8_mpu_boot_base_shram & ((uint32_t)k_ra8_mpu_min_region_size - 1U)) ==
398 0U,
399 "boot shared-SRAM base must be 32-byte aligned");
400static_assert((((uint32_t)k_ra8_mpu_boot_size_mram | (uint32_t)k_ra8_mpu_boot_size_sram |
402 (uint32_t)k_ra8_mpu_boot_size_shram) &
403 ((uint32_t)k_ra8_mpu_min_region_size - 1U)) == 0U,
404 "every boot region size must be a 32-byte multiple");
405static_assert((uint32_t)k_ra8_mpu_boot_size_shram >= (uint32_t)k_ra8_mpu_min_region_size,
406 "boot shared-SRAM size must be at least the 32-byte region quantum");
407
408const ra8_mpu_region_t* ra8_mpu_boot_map(uint8_t* out_count)
409{
410 if (out_count == nullptr) {
411 return nullptr;
412 }
413 *out_count = (uint8_t)k_ra8_mpu_boot_region_count;
415}
416
418{
419 /* Precondition: the silicon must implement at least the map's region count.
420 On the RA8D2 M85 (16 regions) this always holds; the guard keeps the boot
421 path from installing a truncated, half-covered map on an unexpected part. */
422 const uint8_t implemented = internal_dregion_count();
423 if (implemented < (uint8_t)k_ra8_mpu_boot_region_count) {
425 }
426
427 /* Arm Cortex-M85 TRM "MPU_CTRL": disable before reprogramming. */
430
431 /* Clear any stale high-index regions FIRST, then install the map, so an
432 aborted reprogram never leaves a stale enabled region beside the new map,
433 and the last register write reflects the highest map region. */
434 for (uint8_t i = (uint8_t)k_ra8_mpu_boot_region_count; i < implemented; ++i) {
436 }
437 for (uint8_t i = 0U; i < (uint8_t)k_ra8_mpu_boot_region_count; ++i) {
439 }
440
441 /* Retire the region writes, enable the MPU with PRIVDEFENA, then flush the
442 pipeline so the very next access sees the new attribute map. */
443 ra8_hw_dsb();
445 ra8_hw_dsb();
446 ra8_hw_isb();
447 return k_ra8_ok;
448}
449
451{
452 /* Arm Cortex-M85 TRM "MPU_CTRL.ENABLE" -- bit 0. */
453 return (ra8_mpu_regs()->CTRL & (uint32_t)k_ra8_mpu_ctrl_enable) != 0U;
454}
@ k_ra8_mpu_rlar_attridx_shift
RA8 MPU rlar attridx shift.
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
Definition ra8_err.h:478
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Shared CPU-intrinsic seam for the HAL drivers (host/target split).
static void ra8_hw_dsb(void)
Data Synchronisation Barrier (full system).
static void ra8_hw_isb(void)
Instruction Synchronisation Barrier (full system).
static void internal_write_ctrl(uint32_t ctrl)
Definition ra8_mpu.c:159
const ra8_mpu_region_t * ra8_mpu_boot_map(uint8_t *out_count)
Return the canonical boot memory-attribute map region table.
Definition ra8_mpu.c:408
static uint32_t internal_build_rbar(const ra8_mpu_region_t *r)
Definition ra8_mpu.c:117
static void internal_clear_region(uint8_t region)
Definition ra8_mpu.c:151
ra8_mpu_boot_size_t
Region byte sizes for the canonical boot map (base+size form).
Definition ra8_mpu.c:304
@ k_ra8_mpu_boot_size_shram
640 KiB shared SRAM (!pow2).
Definition ra8_mpu.c:309
@ k_ra8_mpu_boot_size_sram
1 MiB M85-private SRAM.
Definition ra8_mpu.c:306
@ k_ra8_mpu_boot_size_sdram
64 MiB SDRAM.
Definition ra8_mpu.c:307
@ k_ra8_mpu_boot_size_mram
1 MiB MRAM code.
Definition ra8_mpu.c:305
@ k_ra8_mpu_boot_size_peri
128 MiB peripheral window.
Definition ra8_mpu.c:308
ra8_mpu_boot_base_t
Region base addresses for the canonical boot map.
Definition ra8_mpu.c:288
@ k_ra8_mpu_boot_base_shram
Shared M85<->M33 SRAM base.
Definition ra8_mpu.c:293
@ k_ra8_mpu_boot_base_mram
MRAM code base.
Definition ra8_mpu.c:289
@ k_ra8_mpu_boot_base_peri
Peripheral window base.
Definition ra8_mpu.c:292
@ k_ra8_mpu_boot_base_sdram
External SDRAM base.
Definition ra8_mpu.c:291
@ k_ra8_mpu_boot_base_sram
M85-private SRAM0+1 base.
Definition ra8_mpu.c:290
static uint32_t internal_build_rlar(const ra8_mpu_region_t *r)
Definition ra8_mpu.c:131
static uint8_t internal_dregion_count(void)
Definition ra8_mpu.c:93
ra8_mpu_shcsr_addr_t
SCB->SHCSR address + bits needed to dispatch MemManage faults.
Definition ra8_mpu.c:59
@ k_ra8_mpu_shcsr_addr
SCB->SHCSR (Armv8-M B3.2.10).
Definition ra8_mpu.c:60
static const ra8_mpu_region_t s_ra8_mpu_boot_regions[k_ra8_mpu_boot_region_count]
The canonical 5-region boot memory-attribute map.
Definition ra8_mpu.c:325
static uint32_t internal_build_ctrl(const ra8_mpu_cfg_t *cfg)
Definition ra8_mpu.c:175
ra8_err_t ra8_mpu_apply_boot_map(void)
Install the canonical 5-region boot memory-attribute map and enable the MPU.
Definition ra8_mpu.c:417
static bool internal_is_pow2(uint32_t value)
Definition ra8_mpu.c:68
static uint8_t internal_encode_ap(ra8_mpu_perm_t priv, ra8_mpu_perm_t unpriv)
Definition ra8_mpu.c:74
ra8_err_t ra8_mpu_configure(const ra8_mpu_cfg_t *cfg)
Program every MPU region from a static configuration.
Definition ra8_mpu.c:206
ra8_err_t ra8_mpu_enable(void)
Set MPU_CTRL.ENABLE.
Definition ra8_mpu.c:243
ra8_mpu_shcsr_bits_t
Definition ra8_mpu.c:63
@ k_ra8_mpu_shcsr_memfaultena
SHCSR.MEMFAULTENA bit.
Definition ra8_mpu.c:64
static ra8_err_t internal_validate_region(const ra8_mpu_region_t *r)
Definition ra8_mpu.c:102
static ra8_err_t internal_validate_cfg(const ra8_mpu_cfg_t *cfg)
Definition ra8_mpu.c:188
ra8_err_t ra8_mpu_disable(void)
Clear MPU_CTRL.ENABLE.
Definition ra8_mpu.c:251
ra8_err_t ra8_mpu_set_region(uint8_t region, const ra8_mpu_region_t *region_cfg)
Program a single region without disabling the MPU.
Definition ra8_mpu.c:259
static void internal_write_mair(uint32_t mair0, uint32_t mair1)
Definition ra8_mpu.c:166
bool ra8_mpu_is_enabled(void)
Report whether the core MPU is currently enabled.
Definition ra8_mpu.c:450
static void internal_program_region(uint8_t region, const ra8_mpu_region_t *r)
Definition ra8_mpu.c:142
ra8_mpu_ap_t
Encoded AP[1:0] values per the Cortex-M85 TRM.
Definition ra8_mpu.c:40
@ k_ra8_mpu_ap_priv_rw_unpriv_none
00: priv RW, unpriv -.
Definition ra8_mpu.c:41
@ k_ra8_mpu_ap_priv_rw_unpriv_rw
01: priv RW, unpriv RW.
Definition ra8_mpu.c:42
@ k_ra8_mpu_ap_priv_ro_unpriv_none
10: priv RO, unpriv -.
Definition ra8_mpu.c:43
@ k_ra8_mpu_ap_priv_ro_unpriv_ro
11: priv RO, unpriv RO.
Definition ra8_mpu.c:44
@ k_ra8_mpu_ap_invalid
Sentinel: not encodable.
Definition ra8_mpu.c:45
Cortex-M85 Memory Protection Unit (MPU) configuration helper.
ra8_mpu_perm_t
Per-world (priv / unpriv) access permission for an MPU region.
Definition ra8_mpu.h:41
@ k_ra8_mpu_perm_none
No access at this privilege level.
Definition ra8_mpu.h:42
@ k_ra8_mpu_perm_rw
Read-write at this privilege level.
Definition ra8_mpu.h:44
@ k_ra8_mpu_perm_ro
Read-only at this privilege level.
Definition ra8_mpu.h:43
@ k_ra8_mpu_boot_region_count
Regions in the canonical boot map.
Definition ra8_mpu.h:96
@ k_ra8_mpu_min_region_size
Minimum power-of-two size in bytes.
Definition ra8_mpu.h:83
@ k_ra8_mpu_attr_idx_1
MAIR0 byte 1.
Definition ra8_mpu.h:67
@ k_ra8_mpu_attr_idx_0
MAIR0 byte 0.
Definition ra8_mpu.h:66
@ k_ra8_mpu_attr_idx_2
MAIR0 byte 2.
Definition ra8_mpu.h:68
@ k_ra8_mpu_boot_mair0
Boot MAIR0: WB/WA, non-cacheable, Device.
Definition ra8_mpu.h:114
@ k_ra8_mpu_boot_mair1
Boot MAIR1: unused (no AttrIdx >= 4).
Definition ra8_mpu.h:115
@ k_ra8_mpu_share_non
Non-shareable.
Definition ra8_mpu.h:54
Memory Protection Unit register layout for the Renesas RA8D2.
@ k_ra8_mpu_rbar_ap_mask
RA8 MPU rbar ap mask.
@ k_ra8_mpu_rbar_base_mask
RA8 MPU rbar base mask.
@ k_ra8_mpu_rbar_sh_mask
RA8 MPU rbar sh mask.
@ k_ra8_mpu_rbar_xn_mask
RA8 MPU rbar xn mask.
@ k_ra8_mpu_rbar_sh_shift
RA8 MPU rbar sh shift.
@ k_ra8_mpu_rbar_ap_shift
RA8 MPU rbar ap shift.
@ k_ra8_mpu_ctrl_enable
RA8 MPU control enable.
@ k_ra8_mpu_ctrl_hfnmiena
RA8 MPU control hfnmiena.
@ k_ra8_mpu_ctrl_privdefena
RA8 MPU control privdefena.
static volatile r_mpu_regs_t * ra8_mpu_regs(void)
Accessor for the architectural Cortex-M85 MPU register block.
@ k_ra8_mpu_rlar_limit_mask
RA8 MPU rlar limit mask.
@ k_ra8_mpu_rlar_en_mask
RA8 MPU rlar en mask.
@ k_ra8_mpu_rlar_attridx_mask
RA8 MPU rlar attridx mask.
@ k_ra8_mpu_type_dregion_shift
RA8 MPU type dregion shift.
@ k_ra8_mpu_type_dregion_mask
RA8 MPU type dregion mask.
Architectural Cortex-M85 MPU register block.
volatile uint32_t RBAR
RBAR register.
volatile uint32_t MAIR0
MAIR0 register.
volatile uint32_t RNR
RNR register.
volatile uint32_t MAIR1
MAIR1 register.
volatile uint32_t RLAR
RLAR register.
volatile uint32_t TYPE
TYPE register.
volatile uint32_t CTRL
CTRL register.
Whole-MPU static configuration block.
Definition ra8_mpu.h:150
uint8_t region_count
Entries in regions.
Definition ra8_mpu.h:152
bool privdefena
MPU_CTRL.PRIVDEFENA = 1.
Definition ra8_mpu.h:155
uint32_t mair1
Verbatim MPU_MAIR1 value.
Definition ra8_mpu.h:154
bool hfnmiena
MPU_CTRL.HFNMIENA = 1.
Definition ra8_mpu.h:156
uint32_t mair0
Verbatim MPU_MAIR0 value.
Definition ra8_mpu.h:153
const ra8_mpu_region_t * regions
Region descriptor array.
Definition ra8_mpu.h:151
Static descriptor for one Armv8-M MPU region.
Definition ra8_mpu.h:130
ra8_mpu_perm_t priv
Privileged-mode permission.
Definition ra8_mpu.h:133
bool executable
If true, instruction fetch allowed.
Definition ra8_mpu.h:135
uintptr_t base
Region base address.
Definition ra8_mpu.h:131
uint32_t size
Region size in bytes (power of two).
Definition ra8_mpu.h:132
ra8_mpu_attr_idx_t attr_idx
MAIR slot index.
Definition ra8_mpu.h:137
ra8_mpu_perm_t unpriv
Unprivileged-mode permission.
Definition ra8_mpu.h:134
ra8_mpu_share_t shareable
SH[1:0] field.
Definition ra8_mpu.h:136