]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
binman: Create FIT subentries in the FIT section, not its parent
authorAlper Nebi Yasak <alpernebiyasak@gmail.com>
Sun, 27 Mar 2022 15:31:48 +0000 (18:31 +0300)
committerTom Rini <trini@konsulko.com>
Mon, 25 Apr 2022 14:11:05 +0000 (10:11 -0400)
When reading images from a file, each entry's data is read from its
parent section as specified in the Entry.Create() call that created it.
The FIT entry type has been creating its subentries under its parent
(their grandparent), as creating them under the FIT entry resulted in an
error until FIT was converted into a proper section.

FIT subentries have their offsets relative to the FIT section, and
reading those offsets in the parent section results in wrong data. The
subentries rightfully belong under the FIT entries, so create them
there. Add tests checking that we can extract the correct data for a FIT
entry and its subentries.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
tools/binman/etype/fit.py
tools/binman/ftest.py
tools/binman/test/233_fit_extract_replace.dts [new file with mode: 0644]

index 035719871e041d42dbcd0ac5d4fcb200251021a6..12306623af679896bf2c4d288d387258b4a05e8b 100644 (file)
@@ -380,7 +380,7 @@ class Entry_fit(Entry_section):
                 # section entries for them here to merge the content subnodes
                 # together and put the merged contents in the subimage node's
                 # 'data' property later.
-                entry = Entry.Create(self.section, node, etype='section')
+                entry = Entry.Create(self, node, etype='section')
                 entry.ReadNode()
                 # The hash subnodes here are for mkimage, not binman.
                 entry.SetUpdateHash(False)
index 0e77358b32b155c618c3b2ce1cd33d866be136d6..3fe57532d2bd3849abb1aa0aeff0ef62ef20094d 100644 (file)
@@ -5620,6 +5620,41 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
         self.assertIsNotNone(path)
         self.assertEqual(expected_fdtmap, fdtmap)
 
+    def testExtractFit(self):
+        """Test extracting a FIT section"""
+        self._DoReadFileRealDtb('233_fit_extract_replace.dts')
+        image_fname = tools.get_output_filename('image.bin')
+
+        fit_data = control.ReadEntry(image_fname, 'fit')
+        fit = fdt.Fdt.FromData(fit_data)
+        fit.Scan()
+
+        # Check subentry data inside the extracted fit
+        for node_path, expected in [
+            ('/images/kernel', U_BOOT_DATA),
+            ('/images/fdt-1', U_BOOT_NODTB_DATA),
+            ('/images/scr-1', COMPRESS_DATA),
+        ]:
+            node = fit.GetNode(node_path)
+            data = fit.GetProps(node)['data'].bytes
+            self.assertEqual(expected, data)
+
+    def testExtractFitSubentries(self):
+        """Test extracting FIT section subentries"""
+        self._DoReadFileRealDtb('233_fit_extract_replace.dts')
+        image_fname = tools.get_output_filename('image.bin')
+
+        for entry_path, expected in [
+            ('fit/kernel', U_BOOT_DATA),
+            ('fit/kernel/u-boot', U_BOOT_DATA),
+            ('fit/fdt-1', U_BOOT_NODTB_DATA),
+            ('fit/fdt-1/u-boot-nodtb', U_BOOT_NODTB_DATA),
+            ('fit/scr-1', COMPRESS_DATA),
+            ('fit/scr-1/blob', COMPRESS_DATA),
+        ]:
+            data = control.ReadEntry(image_fname, entry_path)
+            self.assertEqual(expected, data)
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/tools/binman/test/233_fit_extract_replace.dts b/tools/binman/test/233_fit_extract_replace.dts
new file mode 100644 (file)
index 0000000..b44d05a
--- /dev/null
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               allow-repack;
+
+               fill {
+                       size = <0x1000>;
+                       fill-byte = [77];
+               };
+
+               fit {
+                       description = "test-desc";
+                       #address-cells = <1>;
+
+                       images {
+                               kernel {
+                                       description = "test u-boot";
+                                       type = "kernel";
+                                       arch = "arm64";
+                                       os = "linux";
+                                       compression = "none";
+                                       load = <00000000>;
+                                       entry = <00000000>;
+
+                                       u-boot {
+                                       };
+                               };
+
+                               fdt-1 {
+                                       description = "test u-boot-nodtb";
+                                       type = "flat_dt";
+                                       arch = "arm64";
+                                       compression = "none";
+
+                                       u-boot-nodtb {
+                                       };
+                               };
+
+                               scr-1 {
+                                       description = "test blob";
+                                       type = "script";
+                                       arch = "arm64";
+                                       compression = "none";
+
+                                       blob {
+                                               filename = "compress";
+                                       };
+                               };
+                       };
+
+                       configurations {
+                               default = "conf-1";
+
+                               conf-1 {
+                                       description = "Kernel with FDT blob";
+                                       kernel = "kernel";
+                                       fdt = "fdt-1";
+                               };
+                       };
+               };
+
+               u-boot-dtb {
+               };
+
+               fdtmap {
+               };
+       };
+};