blob: 19878d43e7ae373261f72bdc56a4090c7df95258 [file] [log] [blame]
Adriana Kobylake882f912017-07-06 10:31:59 -05001#!/bin/sh
2
3# Get the mtd device number (mtdX)
4findmtd() {
5 m="$(grep -xl "$1" /sys/class/mtd/*/name)"
6 m="${m%/name}"
7 m="${m##*/}"
8 echo "${m}"
9}
10
Adriana Kobylakf15e77c2017-07-06 11:26:42 -050011# Get the ubi device number (ubiX_Y)
12findubi() {
13 u="$(grep -xl "$1" /sys/class/ubi/ubi?/subsystem/ubi*/name)"
14 u="${u%/name}"
15 u="${u##*/}"
16 echo "${u}"
17}
18
19# Get the mount information
20is_mounted() {
21 grep -q "$1" /proc/mounts
22 return $?
23}
24
Saqib Khance611932017-08-01 09:46:22 -050025# Attach the pnor mtd device to ubi.
Adriana Kobylake882f912017-07-06 10:31:59 -050026attach_ubi() {
27 pnormtd="$(findmtd pnor)"
28 pnor="${pnormtd#mtd}"
29 pnordev="/dev/mtd${pnor}"
30
31 ubiattach /dev/ubi_ctrl -m "${pnor}" -d "${pnor}"
32 rc=$?
33 if [ ${rc} -ne 0 ]; then
34 # Check the pnor mtd device is formatted as ubi by reading the first 3 byes,
35 # which should be the ascii chars 'UBI'
36 magic="$(hexdump -C -n 3 ${pnordev})"
37 if [[ "${magic}" =~ "UBI" ]]; then
38 # Device already formatted as ubi, ubiattach failed for some other reason
39 return ${rc}
40 else
41 # Format device as ubi
42 echo "Starting ubiformat ${pnordev}"
43 ubiformat "${pnordev}" -y -q
44 # Retry the ubiattach
45 ubiattach /dev/ubi_ctrl -m "${pnor}" -d "${pnor}"
46 fi
47 fi
48}
49
Adriana Kobylakf15e77c2017-07-06 11:26:42 -050050mount_squashfs() {
51 pnormtd="$(findmtd pnor)"
52 pnor="${pnormtd#mtd}"
53 ubidev="/dev/ubi${pnor}"
54 mountdir="/media/${name}"
55
56 if [ ! -d "${mountdir}" ]; then
57 mkdir "${mountdir}"
58 fi
59
Adriana Kobylakd3165592017-07-18 12:24:24 -050060 # Create a static ubi volume of arbitrary size 24MB,
61 # the current pnor image is ~19MB
62 # TODO Set size based on file size openbmc/openbmc#1840
Adriana Kobylakf15e77c2017-07-06 11:26:42 -050063 vol="$(findubi "${name}")"
64 if [ -z "${vol}" ]; then
Adriana Kobylakd3165592017-07-18 12:24:24 -050065 ubimkvol "${ubidev}" -N "${name}" -s 24MiB --type=static
Adriana Kobylakf15e77c2017-07-06 11:26:42 -050066 vol="$(findubi "${name}")"
67 fi
68
69 # Create a ubi block needed for read-only volumes,
70 # and update the volume with the pnor squashfs image
71 ubidevid="${vol#ubi}"
72 block="/dev/ubiblock${ubidevid}"
73 if [ ! -e "$block" ]; then
74 img="/tmp/images/${version}/pnor.xz.squashfs"
75 ubiblock --create "/dev/ubi${ubidevid}"
76 ubiupdatevol "/dev/ubi${ubidevid}" "${img}"
77 fi
78
79 if ! is_mounted "${name}"; then
80 mount -t squashfs -o ro "${block}" "${mountdir}"
81 fi
82}
83
Adriana Kobylak6aff5742017-07-06 11:29:46 -050084mount_ubi() {
85 pnormtd="$(findmtd pnor)"
86 pnor="${pnormtd#mtd}"
87 ubidev="/dev/ubi${pnor}"
Adriana Kobylakf287af32017-07-12 13:52:22 -050088
89 if [[ "${name}" == "pnor-patch" ]]; then
90 mountdir="/usr/local/share/pnor"
91 else
92 mountdir="/media/${name}"
93 fi
Adriana Kobylak6aff5742017-07-06 11:29:46 -050094
Adriana Kobylakd3165592017-07-18 12:24:24 -050095 if [[ "${name}" == "pnor-prsv" ]]; then
96 size="2MiB"
97 else
98 size="16MiB"
99 fi
100
Adriana Kobylak6aff5742017-07-06 11:29:46 -0500101 if [ ! -d "${mountdir}" ]; then
Adriana Kobylakf287af32017-07-12 13:52:22 -0500102 mkdir -p "${mountdir}"
Adriana Kobylak6aff5742017-07-06 11:29:46 -0500103 fi
104
Adriana Kobylak6aff5742017-07-06 11:29:46 -0500105 vol="$(findubi "${name}")"
106 if [ -z "${vol}" ]; then
Adriana Kobylakd3165592017-07-18 12:24:24 -0500107 ubimkvol "${ubidev}" -N "${name}" -s "${size}"
Adriana Kobylak6aff5742017-07-06 11:29:46 -0500108 fi
109
110 if ! is_mounted "${name}"; then
111 mountdev="ubi${pnor}:${name}"
112 mount -t ubifs "${mountdev}" "${mountdir}"
113 fi
114}
115
Adriana Kobylake5764af2017-06-07 15:24:52 -0500116umount_ubi() {
117 pnormtd="$(findmtd pnor)"
118 pnor="${pnormtd#mtd}"
119 ubidev="/dev/ubi${pnor}"
120 mountdir="/media/${name}"
121
122 if is_mounted "${name}"; then
123 umount "${mountdir}"
124 fi
125
126 vol="$(findubi "${name}")"
127 if [ -n "${vol}" ]; then
128 ubirmvol "${ubidev}" -N "${name}"
129 fi
130
131 if [ -d "${mountdir}" ]; then
132 rm -r "${mountdir}"
133 fi
134}
135
Saqib Khan58c870d2017-07-26 23:48:20 -0500136remount_ubi() {
137 pnormtd="$(findmtd pnor)"
138 pnor="${pnormtd#mtd}"
Saqib Khance611932017-08-01 09:46:22 -0500139 pnordev="/dev/mtd${pnor}"
140
141 # Re-Attach the pnor mtd device to ubi
142 ubiattach /dev/ubi_ctrl -m "${pnor}" -d "${pnor}"
143 rc=$?
144 if [ ${rc} -ne 0 ]; then
145 # Check the pnor mtd device is formatted as ubi by reading
146 # the first 3 byes, which should be the ascii chars 'UBI'
147 magic="$(hexdump -C -n 3 ${pnordev})"
148 if [[ ! "${magic}" =~ "UBI" ]]; then
149 # Device not formatted as ubi.
150 return
151 fi
152 fi
153
Saqib Khan58c870d2017-07-26 23:48:20 -0500154 # Get information on all ubi volumes
155 ubinfo=$(ubinfo -d ${pnor})
156 presentVolumes=${ubinfo##*:}
157 IFS=', ' read -r -a array <<< "$presentVolumes"
158 for element in ${array[@]};
159 do
160 elementProperties=$(ubinfo -d $pnor -n $element)
161 # Get ubi volume name by getting rid of additional properties
162 name=${elementProperties#*Name:}
163 name="${name%Character*}"
164 name="$(echo -e "${name}" | tr -d '[:space:]')"
165
166 if [[ ${name} == pnor-prsv ]] || [[ ${name} == pnor-rw* ]] || [[ ${name} == pnor-ro* ]]; then
167 mountdir="/media/${name}"
Saqib Khan76b7b832017-08-01 11:32:27 -0500168 if [ ! -d "${mountdir}" ]; then
169 mkdir -p "${mountdir}"
170 fi
171
Saqib Khan58c870d2017-07-26 23:48:20 -0500172 if [[ ${name} == pnor-ro* ]]
173 then
174 ubiblock --create /dev/ubi${pnor}_${element}
175 mount -t squashfs -o ro "/dev/ubiblock${pnor}_${element}" "${mountdir}"
176 else
177 mount -t ubifs "ubi${pnor}:${name}" "${mountdir}"
178 fi
179 fi
180 done
181}
182
Adriana Kobylake882f912017-07-06 10:31:59 -0500183case "$1" in
184 ubiattach)
185 attach_ubi
186 ;;
Adriana Kobylakf15e77c2017-07-06 11:26:42 -0500187 squashfsmount)
188 name="$2"
189 version="$3"
190 mount_squashfs
191 ;;
Adriana Kobylak6aff5742017-07-06 11:29:46 -0500192 ubimount)
193 name="$2"
194 mount_ubi
195 ;;
Adriana Kobylake5764af2017-06-07 15:24:52 -0500196 ubiumount)
197 name="$2"
198 umount_ubi
199 ;;
Saqib Khan58c870d2017-07-26 23:48:20 -0500200 ubiremount)
201 remount_ubi
202 ;;
Adriana Kobylake882f912017-07-06 10:31:59 -0500203 *)
204 echo "Invalid argument"
205 exit 1
206 ;;
207esac
208rc=$?
209if [ ${rc} -ne 0 ]; then
210 echo "$0: error ${rc}"
211 exit ${rc}
212fi