blob: 6612bd680a07557bc9623e73e06bb2da0f509df4 [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
Patrick Williamsb9e124c2022-12-14 09:10:49 -06005FIT_IMAGE_INHERIT=""
6FIT_IMAGE_INHERIT:df-obmc-static-norootfs = "fit-image"
7inherit ${FIT_IMAGE_INHERIT}
8
Brad Bishop19fc4f82017-08-04 23:38:54 -04009# Phosphor image types
10#
Brad Bishop3aa1ef62017-08-04 23:48:12 -040011# Phosphor OpenBMC supports a fixed partition mtd layout,
12# A dynamic mtd with ubi layout, and a tar file for use with
13# The reference BMC software update implementation.
Brad Bishop19fc4f82017-08-04 23:38:54 -040014
15# Image composition
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080016FLASH_KERNEL_IMAGE ?= "fitImage-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}"
Patrick Williams12fc9392021-08-06 09:16:53 -050017FLASH_KERNEL_IMAGE:df-obmc-ubi-fs ?= "fitImage-${MACHINE}.bin"
Brad Bishop8623bbe2018-03-09 00:04:00 -050018
Brad Bishop19fc4f82017-08-04 23:38:54 -040019IMAGE_BASETYPE ?= "squashfs-xz"
Patrick Williamsb9e124c2022-12-14 09:10:49 -060020IMAGE_BASETYPE:df-obmc-static-norootfs ?= "cpio"
Brad Bishop19fc4f82017-08-04 23:38:54 -040021OVERLAY_BASETYPE ?= "jffs2"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040022FLASH_UBI_BASETYPE ?= "${IMAGE_BASETYPE}"
23FLASH_UBI_OVERLAY_BASETYPE ?= "ubifs"
Adriana Kobylak9b7197e2019-07-29 15:25:33 -050024FLASH_EXT4_BASETYPE ?= "ext4"
Adriana Kobylak5a5753a2019-07-30 11:27:46 -050025FLASH_EXT4_OVERLAY_BASETYPE ?= "ext4"
Brad Bishop19fc4f82017-08-04 23:38:54 -040026
Patrick Williamsb9e124c2022-12-14 09:10:49 -060027PHOSPHOR_IMAGE_TYPES += " \
28 mtd-static \
29 mtd-static-alltar \
30 mtd-static-tar \
31 mtd-static-norootfs \
32 mtd-ubi \
33 mtd-ubi-tar \
34 mmc-ext4-tar \
35"
36IMAGE_TYPES += "${PHOSPHOR_IMAGE_TYPES}"
37IMAGE_TYPES_MASKED += "${PHOSPHOR_IMAGE_TYPES}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040038
Patrick Williams12fc9392021-08-06 09:16:53 -050039IMAGE_TYPEDEP:mtd-static = "${IMAGE_BASETYPE}"
40IMAGE_TYPEDEP:mtd-static-tar = "${IMAGE_BASETYPE}"
41IMAGE_TYPEDEP:mtd-static-alltar = "mtd-static"
Patrick Williamsb9e124c2022-12-14 09:10:49 -060042IMAGE_TYPEDEP:mtd-static-norootfs = "${IMAGE_BASETYPE}"
Patrick Williams12fc9392021-08-06 09:16:53 -050043IMAGE_TYPEDEP:mtd-ubi = "${FLASH_UBI_BASETYPE}"
44IMAGE_TYPEDEP:mtd-ubi-tar = "${FLASH_UBI_BASETYPE}"
45IMAGE_TYPEDEP:mmc-ext4-tar = "${FLASH_EXT4_BASETYPE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040046
Brad Bishop3aa1ef62017-08-04 23:48:12 -040047# Flash characteristics in KB unless otherwise noted
Brad Bishopdcd861c2019-09-24 21:16:09 -040048DISTROOVERRIDES .= ":flash-${FLASH_SIZE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040049FLASH_SIZE ?= "32768"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040050FLASH_PEB_SIZE ?= "64"
51# Flash page and overhead sizes in bytes
52FLASH_PAGE_SIZE ?= "1"
53FLASH_NOR_UBI_OVERHEAD ?= "64"
Brad Bishop19fc4f82017-08-04 23:38:54 -040054
55# Fixed partition offsets
Adriana Kobylake913dd82020-04-13 13:56:41 -050056FLASH_UBOOT_SPL_SIZE ?= "64"
Brad Bishop19fc4f82017-08-04 23:38:54 -040057FLASH_UBOOT_OFFSET ?= "0"
58FLASH_KERNEL_OFFSET ?= "512"
Patrick Williams12fc9392021-08-06 09:16:53 -050059FLASH_KERNEL_OFFSET:flash-65536 ?= "1024"
60FLASH_KERNEL_OFFSET:flash-131072 ?= "1024"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040061FLASH_UBI_OFFSET ?= "${FLASH_KERNEL_OFFSET}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040062FLASH_ROFS_OFFSET ?= "4864"
Patrick Williams12fc9392021-08-06 09:16:53 -050063FLASH_ROFS_OFFSET:flash-65536 ?= "10240"
64FLASH_ROFS_OFFSET:flash-131072 ?= "10240"
Brad Bishop19fc4f82017-08-04 23:38:54 -040065FLASH_RWFS_OFFSET ?= "28672"
Patrick Williams12fc9392021-08-06 09:16:53 -050066FLASH_RWFS_OFFSET:flash-65536 ?= "43008"
67FLASH_RWFS_OFFSET:flash-131072 ?= "98304"
Brad Bishop19fc4f82017-08-04 23:38:54 -040068
Brad Bishop3aa1ef62017-08-04 23:48:12 -040069# UBI volume sizes in KB unless otherwise noted.
Adriana Kobylakb70005d2018-02-14 16:35:30 -060070FLASH_UBI_RWFS_SIZE ?= "6144"
Patrick Williams12fc9392021-08-06 09:16:53 -050071FLASH_UBI_RWFS_SIZE:flash-131072 ?= "32768"
Adriana Kobylakb70005d2018-02-14 16:35:30 -060072FLASH_UBI_RWFS_TXT_SIZE ?= "6MiB"
Patrick Williams12fc9392021-08-06 09:16:53 -050073FLASH_UBI_RWFS_TXT_SIZE:flash-131072 ?= "32MiB"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040074
Adriana Kobylak45a57952020-07-01 16:23:11 -050075# eMMC sizes in KB unless otherwise noted.
Adriana Kobylak55681e42020-11-11 15:06:50 -060076MMC_UBOOT_SIZE ?= "1024"
Adriana Kobylak45a57952020-07-01 16:23:11 -050077MMC_BOOT_PARTITION_SIZE ?= "65536"
78
Eddie Jamesb2b7ff62018-02-09 11:59:18 -060079SIGNING_KEY ?= "${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv"
80INSECURE_KEY = "${@'${SIGNING_KEY}' == '${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv'}"
81SIGNING_KEY_DEPENDS = "${@oe.utils.conditional('INSECURE_KEY', 'True', 'phosphor-insecure-signing-key-native:do_populate_sysroot', '', d)}"
82
Adriana Kobylakfb62a682019-10-28 16:03:12 -050083VERSION_PURPOSE ?= "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
84
Brad Bishop3e37d382018-03-31 12:17:28 -040085UBOOT_SUFFIX ?= "bin"
86
Brad Bishop3aa1ef62017-08-04 23:48:12 -040087python() {
88 # Compute rwfs LEB count and LEB size.
89 page_size = d.getVar('FLASH_PAGE_SIZE', True)
90 nor_overhead_size = d.getVar('FLASH_NOR_UBI_OVERHEAD', True)
91 overhead_size = max(int(page_size), int(nor_overhead_size))
92 peb_size = d.getVar('FLASH_PEB_SIZE', True)
93 leb_size = (int(peb_size) * 1024) - (2 * overhead_size)
94 d.setVar('FLASH_LEB_SIZE', str(leb_size)) # In bytes
95
96 rwfs_size = d.getVar('FLASH_UBI_RWFS_SIZE', True)
97 rwfs_size = int(rwfs_size) * 1024
98 lebs = int((rwfs_size + leb_size - 1) / leb_size) # Rounding up
99 d.setVar('FLASH_UBI_RWFS_LEBS', str(lebs))
100}
101
Brad Bishop19fc4f82017-08-04 23:38:54 -0400102# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
103# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
104# reserved for the primary image (and setting them currently breaks the build).
105# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
106DISTROOVERRIDES .= ":static-rwfs-${OVERLAY_BASETYPE}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400107DISTROOVERRIDES .= ":ubi-rwfs-${FLASH_UBI_OVERLAY_BASETYPE}"
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500108DISTROOVERRIDES .= ":mmc-rwfs-${FLASH_EXT4_OVERLAY_BASETYPE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400109
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700110JFFS2_RWFS_CMD = "mkfs.jffs2 --root=jffs2 --faketime --output=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.jffs2"
111UBIFS_RWFS_CMD = "mkfs.ubifs -r ubifs -c ${FLASH_UBI_RWFS_LEBS} -m ${FLASH_PAGE_SIZE} -e ${FLASH_LEB_SIZE} ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubifs"
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500112EXT4_RWFS_CMD = "mkfs.ext4 -F ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.ext4"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400113
Patrick Williams12fc9392021-08-06 09:16:53 -0500114FLASH_STATIC_RWFS_CMD:static-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
115FLASH_UBI_RWFS_CMD:ubi-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
116FLASH_UBI_RWFS_CMD:ubi-rwfs-ubifs = "${UBIFS_RWFS_CMD}"
117FLASH_EXT4_RWFS_CMD:mmc-rwfs-ext4 = "${EXT4_RWFS_CMD}"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400118
Adriana Kobylak661cf392019-07-29 14:39:00 -0500119mk_empty_image() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400120 image_dst="$1"
121 image_size_kb=$2
122 dd if=/dev/zero bs=1k count=$image_size_kb \
123 | tr '\000' '\377' > $image_dst
124}
125
Adriana Kobylak55681e42020-11-11 15:06:50 -0600126mk_empty_image_zeros() {
127 image_dst="$1"
128 image_size_kb=$2
129 dd if=/dev/zero of=$image_dst bs=1k count=$image_size_kb
130}
131
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500132clean_rwfs() {
133 type=$1
134 shift
135
136 rm -f ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type
137 rm -rf $type
138 mkdir $type
139}
140
Brad Bishop19fc4f82017-08-04 23:38:54 -0400141make_rwfs() {
142 type=$1
143 cmd=$2
144 shift
145 shift
146 opts="$@"
147
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500148 mkdir -p $type
Brad Bishop19fc4f82017-08-04 23:38:54 -0400149
150 $cmd $opts
151}
152
153do_generate_rwfs_static() {
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500154 clean_rwfs ${OVERLAY_BASETYPE}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400155 make_rwfs ${OVERLAY_BASETYPE} "${FLASH_STATIC_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
156}
157do_generate_rwfs_static[dirs] = " ${S}/static"
158do_generate_rwfs_static[depends] += " \
159 mtd-utils-native:do_populate_sysroot \
160 "
161
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400162do_generate_rwfs_ubi() {
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500163 clean_rwfs ${FLASH_UBI_OVERLAY_BASETYPE}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400164 make_rwfs ${FLASH_UBI_OVERLAY_BASETYPE} "${FLASH_UBI_RWFS_CMD}"
165}
166do_generate_rwfs_ubi[dirs] = " ${S}/ubi"
167do_generate_rwfs_ubi[depends] += " \
168 mtd-utils-native:do_populate_sysroot \
169 "
170
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500171do_generate_rwfs_ext4() {
172 clean_rwfs rwfs.${FLASH_EXT4_OVERLAY_BASETYPE}
173 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.ext4 1024
174 make_rwfs ${FLASH_EXT4_OVERLAY_BASETYPE} "${FLASH_EXT4_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
175}
176do_generate_rwfs_ext4[dirs] = " ${S}/ext4"
177do_generate_rwfs_ext4[depends] += " \
178 e2fsprogs-native:do_populate_sysroot \
179 "
180
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400181add_volume() {
182 config_file=$1
183 vol_id=$2
184 vol_type=$3
185 vol_name=$4
186 image=$5
187 vol_size=$6
188
189 echo \[$vol_name\] >> $config_file
190 echo mode=ubi >> $config_file
191 echo image=$image >> $config_file
192 echo vol_type=$vol_type >> $config_file
193 echo vol_name=$vol_name >> $config_file
194 echo vol_id=$vol_id >> $config_file
195 if [ ! -z $vol_size ]; then
196 echo vol_size=$vol_size >> $config_file
197 fi
198}
199
Saqib Khan41723472017-09-22 10:21:30 -0500200python do_generate_ubi() {
201 version_id = do_get_versionID(d)
202 d.setVar('VERSION_ID', version_id)
203 bb.build.exec_func("do_make_ubi", d)
204}
205do_generate_ubi[dirs] = "${S}/ubi"
206do_generate_ubi[depends] += " \
207 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
208 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500209 u-boot:do_deploy \
Saqib Khan41723472017-09-22 10:21:30 -0500210 mtd-utils-native:do_populate_sysroot \
211 "
212
213do_make_ubi() {
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400214 cfg=ubinize-${IMAGE_NAME}.cfg
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400215 rm -f $cfg ubi-img
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400216 # Construct the ubinize config file
Saqib Khan41723472017-09-22 10:21:30 -0500217 add_volume $cfg 0 static kernel-${VERSION_ID} \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400218 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}
219
Saqib Khan41723472017-09-22 10:21:30 -0500220 add_volume $cfg 1 static rofs-${VERSION_ID} \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400221 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_BASETYPE}
222
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700223 add_volume $cfg 2 dynamic rwfs ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_RWFS_TXT_SIZE}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400224
225 # Build the ubi partition image
226 ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg
227
228 # Concatenate the uboot and ubi partitions
Adriana Kobylak661cf392019-07-29 14:39:00 -0500229 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd ${FLASH_SIZE}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400230 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
231 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
232 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
233 dd bs=1k conv=notrunc seek=${FLASH_UBI_OFFSET} \
234 if=ubi-img \
235 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
236
237 cd ${IMGDEPLOYDIR}
238 ln -sf ${IMAGE_NAME}.ubi.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubi.mtd
239}
Saqib Khan41723472017-09-22 10:21:30 -0500240do_make_ubi[dirs] = "${S}/ubi"
241do_make_ubi[depends] += " \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400242 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
243 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500244 u-boot:do_deploy \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400245 mtd-utils-native:do_populate_sysroot \
246 "
247
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300248do_mk_static_nor_image() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400249 # Assemble the flash image
Adriana Kobylak661cf392019-07-29 14:39:00 -0500250 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd ${FLASH_SIZE}
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300251}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400252
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500253do_generate_image_uboot_file() {
254 image_dst="$1"
255 uboot_offset=${FLASH_UBOOT_OFFSET}
256
257 if [ ! -z ${SPL_BINARY} ]; then
258 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
259 if=${DEPLOY_DIR_IMAGE}/u-boot-spl.${UBOOT_SUFFIX} \
260 of=${image_dst}
261 uboot_offset=${FLASH_UBOOT_SPL_SIZE}
262 fi
263
264 dd bs=1k conv=notrunc seek=${uboot_offset} \
265 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
266 of=${image_dst}
267}
268
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300269python do_generate_static() {
270 import subprocess
Brad Bishop19fc4f82017-08-04 23:38:54 -0400271
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300272 bb.build.exec_func("do_mk_static_nor_image", d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400273
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300274 nor_image = os.path.join(d.getVar('IMGDEPLOYDIR', True),
275 '%s.static.mtd' % d.getVar('IMAGE_NAME', True))
276
277 def _append_image(imgpath, start_kb, finish_kb):
278 imgsize = os.path.getsize(imgpath)
Josh Lehan0a5ef2a2020-02-26 12:11:33 -0800279 maxsize = (finish_kb - start_kb) * 1024
280 bb.debug(1, 'Considering file size=' + str(imgsize) + ' name=' + imgpath)
281 bb.debug(1, 'Spanning start=' + str(start_kb) + 'K end=' + str(finish_kb) + 'K')
282 bb.debug(1, 'Compare needed=' + str(imgsize) + ' available=' + str(maxsize) + ' margin=' + str(maxsize - imgsize))
283 if imgsize > maxsize:
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300284 bb.fatal("Image '%s' is too large!" % imgpath)
285
286 subprocess.check_call(['dd', 'bs=1k', 'conv=notrunc',
287 'seek=%d' % start_kb,
288 'if=%s' % imgpath,
289 'of=%s' % nor_image])
290
Adriana Kobylake913dd82020-04-13 13:56:41 -0500291 uboot_offset = int(d.getVar('FLASH_UBOOT_OFFSET', True))
292
293 spl_binary = d.getVar('SPL_BINARY', True)
294 if spl_binary:
295 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
296 'u-boot-spl.%s' % d.getVar('UBOOT_SUFFIX',True)),
297 int(d.getVar('FLASH_UBOOT_OFFSET', True)),
298 int(d.getVar('FLASH_UBOOT_SPL_SIZE', True)))
299 uboot_offset += int(d.getVar('FLASH_UBOOT_SPL_SIZE', True))
300
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300301 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
302 'u-boot.%s' % d.getVar('UBOOT_SUFFIX',True)),
Adriana Kobylake913dd82020-04-13 13:56:41 -0500303 uboot_offset,
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300304 int(d.getVar('FLASH_KERNEL_OFFSET', True)))
305
306 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
307 d.getVar('FLASH_KERNEL_IMAGE', True)),
308 int(d.getVar('FLASH_KERNEL_OFFSET', True)),
309 int(d.getVar('FLASH_ROFS_OFFSET', True)))
310
311 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
312 '%s.%s' % (
313 d.getVar('IMAGE_LINK_NAME', True),
314 d.getVar('IMAGE_BASETYPE', True))),
315 int(d.getVar('FLASH_ROFS_OFFSET', True)),
316 int(d.getVar('FLASH_RWFS_OFFSET', True)))
317
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700318 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
319 '%s.%s' % (
320 d.getVar('IMAGE_LINK_NAME', True),
321 d.getVar('OVERLAY_BASETYPE', True))),
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300322 int(d.getVar('FLASH_RWFS_OFFSET', True)),
323 int(d.getVar('FLASH_SIZE', True)))
324
325 bb.build.exec_func("do_mk_static_symlinks", d)
326}
327
328do_mk_static_symlinks() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400329 cd ${IMGDEPLOYDIR}
330 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd
331
332 # Maintain non-standard legacy links
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500333 do_generate_image_uboot_file ${IMGDEPLOYDIR}/image-u-boot
Brad Bishop19fc4f82017-08-04 23:38:54 -0400334 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/flash-${MACHINE}
335 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/image-bmc
Brad Bishop19fc4f82017-08-04 23:38:54 -0400336 ln -sf ${FLASH_KERNEL_IMAGE} ${IMGDEPLOYDIR}/image-kernel
337 ln -sf ${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} ${IMGDEPLOYDIR}/image-rofs
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700338 ln -sf ${IMAGE_LINK_NAME}.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/image-rwfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400339}
340do_generate_static[dirs] = "${S}/static"
341do_generate_static[depends] += " \
342 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
343 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500344 u-boot:do_deploy \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400345 "
346
Lei YUf2072212018-06-20 13:27:34 +0800347make_signatures() {
348 signature_files=""
349 for file in "$@"; do
350 openssl dgst -sha256 -sign ${SIGNING_KEY} -out "${file}.sig" $file
351 signature_files="${signature_files} ${file}.sig"
352 done
George Liuf0afcf82020-12-15 09:46:10 +0800353
354 if [ -n "$signature_files" ]; then
355 sort_signature_files=`echo "$signature_files" | tr ' ' '\n' | sort | tr '\n' ' '`
356 cat $sort_signature_files > image-full
357 openssl dgst -sha256 -sign ${SIGNING_KEY} -out image-full.sig image-full
358 signature_files="${signature_files} image-full.sig"
George Liuf0afcf82020-12-15 09:46:10 +0800359 fi
Lei YUf2072212018-06-20 13:27:34 +0800360}
361
Brad Bishop19fc4f82017-08-04 23:38:54 -0400362do_generate_static_alltar() {
Lei YUa4674942018-05-23 14:01:14 +0800363 ln -sf ${S}/MANIFEST MANIFEST
364 ln -sf ${S}/publickey publickey
Brad Bishop19fc4f82017-08-04 23:38:54 -0400365 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd image-bmc
Lei YUa4674942018-05-23 14:01:14 +0800366
Lei YUf2072212018-06-20 13:27:34 +0800367 make_signatures image-bmc MANIFEST publickey
Lei YUa4674942018-05-23 14:01:14 +0800368
369 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd.all.tar \
370 image-bmc MANIFEST publickey ${signature_files}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400371
372 cd ${IMGDEPLOYDIR}
373
374 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
375 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd.all.tar
376
377 # Maintain non-standard legacy link.
378 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
379 ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
Lei YUa4674942018-05-23 14:01:14 +0800380
Brad Bishop19fc4f82017-08-04 23:38:54 -0400381}
382do_generate_static_alltar[vardepsexclude] = "DATETIME"
383do_generate_static_alltar[dirs] = "${S}/static"
Lei YUa4674942018-05-23 14:01:14 +0800384do_generate_static_alltar[depends] += " \
385 openssl-native:do_populate_sysroot \
386 ${SIGNING_KEY_DEPENDS} \
387 ${PN}:do_copy_signing_pubkey \
388 "
Brad Bishop19fc4f82017-08-04 23:38:54 -0400389
Brad Bishopde659382018-03-30 01:46:16 -0400390make_image_links() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400391 rwfs=$1
392 rofs=$2
Brad Bishop19fc4f82017-08-04 23:38:54 -0400393 shift
394 shift
Brad Bishop19fc4f82017-08-04 23:38:54 -0400395
Brad Bishopde659382018-03-30 01:46:16 -0400396 # Create some links to help make the tar archive in the format
397 # expected by phosphor-bmc-code-mgmt.
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500398 do_generate_image_uboot_file image-u-boot
Brad Bishop19fc4f82017-08-04 23:38:54 -0400399 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
400 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rofs image-rofs
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700401 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rwfs image-rwfs
Brad Bishopde659382018-03-30 01:46:16 -0400402}
403
404make_tar_of_images() {
405 type=$1
406 shift
407 extra_files="$@"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400408
409 # Create the tar archive
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500410 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type.tar \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400411 image-u-boot image-kernel image-rofs image-rwfs $extra_files
412
413 cd ${IMGDEPLOYDIR}
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500414 ln -sf ${IMAGE_NAME}.$type.tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type.tar
Brad Bishop19fc4f82017-08-04 23:38:54 -0400415}
416
417do_generate_static_tar() {
Lei YUa4674942018-05-23 14:01:14 +0800418 ln -sf ${S}/MANIFEST MANIFEST
419 ln -sf ${S}/publickey publickey
Brad Bishopde659382018-03-30 01:46:16 -0400420 make_image_links ${OVERLAY_BASETYPE} ${IMAGE_BASETYPE}
Lei YUf2072212018-06-20 13:27:34 +0800421 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500422 make_tar_of_images static.mtd MANIFEST publickey ${signature_files}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400423
424 # Maintain non-standard legacy link.
425 cd ${IMGDEPLOYDIR}
426 ln -sf ${IMAGE_NAME}.static.mtd.tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
427}
428do_generate_static_tar[dirs] = " ${S}/static"
429do_generate_static_tar[depends] += " \
430 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
431 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500432 u-boot:do_deploy \
Lei YUa4674942018-05-23 14:01:14 +0800433 openssl-native:do_populate_sysroot \
434 ${SIGNING_KEY_DEPENDS} \
435 ${PN}:do_copy_signing_pubkey \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400436 "
437do_generate_static_tar[vardepsexclude] = "DATETIME"
438
Patrick Williamsb9e124c2022-12-14 09:10:49 -0600439python do_generate_static_norootfs() {
440 import subprocess
441
442 nor_image_basename = '%s.static.mtd' % d.getVar('IMAGE_NAME', True)
443 nor_image = os.path.join(d.getVar('IMGDEPLOYDIR', True), nor_image_basename)
444
445 def _append_image(imgpath, start_kb, finish_kb):
446 imgsize = os.path.getsize(imgpath)
447 maxsize = (finish_kb - start_kb) * 1024
448 bb.debug(1, 'Considering file size=' + str(imgsize) + ' name=' + imgpath)
449 bb.debug(1, 'Spanning start=' + str(start_kb) + 'K end=' + str(finish_kb) + 'K')
450 bb.debug(1, 'Compare needed=' + str(imgsize) + ' available=' + str(maxsize) + ' margin=' + str(maxsize - imgsize))
451 if imgsize > maxsize:
452 bb.fatal("Image '%s' is too large!" % imgpath)
453
454 subprocess.check_call(['dd', 'bs=1k', 'conv=notrunc',
455 'seek=%d' % start_kb,
456 'if=%s' % imgpath,
457 'of=%s' % nor_image])
458 uboot_offset = int(d.getVar('FLASH_UBOOT_OFFSET', True))
459
460 spl_binary = d.getVar('SPL_BINARY', True)
461 if spl_binary:
462 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
463 'u-boot-spl.%s' % d.getVar('UBOOT_SUFFIX',True)),
464 int(d.getVar('FLASH_UBOOT_OFFSET', True)),
465 int(d.getVar('FLASH_UBOOT_SPL_SIZE', True)))
466 uboot_offset += int(d.getVar('FLASH_UBOOT_SPL_SIZE', True))
467
468 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
469 'u-boot.%s' % d.getVar('UBOOT_SUFFIX',True)),
470 uboot_offset,
471 int(d.getVar('FLASH_KERNEL_OFFSET', True)))
472
473 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
474 '%s.cpio.%s.fitImage' % (
475 d.getVar('IMAGE_LINK_NAME', True),
476 d.getVar('INITRAMFS_CTYPE', True))),
477 int(d.getVar('FLASH_KERNEL_OFFSET', True)),
478 int(d.getVar('FLASH_RWFS_OFFSET', True)))
479
480 flash_symlink = os.path.join(
481 d.getVar('IMGDEPLOYDIR', True),
482 'flash-%s' % d.getVar('MACHINE', True))
483 if os.path.exists(flash_symlink):
484 os.remove(flash_symlink)
485 os.symlink(nor_image_basename, flash_symlink)
486}
487do_generate_static_norootfs[depends] += " \
488 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
489 u-boot:do_deploy \
490 "
491
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400492do_generate_ubi_tar() {
493 ln -sf ${S}/MANIFEST MANIFEST
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600494 ln -sf ${S}/publickey publickey
Brad Bishopde659382018-03-30 01:46:16 -0400495 make_image_links ${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_BASETYPE}
Lei YUf2072212018-06-20 13:27:34 +0800496 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500497 make_tar_of_images ubi.mtd MANIFEST publickey ${signature_files}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400498}
499do_generate_ubi_tar[dirs] = " ${S}/ubi"
500do_generate_ubi_tar[depends] += " \
501 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
502 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500503 u-boot:do_deploy \
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600504 openssl-native:do_populate_sysroot \
505 ${SIGNING_KEY_DEPENDS} \
506 ${PN}:do_copy_signing_pubkey \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400507 "
508
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500509do_generate_ext4_tar() {
Adriana Kobylak45a57952020-07-01 16:23:11 -0500510 # Generate the U-Boot image
Adriana Kobylak55681e42020-11-11 15:06:50 -0600511 mk_empty_image_zeros image-u-boot ${MMC_UBOOT_SIZE}
Adriana Kobylak45a57952020-07-01 16:23:11 -0500512 do_generate_image_uboot_file image-u-boot
513
514 # Generate a compressed ext4 filesystem with the fitImage file in it to be
515 # flashed to the boot partition of the eMMC
516 install -d boot-image
517 install -m 644 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} boot-image/fitImage
Adriana Kobylak55681e42020-11-11 15:06:50 -0600518 mk_empty_image_zeros boot-image.${FLASH_EXT4_BASETYPE} ${MMC_BOOT_PARTITION_SIZE}
Adriana Kobylak45a57952020-07-01 16:23:11 -0500519 mkfs.ext4 -F -i 4096 -d boot-image boot-image.${FLASH_EXT4_BASETYPE}
520 # Error codes 0-3 indicate successfull operation of fsck
521 fsck.ext4 -pvfD boot-image.${FLASH_EXT4_BASETYPE} || [ $? -le 3 ]
522 zstd -f -k -T0 -c ${ZSTD_COMPRESSION_LEVEL} boot-image.${FLASH_EXT4_BASETYPE} > boot-image.${FLASH_EXT4_BASETYPE}.zst
523
524 # Generate the compressed ext4 rootfs
525 zstd -f -k -T0 -c ${ZSTD_COMPRESSION_LEVEL} ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE} > ${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE}.zst
526
527 ln -sf boot-image.${FLASH_EXT4_BASETYPE}.zst image-kernel
528 ln -sf ${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE}.zst image-rofs
529 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.${FLASH_EXT4_OVERLAY_BASETYPE} image-rwfs
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500530 ln -sf ${S}/MANIFEST MANIFEST
531 ln -sf ${S}/publickey publickey
Adriana Kobylak81846a22020-07-12 15:12:36 -0500532
533 hostfw_update_file="${DEPLOY_DIR_IMAGE}/hostfw/update/image-hostfw"
534 if [ -e "${hostfw_update_file}" ]; then
535 ln -sf "${hostfw_update_file}" image-hostfw
536 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey image-hostfw
537 make_tar_of_images ext4.mmc MANIFEST publickey ${signature_files} image-hostfw
538 else
539 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
540 make_tar_of_images ext4.mmc MANIFEST publickey ${signature_files}
541 fi
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500542}
543do_generate_ext4_tar[dirs] = " ${S}/ext4"
544do_generate_ext4_tar[depends] += " \
Adriana Kobylak4cc866b2020-03-28 13:43:33 -0500545 zstd-native:do_populate_sysroot \
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500546 ${PN}:do_image_${FLASH_EXT4_BASETYPE} \
547 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500548 u-boot:do_deploy \
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500549 openssl-native:do_populate_sysroot \
550 ${SIGNING_KEY_DEPENDS} \
551 ${PN}:do_copy_signing_pubkey \
Brad Bishop209ed522020-11-02 12:36:04 -0500552 phosphor-hostfw-image:do_deploy \
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500553 "
554
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600555def get_pubkey_basedir(d):
556 return os.path.join(
557 d.getVar('STAGING_DIR_TARGET', True),
558 d.getVar('sysconfdir', True).strip(os.sep),
559 'activationdata')
560
561def get_pubkey_type(d):
562 return os.listdir(get_pubkey_basedir(d))[0]
563
564def get_pubkey_path(d):
565 return os.path.join(
566 get_pubkey_basedir(d),
567 get_pubkey_type(d),
568 'publickey')
569
Brad Bishop19fc4f82017-08-04 23:38:54 -0400570python do_generate_phosphor_manifest() {
Adriana Kobylakfb62a682019-10-28 16:03:12 -0500571 purpose = d.getVar('VERSION_PURPOSE', True)
Saqib Khan41723472017-09-22 10:21:30 -0500572 version = do_get_version(d)
Adriana Kobylakcdd91ad2021-10-25 15:58:19 +0000573 build_id = do_get_buildID(d)
Vijay Khemkaae614bd2019-09-18 12:28:46 -0700574 target_machine = d.getVar('MACHINE', True)
Adriana Kobylakbde7dbe2022-08-04 09:13:26 -0500575 extended_version = do_get_extended_version(d)
Justin Ledfordb4de16d2022-03-24 17:27:17 -0700576 compatible_names = d.getVar('OBMC_COMPATIBLE_NAMES', True)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400577 with open('MANIFEST', 'w') as fd:
Adriana Kobylakfb62a682019-10-28 16:03:12 -0500578 fd.write('purpose={}\n'.format(purpose))
Brad Bishop19fc4f82017-08-04 23:38:54 -0400579 fd.write('version={}\n'.format(version.strip('"')))
Adriana Kobylakcdd91ad2021-10-25 15:58:19 +0000580 fd.write('BuildId={}\n'.format(build_id.strip('"')))
Justin Ledfordb4de16d2022-03-24 17:27:17 -0700581 if extended_version:
582 fd.write('ExtendedVersion={}\n'.format(extended_version))
583 if compatible_names:
584 for name in compatible_names.split():
585 fd.write('CompatibleName={}\n'.format(name))
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600586 fd.write('KeyType={}\n'.format(get_pubkey_type(d)))
587 fd.write('HashType=RSA-SHA256\n')
Vijay Khemkaae614bd2019-09-18 12:28:46 -0700588 fd.write('MachineName={}\n'.format(target_machine))
Brad Bishop19fc4f82017-08-04 23:38:54 -0400589}
590do_generate_phosphor_manifest[dirs] = "${S}"
591do_generate_phosphor_manifest[depends] += " \
592 os-release:do_populate_sysroot \
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600593 phosphor-image-signing:do_populate_sysroot \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400594 "
595
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600596python do_copy_signing_pubkey() {
597 with open(get_pubkey_path(d), 'r') as read_fd:
598 with open('publickey', 'w') as write_fd:
599 write_fd.write(read_fd.read())
600}
601
602do_copy_signing_pubkey[dirs] = "${S}"
603do_copy_signing_pubkey[depends] += " \
604 phosphor-image-signing:do_populate_sysroot \
605 "
606
607addtask copy_signing_pubkey after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400608addtask generate_phosphor_manifest after do_rootfs
609addtask generate_rwfs_static after do_rootfs
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400610addtask generate_rwfs_ubi after do_rootfs
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500611addtask generate_rwfs_ext4 after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400612
613python() {
614 types = d.getVar('IMAGE_FSTYPES', True).split()
615
616 if any([x in types for x in ['mtd-static', 'mtd-static-alltar']]):
617 bb.build.addtask(
618 'do_generate_static',
619 'do_image_complete',
620 'do_generate_rwfs_static', d)
621 if 'mtd-static-alltar' in types:
622 bb.build.addtask(
623 'do_generate_static_alltar',
624 'do_image_complete',
Lei YUa4674942018-05-23 14:01:14 +0800625 'do_generate_static do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400626 if 'mtd-static-tar' in types:
627 bb.build.addtask(
628 'do_generate_static_tar',
629 'do_image_complete',
Lei YUa4674942018-05-23 14:01:14 +0800630 'do_generate_rwfs_static do_generate_phosphor_manifest', d)
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400631
Patrick Williamsb9e124c2022-12-14 09:10:49 -0600632 if 'mtd-static-norootfs' in types:
633 bb.build.addtask(
634 'do_generate_static_norootfs',
635 'do_image_complete',
636 'do_image_cpio', d)
637
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400638 if 'mtd-ubi' in types:
639 bb.build.addtask(
640 'do_generate_ubi',
641 'do_image_complete',
642 'do_generate_rwfs_ubi', d)
643 if 'mtd-ubi-tar' in types:
644 bb.build.addtask(
645 'do_generate_ubi_tar',
646 'do_image_complete',
647 'do_generate_rwfs_ubi do_generate_phosphor_manifest', d)
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500648
649 if 'mmc-ext4-tar' in types:
650 bb.build.addtask(
651 'do_generate_ext4_tar',
652 'do_image_complete',
653 'do_generate_rwfs_ext4 do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400654}