blob: 21febe73dae48d2e1301383ec15b88850667afb9 [file] [log] [blame]
Brad Bishop97cce002017-07-22 14:49:25 -04001# Base image class extension, inlined into every image.
2
3def build_uboot(d):
4 fstypes = d.getVar('IMAGE_FSTYPES', True).split()
5 if any([x.endswith('u-boot') for x in fstypes]):
6 return 'image_types_uboot'
7 return ''
8
9
10# Inherit u-boot classes if legacy uboot images are in use.
11IMAGE_TYPE_uboot = '${@build_uboot(d)}'
12inherit ${IMAGE_TYPE_uboot}
13
Brad Bishop19fc4f82017-08-04 23:38:54 -040014# Phosphor image types
15#
Brad Bishop3aa1ef62017-08-04 23:48:12 -040016# Phosphor OpenBMC supports a fixed partition mtd layout,
17# A dynamic mtd with ubi layout, and a tar file for use with
18# The reference BMC software update implementation.
Brad Bishop19fc4f82017-08-04 23:38:54 -040019
20# Image composition
Patrick Williams6edb67d2017-07-27 14:16:40 -050021FLASH_KERNEL_IMAGE ?= "${@bb.utils.contains('MACHINE_FEATURES', \
22 'obmc-ubi-fs', 'fitImage-${MACHINE}.bin', \
23 'fitImage-${INITRAMFS_IMAGE}-${MACHINE}.bin', d)}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040024IMAGE_BASETYPE ?= "squashfs-xz"
25OVERLAY_BASETYPE ?= "jffs2"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040026FLASH_UBI_BASETYPE ?= "${IMAGE_BASETYPE}"
27FLASH_UBI_OVERLAY_BASETYPE ?= "ubifs"
Brad Bishop19fc4f82017-08-04 23:38:54 -040028
Brad Bishop3aa1ef62017-08-04 23:48:12 -040029IMAGE_TYPES += "overlay mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar"
Brad Bishop19fc4f82017-08-04 23:38:54 -040030
Brad Bishop3aa1ef62017-08-04 23:48:12 -040031IMAGE_TYPEDEP_overlay = "${IMAGE_BASETYPE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040032IMAGE_TYPEDEP_mtd-static = "${IMAGE_BASETYPE}"
33IMAGE_TYPEDEP_mtd-static-tar = "${IMAGE_BASETYPE}"
34IMAGE_TYPEDEP_mtd-static-alltar = "mtd-static"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040035IMAGE_TYPEDEP_mtd-ubi = "${FLASH_UBI_BASETYPE}"
36IMAGE_TYPEDEP_mtd-ubi-tar = "${FLASH_UBI_BASETYPE}"
37IMAGE_TYPES_MASKED += "overlay mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar"
Brad Bishop19fc4f82017-08-04 23:38:54 -040038
Brad Bishop3aa1ef62017-08-04 23:48:12 -040039# Flash characteristics in KB unless otherwise noted
Brad Bishop19fc4f82017-08-04 23:38:54 -040040FLASH_SIZE ?= "32768"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040041FLASH_PEB_SIZE ?= "64"
42# Flash page and overhead sizes in bytes
43FLASH_PAGE_SIZE ?= "1"
44FLASH_NOR_UBI_OVERHEAD ?= "64"
Brad Bishop19fc4f82017-08-04 23:38:54 -040045
46# Fixed partition offsets
47FLASH_UBOOT_OFFSET ?= "0"
48FLASH_KERNEL_OFFSET ?= "512"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040049FLASH_UBI_OFFSET ?= "${FLASH_KERNEL_OFFSET}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040050FLASH_ROFS_OFFSET ?= "4864"
51FLASH_RWFS_OFFSET ?= "28672"
52
Brad Bishop3aa1ef62017-08-04 23:48:12 -040053# UBI volume sizes in KB unless otherwise noted.
54FLASH_UBI_RWFS_SIZE ?= "4096"
55FLASH_UBI_RWFS_TXT_SIZE ?= "4MiB"
56
57python() {
58 # Compute rwfs LEB count and LEB size.
59 page_size = d.getVar('FLASH_PAGE_SIZE', True)
60 nor_overhead_size = d.getVar('FLASH_NOR_UBI_OVERHEAD', True)
61 overhead_size = max(int(page_size), int(nor_overhead_size))
62 peb_size = d.getVar('FLASH_PEB_SIZE', True)
63 leb_size = (int(peb_size) * 1024) - (2 * overhead_size)
64 d.setVar('FLASH_LEB_SIZE', str(leb_size)) # In bytes
65
66 rwfs_size = d.getVar('FLASH_UBI_RWFS_SIZE', True)
67 rwfs_size = int(rwfs_size) * 1024
68 lebs = int((rwfs_size + leb_size - 1) / leb_size) # Rounding up
69 d.setVar('FLASH_UBI_RWFS_LEBS', str(lebs))
70}
71
Brad Bishop19fc4f82017-08-04 23:38:54 -040072# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
73# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
74# reserved for the primary image (and setting them currently breaks the build).
75# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
76DISTROOVERRIDES .= ":static-rwfs-${OVERLAY_BASETYPE}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040077DISTROOVERRIDES .= ":ubi-rwfs-${FLASH_UBI_OVERLAY_BASETYPE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040078
79JFFS2_RWFS_CMD = "mkfs.jffs2 --root=jffs2 --faketime --output=rwfs.jffs2"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040080UBIFS_RWFS_CMD = "mkfs.ubifs -r ubifs -c ${FLASH_UBI_RWFS_LEBS} -m ${FLASH_PAGE_SIZE} -e ${FLASH_LEB_SIZE} rwfs.ubifs"
Brad Bishop19fc4f82017-08-04 23:38:54 -040081
82FLASH_STATIC_RWFS_CMD_static-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040083FLASH_UBI_RWFS_CMD_ubi-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
84FLASH_UBI_RWFS_CMD_ubi-rwfs-ubifs = "${UBIFS_RWFS_CMD}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040085
86mk_nor_image() {
87 image_dst="$1"
88 image_size_kb=$2
89 dd if=/dev/zero bs=1k count=$image_size_kb \
90 | tr '\000' '\377' > $image_dst
91}
92
93make_rwfs() {
94 type=$1
95 cmd=$2
96 shift
97 shift
98 opts="$@"
99
100 rm -f rwfs.$type
101 rm -rf $type
102 mkdir $type
103
104 $cmd $opts
105}
106
107do_generate_rwfs_static() {
108 make_rwfs ${OVERLAY_BASETYPE} "${FLASH_STATIC_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
109}
110do_generate_rwfs_static[dirs] = " ${S}/static"
111do_generate_rwfs_static[depends] += " \
112 mtd-utils-native:do_populate_sysroot \
113 "
114
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400115do_generate_rwfs_ubi() {
116 make_rwfs ${FLASH_UBI_OVERLAY_BASETYPE} "${FLASH_UBI_RWFS_CMD}"
117}
118do_generate_rwfs_ubi[dirs] = " ${S}/ubi"
119do_generate_rwfs_ubi[depends] += " \
120 mtd-utils-native:do_populate_sysroot \
121 "
122
123add_volume() {
124 config_file=$1
125 vol_id=$2
126 vol_type=$3
127 vol_name=$4
128 image=$5
129 vol_size=$6
130
131 echo \[$vol_name\] >> $config_file
132 echo mode=ubi >> $config_file
133 echo image=$image >> $config_file
134 echo vol_type=$vol_type >> $config_file
135 echo vol_name=$vol_name >> $config_file
136 echo vol_id=$vol_id >> $config_file
137 if [ ! -z $vol_size ]; then
138 echo vol_size=$vol_size >> $config_file
139 fi
140}
141
142do_generate_ubi() {
143 cfg=ubinize-${IMAGE_NAME}.cfg
144
145 rm -f $cfg ubi-img
146
147 # Construct the ubinize config file
148 add_volume $cfg 0 static kernel0 \
149 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}
150
151 add_volume $cfg 1 static rofs0 \
152 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_BASETYPE}
153
154 add_volume $cfg 2 dynamic rwfs rwfs.${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_RWFS_TXT_SIZE}
155
156 # Build the ubi partition image
157 ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg
158
159 # Concatenate the uboot and ubi partitions
160 mk_nor_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd ${FLASH_SIZE}
161 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
162 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
163 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
164 dd bs=1k conv=notrunc seek=${FLASH_UBI_OFFSET} \
165 if=ubi-img \
166 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
167
168 cd ${IMGDEPLOYDIR}
169 ln -sf ${IMAGE_NAME}.ubi.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubi.mtd
170}
171do_generate_ubi[dirs] = "${S}/ubi"
172do_generate_ubi[depends] += " \
173 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
174 virtual/kernel:do_deploy \
175 u-boot:do_populate_sysroot \
176 mtd-utils-native:do_populate_sysroot \
177 "
178
Brad Bishop19fc4f82017-08-04 23:38:54 -0400179do_generate_static() {
180 # Assemble the flash image
181 mk_nor_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd ${FLASH_SIZE}
182 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
183 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
184 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
185
186 dd bs=1k conv=notrunc seek=${FLASH_KERNEL_OFFSET} \
187 if=${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} \
188 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
189
190 dd bs=1k conv=notrunc seek=${FLASH_ROFS_OFFSET} \
191 if=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} \
192 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
193
194 dd bs=1k conv=notrunc seek=${FLASH_RWFS_OFFSET} \
195 if=rwfs.${OVERLAY_BASETYPE} \
196 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
197 # File needed for generating non-standard legacy links below
198 cp rwfs.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/rwfs.${OVERLAY_BASETYPE}
199
200 cd ${IMGDEPLOYDIR}
201 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd
202
203 # Maintain non-standard legacy links
204 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/flash-${MACHINE}
205 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/image-bmc
206 ln -sf u-boot.${UBOOT_SUFFIX} ${IMGDEPLOYDIR}/image-u-boot
207 ln -sf ${FLASH_KERNEL_IMAGE} ${IMGDEPLOYDIR}/image-kernel
208 ln -sf ${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} ${IMGDEPLOYDIR}/image-rofs
209 ln -sf rwfs.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/image-rwfs
210}
211do_generate_static[dirs] = "${S}/static"
212do_generate_static[depends] += " \
213 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
214 virtual/kernel:do_deploy \
215 u-boot:do_populate_sysroot \
216 "
217
218do_generate_static_alltar() {
219 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd image-bmc
220 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd.all.tar image-bmc
221
222 cd ${IMGDEPLOYDIR}
223
224 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
225 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd.all.tar
226
227 # Maintain non-standard legacy link.
228 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
229 ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
230}
231do_generate_static_alltar[vardepsexclude] = "DATETIME"
232do_generate_static_alltar[dirs] = "${S}/static"
233
234make_tar_of_images() {
235 rwfs=$1
236 rofs=$2
237 type=$3
238 shift
239 shift
240 shift
241 extra_files="$@"
242
243 # Create some links to help make the tar archive
244 ln -sf ${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} image-u-boot
245 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
246 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rofs image-rofs
247 ln -sf rwfs.$rwfs image-rwfs
248
249 # Create the tar archive
250 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type.mtd.tar \
251 image-u-boot image-kernel image-rofs image-rwfs $extra_files
252
253 cd ${IMGDEPLOYDIR}
254 ln -sf ${IMAGE_NAME}.$type.mtd.tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type.mtd.tar
255}
256
257do_generate_static_tar() {
258 make_tar_of_images ${OVERLAY_BASETYPE} ${IMAGE_BASETYPE} static
259
260 # Maintain non-standard legacy link.
261 cd ${IMGDEPLOYDIR}
262 ln -sf ${IMAGE_NAME}.static.mtd.tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
263}
264do_generate_static_tar[dirs] = " ${S}/static"
265do_generate_static_tar[depends] += " \
266 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
267 virtual/kernel:do_deploy \
268 u-boot:do_populate_sysroot \
269 "
270do_generate_static_tar[vardepsexclude] = "DATETIME"
271
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400272do_generate_ubi_tar() {
273 ln -sf ${S}/MANIFEST MANIFEST
274 make_tar_of_images ${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_BASETYPE} ubi MANIFEST
275}
276do_generate_ubi_tar[dirs] = " ${S}/ubi"
277do_generate_ubi_tar[depends] += " \
278 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
279 virtual/kernel:do_deploy \
280 u-boot:do_populate_sysroot \
281 "
282
Brad Bishop19fc4f82017-08-04 23:38:54 -0400283python do_generate_phosphor_manifest() {
284 import configparser
285 import io
286 path = d.getVar('STAGING_DIR_HOST', True) + d.getVar('sysconfdir', True)
287 path = os.path.join(path, 'os-release')
288 parser = configparser.SafeConfigParser(strict=False)
289 parser.optionxform = str
290 version = ''
291 with open(path, 'r') as fd:
292 buf = '[root]\n' + fd.read()
293 fd = io.StringIO(buf)
294 parser.readfp(fd)
295 version = parser['root']['VERSION_ID']
296
297 with open('MANIFEST', 'w') as fd:
298 fd.write('purpose=xyz.openbmc_project.Software.Version.VersionPurpose.BMC\n')
299 fd.write('version={}\n'.format(version.strip('"')))
300}
301do_generate_phosphor_manifest[dirs] = "${S}"
302do_generate_phosphor_manifest[depends] += " \
303 os-release:do_populate_sysroot \
304 "
305
306addtask generate_phosphor_manifest after do_rootfs
307addtask generate_rwfs_static after do_rootfs
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400308addtask generate_rwfs_ubi after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400309
310python() {
311 types = d.getVar('IMAGE_FSTYPES', True).split()
312
313 if any([x in types for x in ['mtd-static', 'mtd-static-alltar']]):
314 bb.build.addtask(
315 'do_generate_static',
316 'do_image_complete',
317 'do_generate_rwfs_static', d)
318 if 'mtd-static-alltar' in types:
319 bb.build.addtask(
320 'do_generate_static_alltar',
321 'do_image_complete',
322 'do_generate_static', d)
323 if 'mtd-static-tar' in types:
324 bb.build.addtask(
325 'do_generate_static_tar',
326 'do_image_complete',
327 'do_generate_rwfs_static', d)
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400328
329 if 'mtd-ubi' in types:
330 bb.build.addtask(
331 'do_generate_ubi',
332 'do_image_complete',
333 'do_generate_rwfs_ubi', d)
334 if 'mtd-ubi-tar' in types:
335 bb.build.addtask(
336 'do_generate_ubi_tar',
337 'do_image_complete',
338 'do_generate_rwfs_ubi do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400339}