blob: b7cfdaf56baf1fac9134e3db2b27ec12b873da25 [file] [log] [blame]
developer8262b0d2021-11-12 09:02:17 +08001
2# Keep these values be up-to-date with definition in libfstools/rootdisk.c of fstools package
3ROOTDEV_OVERLAY_ALIGN=$((64*1024))
4F2FS_MINSIZE=$((100*1024*1024))
5
6mtk_get_root() {
7 local rootfsdev
8
9 if read cmdline < /proc/cmdline; then
10 case "$cmdline" in
11 *root=*)
12 rootfsdev="${cmdline##*root=}"
13 rootfsdev="${rootfsdev%% *}"
14 ;;
15 esac
16
17 echo "${rootfsdev}"
18 fi
19}
20
developer01dcd472022-02-10 10:30:49 +080021block_dev_path() {
22 local dev_path
23
24 case "$1" in
25 /dev/mmcblk*)
26 dev_path="$1"
27 ;;
28 PARTLABEL=* | PARTUUID=*)
29 dev_path=$(blkid -t "$1" -o device)
30 [ -z "${dev_path}" -o $? -ne 0 ] && return 1
31 ;;
32 *)
33 return 1;
34 ;;
35 esac
36
37 echo "${dev_path}"
38 return 0
39}
40
developer8262b0d2021-11-12 09:02:17 +080041mmc_upgrade_tar() {
42 local tar_file="$1"
43 local kernel_dev="$2"
44 local rootfs_dev="$3"
45
46 local board_dir=$(tar tf ${tar_file} | grep -m 1 '^sysupgrade-.*/$')
47 board_dir=${board_dir%/}
48
49 local kernel_length=$( (tar xf $tar_file ${board_dir}/kernel -O | wc -c) 2> /dev/null)
50 local rootfs_length=$( (tar xf $tar_file ${board_dir}/root -O | wc -c) 2> /dev/null)
51
52 [ "${kernel_length}" != 0 ] && {
53 tar xf ${tar_file} ${board_dir}/kernel -O >${kernel_dev}
54 }
55
56 [ "${rootfs_length}" != 0 ] && {
57 tar xf ${tar_file} ${board_dir}/root -O >${rootfs_dev}
58 }
59
60 local rootfs_dev_size=$(blockdev --getsize64 ${rootfs_dev})
61 [ $? -ne 0 ] && return 1
62
63 local rootfs_data_offset=$(((rootfs_length+ROOTDEV_OVERLAY_ALIGN-1)&~(ROOTDEV_OVERLAY_ALIGN-1)))
64 local rootfs_data_size=$((rootfs_dev_size-rootfs_data_offset))
65
66 local loopdev="$(losetup -f)"
67 losetup -o $rootfs_data_offset $loopdev $rootfs_dev || {
68 v "Failed to mount looped rootfs_data."
69 return 1
70 }
71
72 local fstype=ext4
73 local mkfs_arg="-q -L rootfs_data"
74 [ "${rootfs_data_size}" -gt "${F2FS_MINSIZE}" ] && {
75 fstype=f2fs
76 mkfs_arg="-q -l rootfs_data"
77 }
78
79 v "Format new rootfs_data at position ${rootfs_data_offset}."
80 mkfs.${fstype} ${mkfs_arg} ${loopdev}
81 [ $? -ne 0 ] && return 1
82
83 [ -n "$UPGRADE_BACKUP" ] && {
84 mkdir -p /tmp/new_root
85 mount -t ${fstype} ${loopdev} /tmp/new_root && {
86 v "Saving config to rootfs_data at position ${rootfs_data_offset}."
87 mv "$UPGRADE_BACKUP" "/tmp/new_root/$BACKUP_FILE"
88 umount /tmp/new_root
89 }
90 }
91
92 # Cleanup
93 losetup -d ${loopdev} >/dev/null 2>&1
94 sync
95
96 return 0
97}
98
developer01dcd472022-02-10 10:30:49 +080099mtk_mmc_do_upgrade_generic() {
developer8262b0d2021-11-12 09:02:17 +0800100 local tar_file="$1"
101 local board=$(board_name)
102 local kernel_dev=
103 local rootfs_dev=
104 local cmdline_root="$(mtk_get_root)"
105
developer01dcd472022-02-10 10:30:49 +0800106 rootfs_dev=$(block_dev_path "${cmdline_root}")
107 [ -z "${rootfs_dev}" -o $? -ne 0 ] && return 1
developer8262b0d2021-11-12 09:02:17 +0800108
109 case "$board" in
110 *)
111 kernel_dev=$(blkid -t "PARTLABEL=kernel" -o device)
112 [ -z "${kernel_dev}" -o $? -ne 0 ] && return 1
113 ;;
114 esac
115
116 # keep sure its unbound
117 losetup --detach-all || {
118 v "Failed to detach all loop devices."
119 sleep 10
120 reboot -f
121 }
122
123 mmc_upgrade_tar "${tar_file}" "${kernel_dev}" "${rootfs_dev}"
124
125 [ $? -ne 0 ] && {
126 v "Upgrade failed."
127 return 1
128 }
129
developer01dcd472022-02-10 10:30:49 +0800130 return 0
131}
132
133mtk_mmc_do_upgrade_dual_boot() {
134 local tar_file="$1"
135 local kernel_dev=
136 local rootfs_dev=
137 local rootfs_data_dev=
developer775ee322022-06-13 18:18:00 +0800138 local reserve_rootfs_data=$(cat /sys/module/boot_param/parameters/reserve_rootfs_data 2>/dev/null)
developer01dcd472022-02-10 10:30:49 +0800139
140 local board_dir=$(tar tf ${tar_file} | grep -m 1 '^sysupgrade-.*/$')
141 board_dir=${board_dir%/}
142
143 kernel_dev=$(cat /sys/module/boot_param/parameters/upgrade_kernel_part 2>/dev/null)
144 [ -z "${kernel_dev}" -o $? -ne 0 ] && return 1
145
146 kernel_dev=$(block_dev_path "${kernel_dev}")
147 [ -z "${kernel_dev}" -o $? -ne 0 ] && return 1
148
149 rootfs_dev=$(cat /sys/module/boot_param/parameters/upgrade_rootfs_part 2>/dev/null)
developer79d918d2022-06-13 11:10:13 +0800150 [ -z "${rootfs_dev}" -o $? -ne 0 ] && return 1
developer01dcd472022-02-10 10:30:49 +0800151
152 rootfs_dev=$(block_dev_path "${rootfs_dev}")
153 [ -z "${rootfs_dev}" -o $? -ne 0 ] && return 1
154
155 local kernel_length=$( (tar xf $tar_file ${board_dir}/kernel -O | wc -c) 2> /dev/null)
156 local rootfs_length=$( (tar xf $tar_file ${board_dir}/root -O | wc -c) 2> /dev/null)
157
158 [ "${kernel_length}" != 0 ] && {
159 tar xf ${tar_file} ${board_dir}/kernel -O >${kernel_dev}
160 }
161
162 [ "${rootfs_length}" != 0 ] && {
163 tar xf ${tar_file} ${board_dir}/root -O >${rootfs_dev}
164 }
165
166 upgrade_image_slot=$(cat /sys/module/boot_param/parameters/upgrade_image_slot 2>/dev/null)
167 [ -n "${upgrade_image_slot}" ] && {
168 v "Set new boot image slot to ${upgrade_image_slot}"
169 # Force the creation of fw_printenv.lock
170 mkdir -p /var/lock
171 touch /var/lock/fw_printenv.lock
172 fw_setenv "dual_boot.current_slot" "${upgrade_image_slot}"
developer2c65bd52022-06-10 09:32:39 +0800173 fw_setenv "dual_boot.slot_${upgrade_image_slot}_invalid" "0"
developer01dcd472022-02-10 10:30:49 +0800174 }
175
developer775ee322022-06-13 18:18:00 +0800176 if [ x"${reserve_rootfs_data}" = xY ]; then
177 # Do not touch rootfs_data
178 sync
179 return 0
180 fi
181
developer01dcd472022-02-10 10:30:49 +0800182 rootfs_data_dev=$(cat /sys/module/boot_param/parameters/rootfs_data_part 2>/dev/null)
183 [ -z "${rootfs_data_dev}" -o $? -ne 0 ] && return 0
184
185 rootfs_data_dev=$(block_dev_path "${rootfs_data_dev}")
186 [ -z "${rootfs_data_dev}" -o $? -ne 0 ] && return 1
187
188 local rootfs_data_dev_size=$(blockdev --getsize64 ${rootfs_data_dev})
189 [ $? -ne 0 ] && return 1
190
191 local fstype=ext4
192 local mkfs_arg="-q -F -L rootfs_data"
193 [ "${rootfs_data_dev_size}" -gt "${F2FS_MINSIZE}" ] && {
194 fstype=f2fs
195 mkfs_arg="-q -f -l rootfs_data"
196 }
197
198 v "Format rootfs_data."
199 mkfs.${fstype} ${mkfs_arg} ${rootfs_data_dev}
200 [ $? -ne 0 ] && return 1
201
202 [ -n "$UPGRADE_BACKUP" ] && {
203 mkdir -p /tmp/new_root
204 mount -t ${fstype} ${rootfs_data_dev} /tmp/new_root && {
205 v "Saving config to rootfs_data."
206 mv "$UPGRADE_BACKUP" "/tmp/new_root/$BACKUP_FILE"
207 umount /tmp/new_root
208 }
209 }
210
211 # Cleanup
212 sync
213
developer8262b0d2021-11-12 09:02:17 +0800214 return 0
215}
developer01dcd472022-02-10 10:30:49 +0800216
217mtk_mmc_do_upgrade() {
218 local dual_boot=$(cat /sys/module/boot_param/parameters/dual_boot 2>/dev/null)
219
220 if [ x"${dual_boot}" = xY ]; then
221 mtk_mmc_do_upgrade_dual_boot "$1"
222 else
223 mtk_mmc_do_upgrade_generic "$1"
224 fi
225
226 return $?
227}