blob: 206b080206e57fe5a0676f58aa89b4dcfc01b2a6 [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 Bishop1a4b7ee2018-12-16 17:11:34 -080012FLASH_KERNEL_IMAGE ?= "fitImage-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}"
Patrick Williams12fc9392021-08-06 09:16:53 -050013FLASH_KERNEL_IMAGE:df-obmc-ubi-fs ?= "fitImage-${MACHINE}.bin"
Brad Bishop8623bbe2018-03-09 00:04:00 -050014
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"
Adriana Kobylak9b7197e2019-07-29 15:25:33 -050019FLASH_EXT4_BASETYPE ?= "ext4"
Adriana Kobylak5a5753a2019-07-30 11:27:46 -050020FLASH_EXT4_OVERLAY_BASETYPE ?= "ext4"
Brad Bishop19fc4f82017-08-04 23:38:54 -040021
Adriana Kobylak35542752020-08-25 10:37:49 -050022IMAGE_TYPES += "mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar mmc-ext4-tar"
Brad Bishop19fc4f82017-08-04 23:38:54 -040023
Patrick Williams12fc9392021-08-06 09:16:53 -050024IMAGE_TYPEDEP:mtd-static = "${IMAGE_BASETYPE}"
25IMAGE_TYPEDEP:mtd-static-tar = "${IMAGE_BASETYPE}"
26IMAGE_TYPEDEP:mtd-static-alltar = "mtd-static"
27IMAGE_TYPEDEP:mtd-ubi = "${FLASH_UBI_BASETYPE}"
28IMAGE_TYPEDEP:mtd-ubi-tar = "${FLASH_UBI_BASETYPE}"
29IMAGE_TYPEDEP:mmc-ext4-tar = "${FLASH_EXT4_BASETYPE}"
Adriana Kobylak35542752020-08-25 10:37:49 -050030IMAGE_TYPES_MASKED += "mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar mmc-ext4-tar"
Brad Bishop19fc4f82017-08-04 23:38:54 -040031
Brad Bishop3aa1ef62017-08-04 23:48:12 -040032# Flash characteristics in KB unless otherwise noted
Brad Bishopdcd861c2019-09-24 21:16:09 -040033DISTROOVERRIDES .= ":flash-${FLASH_SIZE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040034FLASH_SIZE ?= "32768"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040035FLASH_PEB_SIZE ?= "64"
36# Flash page and overhead sizes in bytes
37FLASH_PAGE_SIZE ?= "1"
38FLASH_NOR_UBI_OVERHEAD ?= "64"
Brad Bishop19fc4f82017-08-04 23:38:54 -040039
40# Fixed partition offsets
Adriana Kobylake913dd82020-04-13 13:56:41 -050041FLASH_UBOOT_SPL_SIZE ?= "64"
Brad Bishop19fc4f82017-08-04 23:38:54 -040042FLASH_UBOOT_OFFSET ?= "0"
43FLASH_KERNEL_OFFSET ?= "512"
Patrick Williams12fc9392021-08-06 09:16:53 -050044FLASH_KERNEL_OFFSET:flash-65536 ?= "1024"
45FLASH_KERNEL_OFFSET:flash-131072 ?= "1024"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040046FLASH_UBI_OFFSET ?= "${FLASH_KERNEL_OFFSET}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040047FLASH_ROFS_OFFSET ?= "4864"
Patrick Williams12fc9392021-08-06 09:16:53 -050048FLASH_ROFS_OFFSET:flash-65536 ?= "10240"
49FLASH_ROFS_OFFSET:flash-131072 ?= "10240"
Brad Bishop19fc4f82017-08-04 23:38:54 -040050FLASH_RWFS_OFFSET ?= "28672"
Patrick Williams12fc9392021-08-06 09:16:53 -050051FLASH_RWFS_OFFSET:flash-65536 ?= "43008"
52FLASH_RWFS_OFFSET:flash-131072 ?= "98304"
Brad Bishop19fc4f82017-08-04 23:38:54 -040053
Brad Bishop3aa1ef62017-08-04 23:48:12 -040054# UBI volume sizes in KB unless otherwise noted.
Adriana Kobylakb70005d2018-02-14 16:35:30 -060055FLASH_UBI_RWFS_SIZE ?= "6144"
Patrick Williams12fc9392021-08-06 09:16:53 -050056FLASH_UBI_RWFS_SIZE:flash-131072 ?= "32768"
Adriana Kobylakb70005d2018-02-14 16:35:30 -060057FLASH_UBI_RWFS_TXT_SIZE ?= "6MiB"
Patrick Williams12fc9392021-08-06 09:16:53 -050058FLASH_UBI_RWFS_TXT_SIZE:flash-131072 ?= "32MiB"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040059
Adriana Kobylak45a57952020-07-01 16:23:11 -050060# eMMC sizes in KB unless otherwise noted.
Adriana Kobylak55681e42020-11-11 15:06:50 -060061MMC_UBOOT_SIZE ?= "1024"
Adriana Kobylak45a57952020-07-01 16:23:11 -050062MMC_BOOT_PARTITION_SIZE ?= "65536"
63
Eddie Jamesb2b7ff62018-02-09 11:59:18 -060064SIGNING_KEY ?= "${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv"
65INSECURE_KEY = "${@'${SIGNING_KEY}' == '${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv'}"
66SIGNING_KEY_DEPENDS = "${@oe.utils.conditional('INSECURE_KEY', 'True', 'phosphor-insecure-signing-key-native:do_populate_sysroot', '', d)}"
67
Adriana Kobylakfb62a682019-10-28 16:03:12 -050068VERSION_PURPOSE ?= "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
69
Brad Bishop3e37d382018-03-31 12:17:28 -040070UBOOT_SUFFIX ?= "bin"
71
Brad Bishop3aa1ef62017-08-04 23:48:12 -040072python() {
73 # Compute rwfs LEB count and LEB size.
74 page_size = d.getVar('FLASH_PAGE_SIZE', True)
75 nor_overhead_size = d.getVar('FLASH_NOR_UBI_OVERHEAD', True)
76 overhead_size = max(int(page_size), int(nor_overhead_size))
77 peb_size = d.getVar('FLASH_PEB_SIZE', True)
78 leb_size = (int(peb_size) * 1024) - (2 * overhead_size)
79 d.setVar('FLASH_LEB_SIZE', str(leb_size)) # In bytes
80
81 rwfs_size = d.getVar('FLASH_UBI_RWFS_SIZE', True)
82 rwfs_size = int(rwfs_size) * 1024
83 lebs = int((rwfs_size + leb_size - 1) / leb_size) # Rounding up
84 d.setVar('FLASH_UBI_RWFS_LEBS', str(lebs))
85}
86
Brad Bishop19fc4f82017-08-04 23:38:54 -040087# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
88# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
89# reserved for the primary image (and setting them currently breaks the build).
90# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
91DISTROOVERRIDES .= ":static-rwfs-${OVERLAY_BASETYPE}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040092DISTROOVERRIDES .= ":ubi-rwfs-${FLASH_UBI_OVERLAY_BASETYPE}"
Adriana Kobylak5a5753a2019-07-30 11:27:46 -050093DISTROOVERRIDES .= ":mmc-rwfs-${FLASH_EXT4_OVERLAY_BASETYPE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040094
William A. Kennington IIIc230ab32019-09-16 17:44:48 -070095JFFS2_RWFS_CMD = "mkfs.jffs2 --root=jffs2 --faketime --output=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.jffs2"
96UBIFS_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 -050097EXT4_RWFS_CMD = "mkfs.ext4 -F ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.ext4"
Brad Bishop19fc4f82017-08-04 23:38:54 -040098
Patrick Williams12fc9392021-08-06 09:16:53 -050099FLASH_STATIC_RWFS_CMD:static-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
100FLASH_UBI_RWFS_CMD:ubi-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
101FLASH_UBI_RWFS_CMD:ubi-rwfs-ubifs = "${UBIFS_RWFS_CMD}"
102FLASH_EXT4_RWFS_CMD:mmc-rwfs-ext4 = "${EXT4_RWFS_CMD}"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400103
Adriana Kobylak661cf392019-07-29 14:39:00 -0500104mk_empty_image() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400105 image_dst="$1"
106 image_size_kb=$2
107 dd if=/dev/zero bs=1k count=$image_size_kb \
108 | tr '\000' '\377' > $image_dst
109}
110
Adriana Kobylak55681e42020-11-11 15:06:50 -0600111mk_empty_image_zeros() {
112 image_dst="$1"
113 image_size_kb=$2
114 dd if=/dev/zero of=$image_dst bs=1k count=$image_size_kb
115}
116
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500117clean_rwfs() {
118 type=$1
119 shift
120
121 rm -f ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type
122 rm -rf $type
123 mkdir $type
124}
125
Brad Bishop19fc4f82017-08-04 23:38:54 -0400126make_rwfs() {
127 type=$1
128 cmd=$2
129 shift
130 shift
131 opts="$@"
132
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500133 mkdir -p $type
Brad Bishop19fc4f82017-08-04 23:38:54 -0400134
135 $cmd $opts
136}
137
138do_generate_rwfs_static() {
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500139 clean_rwfs ${OVERLAY_BASETYPE}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400140 make_rwfs ${OVERLAY_BASETYPE} "${FLASH_STATIC_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
141}
142do_generate_rwfs_static[dirs] = " ${S}/static"
143do_generate_rwfs_static[depends] += " \
144 mtd-utils-native:do_populate_sysroot \
145 "
146
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400147do_generate_rwfs_ubi() {
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500148 clean_rwfs ${FLASH_UBI_OVERLAY_BASETYPE}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400149 make_rwfs ${FLASH_UBI_OVERLAY_BASETYPE} "${FLASH_UBI_RWFS_CMD}"
150}
151do_generate_rwfs_ubi[dirs] = " ${S}/ubi"
152do_generate_rwfs_ubi[depends] += " \
153 mtd-utils-native:do_populate_sysroot \
154 "
155
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500156do_generate_rwfs_ext4() {
157 clean_rwfs rwfs.${FLASH_EXT4_OVERLAY_BASETYPE}
158 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.ext4 1024
159 make_rwfs ${FLASH_EXT4_OVERLAY_BASETYPE} "${FLASH_EXT4_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
160}
161do_generate_rwfs_ext4[dirs] = " ${S}/ext4"
162do_generate_rwfs_ext4[depends] += " \
163 e2fsprogs-native:do_populate_sysroot \
164 "
165
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400166add_volume() {
167 config_file=$1
168 vol_id=$2
169 vol_type=$3
170 vol_name=$4
171 image=$5
172 vol_size=$6
173
174 echo \[$vol_name\] >> $config_file
175 echo mode=ubi >> $config_file
176 echo image=$image >> $config_file
177 echo vol_type=$vol_type >> $config_file
178 echo vol_name=$vol_name >> $config_file
179 echo vol_id=$vol_id >> $config_file
180 if [ ! -z $vol_size ]; then
181 echo vol_size=$vol_size >> $config_file
182 fi
183}
184
Saqib Khan41723472017-09-22 10:21:30 -0500185python do_generate_ubi() {
186 version_id = do_get_versionID(d)
187 d.setVar('VERSION_ID', version_id)
188 bb.build.exec_func("do_make_ubi", d)
189}
190do_generate_ubi[dirs] = "${S}/ubi"
191do_generate_ubi[depends] += " \
192 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
193 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500194 u-boot:do_deploy \
Saqib Khan41723472017-09-22 10:21:30 -0500195 mtd-utils-native:do_populate_sysroot \
196 "
197
198do_make_ubi() {
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400199 cfg=ubinize-${IMAGE_NAME}.cfg
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400200 rm -f $cfg ubi-img
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400201 # Construct the ubinize config file
Saqib Khan41723472017-09-22 10:21:30 -0500202 add_volume $cfg 0 static kernel-${VERSION_ID} \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400203 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}
204
Saqib Khan41723472017-09-22 10:21:30 -0500205 add_volume $cfg 1 static rofs-${VERSION_ID} \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400206 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_BASETYPE}
207
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700208 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 -0400209
210 # Build the ubi partition image
211 ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg
212
213 # Concatenate the uboot and ubi partitions
Adriana Kobylak661cf392019-07-29 14:39:00 -0500214 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd ${FLASH_SIZE}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400215 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
216 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
217 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
218 dd bs=1k conv=notrunc seek=${FLASH_UBI_OFFSET} \
219 if=ubi-img \
220 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
221
222 cd ${IMGDEPLOYDIR}
223 ln -sf ${IMAGE_NAME}.ubi.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubi.mtd
224}
Saqib Khan41723472017-09-22 10:21:30 -0500225do_make_ubi[dirs] = "${S}/ubi"
226do_make_ubi[depends] += " \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400227 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
228 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500229 u-boot:do_deploy \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400230 mtd-utils-native:do_populate_sysroot \
231 "
232
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300233do_mk_static_nor_image() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400234 # Assemble the flash image
Adriana Kobylak661cf392019-07-29 14:39:00 -0500235 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd ${FLASH_SIZE}
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300236}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400237
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500238do_generate_image_uboot_file() {
239 image_dst="$1"
240 uboot_offset=${FLASH_UBOOT_OFFSET}
241
242 if [ ! -z ${SPL_BINARY} ]; then
243 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
244 if=${DEPLOY_DIR_IMAGE}/u-boot-spl.${UBOOT_SUFFIX} \
245 of=${image_dst}
246 uboot_offset=${FLASH_UBOOT_SPL_SIZE}
247 fi
248
249 dd bs=1k conv=notrunc seek=${uboot_offset} \
250 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
251 of=${image_dst}
252}
253
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300254python do_generate_static() {
255 import subprocess
Brad Bishop19fc4f82017-08-04 23:38:54 -0400256
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300257 bb.build.exec_func("do_mk_static_nor_image", d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400258
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300259 nor_image = os.path.join(d.getVar('IMGDEPLOYDIR', True),
260 '%s.static.mtd' % d.getVar('IMAGE_NAME', True))
261
262 def _append_image(imgpath, start_kb, finish_kb):
263 imgsize = os.path.getsize(imgpath)
Josh Lehan0a5ef2a2020-02-26 12:11:33 -0800264 maxsize = (finish_kb - start_kb) * 1024
265 bb.debug(1, 'Considering file size=' + str(imgsize) + ' name=' + imgpath)
266 bb.debug(1, 'Spanning start=' + str(start_kb) + 'K end=' + str(finish_kb) + 'K')
267 bb.debug(1, 'Compare needed=' + str(imgsize) + ' available=' + str(maxsize) + ' margin=' + str(maxsize - imgsize))
268 if imgsize > maxsize:
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300269 bb.fatal("Image '%s' is too large!" % imgpath)
270
271 subprocess.check_call(['dd', 'bs=1k', 'conv=notrunc',
272 'seek=%d' % start_kb,
273 'if=%s' % imgpath,
274 'of=%s' % nor_image])
275
Adriana Kobylake913dd82020-04-13 13:56:41 -0500276 uboot_offset = int(d.getVar('FLASH_UBOOT_OFFSET', True))
277
278 spl_binary = d.getVar('SPL_BINARY', True)
279 if spl_binary:
280 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
281 'u-boot-spl.%s' % d.getVar('UBOOT_SUFFIX',True)),
282 int(d.getVar('FLASH_UBOOT_OFFSET', True)),
283 int(d.getVar('FLASH_UBOOT_SPL_SIZE', True)))
284 uboot_offset += int(d.getVar('FLASH_UBOOT_SPL_SIZE', True))
285
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300286 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
287 'u-boot.%s' % d.getVar('UBOOT_SUFFIX',True)),
Adriana Kobylake913dd82020-04-13 13:56:41 -0500288 uboot_offset,
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300289 int(d.getVar('FLASH_KERNEL_OFFSET', True)))
290
291 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
292 d.getVar('FLASH_KERNEL_IMAGE', True)),
293 int(d.getVar('FLASH_KERNEL_OFFSET', True)),
294 int(d.getVar('FLASH_ROFS_OFFSET', True)))
295
296 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
297 '%s.%s' % (
298 d.getVar('IMAGE_LINK_NAME', True),
299 d.getVar('IMAGE_BASETYPE', True))),
300 int(d.getVar('FLASH_ROFS_OFFSET', True)),
301 int(d.getVar('FLASH_RWFS_OFFSET', True)))
302
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700303 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
304 '%s.%s' % (
305 d.getVar('IMAGE_LINK_NAME', True),
306 d.getVar('OVERLAY_BASETYPE', True))),
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300307 int(d.getVar('FLASH_RWFS_OFFSET', True)),
308 int(d.getVar('FLASH_SIZE', True)))
309
310 bb.build.exec_func("do_mk_static_symlinks", d)
311}
312
313do_mk_static_symlinks() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400314 cd ${IMGDEPLOYDIR}
315 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd
316
317 # Maintain non-standard legacy links
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500318 do_generate_image_uboot_file ${IMGDEPLOYDIR}/image-u-boot
Brad Bishop19fc4f82017-08-04 23:38:54 -0400319 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/flash-${MACHINE}
320 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/image-bmc
Brad Bishop19fc4f82017-08-04 23:38:54 -0400321 ln -sf ${FLASH_KERNEL_IMAGE} ${IMGDEPLOYDIR}/image-kernel
322 ln -sf ${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} ${IMGDEPLOYDIR}/image-rofs
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700323 ln -sf ${IMAGE_LINK_NAME}.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/image-rwfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400324}
325do_generate_static[dirs] = "${S}/static"
326do_generate_static[depends] += " \
327 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
328 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500329 u-boot:do_deploy \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400330 "
331
Lei YUf2072212018-06-20 13:27:34 +0800332make_signatures() {
333 signature_files=""
334 for file in "$@"; do
335 openssl dgst -sha256 -sign ${SIGNING_KEY} -out "${file}.sig" $file
336 signature_files="${signature_files} ${file}.sig"
337 done
George Liuf0afcf82020-12-15 09:46:10 +0800338
339 if [ -n "$signature_files" ]; then
340 sort_signature_files=`echo "$signature_files" | tr ' ' '\n' | sort | tr '\n' ' '`
341 cat $sort_signature_files > image-full
342 openssl dgst -sha256 -sign ${SIGNING_KEY} -out image-full.sig image-full
343 signature_files="${signature_files} image-full.sig"
George Liuf0afcf82020-12-15 09:46:10 +0800344 fi
Lei YUf2072212018-06-20 13:27:34 +0800345}
346
Brad Bishop19fc4f82017-08-04 23:38:54 -0400347do_generate_static_alltar() {
Lei YUa4674942018-05-23 14:01:14 +0800348 ln -sf ${S}/MANIFEST MANIFEST
349 ln -sf ${S}/publickey publickey
Brad Bishop19fc4f82017-08-04 23:38:54 -0400350 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd image-bmc
Lei YUa4674942018-05-23 14:01:14 +0800351
Lei YUf2072212018-06-20 13:27:34 +0800352 make_signatures image-bmc MANIFEST publickey
Lei YUa4674942018-05-23 14:01:14 +0800353
354 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd.all.tar \
355 image-bmc MANIFEST publickey ${signature_files}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400356
357 cd ${IMGDEPLOYDIR}
358
359 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
360 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd.all.tar
361
362 # Maintain non-standard legacy link.
363 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
364 ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
Lei YUa4674942018-05-23 14:01:14 +0800365
Brad Bishop19fc4f82017-08-04 23:38:54 -0400366}
367do_generate_static_alltar[vardepsexclude] = "DATETIME"
368do_generate_static_alltar[dirs] = "${S}/static"
Lei YUa4674942018-05-23 14:01:14 +0800369do_generate_static_alltar[depends] += " \
370 openssl-native:do_populate_sysroot \
371 ${SIGNING_KEY_DEPENDS} \
372 ${PN}:do_copy_signing_pubkey \
373 "
Brad Bishop19fc4f82017-08-04 23:38:54 -0400374
Brad Bishopde659382018-03-30 01:46:16 -0400375make_image_links() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400376 rwfs=$1
377 rofs=$2
Brad Bishop19fc4f82017-08-04 23:38:54 -0400378 shift
379 shift
Brad Bishop19fc4f82017-08-04 23:38:54 -0400380
Brad Bishopde659382018-03-30 01:46:16 -0400381 # Create some links to help make the tar archive in the format
382 # expected by phosphor-bmc-code-mgmt.
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500383 do_generate_image_uboot_file image-u-boot
Brad Bishop19fc4f82017-08-04 23:38:54 -0400384 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
385 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rofs image-rofs
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700386 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rwfs image-rwfs
Brad Bishopde659382018-03-30 01:46:16 -0400387}
388
389make_tar_of_images() {
390 type=$1
391 shift
392 extra_files="$@"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400393
394 # Create the tar archive
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500395 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type.tar \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400396 image-u-boot image-kernel image-rofs image-rwfs $extra_files
397
398 cd ${IMGDEPLOYDIR}
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500399 ln -sf ${IMAGE_NAME}.$type.tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type.tar
Brad Bishop19fc4f82017-08-04 23:38:54 -0400400}
401
402do_generate_static_tar() {
Lei YUa4674942018-05-23 14:01:14 +0800403 ln -sf ${S}/MANIFEST MANIFEST
404 ln -sf ${S}/publickey publickey
Brad Bishopde659382018-03-30 01:46:16 -0400405 make_image_links ${OVERLAY_BASETYPE} ${IMAGE_BASETYPE}
Lei YUf2072212018-06-20 13:27:34 +0800406 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500407 make_tar_of_images static.mtd MANIFEST publickey ${signature_files}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400408
409 # Maintain non-standard legacy link.
410 cd ${IMGDEPLOYDIR}
411 ln -sf ${IMAGE_NAME}.static.mtd.tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
412}
413do_generate_static_tar[dirs] = " ${S}/static"
414do_generate_static_tar[depends] += " \
415 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
416 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500417 u-boot:do_deploy \
Lei YUa4674942018-05-23 14:01:14 +0800418 openssl-native:do_populate_sysroot \
419 ${SIGNING_KEY_DEPENDS} \
420 ${PN}:do_copy_signing_pubkey \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400421 "
422do_generate_static_tar[vardepsexclude] = "DATETIME"
423
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400424do_generate_ubi_tar() {
425 ln -sf ${S}/MANIFEST MANIFEST
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600426 ln -sf ${S}/publickey publickey
Brad Bishopde659382018-03-30 01:46:16 -0400427 make_image_links ${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_BASETYPE}
Lei YUf2072212018-06-20 13:27:34 +0800428 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500429 make_tar_of_images ubi.mtd MANIFEST publickey ${signature_files}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400430}
431do_generate_ubi_tar[dirs] = " ${S}/ubi"
432do_generate_ubi_tar[depends] += " \
433 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
434 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500435 u-boot:do_deploy \
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600436 openssl-native:do_populate_sysroot \
437 ${SIGNING_KEY_DEPENDS} \
438 ${PN}:do_copy_signing_pubkey \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400439 "
440
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500441do_generate_ext4_tar() {
Adriana Kobylak45a57952020-07-01 16:23:11 -0500442 # Generate the U-Boot image
Adriana Kobylak55681e42020-11-11 15:06:50 -0600443 mk_empty_image_zeros image-u-boot ${MMC_UBOOT_SIZE}
Adriana Kobylak45a57952020-07-01 16:23:11 -0500444 do_generate_image_uboot_file image-u-boot
445
446 # Generate a compressed ext4 filesystem with the fitImage file in it to be
447 # flashed to the boot partition of the eMMC
448 install -d boot-image
449 install -m 644 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} boot-image/fitImage
Adriana Kobylak55681e42020-11-11 15:06:50 -0600450 mk_empty_image_zeros boot-image.${FLASH_EXT4_BASETYPE} ${MMC_BOOT_PARTITION_SIZE}
Adriana Kobylak45a57952020-07-01 16:23:11 -0500451 mkfs.ext4 -F -i 4096 -d boot-image boot-image.${FLASH_EXT4_BASETYPE}
452 # Error codes 0-3 indicate successfull operation of fsck
453 fsck.ext4 -pvfD boot-image.${FLASH_EXT4_BASETYPE} || [ $? -le 3 ]
454 zstd -f -k -T0 -c ${ZSTD_COMPRESSION_LEVEL} boot-image.${FLASH_EXT4_BASETYPE} > boot-image.${FLASH_EXT4_BASETYPE}.zst
455
456 # Generate the compressed ext4 rootfs
457 zstd -f -k -T0 -c ${ZSTD_COMPRESSION_LEVEL} ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE} > ${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE}.zst
458
459 ln -sf boot-image.${FLASH_EXT4_BASETYPE}.zst image-kernel
460 ln -sf ${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE}.zst image-rofs
461 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.${FLASH_EXT4_OVERLAY_BASETYPE} image-rwfs
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500462 ln -sf ${S}/MANIFEST MANIFEST
463 ln -sf ${S}/publickey publickey
Adriana Kobylak81846a22020-07-12 15:12:36 -0500464
465 hostfw_update_file="${DEPLOY_DIR_IMAGE}/hostfw/update/image-hostfw"
466 if [ -e "${hostfw_update_file}" ]; then
467 ln -sf "${hostfw_update_file}" image-hostfw
468 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey image-hostfw
469 make_tar_of_images ext4.mmc MANIFEST publickey ${signature_files} image-hostfw
470 else
471 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
472 make_tar_of_images ext4.mmc MANIFEST publickey ${signature_files}
473 fi
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500474}
475do_generate_ext4_tar[dirs] = " ${S}/ext4"
476do_generate_ext4_tar[depends] += " \
Adriana Kobylak4cc866b2020-03-28 13:43:33 -0500477 zstd-native:do_populate_sysroot \
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500478 ${PN}:do_image_${FLASH_EXT4_BASETYPE} \
479 virtual/kernel:do_deploy \
Brad Bishop209ed522020-11-02 12:36:04 -0500480 u-boot:do_deploy \
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500481 openssl-native:do_populate_sysroot \
482 ${SIGNING_KEY_DEPENDS} \
483 ${PN}:do_copy_signing_pubkey \
Brad Bishop209ed522020-11-02 12:36:04 -0500484 phosphor-hostfw-image:do_deploy \
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500485 "
486
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600487def get_pubkey_basedir(d):
488 return os.path.join(
489 d.getVar('STAGING_DIR_TARGET', True),
490 d.getVar('sysconfdir', True).strip(os.sep),
491 'activationdata')
492
493def get_pubkey_type(d):
494 return os.listdir(get_pubkey_basedir(d))[0]
495
496def get_pubkey_path(d):
497 return os.path.join(
498 get_pubkey_basedir(d),
499 get_pubkey_type(d),
500 'publickey')
501
Brad Bishop19fc4f82017-08-04 23:38:54 -0400502python do_generate_phosphor_manifest() {
Adriana Kobylakfb62a682019-10-28 16:03:12 -0500503 purpose = d.getVar('VERSION_PURPOSE', True)
Saqib Khan41723472017-09-22 10:21:30 -0500504 version = do_get_version(d)
Adriana Kobylakcdd91ad2021-10-25 15:58:19 +0000505 build_id = do_get_buildID(d)
Vijay Khemkaae614bd2019-09-18 12:28:46 -0700506 target_machine = d.getVar('MACHINE', True)
Justin Ledfordb4de16d2022-03-24 17:27:17 -0700507 extended_version = d.getVar('EXTENDED_VERSION', True)
508 compatible_names = d.getVar('OBMC_COMPATIBLE_NAMES', True)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400509 with open('MANIFEST', 'w') as fd:
Adriana Kobylakfb62a682019-10-28 16:03:12 -0500510 fd.write('purpose={}\n'.format(purpose))
Brad Bishop19fc4f82017-08-04 23:38:54 -0400511 fd.write('version={}\n'.format(version.strip('"')))
Adriana Kobylakcdd91ad2021-10-25 15:58:19 +0000512 fd.write('BuildId={}\n'.format(build_id.strip('"')))
Justin Ledfordb4de16d2022-03-24 17:27:17 -0700513 if extended_version:
514 fd.write('ExtendedVersion={}\n'.format(extended_version))
515 if compatible_names:
516 for name in compatible_names.split():
517 fd.write('CompatibleName={}\n'.format(name))
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600518 fd.write('KeyType={}\n'.format(get_pubkey_type(d)))
519 fd.write('HashType=RSA-SHA256\n')
Vijay Khemkaae614bd2019-09-18 12:28:46 -0700520 fd.write('MachineName={}\n'.format(target_machine))
Brad Bishop19fc4f82017-08-04 23:38:54 -0400521}
522do_generate_phosphor_manifest[dirs] = "${S}"
523do_generate_phosphor_manifest[depends] += " \
524 os-release:do_populate_sysroot \
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600525 phosphor-image-signing:do_populate_sysroot \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400526 "
527
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600528python do_copy_signing_pubkey() {
529 with open(get_pubkey_path(d), 'r') as read_fd:
530 with open('publickey', 'w') as write_fd:
531 write_fd.write(read_fd.read())
532}
533
534do_copy_signing_pubkey[dirs] = "${S}"
535do_copy_signing_pubkey[depends] += " \
536 phosphor-image-signing:do_populate_sysroot \
537 "
538
539addtask copy_signing_pubkey after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400540addtask generate_phosphor_manifest after do_rootfs
541addtask generate_rwfs_static after do_rootfs
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400542addtask generate_rwfs_ubi after do_rootfs
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500543addtask generate_rwfs_ext4 after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400544
545python() {
546 types = d.getVar('IMAGE_FSTYPES', True).split()
547
548 if any([x in types for x in ['mtd-static', 'mtd-static-alltar']]):
549 bb.build.addtask(
550 'do_generate_static',
551 'do_image_complete',
552 'do_generate_rwfs_static', d)
553 if 'mtd-static-alltar' in types:
554 bb.build.addtask(
555 'do_generate_static_alltar',
556 'do_image_complete',
Lei YUa4674942018-05-23 14:01:14 +0800557 'do_generate_static do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400558 if 'mtd-static-tar' in types:
559 bb.build.addtask(
560 'do_generate_static_tar',
561 'do_image_complete',
Lei YUa4674942018-05-23 14:01:14 +0800562 'do_generate_rwfs_static do_generate_phosphor_manifest', d)
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400563
564 if 'mtd-ubi' in types:
565 bb.build.addtask(
566 'do_generate_ubi',
567 'do_image_complete',
568 'do_generate_rwfs_ubi', d)
569 if 'mtd-ubi-tar' in types:
570 bb.build.addtask(
571 'do_generate_ubi_tar',
572 'do_image_complete',
573 'do_generate_rwfs_ubi do_generate_phosphor_manifest', d)
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500574
575 if 'mmc-ext4-tar' in types:
576 bb.build.addtask(
577 'do_generate_ext4_tar',
578 'do_image_complete',
579 'do_generate_rwfs_ext4 do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400580}