blob: 753164551ca4240a74526c59a3cd3ecaf4291859 [file] [log] [blame]
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001inherit kernel-uboot kernel-artifact-names uboot-sign
Patrick Williamsc124f4f2015-09-15 14:41:29 -05002
Andrew Geissler9aee5002022-03-30 16:27:02 +00003def get_fit_replacement_type(d):
Brad Bishop6e60e8b2018-02-01 10:27:11 -05004 kerneltypes = d.getVar('KERNEL_IMAGETYPES') or ""
Andrew Geissler9aee5002022-03-30 16:27:02 +00005 replacementtype = ""
He Zhefe76b1e2016-05-25 04:47:16 -04006 if 'fitImage' in kerneltypes.split():
Brad Bishopd7bf8c12018-02-25 22:55:05 -05007 uarch = d.getVar("UBOOT_ARCH")
8 if uarch == "arm64":
9 replacementtype = "Image"
Brad Bishopc342db32019-05-15 21:57:59 -040010 elif uarch == "riscv":
11 replacementtype = "Image"
Brad Bishopd7bf8c12018-02-25 22:55:05 -050012 elif uarch == "mips":
Brad Bishop6e60e8b2018-02-01 10:27:11 -050013 replacementtype = "vmlinuz.bin"
Brad Bishopd7bf8c12018-02-25 22:55:05 -050014 elif uarch == "x86":
Patrick Williamsc0f7c042017-02-23 20:41:17 -060015 replacementtype = "bzImage"
Brad Bishop316dfdd2018-06-25 12:45:53 -040016 elif uarch == "microblaze":
17 replacementtype = "linux.bin"
Patrick Williamsc0f7c042017-02-23 20:41:17 -060018 else:
19 replacementtype = "zImage"
Andrew Geissler9aee5002022-03-30 16:27:02 +000020 return replacementtype
Patrick Williamsc0f7c042017-02-23 20:41:17 -060021
Andrew Geissler9aee5002022-03-30 16:27:02 +000022KERNEL_IMAGETYPE_REPLACEMENT ?= "${@get_fit_replacement_type(d)}"
23DEPENDS:append = " ${@'u-boot-tools-native dtc-native' if 'fitImage' in (d.getVar('KERNEL_IMAGETYPES') or '').split() else ''}"
Andrew Geisslerd1e89492021-02-12 15:35:20 -060024
Andrew Geissler9aee5002022-03-30 16:27:02 +000025python __anonymous () {
Brad Bishop19323692019-04-05 15:28:33 -040026 # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal
27 # to kernel.bbclass . We have to override it, since we pack zImage
28 # (at least for now) into the fitImage .
Brad Bishop6e60e8b2018-02-01 10:27:11 -050029 typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE") or ""
He Zhefe76b1e2016-05-25 04:47:16 -040030 if 'fitImage' in typeformake.split():
Andrew Geissler9aee5002022-03-30 16:27:02 +000031 d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake.replace('fitImage', d.getVar('KERNEL_IMAGETYPE_REPLACEMENT')))
Patrick Williamsc124f4f2015-09-15 14:41:29 -050032
Brad Bishop6e60e8b2018-02-01 10:27:11 -050033 image = d.getVar('INITRAMFS_IMAGE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -050034 if image:
George McCollister185c8ae2016-05-26 08:55:16 -050035 d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete')
36
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000037 ubootenv = d.getVar('UBOOT_ENV')
38 if ubootenv:
39 d.appendVarFlag('do_assemble_fitimage', 'depends', ' virtual/bootloader:do_populate_sysroot')
40
Brad Bishop19323692019-04-05 15:28:33 -040041 #check if there are any dtb providers
42 providerdtb = d.getVar("PREFERRED_PROVIDER_virtual/dtb")
43 if providerdtb:
44 d.appendVarFlag('do_assemble_fitimage', 'depends', ' virtual/dtb:do_populate_sysroot')
45 d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' virtual/dtb:do_populate_sysroot')
46 d.setVar('EXTERNAL_KERNEL_DEVICETREE', "${RECIPE_SYSROOT}/boot/devicetree")
47
Patrick Williamsc0f7c042017-02-23 20:41:17 -060048 # Verified boot will sign the fitImage and append the public key to
Brad Bishop6e60e8b2018-02-01 10:27:11 -050049 # U-Boot dtb. We ensure the U-Boot dtb is deployed before assembling
Patrick Williamsc0f7c042017-02-23 20:41:17 -060050 # the fitImage:
Brad Bishop15ae2502019-06-18 21:44:24 -040051 if d.getVar('UBOOT_SIGN_ENABLE') == "1" and d.getVar('UBOOT_DTB_BINARY'):
Brad Bishop6e60e8b2018-02-01 10:27:11 -050052 uboot_pn = d.getVar('PREFERRED_PROVIDER_u-boot') or 'u-boot'
Brad Bishop19323692019-04-05 15:28:33 -040053 d.appendVarFlag('do_assemble_fitimage', 'depends', ' %s:do_populate_sysroot' % uboot_pn)
Andrew Geisslerd1e89492021-02-12 15:35:20 -060054 if d.getVar('INITRAMFS_IMAGE_BUNDLE') == "1":
55 d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' %s:do_populate_sysroot' % uboot_pn)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050056}
57
Andrew Geisslerf0343792020-11-18 10:42:21 -060058
Andrew Geisslerd1e89492021-02-12 15:35:20 -060059# Description string
Andrew Geissler3b8a17c2021-04-15 15:55:55 -050060FIT_DESC ?= "Kernel fitImage for ${DISTRO_NAME}/${PV}/${MACHINE}"
Andrew Geisslerd1e89492021-02-12 15:35:20 -060061
62# Sign individual images as well
63FIT_SIGN_INDIVIDUAL ?= "0"
64
Andrew Geissler9aee5002022-03-30 16:27:02 +000065FIT_CONF_PREFIX ?= "conf-"
66FIT_CONF_PREFIX[doc] = "Prefix to use for FIT configuration node name"
67
68FIT_SUPPORTED_INITRAMFS_FSTYPES ?= "cpio.lz4 cpio.lzo cpio.lzma cpio.xz cpio.zst cpio.gz ext2.gz cpio"
69
Patrick Williams0ca19cc2021-08-16 14:03:13 -050070# Keys used to sign individually image nodes.
71# The keys to sign image nodes must be different from those used to sign
72# configuration nodes, otherwise the "required" property, from
73# UBOOT_DTB_BINARY, will be set to "conf", because "conf" prevails on "image".
74# Then the images signature checking will not be mandatory and no error will be
75# raised in case of failure.
76# UBOOT_SIGN_IMG_KEYNAME = "dev2" # keys name in keydir (eg. "dev2.crt", "dev2.key")
77
Patrick Williamsc124f4f2015-09-15 14:41:29 -050078#
79# Emit the fitImage ITS header
80#
George McCollister185c8ae2016-05-26 08:55:16 -050081# $1 ... .its filename
Patrick Williamsc124f4f2015-09-15 14:41:29 -050082fitimage_emit_fit_header() {
Andrew Geisslereff27472021-10-29 15:35:00 -050083 cat << EOF >> $1
Patrick Williamsc124f4f2015-09-15 14:41:29 -050084/dts-v1/;
85
86/ {
Andrew Geisslerd1e89492021-02-12 15:35:20 -060087 description = "${FIT_DESC}";
Patrick Williamsc124f4f2015-09-15 14:41:29 -050088 #address-cells = <1>;
89EOF
90}
91
92#
93# Emit the fitImage section bits
94#
George McCollister185c8ae2016-05-26 08:55:16 -050095# $1 ... .its filename
96# $2 ... Section bit type: imagestart - image section start
Patrick Williamsc124f4f2015-09-15 14:41:29 -050097# confstart - configuration section start
98# sectend - section end
99# fitend - fitimage end
100#
101fitimage_emit_section_maint() {
George McCollister185c8ae2016-05-26 08:55:16 -0500102 case $2 in
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500103 imagestart)
Andrew Geisslereff27472021-10-29 15:35:00 -0500104 cat << EOF >> $1
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500105
106 images {
107EOF
108 ;;
109 confstart)
Andrew Geisslereff27472021-10-29 15:35:00 -0500110 cat << EOF >> $1
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500111
112 configurations {
113EOF
114 ;;
115 sectend)
Andrew Geisslereff27472021-10-29 15:35:00 -0500116 cat << EOF >> $1
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500117 };
118EOF
119 ;;
120 fitend)
Andrew Geisslereff27472021-10-29 15:35:00 -0500121 cat << EOF >> $1
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500122};
123EOF
124 ;;
125 esac
126}
127
128#
129# Emit the fitImage ITS kernel section
130#
George McCollister185c8ae2016-05-26 08:55:16 -0500131# $1 ... .its filename
132# $2 ... Image counter
133# $3 ... Path to kernel image
134# $4 ... Compression type
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500135fitimage_emit_section_kernel() {
136
Brad Bishopf3fd2882019-06-21 08:06:37 -0400137 kernel_csum="${FIT_HASH_ALG}"
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600138 kernel_sign_algo="${FIT_SIGN_ALG}"
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500139 kernel_sign_keyname="${UBOOT_SIGN_IMG_KEYNAME}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500140
Brad Bishop316dfdd2018-06-25 12:45:53 -0400141 ENTRYPOINT="${UBOOT_ENTRYPOINT}"
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500142 if [ -n "${UBOOT_ENTRYSYMBOL}" ]; then
143 ENTRYPOINT=`${HOST_PREFIX}nm vmlinux | \
144 awk '$3=="${UBOOT_ENTRYSYMBOL}" {print "0x"$1;exit}'`
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500145 fi
146
Andrew Geisslereff27472021-10-29 15:35:00 -0500147 cat << EOF >> $1
148 kernel-$2 {
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500149 description = "Linux kernel";
Andrew Geisslereff27472021-10-29 15:35:00 -0500150 data = /incbin/("$3");
Andrew Geissler615f2f12022-07-15 14:00:58 -0500151 type = "${UBOOT_MKIMAGE_KERNEL_TYPE}";
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500152 arch = "${UBOOT_ARCH}";
153 os = "linux";
Andrew Geisslereff27472021-10-29 15:35:00 -0500154 compression = "$4";
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500155 load = <${UBOOT_LOADADDRESS}>;
Andrew Geisslereff27472021-10-29 15:35:00 -0500156 entry = <$ENTRYPOINT>;
Andrew Geissler90fd73c2021-03-05 15:25:55 -0600157 hash-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500158 algo = "$kernel_csum";
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500159 };
160 };
161EOF
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600162
Andrew Geisslereff27472021-10-29 15:35:00 -0500163 if [ "${UBOOT_SIGN_ENABLE}" = "1" -a "${FIT_SIGN_INDIVIDUAL}" = "1" -a -n "$kernel_sign_keyname" ] ; then
164 sed -i '$ d' $1
165 cat << EOF >> $1
Andrew Geissler90fd73c2021-03-05 15:25:55 -0600166 signature-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500167 algo = "$kernel_csum,$kernel_sign_algo";
168 key-name-hint = "$kernel_sign_keyname";
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600169 };
170 };
171EOF
172 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500173}
174
175#
176# Emit the fitImage ITS DTB section
177#
George McCollister185c8ae2016-05-26 08:55:16 -0500178# $1 ... .its filename
179# $2 ... Image counter
180# $3 ... Path to DTB image
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500181fitimage_emit_section_dtb() {
182
Brad Bishopf3fd2882019-06-21 08:06:37 -0400183 dtb_csum="${FIT_HASH_ALG}"
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600184 dtb_sign_algo="${FIT_SIGN_ALG}"
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500185 dtb_sign_keyname="${UBOOT_SIGN_IMG_KEYNAME}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500186
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800187 dtb_loadline=""
188 dtb_ext=${DTB##*.}
189 if [ "${dtb_ext}" = "dtbo" ]; then
190 if [ -n "${UBOOT_DTBO_LOADADDRESS}" ]; then
191 dtb_loadline="load = <${UBOOT_DTBO_LOADADDRESS}>;"
192 fi
193 elif [ -n "${UBOOT_DTB_LOADADDRESS}" ]; then
194 dtb_loadline="load = <${UBOOT_DTB_LOADADDRESS}>;"
195 fi
Andrew Geisslereff27472021-10-29 15:35:00 -0500196 cat << EOF >> $1
197 fdt-$2 {
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500198 description = "Flattened Device Tree blob";
Andrew Geisslereff27472021-10-29 15:35:00 -0500199 data = /incbin/("$3");
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500200 type = "flat_dt";
201 arch = "${UBOOT_ARCH}";
202 compression = "none";
Andrew Geisslereff27472021-10-29 15:35:00 -0500203 $dtb_loadline
Andrew Geissler90fd73c2021-03-05 15:25:55 -0600204 hash-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500205 algo = "$dtb_csum";
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500206 };
207 };
208EOF
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600209
Andrew Geisslereff27472021-10-29 15:35:00 -0500210 if [ "${UBOOT_SIGN_ENABLE}" = "1" -a "${FIT_SIGN_INDIVIDUAL}" = "1" -a -n "$dtb_sign_keyname" ] ; then
211 sed -i '$ d' $1
212 cat << EOF >> $1
Andrew Geissler90fd73c2021-03-05 15:25:55 -0600213 signature-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500214 algo = "$dtb_csum,$dtb_sign_algo";
215 key-name-hint = "$dtb_sign_keyname";
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600216 };
217 };
218EOF
219 fi
220}
221
222#
223# Emit the fitImage ITS u-boot script section
224#
225# $1 ... .its filename
226# $2 ... Image counter
227# $3 ... Path to boot script image
228fitimage_emit_section_boot_script() {
229
Andrew Geisslereff27472021-10-29 15:35:00 -0500230 bootscr_csum="${FIT_HASH_ALG}"
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600231 bootscr_sign_algo="${FIT_SIGN_ALG}"
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500232 bootscr_sign_keyname="${UBOOT_SIGN_IMG_KEYNAME}"
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600233
Andrew Geisslereff27472021-10-29 15:35:00 -0500234 cat << EOF >> $1
235 bootscr-$2 {
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600236 description = "U-boot script";
Andrew Geisslereff27472021-10-29 15:35:00 -0500237 data = /incbin/("$3");
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600238 type = "script";
239 arch = "${UBOOT_ARCH}";
240 compression = "none";
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700241 hash-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500242 algo = "$bootscr_csum";
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600243 };
244 };
245EOF
246
Andrew Geisslereff27472021-10-29 15:35:00 -0500247 if [ "${UBOOT_SIGN_ENABLE}" = "1" -a "${FIT_SIGN_INDIVIDUAL}" = "1" -a -n "$bootscr_sign_keyname" ] ; then
248 sed -i '$ d' $1
249 cat << EOF >> $1
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700250 signature-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500251 algo = "$bootscr_csum,$bootscr_sign_algo";
252 key-name-hint = "$bootscr_sign_keyname";
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600253 };
254 };
255EOF
256 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500257}
258
259#
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600260# Emit the fitImage ITS setup section
261#
262# $1 ... .its filename
263# $2 ... Image counter
264# $3 ... Path to setup image
265fitimage_emit_section_setup() {
266
Brad Bishopf3fd2882019-06-21 08:06:37 -0400267 setup_csum="${FIT_HASH_ALG}"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600268
Andrew Geisslereff27472021-10-29 15:35:00 -0500269 cat << EOF >> $1
270 setup-$2 {
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600271 description = "Linux setup.bin";
Andrew Geisslereff27472021-10-29 15:35:00 -0500272 data = /incbin/("$3");
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600273 type = "x86_setup";
274 arch = "${UBOOT_ARCH}";
275 os = "linux";
276 compression = "none";
277 load = <0x00090000>;
278 entry = <0x00090000>;
Andrew Geissler90fd73c2021-03-05 15:25:55 -0600279 hash-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500280 algo = "$setup_csum";
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600281 };
282 };
283EOF
284}
285
286#
George McCollister185c8ae2016-05-26 08:55:16 -0500287# Emit the fitImage ITS ramdisk section
288#
289# $1 ... .its filename
290# $2 ... Image counter
291# $3 ... Path to ramdisk image
292fitimage_emit_section_ramdisk() {
293
Brad Bishopf3fd2882019-06-21 08:06:37 -0400294 ramdisk_csum="${FIT_HASH_ALG}"
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600295 ramdisk_sign_algo="${FIT_SIGN_ALG}"
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500296 ramdisk_sign_keyname="${UBOOT_SIGN_IMG_KEYNAME}"
Nathan Rossib4a4dc02016-10-21 22:07:27 +1000297 ramdisk_loadline=""
298 ramdisk_entryline=""
299
300 if [ -n "${UBOOT_RD_LOADADDRESS}" ]; then
301 ramdisk_loadline="load = <${UBOOT_RD_LOADADDRESS}>;"
302 fi
303 if [ -n "${UBOOT_RD_ENTRYPOINT}" ]; then
304 ramdisk_entryline="entry = <${UBOOT_RD_ENTRYPOINT}>;"
305 fi
George McCollister185c8ae2016-05-26 08:55:16 -0500306
Andrew Geisslereff27472021-10-29 15:35:00 -0500307 cat << EOF >> $1
308 ramdisk-$2 {
Rick Altherrbc1b8802017-01-20 11:28:53 -0800309 description = "${INITRAMFS_IMAGE}";
Andrew Geisslereff27472021-10-29 15:35:00 -0500310 data = /incbin/("$3");
George McCollister185c8ae2016-05-26 08:55:16 -0500311 type = "ramdisk";
312 arch = "${UBOOT_ARCH}";
313 os = "linux";
Brad Bishop00e122a2019-10-05 11:10:57 -0400314 compression = "none";
Andrew Geisslereff27472021-10-29 15:35:00 -0500315 $ramdisk_loadline
316 $ramdisk_entryline
Andrew Geissler90fd73c2021-03-05 15:25:55 -0600317 hash-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500318 algo = "$ramdisk_csum";
George McCollister185c8ae2016-05-26 08:55:16 -0500319 };
320 };
321EOF
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600322
Andrew Geisslereff27472021-10-29 15:35:00 -0500323 if [ "${UBOOT_SIGN_ENABLE}" = "1" -a "${FIT_SIGN_INDIVIDUAL}" = "1" -a -n "$ramdisk_sign_keyname" ] ; then
324 sed -i '$ d' $1
325 cat << EOF >> $1
Andrew Geissler90fd73c2021-03-05 15:25:55 -0600326 signature-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500327 algo = "$ramdisk_csum,$ramdisk_sign_algo";
328 key-name-hint = "$ramdisk_sign_keyname";
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600329 };
330 };
331EOF
332 fi
George McCollister185c8ae2016-05-26 08:55:16 -0500333}
334
335#
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500336# Emit the fitImage ITS configuration section
337#
George McCollister185c8ae2016-05-26 08:55:16 -0500338# $1 ... .its filename
339# $2 ... Linux kernel ID
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500340# $3 ... DTB image name
George McCollister185c8ae2016-05-26 08:55:16 -0500341# $4 ... ramdisk ID
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600342# $5 ... u-boot script ID
343# $6 ... config ID
344# $7 ... default flag
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500345fitimage_emit_section_config() {
346
Brad Bishopf3fd2882019-06-21 08:06:37 -0400347 conf_csum="${FIT_HASH_ALG}"
Brad Bishop64c979e2019-11-04 13:55:29 -0500348 conf_sign_algo="${FIT_SIGN_ALG}"
Patrick Williamsdb4c27e2022-08-05 08:10:29 -0500349 conf_padding_algo="${FIT_PAD_ALG}"
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700350 if [ "${UBOOT_SIGN_ENABLE}" = "1" ] ; then
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600351 conf_sign_keyname="${UBOOT_SIGN_KEYNAME}"
352 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500353
Andrew Geisslereff27472021-10-29 15:35:00 -0500354 its_file="$1"
355 kernel_id="$2"
356 dtb_image="$3"
357 ramdisk_id="$4"
358 bootscr_id="$5"
359 config_id="$6"
360 default_flag="$7"
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600361
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500362 # Test if we have any DTBs at all
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800363 sep=""
364 conf_desc=""
Andrew Geissler9aee5002022-03-30 16:27:02 +0000365 conf_node="${FIT_CONF_PREFIX}"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800366 kernel_line=""
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600367 fdt_line=""
368 ramdisk_line=""
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600369 bootscr_line=""
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500370 setup_line=""
371 default_line=""
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600372
Andrew Geissler635e0e42020-08-21 15:58:33 -0500373 # conf node name is selected based on dtb ID if it is present,
374 # otherwise its selected based on kernel ID
Andrew Geisslereff27472021-10-29 15:35:00 -0500375 if [ -n "$dtb_image" ]; then
376 conf_node=$conf_node$dtb_image
Andrew Geissler635e0e42020-08-21 15:58:33 -0500377 else
Andrew Geisslereff27472021-10-29 15:35:00 -0500378 conf_node=$conf_node$kernel_id
Andrew Geissler635e0e42020-08-21 15:58:33 -0500379 fi
380
Andrew Geisslereff27472021-10-29 15:35:00 -0500381 if [ -n "$kernel_id" ]; then
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800382 conf_desc="Linux kernel"
383 sep=", "
Andrew Geisslereff27472021-10-29 15:35:00 -0500384 kernel_line="kernel = \"kernel-$kernel_id\";"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800385 fi
386
Andrew Geisslereff27472021-10-29 15:35:00 -0500387 if [ -n "$dtb_image" ]; then
388 conf_desc="$conf_desc${sep}FDT blob"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800389 sep=", "
Andrew Geisslereff27472021-10-29 15:35:00 -0500390 fdt_line="fdt = \"fdt-$dtb_image\";"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600391 fi
392
Andrew Geisslereff27472021-10-29 15:35:00 -0500393 if [ -n "$ramdisk_id" ]; then
394 conf_desc="$conf_desc${sep}ramdisk"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800395 sep=", "
Andrew Geisslereff27472021-10-29 15:35:00 -0500396 ramdisk_line="ramdisk = \"ramdisk-$ramdisk_id\";"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500397 fi
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600398
Andrew Geisslereff27472021-10-29 15:35:00 -0500399 if [ -n "$bootscr_id" ]; then
400 conf_desc="$conf_desc${sep}u-boot script"
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600401 sep=", "
Andrew Geisslereff27472021-10-29 15:35:00 -0500402 bootscr_line="bootscr = \"bootscr-$bootscr_id\";"
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600403 fi
404
Andrew Geisslereff27472021-10-29 15:35:00 -0500405 if [ -n "$config_id" ]; then
406 conf_desc="$conf_desc${sep}setup"
407 setup_line="setup = \"setup-$config_id\";"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600408 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500409
Andrew Geisslereff27472021-10-29 15:35:00 -0500410 if [ "$default_flag" = "1" ]; then
Andrew Geissler635e0e42020-08-21 15:58:33 -0500411 # default node is selected based on dtb ID if it is present,
412 # otherwise its selected based on kernel ID
Andrew Geisslereff27472021-10-29 15:35:00 -0500413 if [ -n "$dtb_image" ]; then
Andrew Geissler9aee5002022-03-30 16:27:02 +0000414 default_line="default = \"${FIT_CONF_PREFIX}$dtb_image\";"
Andrew Geissler635e0e42020-08-21 15:58:33 -0500415 else
Andrew Geissler9aee5002022-03-30 16:27:02 +0000416 default_line="default = \"${FIT_CONF_PREFIX}$kernel_id\";"
Andrew Geissler635e0e42020-08-21 15:58:33 -0500417 fi
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500418 fi
419
Andrew Geisslereff27472021-10-29 15:35:00 -0500420 cat << EOF >> $its_file
421 $default_line
Andrew Geissler635e0e42020-08-21 15:58:33 -0500422 $conf_node {
Andrew Geisslereff27472021-10-29 15:35:00 -0500423 description = "$default_flag $conf_desc";
424 $kernel_line
425 $fdt_line
426 $ramdisk_line
427 $bootscr_line
428 $setup_line
Andrew Geissler90fd73c2021-03-05 15:25:55 -0600429 hash-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500430 algo = "$conf_csum";
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500431 };
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600432EOF
433
Andrew Geisslereff27472021-10-29 15:35:00 -0500434 if [ -n "$conf_sign_keyname" ] ; then
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600435
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800436 sign_line="sign-images = "
437 sep=""
438
Andrew Geisslereff27472021-10-29 15:35:00 -0500439 if [ -n "$kernel_id" ]; then
440 sign_line="$sign_line${sep}\"kernel\""
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800441 sep=", "
442 fi
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600443
Andrew Geisslereff27472021-10-29 15:35:00 -0500444 if [ -n "$dtb_image" ]; then
445 sign_line="$sign_line${sep}\"fdt\""
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800446 sep=", "
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600447 fi
448
Andrew Geisslereff27472021-10-29 15:35:00 -0500449 if [ -n "$ramdisk_id" ]; then
450 sign_line="$sign_line${sep}\"ramdisk\""
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800451 sep=", "
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600452 fi
453
Andrew Geisslereff27472021-10-29 15:35:00 -0500454 if [ -n "$bootscr_id" ]; then
455 sign_line="$sign_line${sep}\"bootscr\""
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600456 sep=", "
457 fi
458
Andrew Geisslereff27472021-10-29 15:35:00 -0500459 if [ -n "$config_id" ]; then
460 sign_line="$sign_line${sep}\"setup\""
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600461 fi
462
Andrew Geisslereff27472021-10-29 15:35:00 -0500463 sign_line="$sign_line;"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600464
Andrew Geisslereff27472021-10-29 15:35:00 -0500465 cat << EOF >> $its_file
Andrew Geissler90fd73c2021-03-05 15:25:55 -0600466 signature-1 {
Andrew Geisslereff27472021-10-29 15:35:00 -0500467 algo = "$conf_csum,$conf_sign_algo";
468 key-name-hint = "$conf_sign_keyname";
Patrick Williamsdb4c27e2022-08-05 08:10:29 -0500469 padding = "$conf_padding_algo";
Andrew Geisslereff27472021-10-29 15:35:00 -0500470 $sign_line
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600471 };
472EOF
473 fi
474
Andrew Geisslereff27472021-10-29 15:35:00 -0500475 cat << EOF >> $its_file
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500476 };
477EOF
478}
479
George McCollister185c8ae2016-05-26 08:55:16 -0500480#
481# Assemble fitImage
482#
483# $1 ... .its filename
484# $2 ... fitImage name
485# $3 ... include ramdisk
486fitimage_assemble() {
487 kernelcount=1
488 dtbcount=""
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500489 DTBS=""
Andrew Geisslereff27472021-10-29 15:35:00 -0500490 ramdiskcount=$3
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600491 setupcount=""
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600492 bootscr_id=""
Andrew Geisslereff27472021-10-29 15:35:00 -0500493 rm -f $1 arch/${ARCH}/boot/$2
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500494
Andrew Geisslereff27472021-10-29 15:35:00 -0500495 if [ -n "${UBOOT_SIGN_IMG_KEYNAME}" -a "${UBOOT_SIGN_KEYNAME}" = "${UBOOT_SIGN_IMG_KEYNAME}" ]; then
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500496 bbfatal "Keys used to sign images and configuration nodes must be different."
497 fi
498
Andrew Geisslereff27472021-10-29 15:35:00 -0500499 fitimage_emit_fit_header $1
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500500
George McCollister185c8ae2016-05-26 08:55:16 -0500501 #
502 # Step 1: Prepare a kernel image section.
503 #
Andrew Geisslereff27472021-10-29 15:35:00 -0500504 fitimage_emit_section_maint $1 imagestart
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500505
George McCollister185c8ae2016-05-26 08:55:16 -0500506 uboot_prep_kimage
Andrew Geisslereff27472021-10-29 15:35:00 -0500507 fitimage_emit_section_kernel $1 $kernelcount linux.bin "$linux_comp"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500508
George McCollister185c8ae2016-05-26 08:55:16 -0500509 #
510 # Step 2: Prepare a DTB image section
511 #
Brad Bishop19323692019-04-05 15:28:33 -0400512
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500513 if [ -n "${KERNEL_DEVICETREE}" ]; then
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500514 dtbcount=1
George McCollister185c8ae2016-05-26 08:55:16 -0500515 for DTB in ${KERNEL_DEVICETREE}; do
Andrew Geisslereff27472021-10-29 15:35:00 -0500516 if echo $DTB | grep -q '/dts/'; then
517 bbwarn "$DTB contains the full path to the the dts file, but only the dtb name should be used."
518 DTB=`basename $DTB | sed 's,\.dts$,.dtb,g'`
George McCollister185c8ae2016-05-26 08:55:16 -0500519 fi
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500520
521 # Skip ${DTB} if it's also provided in ${EXTERNAL_KERNEL_DEVICETREE}
522 if [ -n "${EXTERNAL_KERNEL_DEVICETREE}" ] && [ -s ${EXTERNAL_KERNEL_DEVICETREE}/${DTB} ]; then
523 continue
524 fi
525
Andrew Geisslereff27472021-10-29 15:35:00 -0500526 DTB_PATH="arch/${ARCH}/boot/dts/$DTB"
527 if [ ! -e "$DTB_PATH" ]; then
528 DTB_PATH="arch/${ARCH}/boot/$DTB"
George McCollister185c8ae2016-05-26 08:55:16 -0500529 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500530
Andrew Geisslereff27472021-10-29 15:35:00 -0500531 DTB=$(echo "$DTB" | tr '/' '_')
532 DTBS="$DTBS $DTB"
533 fitimage_emit_section_dtb $1 $DTB $DTB_PATH
George McCollister185c8ae2016-05-26 08:55:16 -0500534 done
535 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500536
Brad Bishop19323692019-04-05 15:28:33 -0400537 if [ -n "${EXTERNAL_KERNEL_DEVICETREE}" ]; then
538 dtbcount=1
Andrew Geissler82c905d2020-04-13 13:39:40 -0500539 for DTB in $(find "${EXTERNAL_KERNEL_DEVICETREE}" \( -name '*.dtb' -o -name '*.dtbo' \) -printf '%P\n' | sort); do
Andrew Geisslereff27472021-10-29 15:35:00 -0500540 DTB=$(echo "$DTB" | tr '/' '_')
541 DTBS="$DTBS $DTB"
542 fitimage_emit_section_dtb $1 $DTB "${EXTERNAL_KERNEL_DEVICETREE}/$DTB"
Brad Bishop19323692019-04-05 15:28:33 -0400543 done
544 fi
545
George McCollister185c8ae2016-05-26 08:55:16 -0500546 #
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600547 # Step 3: Prepare a u-boot script section
548 #
549
550 if [ -n "${UBOOT_ENV}" ] && [ -d "${STAGING_DIR_HOST}/boot" ]; then
551 if [ -e "${STAGING_DIR_HOST}/boot/${UBOOT_ENV_BINARY}" ]; then
552 cp ${STAGING_DIR_HOST}/boot/${UBOOT_ENV_BINARY} ${B}
553 bootscr_id="${UBOOT_ENV_BINARY}"
Andrew Geisslereff27472021-10-29 15:35:00 -0500554 fitimage_emit_section_boot_script $1 "$bootscr_id" ${UBOOT_ENV_BINARY}
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600555 else
556 bbwarn "${STAGING_DIR_HOST}/boot/${UBOOT_ENV_BINARY} not found."
557 fi
558 fi
559
560 #
561 # Step 4: Prepare a setup section. (For x86)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600562 #
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500563 if [ -e arch/${ARCH}/boot/setup.bin ]; then
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600564 setupcount=1
Andrew Geisslereff27472021-10-29 15:35:00 -0500565 fitimage_emit_section_setup $1 $setupcount arch/${ARCH}/boot/setup.bin
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600566 fi
567
568 #
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600569 # Step 5: Prepare a ramdisk section.
George McCollister185c8ae2016-05-26 08:55:16 -0500570 #
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600571 if [ "x${ramdiskcount}" = "x1" ] && [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then
Rick Altherrbc1b8802017-01-20 11:28:53 -0800572 # Find and use the first initramfs image archive type we find
Andrew Geissler9aee5002022-03-30 16:27:02 +0000573 found=
574 for img in ${FIT_SUPPORTED_INITRAMFS_FSTYPES}; do
Andrew Geisslereff27472021-10-29 15:35:00 -0500575 initramfs_path="${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.$img"
Andrew Geisslereff27472021-10-29 15:35:00 -0500576 if [ -e "$initramfs_path" ]; then
Andrew Geissler9aee5002022-03-30 16:27:02 +0000577 bbnote "Found initramfs image: $initramfs_path"
578 found=true
Andrew Geisslereff27472021-10-29 15:35:00 -0500579 fitimage_emit_section_ramdisk $1 "$ramdiskcount" "$initramfs_path"
Rick Altherrbc1b8802017-01-20 11:28:53 -0800580 break
Andrew Geisslereff27472021-10-29 15:35:00 -0500581 else
Andrew Geissler9aee5002022-03-30 16:27:02 +0000582 bbnote "Did not find initramfs image: $initramfs_path"
Rick Altherrbc1b8802017-01-20 11:28:53 -0800583 fi
584 done
Andrew Geissler9aee5002022-03-30 16:27:02 +0000585
586 if [ -z "$found" ]; then
587 bbfatal "Could not find a valid initramfs type for ${INITRAMFS_IMAGE_NAME}, the supported types are: ${FIT_SUPPORTED_INITRAMFS_FSTYPES}"
588 fi
George McCollister185c8ae2016-05-26 08:55:16 -0500589 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500590
Andrew Geisslereff27472021-10-29 15:35:00 -0500591 fitimage_emit_section_maint $1 sectend
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500592
George McCollister185c8ae2016-05-26 08:55:16 -0500593 # Force the first Kernel and DTB in the default config
594 kernelcount=1
Andrew Geisslereff27472021-10-29 15:35:00 -0500595 if [ -n "$dtbcount" ]; then
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600596 dtbcount=1
597 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500598
George McCollister185c8ae2016-05-26 08:55:16 -0500599 #
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600600 # Step 6: Prepare a configurations section
George McCollister185c8ae2016-05-26 08:55:16 -0500601 #
Andrew Geisslereff27472021-10-29 15:35:00 -0500602 fitimage_emit_section_maint $1 confstart
George McCollister185c8ae2016-05-26 08:55:16 -0500603
Andrew Geissler635e0e42020-08-21 15:58:33 -0500604 # kernel-fitimage.bbclass currently only supports a single kernel (no less or
605 # more) to be added to the FIT image along with 0 or more device trees and
606 # 0 or 1 ramdisk.
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600607 # It is also possible to include an initramfs bundle (kernel and rootfs in one binary)
608 # When the initramfs bundle is used ramdisk is disabled.
Andrew Geissler635e0e42020-08-21 15:58:33 -0500609 # If a device tree is to be part of the FIT image, then select
610 # the default configuration to be used is based on the dtbcount. If there is
611 # no dtb present than select the default configuation to be based on
612 # the kernelcount.
Andrew Geisslereff27472021-10-29 15:35:00 -0500613 if [ -n "$DTBS" ]; then
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500614 i=1
615 for DTB in ${DTBS}; do
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800616 dtb_ext=${DTB##*.}
Andrew Geisslereff27472021-10-29 15:35:00 -0500617 if [ "$dtb_ext" = "dtbo" ]; then
618 fitimage_emit_section_config $1 "" "$DTB" "" "$bootscr_id" "" "`expr $i = $dtbcount`"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800619 else
Andrew Geisslereff27472021-10-29 15:35:00 -0500620 fitimage_emit_section_config $1 $kernelcount "$DTB" "$ramdiskcount" "$bootscr_id" "$setupcount" "`expr $i = $dtbcount`"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800621 fi
Andrew Geisslereff27472021-10-29 15:35:00 -0500622 i=`expr $i + 1`
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500623 done
Andrew Geissler635e0e42020-08-21 15:58:33 -0500624 else
625 defaultconfigcount=1
Andrew Geisslereff27472021-10-29 15:35:00 -0500626 fitimage_emit_section_config $1 $kernelcount "" "$ramdiskcount" "$bootscr_id" "$setupcount" $defaultconfigcount
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500627 fi
George McCollister185c8ae2016-05-26 08:55:16 -0500628
Andrew Geisslereff27472021-10-29 15:35:00 -0500629 fitimage_emit_section_maint $1 sectend
George McCollister185c8ae2016-05-26 08:55:16 -0500630
Andrew Geisslereff27472021-10-29 15:35:00 -0500631 fitimage_emit_section_maint $1 fitend
George McCollister185c8ae2016-05-26 08:55:16 -0500632
633 #
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600634 # Step 7: Assemble the image
George McCollister185c8ae2016-05-26 08:55:16 -0500635 #
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600636 ${UBOOT_MKIMAGE} \
George McCollister185c8ae2016-05-26 08:55:16 -0500637 ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
Andrew Geisslereff27472021-10-29 15:35:00 -0500638 -f $1 \
639 arch/${ARCH}/boot/$2
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600640
641 #
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600642 # Step 8: Sign the image and add public key to U-Boot dtb
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600643 #
644 if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then
Brad Bishop19323692019-04-05 15:28:33 -0400645 add_key_to_u_boot=""
646 if [ -n "${UBOOT_DTB_BINARY}" ]; then
647 # The u-boot.dtb is a symlink to UBOOT_DTB_IMAGE, so we need copy
648 # both of them, and don't dereference the symlink.
649 cp -P ${STAGING_DATADIR}/u-boot*.dtb ${B}
650 add_key_to_u_boot="-K ${B}/${UBOOT_DTB_BINARY}"
651 fi
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600652 ${UBOOT_MKIMAGE_SIGN} \
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600653 ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
654 -F -k "${UBOOT_SIGN_KEYDIR}" \
Brad Bishop19323692019-04-05 15:28:33 -0400655 $add_key_to_u_boot \
Andrew Geisslereff27472021-10-29 15:35:00 -0500656 -r arch/${ARCH}/boot/$2 \
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600657 ${UBOOT_MKIMAGE_SIGN_ARGS}
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600658 fi
George McCollister185c8ae2016-05-26 08:55:16 -0500659}
660
661do_assemble_fitimage() {
662 if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage"; then
663 cd ${B}
Andrew Geisslereff27472021-10-29 15:35:00 -0500664 fitimage_assemble fit-image.its fitImage ""
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500665 fi
666}
667
668addtask assemble_fitimage before do_install after do_compile
669
George McCollister185c8ae2016-05-26 08:55:16 -0500670do_assemble_fitimage_initramfs() {
671 if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage" && \
672 test -n "${INITRAMFS_IMAGE}" ; then
673 cd ${B}
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600674 if [ "${INITRAMFS_IMAGE_BUNDLE}" = "1" ]; then
675 fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage ""
676 else
677 fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage-${INITRAMFS_IMAGE} 1
678 fi
George McCollister185c8ae2016-05-26 08:55:16 -0500679 fi
680}
681
Brad Bishop19323692019-04-05 15:28:33 -0400682addtask assemble_fitimage_initramfs before do_deploy after do_bundle_initramfs
George McCollister185c8ae2016-05-26 08:55:16 -0500683
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700684do_kernel_generate_rsa_keys() {
685 if [ "${UBOOT_SIGN_ENABLE}" = "0" ] && [ "${FIT_GENERATE_KEYS}" = "1" ]; then
686 bbwarn "FIT_GENERATE_KEYS is set to 1 even though UBOOT_SIGN_ENABLE is set to 0. The keys will not be generated as they won't be used."
687 fi
688
689 if [ "${UBOOT_SIGN_ENABLE}" = "1" ] && [ "${FIT_GENERATE_KEYS}" = "1" ]; then
690
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500691 # Generate keys to sign configuration nodes, only if they don't already exist
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700692 if [ ! -f "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_KEYNAME}".key ] || \
693 [ ! -f "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_KEYNAME}".crt ]; then
694
695 # make directory if it does not already exist
696 mkdir -p "${UBOOT_SIGN_KEYDIR}"
697
Andrew Geissler9aee5002022-03-30 16:27:02 +0000698 bbnote "Generating RSA private key for signing fitImage"
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700699 openssl genrsa ${FIT_KEY_GENRSA_ARGS} -out \
700 "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_KEYNAME}".key \
701 "${FIT_SIGN_NUMBITS}"
702
Andrew Geissler9aee5002022-03-30 16:27:02 +0000703 bbnote "Generating certificate for signing fitImage"
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700704 openssl req ${FIT_KEY_REQ_ARGS} "${FIT_KEY_SIGN_PKCS}" \
705 -key "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_KEYNAME}".key \
706 -out "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_KEYNAME}".crt
707 fi
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500708
709 # Generate keys to sign image nodes, only if they don't already exist
710 if [ ! -f "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_IMG_KEYNAME}".key ] || \
711 [ ! -f "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_IMG_KEYNAME}".crt ]; then
712
713 # make directory if it does not already exist
714 mkdir -p "${UBOOT_SIGN_KEYDIR}"
715
Andrew Geissler9aee5002022-03-30 16:27:02 +0000716 bbnote "Generating RSA private key for signing fitImage"
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500717 openssl genrsa ${FIT_KEY_GENRSA_ARGS} -out \
718 "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_IMG_KEYNAME}".key \
719 "${FIT_SIGN_NUMBITS}"
720
Andrew Geissler9aee5002022-03-30 16:27:02 +0000721 bbnote "Generating certificate for signing fitImage"
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500722 openssl req ${FIT_KEY_REQ_ARGS} "${FIT_KEY_SIGN_PKCS}" \
723 -key "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_IMG_KEYNAME}".key \
724 -out "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_IMG_KEYNAME}".crt
725 fi
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700726 fi
727}
728
729addtask kernel_generate_rsa_keys before do_assemble_fitimage after do_compile
George McCollister185c8ae2016-05-26 08:55:16 -0500730
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500731kernel_do_deploy[vardepsexclude] = "DATETIME"
Patrick Williams213cb262021-08-07 19:21:33 -0500732kernel_do_deploy:append() {
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500733 # Update deploy directory
He Zhefe76b1e2016-05-25 04:47:16 -0400734 if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage"; then
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800735
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600736 if [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then
Andrew Geissler9aee5002022-03-30 16:27:02 +0000737 bbnote "Copying fit-image.its source file..."
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600738 install -m 0644 ${B}/fit-image.its "$deployDir/fitImage-its-${KERNEL_FIT_NAME}.its"
Andrew Geissler595f6302022-01-24 19:11:47 +0000739 if [ -n "${KERNEL_FIT_LINK_NAME}" ] ; then
740 ln -snf fitImage-its-${KERNEL_FIT_NAME}.its "$deployDir/fitImage-its-${KERNEL_FIT_LINK_NAME}"
741 fi
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600742
Andrew Geissler9aee5002022-03-30 16:27:02 +0000743 bbnote "Copying linux.bin file..."
Andrew Geissler595f6302022-01-24 19:11:47 +0000744 install -m 0644 ${B}/linux.bin $deployDir/fitImage-linux.bin-${KERNEL_FIT_NAME}${KERNEL_FIT_BIN_EXT}
745 if [ -n "${KERNEL_FIT_LINK_NAME}" ] ; then
746 ln -snf fitImage-linux.bin-${KERNEL_FIT_NAME}${KERNEL_FIT_BIN_EXT} "$deployDir/fitImage-linux.bin-${KERNEL_FIT_LINK_NAME}"
747 fi
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600748 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500749
George McCollister185c8ae2016-05-26 08:55:16 -0500750 if [ -n "${INITRAMFS_IMAGE}" ]; then
Andrew Geissler9aee5002022-03-30 16:27:02 +0000751 bbnote "Copying fit-image-${INITRAMFS_IMAGE}.its source file..."
Brad Bishop64c979e2019-11-04 13:55:29 -0500752 install -m 0644 ${B}/fit-image-${INITRAMFS_IMAGE}.its "$deployDir/fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.its"
Andrew Geissler595f6302022-01-24 19:11:47 +0000753 if [ -n "${KERNEL_FIT_LINK_NAME}" ] ; then
754 ln -snf fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.its "$deployDir/fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_LINK_NAME}"
755 fi
George McCollister185c8ae2016-05-26 08:55:16 -0500756
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600757 if [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then
Andrew Geissler9aee5002022-03-30 16:27:02 +0000758 bbnote "Copying fitImage-${INITRAMFS_IMAGE} file..."
Andrew Geissler595f6302022-01-24 19:11:47 +0000759 install -m 0644 ${B}/arch/${ARCH}/boot/fitImage-${INITRAMFS_IMAGE} "$deployDir/fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}${KERNEL_FIT_BIN_EXT}"
760 if [ -n "${KERNEL_FIT_LINK_NAME}" ] ; then
761 ln -snf fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}${KERNEL_FIT_BIN_EXT} "$deployDir/fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_LINK_NAME}"
762 fi
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600763 fi
George McCollister185c8ae2016-05-26 08:55:16 -0500764 fi
Andrew Geissler3b8a17c2021-04-15 15:55:55 -0500765 fi
766 if [ "${UBOOT_SIGN_ENABLE}" = "1" -o "${UBOOT_FITIMAGE_ENABLE}" = "1" ] && \
767 [ -n "${UBOOT_DTB_BINARY}" ] ; then
768 # UBOOT_DTB_IMAGE is a realfile, but we can't use
769 # ${UBOOT_DTB_IMAGE} since it contains ${PV} which is aimed
770 # for u-boot, but we are in kernel env now.
771 install -m 0644 ${B}/u-boot-${MACHINE}*.dtb "$deployDir/"
772 fi
773 if [ "${UBOOT_FITIMAGE_ENABLE}" = "1" -a -n "${UBOOT_BINARY}" -a -n "${SPL_DTB_BINARY}" ] ; then
774 # If we're also creating and/or signing the uboot fit, now we need to
775 # deploy it, it's its file, as well as u-boot-spl.dtb
776 install -m 0644 ${B}/u-boot-spl-${MACHINE}*.dtb "$deployDir/"
Andrew Geissler9aee5002022-03-30 16:27:02 +0000777 bbnote "Copying u-boot-fitImage file..."
Andrew Geissler3b8a17c2021-04-15 15:55:55 -0500778 install -m 0644 ${B}/u-boot-fitImage-* "$deployDir/"
Andrew Geissler9aee5002022-03-30 16:27:02 +0000779 bbnote "Copying u-boot-its file..."
Andrew Geissler3b8a17c2021-04-15 15:55:55 -0500780 install -m 0644 ${B}/u-boot-its-* "$deployDir/"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500781 fi
782}
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600783
784# The function below performs the following in case of initramfs bundles:
785# - Removes do_assemble_fitimage. FIT generation is done through
786# do_assemble_fitimage_initramfs. do_assemble_fitimage is not needed
787# and should not be part of the tasks to be executed.
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700788# - Since do_kernel_generate_rsa_keys is inserted by default
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600789# between do_compile and do_assemble_fitimage, this is
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700790# not suitable in case of initramfs bundles. do_kernel_generate_rsa_keys
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600791# should be between do_bundle_initramfs and do_assemble_fitimage_initramfs.
792python () {
793 if d.getVar('INITRAMFS_IMAGE_BUNDLE') == "1":
794 bb.build.deltask('do_assemble_fitimage', d)
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700795 bb.build.deltask('kernel_generate_rsa_keys', d)
796 bb.build.addtask('kernel_generate_rsa_keys', 'do_assemble_fitimage_initramfs', 'do_bundle_initramfs', d)
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500797}