Microchip PolarFire SoC Icicle Kit(microchip-icicle-kit)
Microchip PolarFire SoC Icicle Kit 集成一个 PolarFire SoC,具有一个 SiFive E51 核心、四个 U54 核心、大量片上外设以及一个 FPGA。
关于 Microchip PolarFire SoC 的更多详情,请参见: https://www.microchip.com/en-us/products/fpgas-and-plds/system-on-chip-fpgas/polarfire-soc-fpgas
Icicle Kit 板的信息可在此处找到: https://www.microchip.com/en-us/development-tool/mpfs-icicle-kit-es
支持的设备
microchip-icicle-kit 机器支持以下设备:
一个 E51 核心
四个 U54 核心
核心级中断器(CLINT)
平台级中断控制器(PLIC)
松耦合集成内存(L2-LIM)
L2 缓存控制器(L2CC)
DDR 内存控制器
系统控制器和系统服务邮箱
五个 MMUART
一个 DMA 控制器
两个 GEM 以太网控制器
一个 SDHC 存储控制器
一个实时时钟
机器具有固定的 2 GiB RAM,拒绝其他内存大小。机器始终提供全部五个 hart,拒绝其他 CPU 数量。
启动选项
microchip-icicle-kit 机器提供一些运行固件(BIOS)或内核镜像的选项。QEMU 按下表选择固件:
-bios |
-kernel |
固件 |
|---|---|---|
none |
N |
错误 |
none |
Y |
内核镜像 |
NULL, default |
N |
hss.bin |
NULL, default |
Y |
opensbi-riscv64-generic-fw_dynamic.bin |
other |
任意 |
BIOS 镜像 |
直接内核启动
使用 -kernel 选项直接运行内核镜像。请求直接内核启动时,可以通过 -dtb 选项指定设备树二进制文件。与其他 QEMU 机器不同,此机器不会为内核生成设备树,必须由用户提供。用户提供的 DTB 应满足以下要求:
/cpus节点应至少包含一个 E51 子节点,且子节点数量应与 QEMU 的-smp选项匹配。/memory的 reg 大小应与 QEMU 通过-m选项选择的 RAM 大小匹配。应包含一个 compatible 字符串为 "riscv,clint0" 或 "sifive,clint0" 的 CLINT 设备节点。其
interrupts-extended属性必须描述每个 hart(包括 E51 hart 0)的 M 模式软件中断(3)和定时器中断(7)。
例如,五 hart Icicle Kit 的 CLINT 节点可以描述为:
clint: clint@2000000 {
compatible = "sifive,fu540-c000-clint", "sifive,clint0";
reg = <0x0 0x2000000 0x0 0xc000>;
interrupts-extended = <&cpu0_intc 3>, <&cpu0_intc 7>,
<&cpu1_intc 3>, <&cpu1_intc 7>,
<&cpu2_intc 3>, <&cpu2_intc 7>,
<&cpu3_intc 3>, <&cpu3_intc 7>,
<&cpu4_intc 3>, <&cpu4_intc 7>;
};
如果同一个 DTB 用于初始化通用 OpenSBI 平台,不要将 hart 0 的中断号替换为 0xffffffff。OpenSBI 根据这些中断元组推导第一个 hart 和 CLINT 寄存器槽数量;屏蔽 hart 0 会使逐 hart 的 MSIP 和 MTIMECMP 寄存器映射偏移。
未指定 -bios 或将其设为 default 时,会使用 generic 平台的 OpenSBI fw_dynamic BIOS 镜像,直接启动 U-Boot 或操作系统内核等 S 模式载荷。
例如,以下命令展示如何从 U-Boot 主线 v2021.07 构建适用于 Microchip Icicle Kit 板的 U-Boot 镜像:
$ export CROSS_COMPILE=riscv64-linux-
$ make microchip_mpfs_icicle_defconfig
随后可以通过以下命令启动机器:
$ qemu-system-riscv64 -M microchip-icicle-kit -smp 5 -m 2G \
-sd path/to/sdcard.img \
-nic user,model=cadence_gem \
-nic tap,ifname=tap,model=cadence_gem,script=no \
-display none -serial stdio \
-kernel path/to/u-boot/build/dir/u-boot.bin \
-dtb path/to/u-boot/build/dir/u-boot.dtb
注意事项:
检查 DTB 中 /chosen 节点的 "stdout-path" 属性,确定串口控制台使用哪个串口。例如,如果控制台设为第二个串口,请改用 "-serial null -serial stdio"。
默认 U-Boot 配置使用 CONFIG_OF_SEPARATE,因此 ELF 镜像
u-boot不包含 DTB,不能传给 "-kernel";必须使用包含 DTB 的u-boot.bin。要使用 ELF 镜像,需要改为 CONFIG_OF_EMBED 或 CONFIG_OF_PRIOR_STAGE。
运行 HSS
microchip-icicle-kit 机器可以启动 Hart 软件服务(HSS),随后从 SD 卡加载包含 U-Boot 的 HSS 载荷。以下流程已使用 HSS v2024.06 和 Buildroot 2026.05 测试。
使用 mpfs-icicle-kit-es 板的默认配置来配置 HSS。QEMU 提供 HSS v2024.06 DDR 初始化和训练流程所使用的软件可见寄存器以及确定性状态;它不模拟 DDR 训练的电气特性。HSS 要求 Microchip SoftConsole 提供的 RISC-V 裸机工具链位于 PATH 中。构建经过测试的 HSS 版本:
$ git clone https://github.com/polarfire-soc/hart-software-services.git
$ cd hart-software-services
$ git checkout v2024.06
$ make BOARD=mpfs-icicle-kit-es defconfig
$ make -j$(nproc) BOARD=mpfs-icicle-kit-es
HSS 构建同时生成原始封装文件和 eNVM 编程镜像。QEMU 需要完整 eNVM 镜像,包括 Microchip 启动模式编程器添加的 256 字节启动头。将生成的 Intel HEX 文件转换为原始二进制镜像,例如:
$ riscv64-unknown-elf-objcopy -I ihex -O binary \
build/hss-envm-wrapper.mpfs-icicle-kit-es.hex build/hss.bin
不要将 build/hss-envm-wrapper.bin 直接传给 QEMU。该文件从 eNVM 偏移 0x100 开始,不包含带镜像大小和逐 hart 复位向量的启动头。
使用经过测试的 Buildroot 版本构建 SD 卡镜像:
$ git clone https://gitlab.com/buildroot.org/buildroot.git
$ cd buildroot
$ git checkout 2026.05
$ make microchip_mpfs_icicle_defconfig
$ make
这会生成具有三个 GPT 分区的 output/images/sdcard.img:
包含 U-Boot 的 HSS
payload.bin。包含
boot.scr和内核 FIT 镜像的 FAT 分区。ext4 Linux 根文件系统。
QEMU 的 SD 卡模型要求镜像大小为二的幂。制作一个稀疏的 4 GiB 工作副本,并将备份 GPT 移至镜像的新末尾:
$ cp --reflink=auto output/images/sdcard.img sdcard.img
$ truncate -s 4G sdcard.img
$ sgdisk -e sdcard.img
$ sgdisk -v sdcard.img
FIT 镜像中的 Icicle Kit 固件设备树描述了 2 GiB RAM,与机器的固定 RAM 大小一致。以下命令保留显式的 -m 2G,将镜像作为 SD 卡连接,并连接板上的两个串口:
$ qemu-system-riscv64 \
-M microchip-icicle-kit -smp 5 -m 2G \
-bios path/to/hss/build/hss.bin \
-drive if=sd,file=path/to/sdcard.img,format=raw \
-display none \
-serial file:hss.log \
-serial stdio \
-no-reboot
HSS 向 MMUART0 写入,命令将其记录在 hss.log 中。U-Boot 和 Linux 使用 MMUART1,它保持连接到终端。成功启动会依次经过 HSS 载荷加载、U-Boot、Linux 内核,最终到达第三个分区根文件系统的登录提示符。
已知限制
经过测试的 HSS v2024.06 流程包含两个独立的多 hart 启动竞争问题,截至最新 v2026.04 发布版仍未修复。因此,启动可能在最开始时停滞,也可能在 DDR 训练成功后的 OpenSBI/U-Boot 交接期间停滞。
SD 卡模型要求原始镜像大小为二的幂。调整镜像大小时,请保持备份 GPT 头位于末尾。
机器不生成 Icicle Kit 设备树。固件启动必须在载荷或 FIT 镜像中提供设备树;直接内核启动必须按上文所述使用
-dtb。