diff --git a/meta/lib/oeqa/selftest/cases/fitimage.py b/meta/lib/oeqa/selftest/cases/fitimage.py index b39f2622df..31116979ef 100644 --- a/meta/lib/oeqa/selftest/cases/fitimage.py +++ b/meta/lib/oeqa/selftest/cases/fitimage.py @@ -161,10 +161,23 @@ class FitImageTestCase(OESelftestTestCase): @staticmethod def _get_dtb_files(bb_vars): + """Return a list of devicetree names + + The list should be used to check the dtb and conf nodes in the FIT image or its file. + In addition to the entries from KERNEL_DEVICETREE, the external devicetree and the + external devicetree overlay added by the test recipe bbb-dtbs-as-ext are handled as well. + """ kernel_devicetree = bb_vars.get('KERNEL_DEVICETREE') + all_dtbs = [] + dtb_symlinks = [] if kernel_devicetree: - return [os.path.basename(dtb) for dtb in kernel_devicetree.split()] - return [] + all_dtbs += [os.path.basename(dtb) for dtb in kernel_devicetree.split()] + # Support only the test recipe which provides 1 devicetree and 1 devicetree overlay + pref_prov_dtb = bb_vars.get('PREFERRED_PROVIDER_virtual/dtb') + if pref_prov_dtb == "bbb-dtbs-as-ext": + all_dtbs += ["am335x-bonegreen-ext.dtb", "BBORG_RELAY-00A2.dtbo"] + dtb_symlinks.append("am335x-bonegreen-ext-alias.dtb") + return (all_dtbs, dtb_symlinks) def _is_req_dict_in_dict(self, found_dict, req_dict): """ @@ -379,6 +392,7 @@ class KernelFitImageTests(FitImageTestCase): 'KERNEL_DEVICETREE', 'KERNEL_FIT_LINK_NAME', 'MACHINE', + 'PREFERRED_PROVIDER_virtual/dtb', 'UBOOT_ARCH', 'UBOOT_ENTRYPOINT', 'UBOOT_LOADADDRESS', @@ -452,7 +466,7 @@ class KernelFitImageTests(FitImageTestCase): ['/', 'images', 'kernel-1', 'signature-1'], ] """ - dtb_files = FitImageTestCase._get_dtb_files(bb_vars) + dtb_files, dtb_symlinks = FitImageTestCase._get_dtb_files(bb_vars) fit_sign_individual = bb_vars['FIT_SIGN_INDIVIDUAL'] fit_uboot_env = bb_vars['FIT_UBOOT_ENV'] initramfs_image = bb_vars['INITRAMFS_IMAGE'] @@ -470,9 +484,9 @@ class KernelFitImageTests(FitImageTestCase): if initramfs_image and initramfs_image_bundle != "1": images.append('ramdisk-1') - # configuration nodes + # configuration nodes (one per DTB and also one per symlink) if dtb_files: - configurations = [ 'conf-' + conf for conf in dtb_files ] + configurations = [ 'conf-' + conf for conf in dtb_files + dtb_symlinks] else: configurations = [ 'conf-1' ] @@ -548,7 +562,7 @@ class KernelFitImageTests(FitImageTestCase): def _get_req_sections(self, bb_vars): """Generate a dictionary of expected sections in the output of dumpimage""" - dtb_files = FitImageTestCase._get_dtb_files(bb_vars) + dtb_files, dtb_symlinks = FitImageTestCase._get_dtb_files(bb_vars) fit_hash_alg = bb_vars['FIT_HASH_ALG'] fit_sign_alg = bb_vars['FIT_SIGN_ALG'] fit_sign_individual = bb_vars['FIT_SIGN_INDIVIDUAL'] @@ -584,11 +598,20 @@ class KernelFitImageTests(FitImageTestCase): } # Create a configuration section for each DTB if dtb_files: - for dtb in dtb_files: - req_sections['conf-' + dtb] = { - "Kernel": "kernel-1", - "FDT": 'fdt-' + dtb, - } + for dtb in dtb_files + dtb_symlinks: + # Assume that DTBs with an "-alias" in its name are symlink DTBs created e.g. by the + # bbb-dtbs-as-ext test recipe. Make the configuration node pointing to the real DTB. + real_dtb = dtb.replace("-alias", "") + # dtb overlays do not refer to a kernel (yet?) + if dtb.endswith('.dtbo'): + req_sections['conf-' + dtb] = { + "FDT": 'fdt-' + real_dtb, + } + else: + req_sections['conf-' + dtb] = { + "Kernel": "kernel-1", + "FDT": 'fdt-' + real_dtb, + } if initramfs_image and initramfs_image_bundle != "1": req_sections['conf-' + dtb]['Init Ramdisk'] = "ramdisk-1" else: @@ -635,7 +658,12 @@ class KernelFitImageTests(FitImageTestCase): self.assertEqual(sign_algo, req_sign_algo, 'Signature algorithm for %s not expected value' % section) sign_value = values.get('Sign value', None) self.assertEqual(len(sign_value), fit_sign_alg_len, 'Signature value for section %s not expected length' % section) - dtb_path = os.path.join(deploy_dir_image, section.replace('conf-', '')) + dtb_file_name = section.replace('conf-', '') + dtb_path = os.path.join(deploy_dir_image, dtb_file_name) + # External devicetrees created by devicetree.bbclass are in a subfolder and have priority + dtb_path_ext = os.path.join(deploy_dir_image, "devicetree", dtb_file_name) + if os.path.exists(dtb_path_ext): + dtb_path = dtb_path_ext self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, dtb_path, section) else: # Image nodes always need a hash which gets indirectly signed by the config signature @@ -696,6 +724,27 @@ FIT_DESC = "A model description" self._test_fitimage(bb_vars) + def test_fit_image_ext_dtb_dtbo(self): + """ + Summary: Check if FIT image and Image Tree Source (its) are created correctly. + Expected: 1) its and FIT image are built successfully + 2) The its file contains also the external devicetree overlay + 3) Dumping the FIT image indicates the devicetree overlay + """ + config = """ +# Enable creation of fitImage +MACHINE = "beaglebone-yocto" +KERNEL_IMAGETYPES += " fitImage " +KERNEL_CLASSES = " kernel-fitimage " +# Add a devicetree overlay which does not need kernel sources +PREFERRED_PROVIDER_virtual/dtb = "bbb-dtbs-as-ext" +""" + config = self._config_add_uboot_env(config) + self.write_config(config) + bb_vars = self._fit_get_bb_vars() + self._test_fitimage(bb_vars) + + def test_sign_fit_image_configurations(self): """ Summary: Check if FIT image and Image Tree Source (its) are created