Skip to content

Commit a49ec95

Browse files
committed
Support for L2-LIM
1 parent c11f292 commit a49ec95

5 files changed

Lines changed: 184 additions & 6 deletions

File tree

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,8 @@ $(LSCRIPT): $(LSCRIPT_IN) FORCE
519519
sed -e "s/@WOLFBOOT_LOAD_BASE@/$(WOLFBOOT_LOAD_BASE)/g" | \
520520
sed -e "s/@BOOTLOADER_START@/$(BOOTLOADER_START)/g" | \
521521
sed -e "s/@IMAGE_HEADER_SIZE@/$(IMAGE_HEADER_SIZE)/g" | \
522-
sed -e "s/@FSP_S_LOAD_BASE@/$(FSP_S_LOAD_BASE)/g" \
522+
sed -e "s/@FSP_S_LOAD_BASE@/$(FSP_S_LOAD_BASE)/g" | \
523+
sed -e "s/@WOLFBOOT_L2LIM_SIZE@/$(WOLFBOOT_L2LIM_SIZE)/g" \
523524
> $@
524525

525526
hex: wolfboot.hex

arch.mk

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -596,8 +596,15 @@ ifeq ($(ARCH),RISCV64)
596596
# Use M-mode specific linker script
597597
LSCRIPT_IN:=hal/$(TARGET)-m.ld
598598
else
599-
# Supervisor Mode (default): Running under HSS with DDR available
600-
CFLAGS+=-DMMU -DWOLFBOOT_DUALBOOT
599+
# Supervisor Mode: Running under HSS
600+
CFLAGS+=-DWOLFBOOT_DUALBOOT
601+
ifeq ($(MPFS_L2LIM),1)
602+
# L2-LIM mode: wolfBoot in on-chip SRAM, loaded by HSS (no DDR)
603+
LSCRIPT_IN:=hal/$(TARGET)-hss.ld
604+
else
605+
# DDR mode (default): full MMU and FDT support
606+
CFLAGS+=-DMMU
607+
endif
601608
endif
602609

603610
# If SD card or eMMC is enabled use update_disk loader with GPT support
@@ -627,9 +634,11 @@ ifeq ($(ARCH),RISCV64)
627634
# U54 cores: rv64gc (with FPU)
628635
ARCH_FLAGS=-march=rv64imafd$(RISCV64_ZICSR)$(RISCV64_ZIFENCEI) -mabi=lp64d -mcmodel=medany
629636

630-
# FDT support required
631-
CFLAGS+=-DWOLFBOOT_FDT
632-
OBJS+=src/fdt.o
637+
# FDT support for DDR S-mode (not needed for L2-LIM bare-metal boot)
638+
ifneq ($(MPFS_L2LIM),1)
639+
CFLAGS+=-DWOLFBOOT_FDT
640+
OBJS+=src/fdt.o
641+
endif
633642
endif
634643
CFLAGS+=-fno-builtin-printf -DUSE_M_TIME -g -nostartfiles -DARCH_RISCV -DARCH_RISCV64
635644
CFLAGS+=$(ARCH_FLAGS)
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
ARCH?=RISCV64
2+
TARGET?=mpfs250
3+
4+
# ECC P384 + SHA384
5+
SIGN?=ECC384
6+
HASH?=SHA384
7+
IMAGE_HEADER_SIZE=512
8+
9+
WOLFBOOT_VERSION?=1
10+
ARMORED?=0
11+
DEBUG?=0
12+
DEBUG_SYMBOLS?=1
13+
DEBUG_UART?=1
14+
VTOR?=1
15+
16+
NO_XIP?=1
17+
18+
NVM_FLASH_WRITEONCE?=0
19+
UART_FLASH?=0
20+
V?=0
21+
NO_MPU?=1
22+
RAM_CODE?=0
23+
SPMATH?=1
24+
DUALBANK_SWAP?=0
25+
PKA?=0
26+
ENCRYPT=0
27+
WOLFTPM?=0
28+
ELF?=1
29+
#DEBUG_ELF?=1
30+
31+
# Use RISC-V assembly version of ECDSA and SHA
32+
NO_ASM?=0
33+
34+
# QSPI Flash Configuration
35+
# Using Micron MT25QL01GBBB (128MB, 64KB sectors)
36+
EXT_FLASH?=1
37+
SPI_FLASH?=0
38+
39+
# SPI Flash Controller Selection:
40+
# MPFS_SC_SPI: Use SC QSPI Controller (0x37020100) for fabric-connected flash.
41+
# Direct register access to System Controller's QSPI instance.
42+
# DEFAULT: Use MSS QSPI Controller (0x21000000) for external flash
43+
# on MSS QSPI pins.
44+
CFLAGS_EXTRA+=-DMPFS_SC_SPI
45+
46+
# L2-LIM mode: wolfBoot loaded by HSS to L2-LIM (no DDR)
47+
# HSS runs on E51 from eNVM, loads wolfBoot to L2-LIM on U54 (S-mode)
48+
# wolfBoot loads application from SC ext SPI flash to L2-LIM
49+
MPFS_L2LIM?=1
50+
51+
# wolfBoot origin in L2-LIM (above HSS resident region)
52+
# NOTE: Adjust based on HSS L2-LIM footprint. HSS typically uses ~200-400KB
53+
# from 0x08000000. Check HSS linker map for actual end address.
54+
WOLFBOOT_ORIGIN?=0x08040000
55+
56+
# Application loaded from QSPI to L2-LIM (above wolfBoot, 128KB offset)
57+
WOLFBOOT_LOAD_ADDRESS?=0x08060000
58+
59+
# Stack at top of 1.5MB L2-LIM (grows downward)
60+
WOLFBOOT_STACK_TOP?=0x08180000
61+
62+
# L2-LIM size available for wolfBoot (STACK_TOP - ORIGIN)
63+
WOLFBOOT_L2LIM_SIZE?=0x140000
64+
65+
# Flash geometry (64 KB sector)
66+
WOLFBOOT_SECTOR_SIZE?=0x10000
67+
68+
# Partition layout for 128MB QSPI flash
69+
# Boot partition: 0x00020000 - 0x01FFFFFF (~32MB)
70+
# Update partition: 0x02000000 - 0x03FFFFFF (~32MB)
71+
# Swap partition: 0x04000000 - 0x0400FFFF (64KB)
72+
# Remaining: 0x04010000 - 0x07FFFFFF (~64MB available)
73+
WOLFBOOT_PARTITION_SIZE?=0x1FE0000
74+
WOLFBOOT_PARTITION_BOOT_ADDRESS?=0x20000
75+
WOLFBOOT_PARTITION_UPDATE_ADDRESS?=0x2000000
76+
WOLFBOOT_PARTITION_SWAP_ADDRESS?=0x4000000
77+
78+
# Speed up reads from flash by using larger blocks
79+
CFLAGS_EXTRA+=-DWOLFBOOT_SHA_BLOCK_SIZE=4096
80+
81+
# Optional Encryption
82+
#CUSTOM_ENCRYPT_KEY=1
83+
#ENCRYPT=1
84+
#ENCRYPT_WITH_AES256=1
85+
#OBJS_EXTRA=src/my_custom_encrypt_key.o
86+
87+
# Optional QSPI debugging
88+
# Uncomment for verbose QSPI debug output
89+
#CFLAGS_EXTRA+=-DDEBUG_QSPI
90+
91+
# Optional QSPI flash test (erase/write/read on update partition)
92+
# Uncomment to run test during hal_init()
93+
#CFLAGS_EXTRA+=-DTEST_EXT_FLASH

hal/mpfs250-hss.ld

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/* PolarFire SoC MPFS250 Linker Script for wolfBoot in L2-LIM (HSS boot)
2+
*
3+
* Boot sequence: HSS (eNVM/E51) loads wolfBoot into L2-LIM on U54 (S-mode).
4+
* wolfBoot then loads application from SC ext SPI flash into L2-LIM.
5+
* No DDR - HSS remains resident in lower L2-LIM for SBI services.
6+
*
7+
* Memory layout (1.5MB L2-LIM: 0x08000000 - 0x0817FFFF):
8+
* 0x08000000 - HSS resident runtime (~256KB)
9+
* WOLFBOOT_ORIGIN (0x08040000) - wolfBoot code + data
10+
* WOLFBOOT_LOAD_ADDRESS (0x08060000) - Application load area
11+
* WOLFBOOT_STACK_TOP (0x08180000) - Stack grows downward
12+
*/
13+
14+
OUTPUT_ARCH( "riscv" )
15+
16+
ENTRY( _reset )
17+
18+
MEMORY
19+
{
20+
/* L2-LIM on-chip SRAM (cache ways configured as LIM by HSS)
21+
* HSS loads wolfBoot binary here directly - no VMA/LMA split needed */
22+
L2_LIM (rwx) : ORIGIN = @WOLFBOOT_ORIGIN@, LENGTH = @WOLFBOOT_L2LIM_SIZE@
23+
}
24+
25+
PROVIDE(STACK_SIZE_PER_HART = 16k);
26+
27+
SECTIONS
28+
{
29+
.text : ALIGN(0x10)
30+
{
31+
_start_text = .;
32+
KEEP(*(.init))
33+
. = ORIGIN(L2_LIM) + 0x100;
34+
_start_vector = .;
35+
KEEP(*(.isr_vector))
36+
. = ALIGN(0x10);
37+
*(.text*)
38+
*(.rodata*)
39+
*(.srodata*)
40+
. = ALIGN(4);
41+
_end_text = .;
42+
} > L2_LIM
43+
44+
.data : ALIGN(0x10)
45+
{
46+
_start_data = .;
47+
KEEP(*(.ramcode*))
48+
. = ALIGN(4);
49+
KEEP(*(.keystore*))
50+
. = ALIGN(4);
51+
*(.data*)
52+
. = ALIGN(4);
53+
_global_pointer = . + 0x800;
54+
*(.sdata*)
55+
. = ALIGN(4);
56+
_end_data = .;
57+
} > L2_LIM
58+
59+
.bss (NOLOAD) : ALIGN(0x10)
60+
{
61+
_start_bss = .;
62+
*(.bss*)
63+
*(COMMON)
64+
. = ALIGN(4);
65+
_end_bss = .;
66+
_end = .;
67+
} > L2_LIM
68+
}
69+
70+
PROVIDE(_start_heap = _end);
71+
PROVIDE(_end_stack = ORIGIN(L2_LIM) + LENGTH(L2_LIM));

src/boot_riscv.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,10 @@ void do_boot(const uint32_t *app_offset)
510510
#endif /* WOLFBOOT_MMODE_SMODE_BOOT */
511511

512512
#elif __riscv_xlen == 64
513+
/* Synchronize I-cache after loading new code into memory.
514+
* Critical for L2-LIM where QSPI data is loaded as instructions. */
515+
asm volatile("fence" ::: "memory");
516+
riscv_icache_sync();
513517
asm volatile(
514518
#if defined(MMU) && !defined(WOLFBOOT_RISCV_MMODE)
515519
/* S-mode boot (e.g., when running under HSS/OpenSBI) */

0 commit comments

Comments
 (0)