56#include "trustzone_init.h"
86typedef enum : uintptr_t {
92#ifdef RA8_TRUSTZONE_ENABLE
105typedef enum : uintptr_t {
106 k_tz_sau_ctrl_addr = 0xE000EDD0U,
107 k_tz_sau_type_addr = 0xE000EDD4U,
108 k_tz_sau_rnr_addr = 0xE000EDD8U,
109 k_tz_sau_rbar_addr = 0xE000EDDCU,
110 k_tz_sau_rlar_addr = 0xE000EDE0U,
111 k_tz_sramsabar0_addr = 0x40008400U,
112 k_tz_prcr_s_addr = 0x4001E3FAU,
113 k_tz_psarb_addr = 0x40204004U,
123typedef enum : uint32_t {
124 k_tz_sau_ctrl_enable = 0x00000001U,
125 k_tz_sau_rlar_enable = 0x00000001U,
126 k_tz_sau_rlar_nsc = 0x00000002U,
127 k_tz_sau_limit_mask = 0xFFFFFFE0U,
128 k_tz_sau_type_mask = 0x000000FFU,
129 k_tz_psarb_usbfs_ns = 0x00000800U,
130 k_tz_psarb_usbhs_ns = 0x00001000U,
131 k_tz_psarb_usb_ns = 0x00001800U,
132 k_tz_psarb_readback_spins = 1000U,
147typedef enum : uint16_t {
213typedef enum : uint16_t {
214 k_tz_prcr_s_open = 0xA510U,
215 k_tz_prcr_s_close = 0xA500U,
228typedef enum : uint32_t {
229 k_tz_sau_min_regions = 4U,
230 k_tz_ns_code_base = 0x10000000U,
231 k_tz_ns_code_limit = 0x1FFFFFE0U,
232 k_tz_ns_sram_base = 0x30000000U,
233 k_tz_ns_sram_limit = 0x3FFFFFE0U,
234 k_tz_ns_per_base = 0x50000000U,
235 k_tz_ns_per_limit = 0xDFFFFFE0U,
236 k_tz_sramsabar0_val = 0x00080000U,
237 k_tz_sramsabar1_val = 0x00100000U,
238 k_tz_sramsabar2_val = 0x00100000U,
239 k_tz_sramsabar3_val = 0x001A0000U,
245typedef enum : uint8_t {
246 k_tz_region_nsc = 0U,
247 k_tz_region_ns_code = 1U,
248 k_tz_region_ns_sram = 2U,
249 k_tz_region_ns_per = 3U,
264static inline void tz_write32(uintptr_t addr, uint32_t value)
268 *(
volatile uint32_t*)addr = value;
283static inline uint32_t tz_read32(uintptr_t addr)
286 return *(
volatile uint32_t*)addr;
302static void tz_sau_set_region(uint8_t region, uint32_t base, uint32_t limit,
bool is_nsc)
305 tz_write32(k_tz_sau_rnr_addr, (uint32_t)region);
306 tz_write32(k_tz_sau_rbar_addr, base & (uint32_t)k_tz_sau_limit_mask);
307 uint32_t rlar = (limit & (uint32_t)k_tz_sau_limit_mask) | (uint32_t)k_tz_sau_rlar_enable;
309 rlar |= (uint32_t)k_tz_sau_rlar_nsc;
311 tz_write32(k_tz_sau_rlar_addr, rlar);
330static void tz_sram_ns_boundary(
void)
334 *(
volatile uint16_t*)k_tz_prcr_s_addr = (uint16_t)k_tz_prcr_s_open;
339 tz_write32(k_tz_sramsabar0_addr + (0U *
sizeof(uint32_t)), (uint32_t)k_tz_sramsabar0_val);
340 tz_write32(k_tz_sramsabar0_addr + (1U *
sizeof(uint32_t)), (uint32_t)k_tz_sramsabar1_val);
341 tz_write32(k_tz_sramsabar0_addr + (2U *
sizeof(uint32_t)), (uint32_t)k_tz_sramsabar2_val);
342 tz_write32(k_tz_sramsabar0_addr + (3U *
sizeof(uint32_t)), (uint32_t)k_tz_sramsabar3_val);
346 *(
volatile uint16_t*)k_tz_prcr_s_addr = (uint16_t)k_tz_prcr_s_close;
372 const uint32_t sau_type = tz_read32(k_tz_sau_type_addr);
373 if ((sau_type & (uint32_t)k_tz_sau_type_mask) < (uint32_t)k_tz_sau_min_regions) {
381 tz_sau_set_region((uint8_t)k_tz_region_nsc, nsc_base, nsc_limit,
true);
382 tz_sau_set_region((uint8_t)k_tz_region_ns_code,
383 (uint32_t)k_tz_ns_code_base,
384 (uint32_t)k_tz_ns_code_limit,
386 tz_sau_set_region((uint8_t)k_tz_region_ns_sram,
387 (uint32_t)k_tz_ns_sram_base,
388 (uint32_t)k_tz_ns_sram_limit,
390 tz_sau_set_region((uint8_t)k_tz_region_ns_per,
391 (uint32_t)k_tz_ns_per_base,
392 (uint32_t)k_tz_ns_per_limit,
395 __asm__
volatile(
"dsb 0xF" :::
"memory");
398 tz_write32(k_tz_sau_ctrl_addr, (uint32_t)k_tz_sau_ctrl_enable);
399 __asm__
volatile(
"dsb 0xF" :::
"memory");
400 __asm__
volatile(
"isb" :::
"memory");
421static void tz_copy_ns_image(
void)
426 for (uintptr_t src = src_start; src < src_end; src +=
sizeof(uint32_t)) {
427 *(
volatile uint32_t*)dst = *(
const volatile uint32_t*)src;
428 dst +=
sizeof(uint32_t);
518static void tz_usb_mark_ns(
void)
528 *(
volatile uint16_t*)k_tz_prcr_s_addr = (uint16_t)k_tz_prcr_s_open;
529 const uint32_t want = tz_read32(k_tz_psarb_addr) | (uint32_t)k_tz_psarb_usb_ns;
530 tz_write32(k_tz_psarb_addr, want);
532 for (uint32_t spin = 0U; spin < (uint32_t)k_tz_psarb_readback_spins; spin += 1U) {
533 seen = tz_read32(k_tz_psarb_addr);
539 *(
volatile uint16_t*)k_tz_prcr_s_addr = (uint16_t)k_tz_prcr_s_close;
571static void tz_usb_handoff_prepare(
void)
574 const ra8_err_t pins_err = tz_usb_route_pins();
596#ifdef RA8_TRUSTZONE_ENABLE
598 tz_usb_handoff_prepare();
601 tz_sram_ns_boundary();
616 __asm__
volatile(
"cpsie i" :::
"memory");
void ra8_trustzone_init(void)
Programme + enable the SAU per the partition.
uint32_t g_ra8_ls_sgstubs_start
Veneer-region start (NSC).
uint32_t g_ra8_ls_sgstubs_end
Veneer-region end (NSC).
tz_ns_image_t
Fixed NS-image addresses (two-project build, #96).
@ k_tz_ns_load_base
NS image LMA (Secure MRAM).
@ k_tz_ns_copy_size
Bytes copied LMA->VMA (192 KB).
@ k_tz_ns_run_base
NS image VMA (SRAM2 NS alias).
volatile uint32_t g_tz_usb_pins_err
First non-OK ra8_err_t from the USB pin + PLL setup (0 = OK).
volatile uint32_t g_tz_usb_psarb_readback
Confirmed PSARB read-back after the USBFS NS-attribution write.
volatile uint32_t g_tz_usb_expander_err
Last ra8_err_t from the U15 I/O-expander host-mode write (0 = OK).
volatile uint32_t g_tz_jump_ns_err
Denial verdict from ra8_tz_secure_boot_jump_ns (0 = never denied).
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_io_expander_set_usbhs_host_mode(void)
Drive the U15 I/O expander to select USB-HS HOST mode.
@ k_ra8_board_usbhs_pin_pwr
PD07 J7 host-power switch (HIGH = U18 drives 5 V VBUS).
@ k_ra8_board_usbhs_pin_vbus
P4_08 USBHS_VBUS sense.
@ k_ra8_board_usbfs_pin_dm
P8_15 D-.
@ k_ra8_board_usbfs_pin_vbusen
P5_00 VBUSEN GPIO.
@ k_ra8_board_usbfs_pin_vbus
P4_07 VBUS sense.
@ k_ra8_board_usbfs_pin_dp
P8_14 D+.
High-level Clock Generation Circuit driver.
ra8_err_t ra8_cgc_usbhs_pll_enable(void)
Bring up the USBHS PHY reference clock + module clock.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_not_supported
Requested feature not compiled in, not wired, or not supported by this MCU variant.
@ k_ra8_err_busy
Resource busy – blocking operation cannot proceed.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
PSEL codes for peripheral pin routing on the RA8D2.
@ k_ra8_psel_usb_fs
10011b: USB Full-Speed.
@ k_ra8_psel_usb_hs
10100b: USB High-Speed (e.g.
Runtime Pin-Ownership Validator.
void ra8_pin_validator_reset(void)
Reset the validator (release every pin).
Typed Port / Pin Constants for the RA8D2 IOPORT Module.
ra8_port_pin_t
Packed (port << 8) | pin pin identifier.
@ k_ra8_level_high
Drive or read 1.
@ k_ra8_level_low
Drive or read 0.
High-level GPIO helpers on top of the PORT + PFS register layer.
ra8_err_t ra8_gpio_output_init(ra8_port_pin_t pin, ra8_level_t init_level)
Configure a pin as a digital output and drive it to an initial level.
ra8_err_t ra8_pfs_route_peripheral(ra8_port_pin_t pin, ra8_psel_t psel, const char *owner)
Route a pin to a non-IRQ peripheral function via PFS.PSEL.
FSP-style TrustZone secure-boot for the Cortex-M85 (CPU0).
ra8_err_t ra8_tz_secure_boot_jump_ns(const uint32_t *ns_vector_table)
Switch to NS state and jump to the NS image's reset vector.