Skip to content

Commit 7fa33fd

Browse files
committed
Add MPFS250 QSPI support
1 parent 2c67f99 commit 7fa33fd

15 files changed

Lines changed: 1727 additions & 53 deletions

arch.mk

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -576,10 +576,19 @@ endif
576576
ifeq ($(ARCH),RISCV64)
577577
CROSS_COMPILE?=riscv64-unknown-elf-
578578
CFLAGS+=-DMMU -DWOLFBOOT_DUALBOOT
579-
CFLAGS+=-DWOLFBOOT_UPDATE_DISK -DMAX_DISKS=1
580-
UPDATE_OBJS:=src/update_disk.o
581-
OBJS += src/gpt.o
582-
OBJS += src/disk.o
579+
580+
# If SD card or eMMC is enabled use update_disk loader with GPT support
581+
ifneq ($(filter 1,$(DISK_SDCARD) $(DISK_EMMC)),)
582+
CFLAGS+=-DWOLFBOOT_UPDATE_DISK -DMAX_DISKS=1
583+
UPDATE_OBJS:=src/update_disk.o
584+
OBJS += src/gpt.o
585+
OBJS += src/disk.o
586+
else
587+
# Use RAM-based update path for non-memory-mapped flash (SC SPI)
588+
# Images are loaded into RAM before execution
589+
UPDATE_OBJS?=src/update_ram.o
590+
endif
591+
583592
ARCH_FLAGS=-march=rv64imafd -mabi=lp64d -mcmodel=medany
584593
CFLAGS+=-fno-builtin-printf -DUSE_M_TIME -g -nostartfiles -DARCH_RISCV -DARCH_RISCV64
585594
CFLAGS+=$(ARCH_FLAGS)
@@ -1440,6 +1449,11 @@ endif
14401449
CFLAGS+=-DARCH_FLASH_OFFSET=$(ARCH_FLASH_OFFSET)
14411450
BOOT_IMG?=test-app/image.bin
14421451

1452+
# When ELF loading is enabled, sign the ELF file (not the flat binary)
1453+
ifeq ($(ELF),1)
1454+
BOOT_IMG=test-app/image.elf
1455+
endif
1456+
14431457
## Update mechanism
14441458
ifeq ($(ARCH),AARCH64)
14451459
CFLAGS+=-DMMU -DWOLFBOOT_FDT -DWOLFBOOT_DUALBOOT

config/examples/polarfire_mpfs250.config

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ DEBUG?=0
2626
DEBUG_SYMBOLS?=1
2727
DEBUG_UART?=1
2828
VTOR?=1
29+
30+
# Flash Configuration
31+
# EXT_FLASH=0: Use eMMC/SD card for firmware storage (default)
32+
# EXT_FLASH=1: Use QSPI flash (Micron MT25QL01G 128MB)
2933
EXT_FLASH?=0
3034
SPI_FLASH?=0
3135
NO_XIP?=1
@@ -44,8 +48,6 @@ ELF?=1
4448

4549
# Use RISC-V assembly version of ECDSA and SHA
4650
NO_ASM?=0
47-
# Optional: Use smaller SHA512
48-
#CFLAGS_EXTRA+=-DUSE_SLOW_SHA512
4951

5052
# SDCard or eMMC support via SDHCI driver
5153
DISK_SDCARD?=1
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
ARCH?=RISCV64
2+
TARGET?=mpfs250
3+
4+
# ECC P384 + SHA384
5+
SIGN?=ECC384
6+
HASH?=SHA384
7+
IMAGE_HEADER_SIZE=512
8+
9+
# ML-DSA 87 + SHA256
10+
#SIGN=ML_DSA
11+
#HASH=SHA256
12+
#ML_DSA_LEVEL=5
13+
#IMAGE_SIGNATURE_SIZE=4627
14+
#IMAGE_HEADER_SIZE=12288
15+
16+
WOLFBOOT_VERSION?=1
17+
ARMORED?=0
18+
DEBUG?=0
19+
DEBUG_SYMBOLS?=1
20+
DEBUG_UART?=1
21+
VTOR?=1
22+
23+
NO_XIP?=1
24+
25+
NVM_FLASH_WRITEONCE?=0
26+
UART_FLASH?=0
27+
V?=0
28+
NO_MPU?=1
29+
RAM_CODE?=0
30+
SPMATH?=1
31+
DUALBANK_SWAP?=0
32+
PKA?=0
33+
ENCRYPT=0
34+
WOLFTPM?=0
35+
ELF?=1
36+
#DEBUG_ELF?=1
37+
38+
# Use RISC-V assembly version of ECDSA and SHA
39+
NO_ASM?=0
40+
41+
# QSPI Flash Configuration
42+
# Using Micron MT25QL01GBBB (128MB, 64KB sectors)
43+
EXT_FLASH?=1
44+
SPI_FLASH?=0
45+
46+
# SPI Flash Controller Selection:
47+
# MPFS_SC_SPI: Use System Controller SPI services (fabric-connected flash)
48+
# This is how HSS accesses the design flash via SCB mailbox.
49+
# DEFAULT: Use MSS QSPI Controller directly (0x21000000)
50+
# For external flash connected to MSS QSPI pins.
51+
CFLAGS_EXTRA+=-DMPFS_SC_SPI
52+
53+
54+
# Enable SD card temporarily (wolfBoot still loads from SD, apps from QSPI)
55+
# For pure QSPI boot, HSS would need to load wolfBoot from QSPI
56+
DISK_SDCARD?=0
57+
DISK_EMMC?=0
58+
59+
# DDR Address for wolfBoot to start from
60+
# Comes from hal/mpfs.yaml
61+
WOLFBOOT_ORIGIN?=0x80000000
62+
63+
# DDR Address where application image will be loaded from flash
64+
# Used by update_ram.c for non-XIP boot
65+
# Must be well above wolfBoot's memory region
66+
WOLFBOOT_LOAD_ADDRESS?=0x8E000000
67+
68+
# Flash geometry (64 KB sector)
69+
WOLFBOOT_SECTOR_SIZE?=0x10000
70+
71+
# Partition layout for 128MB QSPI flash
72+
# HSS Boot Info: 0x00000000 - 0x00000400 (1KB)
73+
# wolfBoot partition: 0x00000400 - 0x0001FFFF (127KB)
74+
# Boot partition: 0x00020000 - 0x01FFFFFF (~32MB)
75+
# Update partition: 0x02000000 - 0x03FFFFFF (32MB)
76+
# Swap partition: 0x04000000 - 0x0400FFFF (64KB)
77+
# Remaining: 0x04010000 - 0x07FFFFFF (~64MB available)
78+
WOLFBOOT_PARTITION_SIZE?=0x1FE0000
79+
WOLFBOOT_PARTITION_BOOT_ADDRESS?=0x20000
80+
WOLFBOOT_PARTITION_UPDATE_ADDRESS?=0x2000000
81+
WOLFBOOT_PARTITION_SWAP_ADDRESS?=0x4000000
82+
83+
# DTS (Device Tree)
84+
WOLFBOOT_LOAD_DTS_ADDRESS?=0x8A000000
85+
WOLFBOOT_DTS_BOOT_ADDRESS?=0x6000000 # DTS at 96MB (after swap)
86+
WOLFBOOT_DTS_UPDATE_ADDRESS?=0x6010000 # DTS update at 96MB + 64KB
87+
88+
# Speed up reads from flash by using larger blocks
89+
CFLAGS_EXTRA+=-DWOLFBOOT_SHA_BLOCK_SIZE=4096
90+
91+
# Optional Encryption
92+
#CUSTOM_ENCRYPT_KEY=1
93+
#ENCRYPT=1
94+
#ENCRYPT_WITH_AES256=1
95+
#OBJS_EXTRA=src/my_custom_encrypt_key.o
96+
97+
# Optional QSPI debugging
98+
# Uncomment for verbose QSPI debug output
99+
#CFLAGS_EXTRA+=-DDEBUG_QSPI

docs/Targets.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,46 @@ sudo dd if=wolfboot.bin of=/dev/sdc1 bs=512 && sudo cmp wolfboot.bin /dev/sdc1
859859

860860
Note:
861861

862+
### PolarFire SoC QSPI
863+
864+
PolarFire QSPI can be accessed in two ways. The selection is made at build time and affects how wolfBoot
865+
talks to the flash:
866+
867+
```text
868+
+-------------------+ +----------------------+
869+
| U54 cores | | U54 cores |
870+
| (wolfBoot) | | (wolfBoot) |
871+
+---------+---------+ +----------+-----------+
872+
| |
873+
| direct QSPI controller | SCB mailbox service
874+
| (MSS QSPI @ 0x2100_0000) | (System Controller)
875+
v v
876+
+-------------------+ +----------------------+
877+
| MSS QSPI IP | | System Controller |
878+
+---------+---------+ +----------+-----------+
879+
| |
880+
v v
881+
External QSPI flash Fabric-connected flash
882+
```
883+
884+
Build options:
885+
886+
- MSS QSPI controller (direct, read/write/erase)
887+
- `EXT_FLASH=1`
888+
- Do not set `MPFS_SC_SPI`
889+
- Example config: `config/examples/polarfire_mpfs250_qspi.config` with `CFLAGS_EXTRA` line removed.
890+
891+
- System Controller SPI services (fabric flash via SCB mailbox, read-only)
892+
- `EXT_FLASH=1`
893+
- `CFLAGS_EXTRA+=-DMPFS_SC_SPI`
894+
- Example config: `config/examples/polarfire_mpfs250_qspi.config` as-is.
895+
896+
Notes:
897+
- For QSPI-based boot flows, disable SD/eMMC in the config (`DISK_SDCARD=0`, `DISK_EMMC=0`) unless you
898+
explicitly want wolfBoot to load from disk and the application from QSPI.
899+
- The MSS QSPI path expects external flash on the MSS QSPI pins; the System Controller path matches
900+
HSS access to the design flash via the SCB mailbox.
901+
862902
### PolarFire testing
863903

864904
This section describes how to build the test-application, create a custom uSD with required partitions and copying signed test-application to uSD partitions.

0 commit comments

Comments
 (0)