[neon/neon/livecd-rootfs/Neon/release] live-build: riscv: Add support for StarFive VisionFive
Alexandre Ghiti
null at kde.org
Tue Jul 26 12:23:08 BST 2022
Git commit ce9f5caccadfbd5b2eb65b9330f58fa48fa31075 by Alexandre Ghiti.
Committed on 13/07/2022 at 14:03.
Pushed by jriddell into branch 'Neon/release'.
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 at canonical.com>
M +4 -2 live-build/auto/config
M +74 -13 live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary
https://invent.kde.org/neon/neon/livecd-rootfs/commit/ce9f5caccadfbd5b2eb65b9330f58fa48fa31075
diff --git a/live-build/auto/config b/live-build/auto/config
index f67ee3d3..b594b79c 100755
--- a/live-build/auto/config
+++ b/live-build/auto/config
@@ -345,8 +345,7 @@ fi
# one also must request disk1-img-xz image format
if [ "$IMAGEFORMAT" = "ext4" ] && [ "$PROJECT" = "ubuntu-cpc" ]; then
case $ARCH:$SUBARCH in
- armhf:raspi2|riscv64:sifive_*|*:generic)
- armhf:raspi2|riscv64:sifive_*|riscv64:nezha|*:generic)
+ armhf:raspi2|riscv64:sifive_*|riscv64:nezha|riscv64:visionfive|*:generic)
IMAGE_HAS_HARDCODED_PASSWORD=1
if [ -z "${IMAGE_TARGETS:-}" ]; then
export IMAGE_TARGETS="disk1-img-xz"
@@ -943,6 +942,9 @@ case $PROJECT in
nezha)
KERNEL_FLAVOURS=allwinner
;;
+ visionfive)
+ KERNEL_FLAVOURS=starfive
+ ;;
*)
KERNEL_FLAVOURS=generic
;;
diff --git a/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary b/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary
index 9ce09413..95d07783 100755
--- a/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary
+++ b/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary
@@ -89,6 +89,19 @@ create_partitions() {
--change-name=12:CIDATA \
--new=1:: \
--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
# preinstalled server, currently FU540
# FU740 too in the future
@@ -203,15 +216,14 @@ install_grub() {
;;
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
case "${SUBARCH}" in
"nezha")
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
# FSBL, which gets U-Boot SPL
loader1="/dev/mapper${loop_device///dev/}p13"
@@ -228,6 +240,53 @@ install_grub() {
# without a cloud datasource.
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}"
if [ "${u_boot_arch}" = "hifive" ]; then
@@ -251,14 +310,16 @@ install_grub() {
esac
fi
- ## TODO remove below once we have grub-efi-riscv64
- rm mountpoint/tmp/device.map
- umount mountpoint/boot/efi
- mount
- umount_partition mountpoint
- rmdir mountpoint
- return
- ##
+ if [ "${SUBARCH}" != "visionfive" ]; then
+ ## TODO remove below once we have grub-efi-riscv64
+ rm mountpoint/tmp/device.map
+ umount mountpoint/boot/efi
+ mount
+ umount_partition mountpoint
+ rmdir mountpoint
+ return
+ ##
+ fi
;;
esac
More information about the Neon-commits
mailing list