34static const char*
s_tag =
"MPU";
40typedef enum : uint8_t {
59typedef enum : uintptr_t {
63typedef enum : uint32_t {
70 return (value != 0U) && ((value & (value - 1U)) == 0U);
107 if ((r->
base & (uintptr_t)(r->
size - 1U)) != 0U) {
127 return base | sh | ap | xn;
134 const uint32_t limit_inclusive = (uint32_t)(r->
base + r->
size - 1U);
145 mpu->
RNR = (uint32_t)region;
154 mpu->
RNR = (uint32_t)region;
222 for (uint8_t i = cfg->
region_count; i < implemented; ++i) {
288typedef enum : uintptr_t {
304typedef enum : uint32_t {
384 "boot map must hold exactly k_ra8_mpu_boot_region_count regions");
387 "boot MRAM base must be 32-byte aligned");
390 "boot SRAM base must be 32-byte aligned");
393 "boot SDRAM base must be 32-byte aligned");
396 "boot peripheral base must be 32-byte aligned");
399 "boot shared-SRAM base must be 32-byte aligned");
404 "every boot region size must be a 32-byte multiple");
406 "boot shared-SRAM size must be at least the 32-byte region quantum");
410 if (out_count ==
nullptr) {
@ k_ra8_mpu_rlar_attridx_shift
RA8 MPU rlar attridx shift.
static const char * s_tag
Logging / check tag.
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.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
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)
const ra8_mpu_region_t * ra8_mpu_boot_map(uint8_t *out_count)
Return the canonical boot memory-attribute map region table.
static uint32_t internal_build_rbar(const ra8_mpu_region_t *r)
static void internal_clear_region(uint8_t region)
ra8_mpu_boot_size_t
Region byte sizes for the canonical boot map (base+size form).
@ k_ra8_mpu_boot_size_shram
640 KiB shared SRAM (!pow2).
@ k_ra8_mpu_boot_size_sram
1 MiB M85-private SRAM.
@ k_ra8_mpu_boot_size_sdram
64 MiB SDRAM.
@ k_ra8_mpu_boot_size_mram
1 MiB MRAM code.
@ k_ra8_mpu_boot_size_peri
128 MiB peripheral window.
ra8_mpu_boot_base_t
Region base addresses for the canonical boot map.
@ k_ra8_mpu_boot_base_shram
Shared M85<->M33 SRAM base.
@ k_ra8_mpu_boot_base_mram
MRAM code base.
@ k_ra8_mpu_boot_base_peri
Peripheral window base.
@ k_ra8_mpu_boot_base_sdram
External SDRAM base.
@ k_ra8_mpu_boot_base_sram
M85-private SRAM0+1 base.
static uint32_t internal_build_rlar(const ra8_mpu_region_t *r)
static uint8_t internal_dregion_count(void)
ra8_mpu_shcsr_addr_t
SCB->SHCSR address + bits needed to dispatch MemManage faults.
@ k_ra8_mpu_shcsr_addr
SCB->SHCSR (Armv8-M B3.2.10).
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.
static uint32_t internal_build_ctrl(const ra8_mpu_cfg_t *cfg)
ra8_err_t ra8_mpu_apply_boot_map(void)
Install the canonical 5-region boot memory-attribute map and enable the MPU.
static bool internal_is_pow2(uint32_t value)
static uint8_t internal_encode_ap(ra8_mpu_perm_t priv, ra8_mpu_perm_t unpriv)
ra8_err_t ra8_mpu_configure(const ra8_mpu_cfg_t *cfg)
Program every MPU region from a static configuration.
ra8_err_t ra8_mpu_enable(void)
Set MPU_CTRL.ENABLE.
@ k_ra8_mpu_shcsr_memfaultena
SHCSR.MEMFAULTENA bit.
static ra8_err_t internal_validate_region(const ra8_mpu_region_t *r)
static ra8_err_t internal_validate_cfg(const ra8_mpu_cfg_t *cfg)
ra8_err_t ra8_mpu_disable(void)
Clear MPU_CTRL.ENABLE.
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.
static void internal_write_mair(uint32_t mair0, uint32_t mair1)
bool ra8_mpu_is_enabled(void)
Report whether the core MPU is currently enabled.
static void internal_program_region(uint8_t region, const ra8_mpu_region_t *r)
ra8_mpu_ap_t
Encoded AP[1:0] values per the Cortex-M85 TRM.
@ k_ra8_mpu_ap_priv_rw_unpriv_none
00: priv RW, unpriv -.
@ k_ra8_mpu_ap_priv_rw_unpriv_rw
01: priv RW, unpriv RW.
@ k_ra8_mpu_ap_priv_ro_unpriv_none
10: priv RO, unpriv -.
@ k_ra8_mpu_ap_priv_ro_unpriv_ro
11: priv RO, unpriv RO.
@ k_ra8_mpu_ap_invalid
Sentinel: not encodable.
Cortex-M85 Memory Protection Unit (MPU) configuration helper.
ra8_mpu_perm_t
Per-world (priv / unpriv) access permission for an MPU region.
@ k_ra8_mpu_perm_none
No access at this privilege level.
@ k_ra8_mpu_perm_rw
Read-write at this privilege level.
@ k_ra8_mpu_perm_ro
Read-only at this privilege level.
@ k_ra8_mpu_boot_region_count
Regions in the canonical boot map.
@ k_ra8_mpu_min_region_size
Minimum power-of-two size in bytes.
@ k_ra8_mpu_attr_idx_1
MAIR0 byte 1.
@ k_ra8_mpu_attr_idx_0
MAIR0 byte 0.
@ k_ra8_mpu_attr_idx_2
MAIR0 byte 2.
@ k_ra8_mpu_boot_mair0
Boot MAIR0: WB/WA, non-cacheable, Device.
@ k_ra8_mpu_boot_mair1
Boot MAIR1: unused (no AttrIdx >= 4).
@ k_ra8_mpu_share_non
Non-shareable.
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.
uint8_t region_count
Entries in regions.
bool privdefena
MPU_CTRL.PRIVDEFENA = 1.
uint32_t mair1
Verbatim MPU_MAIR1 value.
bool hfnmiena
MPU_CTRL.HFNMIENA = 1.
uint32_t mair0
Verbatim MPU_MAIR0 value.
const ra8_mpu_region_t * regions
Region descriptor array.
Static descriptor for one Armv8-M MPU region.
ra8_mpu_perm_t priv
Privileged-mode permission.
bool executable
If true, instruction fetch allowed.
uintptr_t base
Region base address.
uint32_t size
Region size in bytes (power of two).
ra8_mpu_attr_idx_t attr_idx
MAIR slot index.
ra8_mpu_perm_t unpriv
Unprivileged-mode permission.
ra8_mpu_share_t shareable
SH[1:0] field.