summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Freihofer <adrian.freihofer@siemens.com>2025-06-03 10:23:25 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2025-06-05 11:02:22 +0100
commit0208abfd4b517b1a422585e1545c9a5deeba52aa (patch)
treead82ae77be7505003b8b54a1b4755b4ad5d1bc40
parent87fc5911504e6dea6e60819250ed8c6db82c9465 (diff)
downloadpoky-0208abfd4b517b1a422585e1545c9a5deeba52aa.tar.gz
oe-selftest: fitimage: support new FIT recipe as well
Enable all existing tests to be compatible with FIT images generated either by the new linux-yocto-fitimage recipe or the legacy kernel-fitimage.bbclass approach. - Make the following configurations optional: - KERNEL_IMAGETYPES += "fitImage" - KERNEL_CLASSES = "kernel-fitimage" - Allow the tests to specify which kernel recipe should be used for the build (e.g., linux-yocto, linux-yocto-fitimage, etc.) (From OE-Core rev: 20cbb095f8685848aa5e31d04006b9842b387912) Signed-off-by: Adrian Freihofer <adrian.freihofer@siemens.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/lib/oeqa/selftest/cases/fitimage.py58
1 files changed, 37 insertions, 21 deletions
diff --git a/meta/lib/oeqa/selftest/cases/fitimage.py b/meta/lib/oeqa/selftest/cases/fitimage.py
index 3d6a5a582f..20fedee18b 100644
--- a/meta/lib/oeqa/selftest/cases/fitimage.py
+++ b/meta/lib/oeqa/selftest/cases/fitimage.py
@@ -413,6 +413,7 @@ class KernelFitImageBase(FitImageTestCase):
413 'INITRAMFS_IMAGE_BUNDLE', 413 'INITRAMFS_IMAGE_BUNDLE',
414 'INITRAMFS_IMAGE_NAME', 414 'INITRAMFS_IMAGE_NAME',
415 'INITRAMFS_IMAGE', 415 'INITRAMFS_IMAGE',
416 'KERNEL_DEPLOYSUBDIR',
416 'KERNEL_DEVICETREE', 417 'KERNEL_DEVICETREE',
417 'KERNEL_FIT_LINK_NAME', 418 'KERNEL_FIT_LINK_NAME',
418 'MACHINE', 419 'MACHINE',
@@ -429,10 +430,21 @@ class KernelFitImageBase(FitImageTestCase):
429 'UBOOT_SIGN_KEYDIR', 430 'UBOOT_SIGN_KEYDIR',
430 'UBOOT_SIGN_KEYNAME', 431 'UBOOT_SIGN_KEYNAME',
431 } 432 }
432 bb_vars = get_bb_vars(list(internal_used | set(additional_vars)), "virtual/kernel") 433 bb_vars = get_bb_vars(list(internal_used | set(additional_vars)), self.kernel_recipe)
433 self.logger.debug("bb_vars: %s" % pprint.pformat(bb_vars, indent=4)) 434 self.logger.debug("bb_vars: %s" % pprint.pformat(bb_vars, indent=4))
434 return bb_vars 435 return bb_vars
435 436
437 def _config_add_kernel_classes(self, config):
438 config += '# Use kernel-fitimage.bbclass for the creation of the fitImage' + os.linesep
439 config += 'KERNEL_IMAGETYPES += " fitImage "' + os.linesep
440 config += 'KERNEL_CLASSES = " kernel-fitimage "' + os.linesep
441 return config
442
443 @property
444 def kernel_recipe(self):
445 # virtual/kernel does not work with SRC_URI:append:pn-%s
446 return "linux-yocto"
447
436 def _config_add_uboot_env(self, config): 448 def _config_add_uboot_env(self, config):
437 """Generate an u-boot environment 449 """Generate an u-boot environment
438 450
@@ -446,7 +458,7 @@ class KernelFitImageBase(FitImageTestCase):
446 config += '# Add an u-boot script to the fitImage' + os.linesep 458 config += '# Add an u-boot script to the fitImage' + os.linesep
447 config += 'FIT_UBOOT_ENV = "%s"' % fit_uenv_file + os.linesep 459 config += 'FIT_UBOOT_ENV = "%s"' % fit_uenv_file + os.linesep
448 config += 'FILESEXTRAPATHS:prepend := "${TOPDIR}/%s:"' % test_files_dir + os.linesep 460 config += 'FILESEXTRAPATHS:prepend := "${TOPDIR}/%s:"' % test_files_dir + os.linesep
449 config += 'SRC_URI:append:pn-linux-yocto = " file://${FIT_UBOOT_ENV}"' + os.linesep 461 config += 'SRC_URI:append:pn-%s = " file://${FIT_UBOOT_ENV}"' % self.kernel_recipe + os.linesep
450 462
451 if not os.path.isdir(test_files_dir): 463 if not os.path.isdir(test_files_dir):
452 os.makedirs(test_files_dir) 464 os.makedirs(test_files_dir)
@@ -458,7 +470,7 @@ class KernelFitImageBase(FitImageTestCase):
458 470
459 def _bitbake_fit_image(self, bb_vars): 471 def _bitbake_fit_image(self, bb_vars):
460 """Bitbake the kernel and return the paths to the its file and the FIT image""" 472 """Bitbake the kernel and return the paths to the its file and the FIT image"""
461 bitbake("virtual/kernel") 473 bitbake(self.kernel_recipe)
462 474
463 # Find the right its file and the final fitImage and check if both files are available 475 # Find the right its file and the final fitImage and check if both files are available
464 deploy_dir_image = bb_vars['DEPLOY_DIR_IMAGE'] 476 deploy_dir_image = bb_vars['DEPLOY_DIR_IMAGE']
@@ -477,8 +489,13 @@ class KernelFitImageBase(FitImageTestCase):
477 fitimage_name = "fitImage" # or fitImage-${KERNEL_IMAGE_LINK_NAME}${KERNEL_IMAGE_BIN_EXT} 489 fitimage_name = "fitImage" # or fitImage-${KERNEL_IMAGE_LINK_NAME}${KERNEL_IMAGE_BIN_EXT}
478 else: 490 else:
479 self.fail('Invalid configuration: INITRAMFS_IMAGE_BUNDLE = "1" and not INITRAMFS_IMAGE') 491 self.fail('Invalid configuration: INITRAMFS_IMAGE_BUNDLE = "1" and not INITRAMFS_IMAGE')
480 fitimage_its_path = os.path.realpath(os.path.join(deploy_dir_image, fitimage_its_name)) 492 kernel_deploysubdir = bb_vars['KERNEL_DEPLOYSUBDIR']
481 fitimage_path = os.path.realpath(os.path.join(deploy_dir_image, fitimage_name)) 493 if kernel_deploysubdir:
494 fitimage_its_path = os.path.realpath(os.path.join(deploy_dir_image, kernel_deploysubdir, fitimage_its_name))
495 fitimage_path = os.path.realpath(os.path.join(deploy_dir_image, kernel_deploysubdir, fitimage_name))
496 else:
497 fitimage_its_path = os.path.realpath(os.path.join(deploy_dir_image, fitimage_its_name))
498 fitimage_path = os.path.realpath(os.path.join(deploy_dir_image, fitimage_name))
482 return (fitimage_its_path, fitimage_path) 499 return (fitimage_its_path, fitimage_path)
483 500
484 def _get_req_its_paths(self, bb_vars): 501 def _get_req_its_paths(self, bb_vars):
@@ -677,6 +694,7 @@ class KernelFitImageBase(FitImageTestCase):
677 uboot_sign_keyname = bb_vars['UBOOT_SIGN_KEYNAME'] 694 uboot_sign_keyname = bb_vars['UBOOT_SIGN_KEYNAME']
678 uboot_sign_img_keyname = bb_vars['UBOOT_SIGN_IMG_KEYNAME'] 695 uboot_sign_img_keyname = bb_vars['UBOOT_SIGN_IMG_KEYNAME']
679 deploy_dir_image = bb_vars['DEPLOY_DIR_IMAGE'] 696 deploy_dir_image = bb_vars['DEPLOY_DIR_IMAGE']
697 kernel_deploysubdir = bb_vars['KERNEL_DEPLOYSUBDIR']
680 fit_sign_individual = bb_vars['FIT_SIGN_INDIVIDUAL'] 698 fit_sign_individual = bb_vars['FIT_SIGN_INDIVIDUAL']
681 fit_hash_alg_len = FitImageTestCase.MKIMAGE_HASH_LENGTHS[fit_hash_alg] 699 fit_hash_alg_len = FitImageTestCase.MKIMAGE_HASH_LENGTHS[fit_hash_alg]
682 fit_sign_alg_len = FitImageTestCase.MKIMAGE_SIGNATURE_LENGTHS[fit_sign_alg] 700 fit_sign_alg_len = FitImageTestCase.MKIMAGE_SIGNATURE_LENGTHS[fit_sign_alg]
@@ -690,6 +708,8 @@ class KernelFitImageBase(FitImageTestCase):
690 self.assertEqual(len(sign_value), fit_sign_alg_len, 'Signature value for section %s not expected length' % section) 708 self.assertEqual(len(sign_value), fit_sign_alg_len, 'Signature value for section %s not expected length' % section)
691 dtb_file_name = section.replace(bb_vars['FIT_CONF_PREFIX'], '') 709 dtb_file_name = section.replace(bb_vars['FIT_CONF_PREFIX'], '')
692 dtb_path = os.path.join(deploy_dir_image, dtb_file_name) 710 dtb_path = os.path.join(deploy_dir_image, dtb_file_name)
711 if kernel_deploysubdir:
712 dtb_path = os.path.join(deploy_dir_image, kernel_deploysubdir, dtb_file_name)
693 # External devicetrees created by devicetree.bbclass are in a subfolder and have priority 713 # External devicetrees created by devicetree.bbclass are in a subfolder and have priority
694 dtb_path_ext = os.path.join(deploy_dir_image, "devicetree", dtb_file_name) 714 dtb_path_ext = os.path.join(deploy_dir_image, "devicetree", dtb_file_name)
695 if os.path.exists(dtb_path_ext): 715 if os.path.exists(dtb_path_ext):
@@ -735,10 +755,7 @@ class KernelFitImageTests(KernelFitImageBase):
735 Author: Usama Arif <usama.arif@arm.com> 755 Author: Usama Arif <usama.arif@arm.com>
736 """ 756 """
737 config = """ 757 config = """
738# Enable creation of fitImage
739KERNEL_IMAGETYPE = "Image" 758KERNEL_IMAGETYPE = "Image"
740KERNEL_IMAGETYPES += " fitImage "
741KERNEL_CLASSES = " kernel-fitimage "
742 759
743# RAM disk variables including load address and entrypoint for kernel and RAM disk 760# RAM disk variables including load address and entrypoint for kernel and RAM disk
744IMAGE_FSTYPES += "cpio.gz" 761IMAGE_FSTYPES += "cpio.gz"
@@ -752,6 +769,7 @@ UBOOT_ENTRYPOINT = "0x80080000"
752FIT_DESC = "A model description" 769FIT_DESC = "A model description"
753FIT_CONF_PREFIX = "foo-" 770FIT_CONF_PREFIX = "foo-"
754""" 771"""
772 config = self._config_add_kernel_classes(config)
755 self.write_config(config) 773 self.write_config(config)
756 bb_vars = self._fit_get_bb_vars() 774 bb_vars = self._fit_get_bb_vars()
757 self._test_fitimage(bb_vars) 775 self._test_fitimage(bb_vars)
@@ -813,11 +831,10 @@ MACHINE = "beaglebone-yocto"
813 config = """ 831 config = """
814# Enable creation of fitImage 832# Enable creation of fitImage
815MACHINE = "beaglebone-yocto" 833MACHINE = "beaglebone-yocto"
816KERNEL_IMAGETYPES += " fitImage "
817KERNEL_CLASSES = " kernel-fitimage "
818# Add a devicetree overlay which does not need kernel sources 834# Add a devicetree overlay which does not need kernel sources
819PREFERRED_PROVIDER_virtual/dtb = "bbb-dtbs-as-ext" 835PREFERRED_PROVIDER_virtual/dtb = "bbb-dtbs-as-ext"
820""" 836"""
837 config = self._config_add_kernel_classes(config)
821 config = self._config_add_uboot_env(config) 838 config = self._config_add_uboot_env(config)
822 self.write_config(config) 839 self.write_config(config)
823 bb_vars = self._fit_get_bb_vars() 840 bb_vars = self._fit_get_bb_vars()
@@ -841,14 +858,13 @@ PREFERRED_PROVIDER_virtual/dtb = "bbb-dtbs-as-ext"
841 config = """ 858 config = """
842# Enable creation of fitImage 859# Enable creation of fitImage
843MACHINE = "beaglebone-yocto" 860MACHINE = "beaglebone-yocto"
844KERNEL_IMAGETYPES += " fitImage "
845KERNEL_CLASSES = " kernel-fitimage "
846UBOOT_SIGN_ENABLE = "1" 861UBOOT_SIGN_ENABLE = "1"
847UBOOT_SIGN_KEYDIR = "${TOPDIR}/signing-keys" 862UBOOT_SIGN_KEYDIR = "${TOPDIR}/signing-keys"
848UBOOT_SIGN_KEYNAME = "dev" 863UBOOT_SIGN_KEYNAME = "dev"
849UBOOT_MKIMAGE_SIGN_ARGS = "-c 'a smart comment'" 864UBOOT_MKIMAGE_SIGN_ARGS = "-c 'a smart comment'"
850FIT_CONF_DEFAULT_DTB = "am335x-bonegreen.dtb" 865FIT_CONF_DEFAULT_DTB = "am335x-bonegreen.dtb"
851""" 866"""
867 config = self._config_add_kernel_classes(config)
852 config = self._config_add_uboot_env(config) 868 config = self._config_add_uboot_env(config)
853 self.write_config(config) 869 self.write_config(config)
854 870
@@ -890,8 +906,6 @@ FIT_CONF_DEFAULT_DTB = "am335x-bonegreen.dtb"
890 config = """ 906 config = """
891# Enable creation of fitImage 907# Enable creation of fitImage
892MACHINE = "beaglebone-yocto" 908MACHINE = "beaglebone-yocto"
893KERNEL_IMAGETYPES += " fitImage "
894KERNEL_CLASSES = " kernel-fitimage "
895UBOOT_SIGN_ENABLE = "1" 909UBOOT_SIGN_ENABLE = "1"
896FIT_GENERATE_KEYS = "1" 910FIT_GENERATE_KEYS = "1"
897UBOOT_SIGN_KEYDIR = "${TOPDIR}/signing-keys" 911UBOOT_SIGN_KEYDIR = "${TOPDIR}/signing-keys"
@@ -900,6 +914,7 @@ UBOOT_SIGN_KEYNAME = "cfg-oe-selftest"
900FIT_SIGN_INDIVIDUAL = "1" 914FIT_SIGN_INDIVIDUAL = "1"
901UBOOT_MKIMAGE_SIGN_ARGS = "-c 'a smart comment'" 915UBOOT_MKIMAGE_SIGN_ARGS = "-c 'a smart comment'"
902""" 916"""
917 config = self._config_add_kernel_classes(config)
903 config = self._config_add_uboot_env(config) 918 config = self._config_add_uboot_env(config)
904 self.write_config(config) 919 self.write_config(config)
905 bb_vars = self._fit_get_bb_vars() 920 bb_vars = self._fit_get_bb_vars()
@@ -930,8 +945,6 @@ MACHINE = "beaglebone-yocto"
930INITRAMFS_IMAGE = "core-image-minimal-initramfs" 945INITRAMFS_IMAGE = "core-image-minimal-initramfs"
931INITRAMFS_SCRIPTS = "" 946INITRAMFS_SCRIPTS = ""
932UBOOT_MACHINE = "am335x_evm_defconfig" 947UBOOT_MACHINE = "am335x_evm_defconfig"
933KERNEL_CLASSES = " kernel-fitimage "
934KERNEL_IMAGETYPES = "fitImage"
935UBOOT_SIGN_ENABLE = "1" 948UBOOT_SIGN_ENABLE = "1"
936UBOOT_SIGN_KEYNAME = "beaglebonekey" 949UBOOT_SIGN_KEYNAME = "beaglebonekey"
937UBOOT_SIGN_KEYDIR ?= "${DEPLOY_DIR_IMAGE}" 950UBOOT_SIGN_KEYDIR ?= "${DEPLOY_DIR_IMAGE}"
@@ -949,6 +962,7 @@ KERNEL_IMAGETYPE_REPLACEMENT = "zImage"
949FIT_KERNEL_COMP_ALG = "none" 962FIT_KERNEL_COMP_ALG = "none"
950FIT_HASH_ALG = "sha256" 963FIT_HASH_ALG = "sha256"
951""" 964"""
965 config = self._config_add_kernel_classes(config)
952 config = self._config_add_uboot_env(config) 966 config = self._config_add_uboot_env(config)
953 self.write_config(config) 967 self.write_config(config)
954 968
@@ -986,8 +1000,6 @@ INITRAMFS_IMAGE_BUNDLE = "1"
986INITRAMFS_IMAGE = "core-image-minimal-initramfs" 1000INITRAMFS_IMAGE = "core-image-minimal-initramfs"
987INITRAMFS_SCRIPTS = "" 1001INITRAMFS_SCRIPTS = ""
988UBOOT_MACHINE = "am335x_evm_defconfig" 1002UBOOT_MACHINE = "am335x_evm_defconfig"
989KERNEL_CLASSES = " kernel-fitimage "
990KERNEL_IMAGETYPES = "fitImage"
991UBOOT_SIGN_ENABLE = "1" 1003UBOOT_SIGN_ENABLE = "1"
992UBOOT_SIGN_KEYNAME = "beaglebonekey" 1004UBOOT_SIGN_KEYNAME = "beaglebonekey"
993UBOOT_SIGN_KEYDIR ?= "${DEPLOY_DIR_IMAGE}" 1005UBOOT_SIGN_KEYDIR ?= "${DEPLOY_DIR_IMAGE}"
@@ -1003,12 +1015,14 @@ KERNEL_IMAGETYPE_REPLACEMENT = "zImage"
1003FIT_KERNEL_COMP_ALG = "none" 1015FIT_KERNEL_COMP_ALG = "none"
1004FIT_HASH_ALG = "sha256" 1016FIT_HASH_ALG = "sha256"
1005""" 1017"""
1018 config = self._config_add_kernel_classes(config)
1006 config = self._config_add_uboot_env(config) 1019 config = self._config_add_uboot_env(config)
1007 self.write_config(config) 1020 self.write_config(config)
1008 bb_vars = self._fit_get_bb_vars() 1021 bb_vars = self._fit_get_bb_vars()
1009 self._gen_signing_key(bb_vars) 1022 self._gen_signing_key(bb_vars)
1010 self._test_fitimage(bb_vars) 1023 self._test_fitimage(bb_vars)
1011 1024
1025
1012class FitImagePyTests(KernelFitImageBase): 1026class FitImagePyTests(KernelFitImageBase):
1013 """Test cases for the fitimage.py module without calling bitbake""" 1027 """Test cases for the fitimage.py module without calling bitbake"""
1014 1028
@@ -1114,6 +1128,8 @@ class FitImagePyTests(KernelFitImageBase):
1114class UBootFitImageTests(FitImageTestCase): 1128class UBootFitImageTests(FitImageTestCase):
1115 """Test cases for the uboot-sign bbclass""" 1129 """Test cases for the uboot-sign bbclass"""
1116 1130
1131 BOOTLOADER_RECIPE = "virtual/bootloader"
1132
1117 def _fit_get_bb_vars(self, additional_vars=[]): 1133 def _fit_get_bb_vars(self, additional_vars=[]):
1118 """Get bb_vars as needed by _test_sign_fit_image 1134 """Get bb_vars as needed by _test_sign_fit_image
1119 1135
@@ -1155,13 +1171,13 @@ class UBootFitImageTests(FitImageTestCase):
1155 'UBOOT_SIGN_KEYDIR', 1171 'UBOOT_SIGN_KEYDIR',
1156 'UBOOT_SIGN_KEYNAME', 1172 'UBOOT_SIGN_KEYNAME',
1157 } 1173 }
1158 bb_vars = get_bb_vars(list(internal_used | set(additional_vars)), "virtual/bootloader") 1174 bb_vars = get_bb_vars(list(internal_used | set(additional_vars)), UBootFitImageTests.BOOTLOADER_RECIPE)
1159 self.logger.debug("bb_vars: %s" % pprint.pformat(bb_vars, indent=4)) 1175 self.logger.debug("bb_vars: %s" % pprint.pformat(bb_vars, indent=4))
1160 return bb_vars 1176 return bb_vars
1161 1177
1162 def _bitbake_fit_image(self, bb_vars): 1178 def _bitbake_fit_image(self, bb_vars):
1163 """Bitbake the bootloader and return the paths to the its file and the FIT image""" 1179 """Bitbake the bootloader and return the paths to the its file and the FIT image"""
1164 bitbake("virtual/bootloader") 1180 bitbake(UBootFitImageTests.BOOTLOADER_RECIPE)
1165 1181
1166 deploy_dir_image = bb_vars['DEPLOY_DIR_IMAGE'] 1182 deploy_dir_image = bb_vars['DEPLOY_DIR_IMAGE']
1167 machine = bb_vars['MACHINE'] 1183 machine = bb_vars['MACHINE']
@@ -1675,7 +1691,7 @@ FIT_SIGN_INDIVIDUAL = "1"
1675 bb_vars = self._fit_get_bb_vars() 1691 bb_vars = self._fit_get_bb_vars()
1676 self._gen_signing_key(bb_vars) 1692 self._gen_signing_key(bb_vars)
1677 1693
1678 bitbake("virtual/bootloader") 1694 bitbake(UBootFitImageTests.BOOTLOADER_RECIPE)
1679 1695
1680 # Just check the DTB of u-boot since there is no u-boot FIT image 1696 # Just check the DTB of u-boot since there is no u-boot FIT image
1681 self._check_kernel_dtb(bb_vars) 1697 self._check_kernel_dtb(bb_vars)