summaryrefslogtreecommitdiff
path: root/alt-rootfs-installer/socs.d/K1x-riscv64.sh
diff options
context:
space:
mode:
Diffstat (limited to 'alt-rootfs-installer/socs.d/K1x-riscv64.sh')
-rwxr-xr-xalt-rootfs-installer/socs.d/K1x-riscv64.sh92
1 files changed, 92 insertions, 0 deletions
diff --git a/alt-rootfs-installer/socs.d/K1x-riscv64.sh b/alt-rootfs-installer/socs.d/K1x-riscv64.sh
new file mode 100755
index 0000000..3ec7c35
--- /dev/null
+++ b/alt-rootfs-installer/socs.d/K1x-riscv64.sh
@@ -0,0 +1,92 @@
+#!/bin/bash
+# vim:sw=8:noet
+
+FSBL_UID=496846A9-9E0A-4ABA-9736-A41A9FC6B5D8
+ENV_UID=5F720A03-FF87-4B93-A46F-F5788594EA3B
+OPENSBI_UID=0FCB0F7C-4A6C-4C81-8C69-4F0A67F0D5E7
+UBOOT_UID=3E5B8F92-0BFF-4E20-8E88-7EEC40A7CC42
+
+MEDIATABLE=gpt
+ROOTPART_NUM=1
+START_SECTOR=4 # MiB
+CONSOLE=1
+
+soc_write_bootloader() {
+ unmount_partition
+
+ if [ -n "$ROOTFS" ]; then
+ print_message "Creating partitions for FSBL, ENV, OpenSBI and U-Boot..."
+
+ sgdisk -a 1 \
+ --new=0:256:+256K --change-name=0:fsbl \
+ --typecode=0:"$FSBL_UID" \
+ --new=0:768:+64K --change-name=0:env \
+ --typecode=0:"$ENV_UID" \
+ --new=0:2048:+1M --change-name=0:opensbi \
+ --typecode=0:"$OPENSBI_UID" \
+ --new=0:4096:+2M --change-name=0:uboot \
+ --typecode=0:"$UBOOT_UID" \
+ "$MEDIA" ||
+ fatal_error "failed to create bootloader partitions"
+
+ sgdisk --sort "$MEDIA" ||
+ fatal_error "failed to sort partitions by sector"
+ print_done
+ sync_partitions
+ fi
+
+ local FSBLPART ENVPART UBOOTPART OPENSBIPART
+ PART_NUMS=$(ls "$MEDIA"* | sed "s:$MEDIA::" | sed 's/^p//')
+ for PART_NUM in $PART_NUMS; do
+ local CODE
+ CODE=$(sgdisk -i "$PART_NUM" "$MEDIA" |
+ grep 'Partition GUID code:' | cut -d ' ' -f 4)
+ case "$CODE" in
+ "$FSBL_UID") FSBLPART="${MEDIA}${partsuffix-}${PART_NUM}";;
+ "$ENV_UID") ENVPART="${MEDIA}${partsuffix-}${PART_NUM}";;
+ "$OPENSBI_UID") OPENSBIPART="${MEDIA}${partsuffix-}${PART_NUM}";;
+ "$UBOOT_UID") UBOOTPART="${MEDIA}${partsuffix-}${PART_NUM}";;
+ esac
+ done
+
+ # ensure we have all necessary partitions
+ [ -n "$FSBLPART" ] && [ -n "$ENVPART" ] && [ -n "$OPENSBIPART" ] && [ -n "$UBOOTPART" ] ||
+ fatal_error "bootloader partitions not found: expected FSBL, ENV, OpenSBI, U-Boot"
+
+ # find actual rootfs after bootloader zone
+ local RAW_START=$((START_SECTOR * 2048))
+ local PART_NUMS PART_NUM PS
+ PART_NUMS=$(ls "$MEDIA"* | sed "s:$MEDIA::" | sed 's/^p//')
+ for PART_NUM in $PART_NUMS; do
+ PS=$(sgdisk -i "$PART_NUM" "$MEDIA" 2>/dev/null |
+ grep 'First sector:' | tr -s ' ' | cut -d ' ' -f 3)
+ if [ -n "$PS" ] && [ "$PS" -ge "$RAW_START" ]; then
+ ROOTPART_NUM=$PART_NUM
+ break
+ fi
+ done
+
+ ROOTPART="${MEDIA}${partsuffix-}${ROOTPART_NUM}"
+
+ mount_partition
+
+ TARGET=spacemit-k1x set_path_to_uboot
+ print_message "Searching for U-Boot files for ${TARGET-}..."
+ [ -d "$UBOOT" ] || fatal_error "U-Boot files for ${TARGET-} were not found"
+ print_done
+
+ print_message "Searching for OpenSBI files for ${TARGET-}..."
+ OPENSBI="${TMPROOT-}/usr/share/opensbi-spacemit/k1x"
+ [ -d "$OPENSBI" ] || fatal_error "OpenSBI files for ${TARGET-} were not found"
+ print_done
+
+ write_partition_blob "bootinfo" "$UBOOT/bootinfo_sd.bin" "$MEDIA" "1M"
+
+ write_partition_blob "FSBL" "$UBOOT/FSBL.bin" "$FSBLPART"
+
+ write_partition_blob "U-Boot environment" "$UBOOT/u-boot-env-default.bin" "$ENVPART"
+
+ write_partition_blob "U-Boot" "$UBOOT/u-boot.itb" "$UBOOTPART"
+
+ write_partition_blob "OpenSBI" "$OPENSBI/generic/firmware/fw_dynamic.itb" "$OPENSBIPART"
+}