riscv: Add support for StarFive VisionFive

The image created uses a UEFI bootflow, so we install grub for this board
only. We also need flash-kernel to install the dtb where grub can find
it.

This image is specifically architectured so that it can be installed on
a "factory" board, meaning using the u-boot firmware which was
originally implemented for Fedora, so we need the p3 partition that
embeds a uEnv.txt file to tell u-boot what/where to load next stage.

Signed-off-by: Alexandre Ghiti <alexandre.ghiti@canonical.com>
intel-iotg-server-jammy
Alexandre Ghiti 3 years ago
parent 80c5ccd5c1
commit ce9f5cacca

@ -345,8 +345,7 @@ fi
# one also must request disk1-img-xz image format # one also must request disk1-img-xz image format
if [ "$IMAGEFORMAT" = "ext4" ] && [ "$PROJECT" = "ubuntu-cpc" ]; then if [ "$IMAGEFORMAT" = "ext4" ] && [ "$PROJECT" = "ubuntu-cpc" ]; then
case $ARCH:$SUBARCH in case $ARCH:$SUBARCH in
armhf:raspi2|riscv64:sifive_*|*:generic) armhf:raspi2|riscv64:sifive_*|riscv64:nezha|riscv64:visionfive|*:generic)
armhf:raspi2|riscv64:sifive_*|riscv64:nezha|*:generic)
IMAGE_HAS_HARDCODED_PASSWORD=1 IMAGE_HAS_HARDCODED_PASSWORD=1
if [ -z "${IMAGE_TARGETS:-}" ]; then if [ -z "${IMAGE_TARGETS:-}" ]; then
export IMAGE_TARGETS="disk1-img-xz" export IMAGE_TARGETS="disk1-img-xz"
@ -943,6 +942,9 @@ case $PROJECT in
nezha) nezha)
KERNEL_FLAVOURS=allwinner KERNEL_FLAVOURS=allwinner
;; ;;
visionfive)
KERNEL_FLAVOURS=starfive
;;
*) *)
KERNEL_FLAVOURS=generic KERNEL_FLAVOURS=generic
;; ;;

@ -89,6 +89,19 @@ create_partitions() {
--change-name=12:CIDATA \ --change-name=12:CIDATA \
--new=1:: \ --new=1:: \
--attributes=1:set:2 --attributes=1:set:2
elif [ "${SUBARCH:-}" = "visionfive" ]; then
# VisionFive
sgdisk "${disk_image}" \
--set-alignment=2 \
--new=15::+106M \
--typecode=15:ef00 \
--change-name=15:ESP \
--new=12::+4M \
--change-name=12:CIDATA \
--new=3::+1M \
--change-name=3:uEnv \
--new=1:: \
--attributes=1:set:2
else else
# preinstalled server, currently FU540 # preinstalled server, currently FU540
# FU740 too in the future # FU740 too in the future
@ -203,15 +216,14 @@ install_grub() {
;; ;;
riscv64) riscv64)
# TODO grub-efi-riscv64 does not exist yet on riscv64 # TODO grub-efi-riscv64 does not exist yet on riscv64
chroot mountpoint apt-get install -qqy u-boot-menu #grub-efi-riscv64
efi_target=riscv64-efi
chroot mountpoint u-boot-update
if [ -n "${SUBARCH:-}" ]; then if [ -n "${SUBARCH:-}" ]; then
case "${SUBARCH}" in case "${SUBARCH}" in
"nezha") "nezha")
echo "Installing U-Boot for Nezha board" &1>2 echo "Installing U-Boot for Nezha board" &1>2
chroot mountpoint apt-get install -qqy u-boot-menu #grub-efi-riscv64
efi_target=riscv64-efi
chroot mountpoint u-boot-update
chroot mountpoint apt-get install -qqy nezha-boot0 chroot mountpoint apt-get install -qqy nezha-boot0
# FSBL, which gets U-Boot SPL # FSBL, which gets U-Boot SPL
loader1="/dev/mapper${loop_device///dev/}p13" loader1="/dev/mapper${loop_device///dev/}p13"
@ -228,6 +240,53 @@ install_grub() {
# without a cloud datasource. # without a cloud datasource.
setup_cinocloud mountpoint setup_cinocloud mountpoint
;; ;;
"visionfive")
echo "Installing GRUB for VisionFive board" &1>2
# flash-kernel is needed to install the dtb for update-grub: it uses the
# /proc/device-tree/model value to pick the correct dtb and as we are in a chroot,
# the model value is wrong and we need to use /etc/flash-kernel/machine instead.
# This explains why we install flash-kernel here.
chroot mountpoint mkdir -p /etc/flash-kernel/
chroot mountpoint bash -c "echo 'StarFive VisionFive V1' > /etc/flash-kernel/machine"
chroot mountpoint apt-get install -qqy grub-efi-riscv64 flash-kernel
efi_target=riscv64-efi
# factory u-boot requires a p3 partition with /boot/uEnv.txt file
uenv_dev="/dev/mapper${loop_device///dev/}p3"
mkfs.ext4 "${uenv_dev}"
uenv_mnt_dir=`mktemp -d uenvXXX`
mount "${uenv_dev}" "${uenv_mnt_dir}"
mkdir -p "${uenv_mnt_dir}"/boot
cat <<'EOF' >${uenv_mnt_dir}/boot/uEnv.txt
scriptaddr=0x88100000
script_offset_f=0x1fff000
script_size_f=0x1000
kernel_addr_r=0x84000000
kernel_comp_addr_r=0x90000000
kernel_comp_size=0x10000000
fdt_addr_r=0x88000000
ramdisk_addr_r=0x88300000
bootcmd=load mmc 0:f ${kernel_addr_r} /EFI/ubuntu/grubriscv64.efi; bootefi ${kernel_addr_r}
bootcmd_mmc0=devnum=0; run mmc_boot
ipaddr=192.168.120.200
netmask=255.255.255.0
EOF
umount "${uenv_mnt_dir}"
rmdir "${uenv_mnt_dir}"
# Provide end-user modifyable CIDATA
cidata_dev="/dev/mapper${loop_device///dev/}p12"
setup_cidata "${cidata_dev}"
# Provide stock nocloud datasource
# Allow interactive login on baremetal SiFive board,
# without a cloud datasource.
setup_cinocloud mountpoint
;;
*) *)
u_boot_arch="${SUBARCH}" u_boot_arch="${SUBARCH}"
if [ "${u_boot_arch}" = "hifive" ]; then if [ "${u_boot_arch}" = "hifive" ]; then
@ -251,14 +310,16 @@ install_grub() {
esac esac
fi fi
## TODO remove below once we have grub-efi-riscv64 if [ "${SUBARCH}" != "visionfive" ]; then
rm mountpoint/tmp/device.map ## TODO remove below once we have grub-efi-riscv64
umount mountpoint/boot/efi rm mountpoint/tmp/device.map
mount umount mountpoint/boot/efi
umount_partition mountpoint mount
rmdir mountpoint umount_partition mountpoint
return rmdir mountpoint
## return
##
fi
;; ;;
esac esac

Loading…
Cancel
Save