blob: 87381faaa8a6b8085a340612e89f541ed667ce30 [file] [log] [blame]
Brad Bishop0e27f202017-07-22 14:49:25 -04001# Base image class extension, inlined into every image.
2
Saqib Khana8433f52017-09-22 10:21:30 -05003inherit image_version
Brad Bishop0e27f202017-07-22 14:49:25 -04004
Brad Bishop95c130a2017-08-04 23:38:54 -04005# Phosphor image types
6#
Brad Bishopfbb736d2017-08-04 23:48:12 -04007# Phosphor OpenBMC supports a fixed partition mtd layout,
8# A dynamic mtd with ubi layout, and a tar file for use with
9# The reference BMC software update implementation.
Brad Bishop95c130a2017-08-04 23:38:54 -040010
11# Image composition
Brad Bishop811eeec2018-03-09 00:04:00 -050012FLASH_KERNEL_IMAGE ?= "fitImage-${INITRAMFS_IMAGE}-${MACHINE}.bin"
13FLASH_KERNEL_IMAGE_df-obmc-ubi-fs ?= "fitImage-${MACHINE}.bin"
14
Brad Bishop95c130a2017-08-04 23:38:54 -040015IMAGE_BASETYPE ?= "squashfs-xz"
16OVERLAY_BASETYPE ?= "jffs2"
Brad Bishopfbb736d2017-08-04 23:48:12 -040017FLASH_UBI_BASETYPE ?= "${IMAGE_BASETYPE}"
18FLASH_UBI_OVERLAY_BASETYPE ?= "ubifs"
Brad Bishop95c130a2017-08-04 23:38:54 -040019
Brad Bishopfbb736d2017-08-04 23:48:12 -040020IMAGE_TYPES += "overlay mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar"
Brad Bishop95c130a2017-08-04 23:38:54 -040021
Brad Bishopfbb736d2017-08-04 23:48:12 -040022IMAGE_TYPEDEP_overlay = "${IMAGE_BASETYPE}"
Brad Bishop95c130a2017-08-04 23:38:54 -040023IMAGE_TYPEDEP_mtd-static = "${IMAGE_BASETYPE}"
24IMAGE_TYPEDEP_mtd-static-tar = "${IMAGE_BASETYPE}"
25IMAGE_TYPEDEP_mtd-static-alltar = "mtd-static"
Brad Bishopfbb736d2017-08-04 23:48:12 -040026IMAGE_TYPEDEP_mtd-ubi = "${FLASH_UBI_BASETYPE}"
27IMAGE_TYPEDEP_mtd-ubi-tar = "${FLASH_UBI_BASETYPE}"
28IMAGE_TYPES_MASKED += "overlay mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar"
Brad Bishop95c130a2017-08-04 23:38:54 -040029
Brad Bishopfbb736d2017-08-04 23:48:12 -040030# Flash characteristics in KB unless otherwise noted
Brad Bishop95c130a2017-08-04 23:38:54 -040031FLASH_SIZE ?= "32768"
Brad Bishopfbb736d2017-08-04 23:48:12 -040032FLASH_PEB_SIZE ?= "64"
33# Flash page and overhead sizes in bytes
34FLASH_PAGE_SIZE ?= "1"
35FLASH_NOR_UBI_OVERHEAD ?= "64"
Brad Bishop95c130a2017-08-04 23:38:54 -040036
37# Fixed partition offsets
38FLASH_UBOOT_OFFSET ?= "0"
39FLASH_KERNEL_OFFSET ?= "512"
Brad Bishopfbb736d2017-08-04 23:48:12 -040040FLASH_UBI_OFFSET ?= "${FLASH_KERNEL_OFFSET}"
Brad Bishop95c130a2017-08-04 23:38:54 -040041FLASH_ROFS_OFFSET ?= "4864"
42FLASH_RWFS_OFFSET ?= "28672"
43
Brad Bishopfbb736d2017-08-04 23:48:12 -040044# UBI volume sizes in KB unless otherwise noted.
Adriana Kobylakb7059982018-02-14 16:35:30 -060045FLASH_UBI_RWFS_SIZE ?= "6144"
46FLASH_UBI_RWFS_TXT_SIZE ?= "6MiB"
Brad Bishopfbb736d2017-08-04 23:48:12 -040047
48python() {
49 # Compute rwfs LEB count and LEB size.
50 page_size = d.getVar('FLASH_PAGE_SIZE', True)
51 nor_overhead_size = d.getVar('FLASH_NOR_UBI_OVERHEAD', True)
52 overhead_size = max(int(page_size), int(nor_overhead_size))
53 peb_size = d.getVar('FLASH_PEB_SIZE', True)
54 leb_size = (int(peb_size) * 1024) - (2 * overhead_size)
55 d.setVar('FLASH_LEB_SIZE', str(leb_size)) # In bytes
56
57 rwfs_size = d.getVar('FLASH_UBI_RWFS_SIZE', True)
58 rwfs_size = int(rwfs_size) * 1024
59 lebs = int((rwfs_size + leb_size - 1) / leb_size) # Rounding up
60 d.setVar('FLASH_UBI_RWFS_LEBS', str(lebs))
61}
62
Brad Bishop95c130a2017-08-04 23:38:54 -040063# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
64# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
65# reserved for the primary image (and setting them currently breaks the build).
66# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
67DISTROOVERRIDES .= ":static-rwfs-${OVERLAY_BASETYPE}"
Brad Bishopfbb736d2017-08-04 23:48:12 -040068DISTROOVERRIDES .= ":ubi-rwfs-${FLASH_UBI_OVERLAY_BASETYPE}"
Brad Bishop95c130a2017-08-04 23:38:54 -040069
70JFFS2_RWFS_CMD = "mkfs.jffs2 --root=jffs2 --faketime --output=rwfs.jffs2"
Brad Bishopfbb736d2017-08-04 23:48:12 -040071UBIFS_RWFS_CMD = "mkfs.ubifs -r ubifs -c ${FLASH_UBI_RWFS_LEBS} -m ${FLASH_PAGE_SIZE} -e ${FLASH_LEB_SIZE} rwfs.ubifs"
Brad Bishop95c130a2017-08-04 23:38:54 -040072
73FLASH_STATIC_RWFS_CMD_static-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
Brad Bishopfbb736d2017-08-04 23:48:12 -040074FLASH_UBI_RWFS_CMD_ubi-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
75FLASH_UBI_RWFS_CMD_ubi-rwfs-ubifs = "${UBIFS_RWFS_CMD}"
Brad Bishop95c130a2017-08-04 23:38:54 -040076
77mk_nor_image() {
78 image_dst="$1"
79 image_size_kb=$2
80 dd if=/dev/zero bs=1k count=$image_size_kb \
81 | tr '\000' '\377' > $image_dst
82}
83
84make_rwfs() {
85 type=$1
86 cmd=$2
87 shift
88 shift
89 opts="$@"
90
91 rm -f rwfs.$type
92 rm -rf $type
93 mkdir $type
94
95 $cmd $opts
96}
97
98do_generate_rwfs_static() {
99 make_rwfs ${OVERLAY_BASETYPE} "${FLASH_STATIC_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
100}
101do_generate_rwfs_static[dirs] = " ${S}/static"
102do_generate_rwfs_static[depends] += " \
103 mtd-utils-native:do_populate_sysroot \
104 "
105
Brad Bishopfbb736d2017-08-04 23:48:12 -0400106do_generate_rwfs_ubi() {
107 make_rwfs ${FLASH_UBI_OVERLAY_BASETYPE} "${FLASH_UBI_RWFS_CMD}"
108}
109do_generate_rwfs_ubi[dirs] = " ${S}/ubi"
110do_generate_rwfs_ubi[depends] += " \
111 mtd-utils-native:do_populate_sysroot \
112 "
113
114add_volume() {
115 config_file=$1
116 vol_id=$2
117 vol_type=$3
118 vol_name=$4
119 image=$5
120 vol_size=$6
121
122 echo \[$vol_name\] >> $config_file
123 echo mode=ubi >> $config_file
124 echo image=$image >> $config_file
125 echo vol_type=$vol_type >> $config_file
126 echo vol_name=$vol_name >> $config_file
127 echo vol_id=$vol_id >> $config_file
128 if [ ! -z $vol_size ]; then
129 echo vol_size=$vol_size >> $config_file
130 fi
131}
132
Saqib Khana8433f52017-09-22 10:21:30 -0500133python do_generate_ubi() {
134 version_id = do_get_versionID(d)
135 d.setVar('VERSION_ID', version_id)
136 bb.build.exec_func("do_make_ubi", d)
137}
138do_generate_ubi[dirs] = "${S}/ubi"
139do_generate_ubi[depends] += " \
140 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
141 virtual/kernel:do_deploy \
142 u-boot:do_populate_sysroot \
143 mtd-utils-native:do_populate_sysroot \
144 "
145
146do_make_ubi() {
Brad Bishopfbb736d2017-08-04 23:48:12 -0400147 cfg=ubinize-${IMAGE_NAME}.cfg
Brad Bishopfbb736d2017-08-04 23:48:12 -0400148 rm -f $cfg ubi-img
Brad Bishopfbb736d2017-08-04 23:48:12 -0400149 # Construct the ubinize config file
Saqib Khana8433f52017-09-22 10:21:30 -0500150 add_volume $cfg 0 static kernel-${VERSION_ID} \
Brad Bishopfbb736d2017-08-04 23:48:12 -0400151 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}
152
Saqib Khana8433f52017-09-22 10:21:30 -0500153 add_volume $cfg 1 static rofs-${VERSION_ID} \
Brad Bishopfbb736d2017-08-04 23:48:12 -0400154 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_BASETYPE}
155
156 add_volume $cfg 2 dynamic rwfs rwfs.${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_RWFS_TXT_SIZE}
157
158 # Build the ubi partition image
159 ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg
160
161 # Concatenate the uboot and ubi partitions
162 mk_nor_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd ${FLASH_SIZE}
163 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
164 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
165 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
166 dd bs=1k conv=notrunc seek=${FLASH_UBI_OFFSET} \
167 if=ubi-img \
168 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
169
170 cd ${IMGDEPLOYDIR}
171 ln -sf ${IMAGE_NAME}.ubi.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubi.mtd
172}
Saqib Khana8433f52017-09-22 10:21:30 -0500173do_make_ubi[dirs] = "${S}/ubi"
174do_make_ubi[depends] += " \
Brad Bishopfbb736d2017-08-04 23:48:12 -0400175 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
176 virtual/kernel:do_deploy \
177 u-boot:do_populate_sysroot \
178 mtd-utils-native:do_populate_sysroot \
179 "
180
Brad Bishop95c130a2017-08-04 23:38:54 -0400181do_generate_static() {
182 # Assemble the flash image
183 mk_nor_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd ${FLASH_SIZE}
184 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
185 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
186 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
187
188 dd bs=1k conv=notrunc seek=${FLASH_KERNEL_OFFSET} \
189 if=${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} \
190 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
191
192 dd bs=1k conv=notrunc seek=${FLASH_ROFS_OFFSET} \
193 if=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} \
194 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
195
196 dd bs=1k conv=notrunc seek=${FLASH_RWFS_OFFSET} \
197 if=rwfs.${OVERLAY_BASETYPE} \
198 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
199 # File needed for generating non-standard legacy links below
200 cp rwfs.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/rwfs.${OVERLAY_BASETYPE}
201
202 cd ${IMGDEPLOYDIR}
203 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd
204
205 # Maintain non-standard legacy links
206 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/flash-${MACHINE}
207 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/image-bmc
208 ln -sf u-boot.${UBOOT_SUFFIX} ${IMGDEPLOYDIR}/image-u-boot
209 ln -sf ${FLASH_KERNEL_IMAGE} ${IMGDEPLOYDIR}/image-kernel
210 ln -sf ${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} ${IMGDEPLOYDIR}/image-rofs
211 ln -sf rwfs.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/image-rwfs
212}
213do_generate_static[dirs] = "${S}/static"
214do_generate_static[depends] += " \
215 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
216 virtual/kernel:do_deploy \
217 u-boot:do_populate_sysroot \
218 "
219
220do_generate_static_alltar() {
221 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd image-bmc
222 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd.all.tar image-bmc
223
224 cd ${IMGDEPLOYDIR}
225
226 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
227 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd.all.tar
228
229 # Maintain non-standard legacy link.
230 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
231 ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
232}
233do_generate_static_alltar[vardepsexclude] = "DATETIME"
234do_generate_static_alltar[dirs] = "${S}/static"
235
236make_tar_of_images() {
237 rwfs=$1
238 rofs=$2
239 type=$3
240 shift
241 shift
242 shift
243 extra_files="$@"
244
245 # Create some links to help make the tar archive
246 ln -sf ${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} image-u-boot
247 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
248 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rofs image-rofs
249 ln -sf rwfs.$rwfs image-rwfs
250
251 # Create the tar archive
252 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type.mtd.tar \
253 image-u-boot image-kernel image-rofs image-rwfs $extra_files
254
255 cd ${IMGDEPLOYDIR}
256 ln -sf ${IMAGE_NAME}.$type.mtd.tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type.mtd.tar
257}
258
259do_generate_static_tar() {
260 make_tar_of_images ${OVERLAY_BASETYPE} ${IMAGE_BASETYPE} static
261
262 # Maintain non-standard legacy link.
263 cd ${IMGDEPLOYDIR}
264 ln -sf ${IMAGE_NAME}.static.mtd.tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
265}
266do_generate_static_tar[dirs] = " ${S}/static"
267do_generate_static_tar[depends] += " \
268 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
269 virtual/kernel:do_deploy \
270 u-boot:do_populate_sysroot \
271 "
272do_generate_static_tar[vardepsexclude] = "DATETIME"
273
Brad Bishopfbb736d2017-08-04 23:48:12 -0400274do_generate_ubi_tar() {
275 ln -sf ${S}/MANIFEST MANIFEST
276 make_tar_of_images ${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_BASETYPE} ubi MANIFEST
277}
278do_generate_ubi_tar[dirs] = " ${S}/ubi"
279do_generate_ubi_tar[depends] += " \
280 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
281 virtual/kernel:do_deploy \
282 u-boot:do_populate_sysroot \
283 "
284
Brad Bishop95c130a2017-08-04 23:38:54 -0400285python do_generate_phosphor_manifest() {
Saqib Khana8433f52017-09-22 10:21:30 -0500286 version = do_get_version(d)
Brad Bishop95c130a2017-08-04 23:38:54 -0400287 with open('MANIFEST', 'w') as fd:
288 fd.write('purpose=xyz.openbmc_project.Software.Version.VersionPurpose.BMC\n')
289 fd.write('version={}\n'.format(version.strip('"')))
290}
291do_generate_phosphor_manifest[dirs] = "${S}"
292do_generate_phosphor_manifest[depends] += " \
293 os-release:do_populate_sysroot \
294 "
295
296addtask generate_phosphor_manifest after do_rootfs
297addtask generate_rwfs_static after do_rootfs
Brad Bishopfbb736d2017-08-04 23:48:12 -0400298addtask generate_rwfs_ubi after do_rootfs
Brad Bishop95c130a2017-08-04 23:38:54 -0400299
300python() {
301 types = d.getVar('IMAGE_FSTYPES', True).split()
302
303 if any([x in types for x in ['mtd-static', 'mtd-static-alltar']]):
304 bb.build.addtask(
305 'do_generate_static',
306 'do_image_complete',
307 'do_generate_rwfs_static', d)
308 if 'mtd-static-alltar' in types:
309 bb.build.addtask(
310 'do_generate_static_alltar',
311 'do_image_complete',
312 'do_generate_static', d)
313 if 'mtd-static-tar' in types:
314 bb.build.addtask(
315 'do_generate_static_tar',
316 'do_image_complete',
317 'do_generate_rwfs_static', d)
Brad Bishopfbb736d2017-08-04 23:48:12 -0400318
319 if 'mtd-ubi' in types:
320 bb.build.addtask(
321 'do_generate_ubi',
322 'do_image_complete',
323 'do_generate_rwfs_ubi', d)
324 if 'mtd-ubi-tar' in types:
325 bb.build.addtask(
326 'do_generate_ubi_tar',
327 'do_image_complete',
328 'do_generate_rwfs_ubi do_generate_phosphor_manifest', d)
Brad Bishop95c130a2017-08-04 23:38:54 -0400329}