Some notes on setting up the SiFive Unmatched RISC-V to boot from an NNVme SSD.
Download Ubuntu Image
Download cdimage.ubuntu.com/releases/24.10/release/ubuntu-24.10-preinstalled-server-riscv64+unmatched.img.xz
from cdimage.ubuntu.com/releases/. Serch for preinstalled-server-riscv64+unmatched.img.xz
in other latest releases.
The .xz
is a compressed file, and Windows 11 will recognize it as such. Extract the one file:
Use the Raspberry Pi Imager.
Config Steps
ext4load mmc 0:1 0x80200000 /boot/vmlinuz-6.11.0-8-generic ext4load mmc 0:1 0x84000000 /boot/uInitrd ext4load mmc 0:1 0x88000000 /boot/dtb-6.11.0-8-generic
booti 0x80200000 0x84000000 0x88000000
Boot HiFive from SD
load mmc 0:3 ${kernel_addr_r} Image.gz;
load mmc 0:3 ${fdt_addr_r} hifive-unmatched-a00.dtb;
setenv bootargs "root=/dev/mmcblk0p4 rootfstype=ext4 rootwait console=ttySIF0,115200 earlycon"
booti ${kernel_addr_r} - ${fdt_addr_r}
cat /etc/os-release
Ubuntu from SD Card
ext4load mmc 0:1 0x80200000 /boot/vmlinuz-6.11.0-8-generic
ext4load mmc 0:1 0x88000000 /boot/initrd.img-6.11.0-8-generic
ext4load mmc 0:1 0x8C000000 /boot/dtb-6.11.0-8-generic
printenv
setenv bootcmd "nvme scan; nvme dev 0; ${kernel}; ${initrd}; ${dtb}; booti 0x80200000 0x88000000 0x8C000000"
saveenv
setenv bootcmd 'mmc dev 0; ext4load mmc 0:1 0x80200000 /boot/vmlinuz-6.11.0-8-generic; ext4load mmc 0:1 0x88000000 /boot/initrd.img-6.11.0-8-generic; ext4load mmc 0:1 0x8C000000 /boot/dtb-6.11.0-8-generic; setenv bootargs root=/dev/mmcblk0p1 rootfstype=ext4 rw console=ttyS0,115200 earlycon debug loglevel=7; booti 0x80200000 0x88000000 0x8C000000'
setenv bootargs root=/dev/mmcblk0p1 rootfstype=ext4 rw console=ttyS0,115200 earlycon debug loglevel=7
saveenv
booti 0x80200000 - 0x8C000000
booti 0x80200000 0x88000000 0x8C000000
Boot from NVMe
setenv fdtfile "/boot/dtb-6.11.0-8-generic"
setenv
nvme scan;
nvme dev 0;
setenv ramdisk_addr_r 0x90000000
setenv fdt_addr_r 0x8c000000
setenv preboot "nvme scan; nvme dev 0; setenv fdt_addr ${fdtcontroladdr};fdt addr ${fdtcontroladdr};"
echo $kernel_addr_r
echo $ramdisk_addr_r
echo $fdt_addr_r
ext4load nvme 0:1 ${kernel_addr_r} /boot/vmlinuz-6.11.0-8-generic
# we manually created uInitrd
ext4load nvme 0:1 ${ramdisk_addr_r} /boot/uInitrd
ext4load nvme 0:1 ${fdt_addr_r} /boot/dtbs/6.11.0-8-generic/sifive/hifive-unmatched-a00.dtb
setenv bootcmd "nvme scan; nvme dev 0; ${kernel}; ${initrd}; ${dtb}; booti 0x80200000 0x88000000 0x8C000000"
setenv bootargs "root=/dev/nvme0n1p1 rootfstype=ext4 rw console=ttyS0,115200 earlycon debug loglevel=7 nvme_core.default_ps_max_latency_us=0"
setenv bootargs "root=/dev/nvme0n1p1 rootfstype=ext4 rw console=ttyS0,115200 earlycon debug loglevel=7 nvme_core.default_ps_max_latency_us=0 init=/sbin/init"
# consider mmc /boot/extlinux/extlinux.conf
setenv bootargs "root=/dev/nvme0n1p1 rootfstype=ext4 rw console=ttyS0,115200 earlycon debug loglevel=7 nvme_core.default_ps_max_latency_us=0 init=/bin/bash"
setenv bootargs "root=/dev/nvme0n1p1 rootfstype=ext4 rw console=ttyS0,115200 earlycon init=/sbin/init"
# Boot with initramfs
booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
# Boot without initramfs
booti ${kernel_addr_r} - ${fdt_addr_r}
saveenv
booti 0x80200000 - 0x8C000000
booti 0x80200000 0x88000000 0x8C000000
Image Fresh Disk and Mount NVMe
Ubuntu 24.10 pre-installed server riscv64 unmatched.
~ 1GB file to fetch from Internet, ~ 5 GB to expanded and write.
# Original from blogjawn.stufftoread.com
# wget http://cdimage.ubuntu.com/ubuntu/releases/21.04/release/ubuntu-21.04-preinstalled-server-riscv64+unmatched.img.xz
# unxz ./ubuntu-21.04-preinstalled-server-riscv64+unmatched.img.xz
# or
# http ubuntu-24.10:
# wget http://cdimage.ubuntu.com/ubuntu/releases/24.10/release/ubuntu-24.10-preinstalled-server-riscv64+unmatched.img.xz
# or
# https ubuntu-24.10:
wget https://cdimage.ubuntu.com/releases/24.10/release/ubuntu-24.10-preinstalled-server-riscv64+unmatched.img.xz
unxz ./ubuntu-24.10-preinstalled-server-riscv64+unmatched.img.xz
# Write to NVMe SSD:
sudo dd if=./ubuntu-24.10-preinstalled-server-riscv64+unmatched.img of=/dev/nvme0n1 bs=1M status=progress
# Probably needed if not enough free disk space:
xz -dc ./ubuntu-24.10-preinstalled-server-riscv64+unmatched.img.xz | sudo dd of=/dev/nvme0n1 bs=1M status=progress
# growpart is typically not installed
# sudo growpart /dev/nvme0n1 1
sync
sudo umount /mnt
sudo umount /run/media/CIDATA-nvme0n1p12
sudo umount /run/media/UEFI-nvme0n1p15
# Ensure all drives unmounted
lsblk
# resize disk. Enter "w" at the prompt
sudo fdisk /dev/nvme0n1
# reboot to mmc again. See Boot HiFive from SD:
reboot
sudo fdisk /dev/nvme0n1
# p to print partitions (make note of nvme0n1p1 starting sector, in this case 235520)
# d to delete partition 1
# 1 for partition #1
# n to create a new partition
# 1 for partition #1
# confirm 23550 (should be the default)
# Enter for defaults
# N do not remove signature
# w to write
# (should automatically exit)
sync
# Reboot to mms again. See Boot HiFive from SD:
reboot
lsblk
# Confirm typie is ext4
sudo blkid /dev/nvme0n1p1
# Resize the drive
sudo resize2fs /dev/nvme0n1p1
# done
sudo mount /dev/nvme0n1p1 /mnt
sudo chroot /mnt
cat /etc/os-release
Create uInitrd
echo "nvme" | sudo tee -a /etc/initramfs-tools/modules
echo "nvme-core" | sudo tee -a /etc/initramfs-tools/modules
# sudo update-initramfs -u -k 6.11.0-8-generic
# sudo mkimage -A riscv -T ramdisk -C gzip -d /boot/initrd.img-6.11.0-8-generic /boot/uInitrd
sudo mkimage -A riscv -O linux -T ramdisk -C none -n "Ubuntu Initrd" -d /run/media/cloudimg-rootfs-nvme0n1p1/boot/initrd.img-6.11.0-8-generic /run/media/cloudimg-rootfs-nvme0n1p1/boot/uInitrd
# no longer copy
# Copy to mmc SD
# sudo cp /mnt/boot/uInitrd /boot/
# sudo cp /mnt/boot/vmlinuz-6.11.0-8-generic /boot/
# sync
# mount | grep "on / type"
UBoot NVMe with uInitrd ramdisk
setenv devnum 0
setenv bootargs "root=/dev/nvme0n1p1 rootfstype=ext4 rootwait console=ttySIF0,115200 earlycon"
load nvme ${devnum}:1 ${kernel_addr_r} /boot/vmlinuz-6.11.0-8-generic
load nvme ${devnum}:1 ${ramdisk_addr_r} /boot/uInitrd
load nvme ${devnum}:1 ${fdt_addr_r} /boot/dtbs/6.11.0-8-generic/hifive-unmatched-a00.dtb
booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
Some NVMe possible fixes
sudo mkdir -p /mnt/nvme
sudo mount /dev/nvme0n1p1 /mnt/nvme
for i in /dev /dev/pts /proc /sys /run; do sudo mount --bind $i /mnt/nvme$i; done
sudo chroot /mnt/nvme
# Add U_BOOT_ROOT="root=/dev/nvme0n1p1" to /etc/default/u-boot
dpkg -l | grep u-boot
cat /etc/default/u-boot
echo 'U_BOOT_ROOT="root=/dev/nvme0n1p1"' | sudo tee -a /etc/default/u-boot
u-boot-update
TODO review
setenv bootcmd 'mmc dev 0; ext4load mmc 0:1 0x80200000 /boot/vmlinuz-6.11.0-8-generic; ext4load mmc 0:1 0x88000000 /boot/initrd.img-6.11.0-8-generic; ext4load mmc 0:1 0x8C000000 /boot/dtb-6.11.0-8-generic; '
NVMe Boot WIP TODO review
Reminder: no trailing ;
in bootargs:
setenv bootargs 'root=/dev/nvme0n1p1 rootfstype=ext4 rw console=ttyS0,115200 earlycon debug loglevel=7'
x setenv bootcmd 'nvme dev 0; ext4load nvme 0:1 0x80200000 /boot/vmlinuz-6.11.0-8-generic; ext4load nvme 0:1 0x88000000 /boot/initrd.img-6.11.0-8-generic; ext4load nvme 0:1 0x8C000000 /boot/dtb-6.11.0-8-generic; booti 0x80200000 0x88000000 0x8C000000'
setenv bootcmd "nvme dev 0; ext4load nvme 0:1 0x80200000 /boot/vmlinuz-6.11.0-8-generic; ext4load nvme 0:1 0x88000000 /boot/initrd.img-6.11.0-8-generic;
ext4load nvme 0:1 0x8C000000 /boot/dtbs/6.11.0-8-generic/sifive/hifive-unmatched-a00.dtb; booti 0x80200000 0x88000000 0x8C000000"
saveenv
SD Boot
setenv root "/dev/mmcblk0p4"
setenv rootdev "/dev/mmcblk0p4"
setenv boot_targets mmc
setenv bootargs "root=/dev/mmcblk0p4 rootfstype=ext4 rootwait console=ttySIF0,115200 earlycon"
setenv bootcmd "load mmc 0:3 ${kernel_addr_r} Image.gz; load mmc 0:3 ${fdt_addr_r} hifive-unmatched-a00.dtb; booti ${kernel_addr_r} - ${fdt_addr_r}"
load mmc 0:3 ${kernel_addr_r} Image.gz;
load mmc 0:3 ${fdt_addr_r} hifive-unmatched-a00.dtb;
booti ${kernel_addr_r} - ${fdt_addr_r}
NVMe printenv:
arch=riscv
baudrate=115200
board=unmatched
board_name=unmatched
bootargs=root=/dev/nvme0n1p1 rootfstype=ext4 rw console=ttyS0,115200 earlycon debug loglevel=8 nvme_core.default_ps_max_latency_us=0
bootcmd=bootflow scan
bootdelay=2
cpu=fu740
ethaddr=[omit]
fdt_addr=ff730cf0
fdt_addr_r=0x8c000000
fdtaddr=ff730cf0
fdtcontroladdr=ff730cf0
fdtfile="sifive/hifive-unmatched-a00.dtb"
fileaddr=8c000000
filesize=2b9b
kernel_addr_r=0x80200000
kernel_comp_addr_r=0x88000000
kernel_comp_size=0x4000000
loadaddr=0x80200000
partitions=name=loader1,start=17K,size=1M,type=${type_guid_gpt_loader1}; name=loader2,size=4MB,type=${type_guid_gpt_loader2}; name=system,size=-,bootable,type=${type_guid_gpt_system};
preboot=setenv fdt_addr ${fdtcontroladdr};fdt addr ${fdtcontroladdr};
pxefile_addr_r=0x8c200000
ramdisk_addr_r=0x90000000
scriptaddr=0x8c100000
serial#=[omit]
stderr=serial@10010000
stdin=serial@10010000
stdout=serial@10010000
type_guid_gpt_loader1=5B193300-FC78-40CD-8002-E86C45580B47
type_guid_gpt_loader2=2E54B353-1271-4842-806F-E436D6AF6985
type_guid_gpt_system=0FC63DAF-8483-4772-8E79-3D69D8477DE4
vendor=sifive
Environment size: 1136/131068 bytes
Convert Initrd to uboot format
FreedomUSDK (SiFive Freedom Unleashed SDK) 2024.12.00 unmatched ttySIF0
unmatched login: root
Password:
root@unmatched:~# lsblk -o NAME,MOUNTPOINT,FSTYPE,SIZE
NAME MOUNTPOINT FSTYPE SIZE
mmcblk0 29.7G
|-mmcblk0p1 1M
|-mmcblk0p2 4M
|-mmcblk0p3 /boot vfat 130M
`-mmcblk0p4 / ext4 7.6G
nvme0n1 465.8G
|-nvme0n1p1 /run/media/cloudimg-rootfs-nvme0n1p1 ext4 4.4G
|-nvme0n1p12 /run/media/CIDATA-nvme0n1p12 vfat 4M
|-nvme0n1p13 1M
|-nvme0n1p14 4M
`-nvme0n1p15 /run/media/UEFI-nvme0n1p15 vfat 106M
root@unmatched:~# mount /dev/nvme0n1p1 /mnt
root@unmatched:~# ls /mnt
bin dev home lib media opt root sbin srv tmp var
boot etc initrd lost+found mnt proc run snap sys usr
root@unmatched:~# mkimage -A riscv -O linux -T ramdisk -C none -a 0x90000000 -e 0x90000000 -n "Ubuntu Initrd" -d /mnt/boot/initrd.img-6.11.0-8-generic /mnt/boot/uInitrd
Image Name: Ubuntu Initrd
Created: Tue Feb 18 00:56:17 2025
Image Type: RISC-V Linux RAMDisk Image (uncompressed)
Data Size: 62569708 Bytes = 61103.23 KiB = 59.67 MiB
Load Address: 90000000
Entry Point: 90000000
root@unmatched:~# ls -lh /mnt/boot/uInitrd
-rw-r--r-- 1 root root 60M Feb 18 00:56 /mnt/boot/uInitrd
Links: