openwrt/target/linux/gemini/base-files/lib/upgrade/platform.sh
Linus Walleij b7cee916ed gemini: sl93512r: override SL93512R partitions for firmware
This is patch is identical in form and purpose as the IB-4220-B
patch. We switch over to a single "firmware" partition.

All reference design-based machines are now converted and we can
drop the legacy set-up code.

It turns out that the reference design also uses the flash layout
with a 3072KB kernel so augment the sysupgrade to do the right
thing also here.

Link: https://github.com/openwrt/openwrt/pull/21820
(cherry picked from commit c579e1d04c)
Link: https://github.com/openwrt/openwrt/pull/21973
Signed-off-by: Linus Walleij <linusw@kernel.org>
2026-02-11 08:47:45 +01:00

122 lines
2.8 KiB
Bash

REQUIRE_IMAGE_METADATA=1
MTDSYSFS=/sys/class/mtd
gemini_check_redboot_parts() {
MTD1OF=`cat ${MTDSYSFS}/mtd1/offset`
MTD2OF=`cat ${MTDSYSFS}/mtd2/offset`
MTD3OF=`cat ${MTDSYSFS}/mtd3/offset`
MTD4OF=`cat ${MTDSYSFS}/mtd4/offset`
MTD1SZ=$((${MTD2OF} - ${MTD1OF}))
MTD2SZ=$((${MTD3OF} - ${MTD2OF}))
MTD3SZ=$((${MTD4OF} - ${MTD3OF}))
ESZ=`cat ${MTDSYSFS}/mtd1/erasesize`
if test ${ESZ} == 131072 ; then
echo "MTD has 128kb EB size"
else
echo "MTD has wrong EB size!"
fi
KSZ=$(($ESZ * $2))
RSZ=$(($ESZ * $3))
ASZ=$(($ESZ * $4))
NAME=`cat ${MTDSYSFS}/mtd1/name`
if test "x${NAME}" == "xKern" ; then
if test ${MTD1SZ} == ${KSZ} ; then
echo "MTD1 Kern ${MTD1SZ} OK..."
else
echo "MTD1 is wrong size, aborting" >&2
exit 1
fi
else
echo "MTD1 has wrong name, aborting" >&2
exit 1
fi
NAME=`cat ${MTDSYSFS}/mtd2/name`
if test "x${NAME}" == "xRamdisk" ; then
if test ${MTD2SZ} == ${RSZ} ; then
echo "MTD2 Ramdisk ${MTD2SZ} OK..."
else
echo "MTD2 is at wrong offset, aborting" >&2
exit 1
fi
else
echo "MTD2 has wrong name, aborting" >&2
exit 1
fi
NAME=`cat ${MTDSYSFS}/mtd3/name`
if test "x${NAME}" == "xApplication" ; then
if test ${MTD3SZ} == ${ASZ} ; then
echo "MTD3 Application ${MTD3SZ} OK..."
else
echo "MTD3 is at wrong offset, aborting" >&2
exit 1
fi
else
echo "MTD3 has wrong name, aborting" >&2
exit 1
fi
}
# This converts the old RedBoot partitioning to the new shared
# "firmware" partition.
gemini_do_flat_redboot_upgrade() {
ESZ=131072
KSZ=$(($ESZ * $2))
RSZ=$(($ESZ * $3))
KRSZ=$(($KSZ + $RSZ))
ASZ=$(($ESZ * $4))
echo "Partition sizes: Kern ${KSZ}, Ramdisk ${RSZ}, Application ${ASZ}"
echo "Extract Kern from flat image ${1}"
echo "Write Kern from flat image ${1}"
dd if="$1" bs=1 count=${KSZ} | mtd write - Kern
echo "Write rd.gz from flat image ${1}"
dd if="$1" bs=1 skip=${KSZ} count=${RSZ} | mtd write - Ramdisk
echo "Write hddapp.tgz from flat image ${1}"
dd if="$1" bs=1 skip=${KRSZ} count=${ASZ} | mtd write - Application
}
# Check if we have the new partition scheme, else do it the old
# way.
gemini_do_combined_upgrade() {
NAME=`cat ${MTDSYSFS}/mtd1/name`
if test "x${NAME}" == "xfirmware" ; then
PART_NAME=firmware
default_do_upgrade "$1"
else
gemini_check_redboot_parts "$1" $2 $3 $4
gemini_do_flat_redboot_upgrade "$1" $2 $3 $4
fi
}
platform_check_image() {
local board=$(board_name)
case "$board" in
dlink,dir-685|\
itian,sq201|\
storlink,gemini324|\
raidsonic,ib-4220-b)
return 0
;;
esac
echo "Sysupgrade is not yet supported on $board."
return 1
}
platform_do_upgrade() {
local board=$(board_name)
case "$board" in
dlink,dir-685)
PART_NAME=firmware
default_do_upgrade "$1"
;;
raidsonic,ib-4220-b|\
storlink,gemini324)
gemini_do_combined_upgrade "$1" 24 48 48
;;
itian,sq201)
gemini_do_combined_upgrade "$1" 16 48 48
;;
esac
}