[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