49#include "ra8_boot_intrinsics.h"
51#include "trustzone_init.h"
60typedef enum : uintptr_t {
122 k_ra8_cpacr_cp10_cp11_full_access = 0x00F00000UL,
125 cpacr |= k_ra8_cpacr_cp10_cp11_full_access;
145 k_ra8_fpccr_lspen = 1UL << 30,
146 k_ra8_fpccr_aspen = 1UL << 31,
149 fpccr |= k_ra8_fpccr_lspen | k_ra8_fpccr_aspen;
172 enum : uint32_t { k_ra8_ccr_ic = 1UL << 17 };
204 enum : uint32_t { k_ra8_ccr_dc = 1UL << 16 };
225 enum : uint32_t { k_ra8_ccr_bp = 1UL << 18 };
276 k_ra8_shcsr_memfaultena = 1UL << 16,
277 k_ra8_shcsr_busfaultena = 1UL << 17,
278 k_ra8_shcsr_usgfaultena = 1UL << 18,
279 k_ra8_shcsr_securefaultena = 1UL << 19,
282 shcsr |= k_ra8_shcsr_memfaultena | k_ra8_shcsr_busfaultena | k_ra8_shcsr_usgfaultena |
283 k_ra8_shcsr_securefaultena;
324 k_ra8_ccr_div_0_trp = 1UL << 4,
327 ccr |= k_ra8_ccr_div_0_trp;
347 k_ra8_aircr_vectkey = 0x05FA0000UL,
348 k_ra8_aircr_prigroup_4 = 0x00000300UL,
446 uint32_t limit_enable,
470 k_ra8_mair0_default = 0x000444FFUL,
534#ifdef RA8_BOOT_ENABLE_CACHE_MPU
541#ifdef RA8_BOOT_CACHE_VIA_HAL
static void internal_enable_fpu_lazy_stack(void)
Turn on FPU lazy stacking (FPCCR.LSPEN = 1, ASPEN = 1).
static void internal_enable_branch_predictor(void)
Enable branch-target prediction (CCR.BP on Cortex-M85).
static void internal_set_vtor(void)
Point VTOR at the physical vector table base.
static void internal_enable_dcache(void)
Invalidate and enable the Cortex-M85 D-cache.
static void internal_enable_icache(void)
Invalidate and enable the Cortex-M85 I-cache.
static void internal_mpu_init(void)
Programme and enable the Cortex-M85 core MPU.
void SystemInit(void)
Earliest C code the image runs: bring the core up before RAM init.
static void internal_mpu_set_region(uint32_t region, uint32_t base_attr, uint32_t limit_enable)
Program a single MPU region via RNR/RBAR/RLAR.
static void internal_set_priority_grouping(void)
Set NVIC priority grouping to 4 preempt bits / 0 sub-priority.
static void internal_enable_fpu(void)
Grant full access to CP10 / CP11 (the FPU coprocessors).
static void internal_enable_div0_trap(void)
Make integer divide-by-zero trap as a decoded UsageFault.
static void internal_enable_fault_handlers(void)
Enable the configurable-fault handlers so faults decode by class.
void ra8_trustzone_init(void)
Programme + enable the SAU per the partition.
@ k_ra8_mpu_rlar_attridx_shift
RA8 MPU rlar attridx shift.
@ k_ra8_mpu_attridx_normal_wbwa
MAIR0[0] 0xFF: Normal inner/outer WB/WA.
@ k_ra8_mpu_attridx_noncacheable
MAIR0[1] 0x44: Normal non-cacheable.
@ k_ra8_mpu_region_quantum
ARMv8-M PMSAv8 region granule, bytes.
@ k_ra8_mpu_attridx_device
MAIR0[2] 0x04: Device-nGnRE (MMIO).
static void internal_enable_branch_predictor(void)
Enable branch-target prediction (CCR.BP on Cortex-M85).
static void internal_enable_dcache(void)
Invalidate and enable the Cortex-M85 D-cache.
uint32_t g_ra8_ls_stack_top
static void internal_enable_icache(void)
Invalidate and enable the Cortex-M85 I-cache.
@ k_ra8_mpu_sdram_limit
RA8 MPU SDRAM limit.
@ k_ra8_mpu_mram_base
1 MiB MRAM code region.
@ k_ra8_mpu_sram_limit
RA8 MPU SRAM limit.
@ k_ra8_mpu_sram_base
M85 private SRAM0+1, 1 MiB, cacheable.
@ k_ra8_mpu_peri_base
Peripheral bus window base.
@ k_ra8_mpu_shram_base
Shared SRAM2+3: M33 mailbox + CPU1 RAM.
@ k_ra8_mpu_shram_limit
Non-cacheable -> M85<->M33 stays coherent.
@ k_ra8_mpu_mram_limit
RA8 MPU MRAM limit.
@ k_ra8_mpu_peri_limit
RA8 MPU peri limit.
@ k_ra8_mpu_sdram_base
64 MiB external SDRAM.
static void internal_mpu_init(void)
Programme and enable the Cortex-M85 core MPU.
@ k_ra8_rbar_attr_ro_x
AP=RO any-priv, SH=none, XN=0 (executable).
@ k_ra8_mpu_rlar_enable
RA8 MPU rlar enable.
@ k_ra8_rbar_attr_rw_xn
AP=RW any-priv, SH=none, XN=1 (no execute).
@ k_ra8_scb_iciallu
ICIALLU – invalidate I-cache.
@ k_ra8_scb_dcisw
D-cache Invalidate by Set/Way.
@ k_ra8_scb_csselr
Cache Size Selection Register.
@ k_ra8_scb_dciallu
DCIALLU – invalidate D-cache (sets only).
@ k_ra8_mpu_mair0_addr
MPU Attribute Indirection 0.
@ k_ra8_scb_ccsidr
Cache Size ID Register.
@ k_ra8_scb_cpacr_addr
Coprocessor Access Control.
@ k_ra8_scb_shcsr_addr
System Handler Control and State.
@ k_ra8_fpu_fpccr_addr
FPU Context Control Register.
@ k_ra8_scb_ccr_addr
Configuration and Control Register.
@ k_ra8_mpu_type_addr
MPU Type Register.
@ k_ra8_mpu_rnr_addr
MPU Region Number.
@ k_ra8_mpu_rbar_addr
MPU Region Base Address.
@ k_ra8_mpu_mair1_addr
MPU Attribute Indirection 1.
@ k_ra8_mpu_ctrl_addr
MPU Control Register.
@ k_ra8_scb_vtor_addr
Vector Table Offset Register.
@ k_ra8_scb_nsacr_addr
Non-secure Access Control.
@ k_ra8_mpu_rlar_addr
MPU Region Limit Address.
@ k_ra8_nvic_aircr
Application Interrupt and Reset Ctrl.
const uint32_t g_ra8_vector_table_start[]
static uint32_t ra8_boot_read32(uintptr_t addr)
Volatile 32-bit MMIO read.
static void ra8_boot_write32(uintptr_t addr, uint32_t value)
Volatile 32-bit MMIO write.
static void ra8_boot_isb(void)
Instruction synchronisation barrier (no-op under RA8_OFF_TARGET).
static void ra8_boot_disable_irq(void)
Mask IRQs / set PRIMASK (no-op under RA8_OFF_TARGET).
static void ra8_boot_dsb(void)
Data synchronisation barrier (no-op under RA8_OFF_TARGET).
Where the EK-RA8D2's Cortex-M85 and Cortex-M33 meet, stated once.
@ k_ra8_board_cpu1_sram_size_bytes
64 KiB CPU1 private bank.
@ k_ra8_board_cpu1_sram_base
CPU1's private 64 KiB bank at the top of on-chip SRAM: .data, .bss and the M33 main stack.
@ k_ra8_board_shared_ram_base
Start of SRAM2: the CPU0 <-> CPU1 meeting window.
Boot entry points shared between a vector table and its startup code.
Cortex-M85 L1 cache maintenance, enable/disable, and I-cache invalidate.
void ra8_cache_icache_enable(void)
Invalidate then enable the Cortex-M85 L1 instruction cache (CCR.IC).
void ra8_cache_dcache_invalidate_all(void)
Invalidate the entire D-cache by set/way.
void ra8_cache_dcache_enable(void)
Invalidate then enable the Cortex-M85 L1 data cache (CCR.DC).
@ k_ra8_mpu_ctrl_enable
RA8 MPU control enable.
@ k_ra8_mpu_ctrl_privdefena
RA8 MPU control privdefena.