aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mvebu/base-files
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mvebu/base-files')
-rwxr-xr-xtarget/linux/mvebu/base-files/etc/board.d/02_network2
-rw-r--r--target/linux/mvebu/base-files/lib/preinit/82_uDPU48
-rwxr-xr-xtarget/linux/mvebu/base-files/lib/upgrade/platform.sh6
-rw-r--r--target/linux/mvebu/base-files/lib/upgrade/uDPU.sh152
4 files changed, 207 insertions, 1 deletions
diff --git a/target/linux/mvebu/base-files/etc/board.d/02_network b/target/linux/mvebu/base-files/etc/board.d/02_network
index 7acbe4bf62..69c63e3791 100755
--- a/target/linux/mvebu/base-files/etc/board.d/02_network
+++ b/target/linux/mvebu/base-files/etc/board.d/02_network
@@ -49,7 +49,7 @@ marvell,armada-3720-db)
marvell,axp-gp)
ucidef_set_interface_lan "eth0 eth1 eth2 eth3"
;;
-methode,uDPU)
+methode,udpu)
ucidef_set_interfaces_lan_wan "eth1" "eth0"
;;
solidrun,clearfog*a1)
diff --git a/target/linux/mvebu/base-files/lib/preinit/82_uDPU b/target/linux/mvebu/base-files/lib/preinit/82_uDPU
new file mode 100644
index 0000000000..937a0a5f21
--- /dev/null
+++ b/target/linux/mvebu/base-files/lib/preinit/82_uDPU
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2014-2019 OpenWrt.org
+# Copyright (C) 2016 LEDE-Project.org
+#
+
+preinit_mount_udpu() {
+
+ . /lib/functions.sh
+
+ case $(board_name) in
+ methode,udpu)
+ # Check which device is detected
+ [ -b "/dev/mmcblk0" ] && mmcdev="/dev/mmcblk0" || mmcdev="/dev/mmcblk1"
+
+ if [ -b "${mmcdev}p4" ]; then
+ mkdir /misc
+ mount -t f2fs ${mmcdev}p4 /misc
+ [ -f "/misc/sysupgrade.tgz" ] && {
+ echo "- Restoring configuration files -"
+ tar xzf /misc/sysupgrade.tgz -C /
+ rm -f /misc/sysupgrade.tgz
+ sync
+ }
+ [ -f "/misc/firmware/recovery.itb" ] && {
+ echo "- Updating /recovery partition -"
+ mkfs.ext4 -q ${mmcdev}p2 | echo y &> /dev/null
+ mkdir -p /tmp/recovery
+ mount ${mmcdev}p2 /tmp/recovery
+ cp /misc/firmware/recovery.itb /tmp/recovery
+ [ -f "/misc/firmware/boot.scr" ] && \
+ cp /misc/firmware/boot.scr /tmp/recovery
+ sync
+ umount /tmp/recovery
+ rm -rf /tmp/recovery
+
+ # Replace previous backup with the new one
+ [ -d "/misc/firmware_old" ] && rm -rf /misc/firmware_old
+ [ -d "/misc/firmware" ] && mv /misc/firmware /misc/firmware_old
+ }
+ fi
+
+ # Legacy support - if rootfs was booted, instruct u-boot to keep the current root dev
+ [ "$(df | grep /dev/root)" ] && fw_setenv root_ok '2'
+ ;;
+ esac
+}
+
+boot_hook_add preinit_main preinit_mount_udpu
diff --git a/target/linux/mvebu/base-files/lib/upgrade/platform.sh b/target/linux/mvebu/base-files/lib/upgrade/platform.sh
index 58e7d83e4e..0223b72d71 100755
--- a/target/linux/mvebu/base-files/lib/upgrade/platform.sh
+++ b/target/linux/mvebu/base-files/lib/upgrade/platform.sh
@@ -28,6 +28,9 @@ platform_do_upgrade() {
marvell,armada8040-mcbin|solidrun,clearfog-base-a1|solidrun,clearfog-pro-a1)
platform_do_upgrade_sdcard "$1"
;;
+ methode,udpu)
+ platform_do_upgrade_uDPU "$1"
+ ;;
*)
default_do_upgrade "$1"
;;
@@ -42,5 +45,8 @@ platform_copy_config() {
marvell,armada8040-mcbin|solidrun,clearfog-base-a1|solidrun,clearfog-pro-a1)
platform_copy_config_sdcard
;;
+ methode,udpu)
+ platform_copy_config_uDPU
+ ;;
esac
}
diff --git a/target/linux/mvebu/base-files/lib/upgrade/uDPU.sh b/target/linux/mvebu/base-files/lib/upgrade/uDPU.sh
new file mode 100644
index 0000000000..1e98f675f6
--- /dev/null
+++ b/target/linux/mvebu/base-files/lib/upgrade/uDPU.sh
@@ -0,0 +1,152 @@
+# uDPU uses combined ext4 and f2fs partitions.
+# partition layout:
+# 1. boot (ext4)
+# 2. recovery (ext4)
+# 3. rootfs (f2fs)
+# 4. misc (f2fs)
+
+# Check which device is available, depending on the board revision
+if [ -b "/dev/mmcblk1" ]; then
+ emmc_dev=/dev/mmcblk1
+elif [ -b "/dev/mmcblk0" ]; then
+ emmc_dev=/dev/mmcblk0
+else
+ echo "Cannot detect eMMC flash, aborting.."
+ exit 1
+fi
+
+part_prep() {
+ if [ "$(grep $1 /proc/mounts)" ]; then
+ mounted_part="$(grep $1 /proc/mounts | awk '{print $2}' | head -1)"
+ umount $mounted_part
+ [ "$(grep -wo $mounted_part /proc/mounts)" ] && umount -l $mounted_part
+ fi
+}
+
+do_part_check() {
+ local emmc_parts="1 2 3 4"
+ local part_valid="1"
+
+ # Check if the block devices exist
+ for num in ${emmc_parts}; do
+ [[ ! -b ${emmc_dev}p${num} ]] && part_valid="0"
+ done
+
+ # If partitions are missing create a new partition table
+ if [ "$part_valid" != "1" ]; then
+ printf "Invalid partition table, creating a new one\n"
+ printf "o\nn\np\n1\n\n+256M\nn\np\n2\n\n+256M\nn\np\n3\n\n+1536M\nn\np\n\n\nw\n" | fdisk -W always $emmc_dev > /dev/null 2>&1
+
+ # Format the /misc part right away as we will need it for the firmware
+ printf "Formating /misc partition, this make take a while..\n"
+ part_prep ${emmc_dev}p4
+ mkfs.f2fs -q -l misc ${emmc_dev}p4
+ [ $? -eq 0 ] && printf "/misc partition formated successfully\n" || printf "/misc partition formatting failed\n"
+
+ do_initial_setup
+ else
+ printf "Partition table looks ok\n"
+ fi
+}
+
+do_misc_prep() {
+ if [ ! "$(grep -wo /misc /proc/mounts)" ]; then
+ mkdir -p /misc
+ mount ${emmc_dev}p4 /misc
+
+ # If the mount fails, try to reformat partition
+ # Leaving possiblity for multiple iterations
+ if [ $? -ne 0 ]; then
+ printf "Error while mounting /misc, trying to reformat..\n"
+
+ format_count=0
+ while [ "$format_count" -lt "1" ]; do
+ part_prep ${emmc_dev}p4
+ mkfs.f2fs -q -l misc ${emmc_dev}p4
+ mount ${emmc_dev}p4 /misc
+ if [ $? -ne 0 ]; then
+ umount -l /misc
+ printf "Failed while mounting /misc\n"
+ format_count=$((format_count +1))
+ else
+ printf "Mounted /misc successfully\n"
+ break
+ fi
+ done
+ fi
+ fi
+}
+
+do_initial_setup() {
+ # Prepare /recovery parition
+ part_prep ${emmc_dev}p2
+ mkfs.ext4 -q ${emmc_dev}p2 | echo y &> /dev/null
+
+ # Prepare /boot partition
+ part_prep ${emmc_dev}p1
+ mkfs.ext4 -q ${emmc_dev}p1 | echo y &> /dev/null
+
+ # Prepare /root partition
+ printf "Formating /root partition, this may take a while..\n"
+ part_prep ${emmc_dev}p3
+ mkfs.f2fs -q -l rootfs ${emmc_dev}p3
+ [ $? -eq 0 ] && printf "/root partition reformated\n"
+}
+
+do_regular_upgrade() {
+ # Clean /boot partition - mfks.ext4 is not available in chroot
+ [ "$(grep -wo /boot /proc/mounts)" ] && umount /boot
+ mkdir -p /tmp/boot
+ mount ${emmc_dev}p1 /tmp/boot
+ rm -rf /tmp/boot/*
+
+ # Clean /root partition - mkfs.f2fs is not available in chroot
+ [ "$(grep -wo /dev/root /proc/mounts)" ] && umount /
+ mkdir -p /tmp/rootpart
+ mount ${emmc_dev}p3 /tmp/rootpart
+ rm -rf /tmp/rootpart/*
+}
+
+platform_do_upgrade_uDPU() {
+ # Prepare and extract firmware on /misc partition
+ do_misc_prep
+
+ [ -f "/misc/firmware" ] && rm -r /misc/firmware
+ mkdir -p /misc/firmware
+ tar xzf "$1" -C /misc/firmware/
+
+ do_regular_upgrade
+
+ printf "Updating /boot partition\n"
+ tar xzf /misc/firmware/boot.tgz -C /tmp/boot
+ [ $? -eq 0 ] && printf "/boot partition updated successfully\n" || printf "/boot partition update failed\n"
+ sync
+
+ printf "Updating /root partition\n"
+ tar xzf /misc/firmware/rootfs.tgz -C /tmp/rootpart
+ [ $? -eq 0 ] && printf "/root partition updated successfully\n" || printf "/root partition update failed\n"
+ sync
+
+ # Saving configuration files over sysupgrade
+ platform_copy_config_uDPU
+
+ # Remove tmp mounts
+ tmp_parts=$(grep "${emmc_dev}" /proc/mounts | awk '{print $2}')
+ for part in ${tmp_parts}; do
+ umount $part
+ # Force umount is necessary
+ [ "$(grep "${part}" /proc/mounts)" ] && umount -l $part
+ done
+
+ # Sysupgrade complains about /tmp and /dev, so we can detach them here
+ umount -l /tmp
+ umount -l /dev
+}
+
+platform_copy_config_uDPU() {
+ # Config is saved on the /misc partition and copied on the rootfs after the reboot
+ if [ -f "/tmp/sysupgrade.tgz" ]; then
+ cp -f /tmp/sysupgrade.tgz /misc
+ sync
+ fi
+}