blob: 441d87fb35559fc2f95dc50fe680381aaa65270b [file] [log] [blame]
Brad Bishop97cce002017-07-22 14:49:25 -04001# Base image class extension, inlined into every image.
2
Saqib Khan41723472017-09-22 10:21:30 -05003inherit image_version
Brad Bishop97cce002017-07-22 14:49:25 -04004
Brad Bishop19fc4f82017-08-04 23:38:54 -04005# Phosphor image types
6#
Brad Bishop3aa1ef62017-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 Bishop19fc4f82017-08-04 23:38:54 -040010
11# Image composition
Brad Bishop8623bbe2018-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 Bishop19fc4f82017-08-04 23:38:54 -040015IMAGE_BASETYPE ?= "squashfs-xz"
16OVERLAY_BASETYPE ?= "jffs2"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040017FLASH_UBI_BASETYPE ?= "${IMAGE_BASETYPE}"
18FLASH_UBI_OVERLAY_BASETYPE ?= "ubifs"
Brad Bishop19fc4f82017-08-04 23:38:54 -040019
Brad Bishop02ee6ae2018-03-30 08:43:23 -040020IMAGE_TYPES += "mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar"
Brad Bishop19fc4f82017-08-04 23:38:54 -040021
22IMAGE_TYPEDEP_mtd-static = "${IMAGE_BASETYPE}"
23IMAGE_TYPEDEP_mtd-static-tar = "${IMAGE_BASETYPE}"
24IMAGE_TYPEDEP_mtd-static-alltar = "mtd-static"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040025IMAGE_TYPEDEP_mtd-ubi = "${FLASH_UBI_BASETYPE}"
26IMAGE_TYPEDEP_mtd-ubi-tar = "${FLASH_UBI_BASETYPE}"
Brad Bishop02ee6ae2018-03-30 08:43:23 -040027IMAGE_TYPES_MASKED += "mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar"
Brad Bishop19fc4f82017-08-04 23:38:54 -040028
Brad Bishop3aa1ef62017-08-04 23:48:12 -040029# Flash characteristics in KB unless otherwise noted
Brad Bishop19fc4f82017-08-04 23:38:54 -040030FLASH_SIZE ?= "32768"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040031FLASH_PEB_SIZE ?= "64"
32# Flash page and overhead sizes in bytes
33FLASH_PAGE_SIZE ?= "1"
34FLASH_NOR_UBI_OVERHEAD ?= "64"
Brad Bishop19fc4f82017-08-04 23:38:54 -040035
36# Fixed partition offsets
37FLASH_UBOOT_OFFSET ?= "0"
38FLASH_KERNEL_OFFSET ?= "512"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040039FLASH_UBI_OFFSET ?= "${FLASH_KERNEL_OFFSET}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040040FLASH_ROFS_OFFSET ?= "4864"
41FLASH_RWFS_OFFSET ?= "28672"
42
Brad Bishop3aa1ef62017-08-04 23:48:12 -040043# UBI volume sizes in KB unless otherwise noted.
Adriana Kobylakb70005d2018-02-14 16:35:30 -060044FLASH_UBI_RWFS_SIZE ?= "6144"
45FLASH_UBI_RWFS_TXT_SIZE ?= "6MiB"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040046
Eddie Jamesb2b7ff62018-02-09 11:59:18 -060047SIGNING_KEY ?= "${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv"
48INSECURE_KEY = "${@'${SIGNING_KEY}' == '${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv'}"
49SIGNING_KEY_DEPENDS = "${@oe.utils.conditional('INSECURE_KEY', 'True', 'phosphor-insecure-signing-key-native:do_populate_sysroot', '', d)}"
50
Brad Bishop3aa1ef62017-08-04 23:48:12 -040051python() {
52 # Compute rwfs LEB count and LEB size.
53 page_size = d.getVar('FLASH_PAGE_SIZE', True)
54 nor_overhead_size = d.getVar('FLASH_NOR_UBI_OVERHEAD', True)
55 overhead_size = max(int(page_size), int(nor_overhead_size))
56 peb_size = d.getVar('FLASH_PEB_SIZE', True)
57 leb_size = (int(peb_size) * 1024) - (2 * overhead_size)
58 d.setVar('FLASH_LEB_SIZE', str(leb_size)) # In bytes
59
60 rwfs_size = d.getVar('FLASH_UBI_RWFS_SIZE', True)
61 rwfs_size = int(rwfs_size) * 1024
62 lebs = int((rwfs_size + leb_size - 1) / leb_size) # Rounding up
63 d.setVar('FLASH_UBI_RWFS_LEBS', str(lebs))
64}
65
Brad Bishop19fc4f82017-08-04 23:38:54 -040066# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
67# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
68# reserved for the primary image (and setting them currently breaks the build).
69# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
70DISTROOVERRIDES .= ":static-rwfs-${OVERLAY_BASETYPE}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040071DISTROOVERRIDES .= ":ubi-rwfs-${FLASH_UBI_OVERLAY_BASETYPE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040072
73JFFS2_RWFS_CMD = "mkfs.jffs2 --root=jffs2 --faketime --output=rwfs.jffs2"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040074UBIFS_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 -040075
76FLASH_STATIC_RWFS_CMD_static-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040077FLASH_UBI_RWFS_CMD_ubi-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
78FLASH_UBI_RWFS_CMD_ubi-rwfs-ubifs = "${UBIFS_RWFS_CMD}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040079
80mk_nor_image() {
81 image_dst="$1"
82 image_size_kb=$2
83 dd if=/dev/zero bs=1k count=$image_size_kb \
84 | tr '\000' '\377' > $image_dst
85}
86
87make_rwfs() {
88 type=$1
89 cmd=$2
90 shift
91 shift
92 opts="$@"
93
94 rm -f rwfs.$type
95 rm -rf $type
96 mkdir $type
97
98 $cmd $opts
99}
100
101do_generate_rwfs_static() {
102 make_rwfs ${OVERLAY_BASETYPE} "${FLASH_STATIC_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
103}
104do_generate_rwfs_static[dirs] = " ${S}/static"
105do_generate_rwfs_static[depends] += " \
106 mtd-utils-native:do_populate_sysroot \
107 "
108
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400109do_generate_rwfs_ubi() {
110 make_rwfs ${FLASH_UBI_OVERLAY_BASETYPE} "${FLASH_UBI_RWFS_CMD}"
111}
112do_generate_rwfs_ubi[dirs] = " ${S}/ubi"
113do_generate_rwfs_ubi[depends] += " \
114 mtd-utils-native:do_populate_sysroot \
115 "
116
117add_volume() {
118 config_file=$1
119 vol_id=$2
120 vol_type=$3
121 vol_name=$4
122 image=$5
123 vol_size=$6
124
125 echo \[$vol_name\] >> $config_file
126 echo mode=ubi >> $config_file
127 echo image=$image >> $config_file
128 echo vol_type=$vol_type >> $config_file
129 echo vol_name=$vol_name >> $config_file
130 echo vol_id=$vol_id >> $config_file
131 if [ ! -z $vol_size ]; then
132 echo vol_size=$vol_size >> $config_file
133 fi
134}
135
Saqib Khan41723472017-09-22 10:21:30 -0500136python do_generate_ubi() {
137 version_id = do_get_versionID(d)
138 d.setVar('VERSION_ID', version_id)
139 bb.build.exec_func("do_make_ubi", d)
140}
141do_generate_ubi[dirs] = "${S}/ubi"
142do_generate_ubi[depends] += " \
143 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
144 virtual/kernel:do_deploy \
145 u-boot:do_populate_sysroot \
146 mtd-utils-native:do_populate_sysroot \
147 "
148
149do_make_ubi() {
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400150 cfg=ubinize-${IMAGE_NAME}.cfg
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400151 rm -f $cfg ubi-img
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400152 # Construct the ubinize config file
Saqib Khan41723472017-09-22 10:21:30 -0500153 add_volume $cfg 0 static kernel-${VERSION_ID} \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400154 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}
155
Saqib Khan41723472017-09-22 10:21:30 -0500156 add_volume $cfg 1 static rofs-${VERSION_ID} \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400157 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_BASETYPE}
158
159 add_volume $cfg 2 dynamic rwfs rwfs.${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_RWFS_TXT_SIZE}
160
161 # Build the ubi partition image
162 ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg
163
164 # Concatenate the uboot and ubi partitions
165 mk_nor_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd ${FLASH_SIZE}
166 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
167 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
168 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
169 dd bs=1k conv=notrunc seek=${FLASH_UBI_OFFSET} \
170 if=ubi-img \
171 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
172
173 cd ${IMGDEPLOYDIR}
174 ln -sf ${IMAGE_NAME}.ubi.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubi.mtd
175}
Saqib Khan41723472017-09-22 10:21:30 -0500176do_make_ubi[dirs] = "${S}/ubi"
177do_make_ubi[depends] += " \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400178 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
179 virtual/kernel:do_deploy \
180 u-boot:do_populate_sysroot \
181 mtd-utils-native:do_populate_sysroot \
182 "
183
Brad Bishop19fc4f82017-08-04 23:38:54 -0400184do_generate_static() {
185 # Assemble the flash image
186 mk_nor_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd ${FLASH_SIZE}
187 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
188 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
189 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
190
191 dd bs=1k conv=notrunc seek=${FLASH_KERNEL_OFFSET} \
192 if=${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} \
193 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
194
195 dd bs=1k conv=notrunc seek=${FLASH_ROFS_OFFSET} \
196 if=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} \
197 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
198
199 dd bs=1k conv=notrunc seek=${FLASH_RWFS_OFFSET} \
200 if=rwfs.${OVERLAY_BASETYPE} \
201 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
202 # File needed for generating non-standard legacy links below
203 cp rwfs.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/rwfs.${OVERLAY_BASETYPE}
204
205 cd ${IMGDEPLOYDIR}
206 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd
207
208 # Maintain non-standard legacy links
209 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/flash-${MACHINE}
210 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/image-bmc
211 ln -sf u-boot.${UBOOT_SUFFIX} ${IMGDEPLOYDIR}/image-u-boot
212 ln -sf ${FLASH_KERNEL_IMAGE} ${IMGDEPLOYDIR}/image-kernel
213 ln -sf ${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} ${IMGDEPLOYDIR}/image-rofs
214 ln -sf rwfs.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/image-rwfs
215}
216do_generate_static[dirs] = "${S}/static"
217do_generate_static[depends] += " \
218 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
219 virtual/kernel:do_deploy \
220 u-boot:do_populate_sysroot \
221 "
222
223do_generate_static_alltar() {
224 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd image-bmc
225 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd.all.tar image-bmc
226
227 cd ${IMGDEPLOYDIR}
228
229 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
230 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd.all.tar
231
232 # Maintain non-standard legacy link.
233 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
234 ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
235}
236do_generate_static_alltar[vardepsexclude] = "DATETIME"
237do_generate_static_alltar[dirs] = "${S}/static"
238
Brad Bishopde659382018-03-30 01:46:16 -0400239make_image_links() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400240 rwfs=$1
241 rofs=$2
Brad Bishop19fc4f82017-08-04 23:38:54 -0400242 shift
243 shift
Brad Bishop19fc4f82017-08-04 23:38:54 -0400244
Brad Bishopde659382018-03-30 01:46:16 -0400245 # Create some links to help make the tar archive in the format
246 # expected by phosphor-bmc-code-mgmt.
Brad Bishop19fc4f82017-08-04 23:38:54 -0400247 ln -sf ${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} image-u-boot
248 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
249 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rofs image-rofs
250 ln -sf rwfs.$rwfs image-rwfs
Brad Bishopde659382018-03-30 01:46:16 -0400251}
252
253make_tar_of_images() {
254 type=$1
255 shift
256 extra_files="$@"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400257
258 # Create the tar archive
259 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type.mtd.tar \
260 image-u-boot image-kernel image-rofs image-rwfs $extra_files
261
262 cd ${IMGDEPLOYDIR}
263 ln -sf ${IMAGE_NAME}.$type.mtd.tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type.mtd.tar
264}
265
266do_generate_static_tar() {
Brad Bishopde659382018-03-30 01:46:16 -0400267 make_image_links ${OVERLAY_BASETYPE} ${IMAGE_BASETYPE}
268 make_tar_of_images static
Brad Bishop19fc4f82017-08-04 23:38:54 -0400269
270 # Maintain non-standard legacy link.
271 cd ${IMGDEPLOYDIR}
272 ln -sf ${IMAGE_NAME}.static.mtd.tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
273}
274do_generate_static_tar[dirs] = " ${S}/static"
275do_generate_static_tar[depends] += " \
276 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
277 virtual/kernel:do_deploy \
278 u-boot:do_populate_sysroot \
279 "
280do_generate_static_tar[vardepsexclude] = "DATETIME"
281
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400282do_generate_ubi_tar() {
283 ln -sf ${S}/MANIFEST MANIFEST
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600284 ln -sf ${S}/publickey publickey
Brad Bishopde659382018-03-30 01:46:16 -0400285 make_image_links ${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_BASETYPE}
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600286 for file in image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey; do
287 openssl dgst -sha256 -sign ${SIGNING_KEY} -out "${file}.sig" $file
288 done
289 make_tar_of_images ubi MANIFEST publickey *.sig
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400290}
291do_generate_ubi_tar[dirs] = " ${S}/ubi"
292do_generate_ubi_tar[depends] += " \
293 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
294 virtual/kernel:do_deploy \
295 u-boot:do_populate_sysroot \
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600296 openssl-native:do_populate_sysroot \
297 ${SIGNING_KEY_DEPENDS} \
298 ${PN}:do_copy_signing_pubkey \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400299 "
300
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600301def get_pubkey_basedir(d):
302 return os.path.join(
303 d.getVar('STAGING_DIR_TARGET', True),
304 d.getVar('sysconfdir', True).strip(os.sep),
305 'activationdata')
306
307def get_pubkey_type(d):
308 return os.listdir(get_pubkey_basedir(d))[0]
309
310def get_pubkey_path(d):
311 return os.path.join(
312 get_pubkey_basedir(d),
313 get_pubkey_type(d),
314 'publickey')
315
Brad Bishop19fc4f82017-08-04 23:38:54 -0400316python do_generate_phosphor_manifest() {
Saqib Khan41723472017-09-22 10:21:30 -0500317 version = do_get_version(d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400318 with open('MANIFEST', 'w') as fd:
319 fd.write('purpose=xyz.openbmc_project.Software.Version.VersionPurpose.BMC\n')
320 fd.write('version={}\n'.format(version.strip('"')))
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600321 fd.write('KeyType={}\n'.format(get_pubkey_type(d)))
322 fd.write('HashType=RSA-SHA256\n')
Brad Bishop19fc4f82017-08-04 23:38:54 -0400323}
324do_generate_phosphor_manifest[dirs] = "${S}"
325do_generate_phosphor_manifest[depends] += " \
326 os-release:do_populate_sysroot \
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600327 phosphor-image-signing:do_populate_sysroot \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400328 "
329
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600330python do_copy_signing_pubkey() {
331 with open(get_pubkey_path(d), 'r') as read_fd:
332 with open('publickey', 'w') as write_fd:
333 write_fd.write(read_fd.read())
334}
335
336do_copy_signing_pubkey[dirs] = "${S}"
337do_copy_signing_pubkey[depends] += " \
338 phosphor-image-signing:do_populate_sysroot \
339 "
340
341addtask copy_signing_pubkey after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400342addtask generate_phosphor_manifest after do_rootfs
343addtask generate_rwfs_static after do_rootfs
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400344addtask generate_rwfs_ubi after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400345
346python() {
347 types = d.getVar('IMAGE_FSTYPES', True).split()
348
349 if any([x in types for x in ['mtd-static', 'mtd-static-alltar']]):
350 bb.build.addtask(
351 'do_generate_static',
352 'do_image_complete',
353 'do_generate_rwfs_static', d)
354 if 'mtd-static-alltar' in types:
355 bb.build.addtask(
356 'do_generate_static_alltar',
357 'do_image_complete',
358 'do_generate_static', d)
359 if 'mtd-static-tar' in types:
360 bb.build.addtask(
361 'do_generate_static_tar',
362 'do_image_complete',
363 'do_generate_rwfs_static', d)
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400364
365 if 'mtd-ubi' in types:
366 bb.build.addtask(
367 'do_generate_ubi',
368 'do_image_complete',
369 'do_generate_rwfs_ubi', d)
370 if 'mtd-ubi-tar' in types:
371 bb.build.addtask(
372 'do_generate_ubi_tar',
373 'do_image_complete',
374 'do_generate_rwfs_ubi do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400375}