[PATCH] binman: Skip node generation for images read from files

Jan Kiszka jan.kiszka at siemens.com
Fri Jan 28 20:37:53 CET 2022


From: Jan Kiszka <jan.kiszka at siemens.com>

We can and should run the node generator only when creating a new image.
When we read it back, there is no need to generate nodes - they already
exits, and binman does not dive that deep into the image - and there is
no way to provide the required fdt-list. So store the mode in the image
object so that Entry_fit can simply skip generator nodes when reading
them from an fdtmap.

This unbreaks all read-backs of images that contain generator nodes in
their fdtmap. To confirm this, add a corresponding test case.

Signed-off-by: Jan Kiszka <jan.kiszka at siemens.com>
---
  tools/binman/etype/fit.py             |  2 +-
  tools/binman/ftest.py                 | 18 ++++++++++++++++++
  tools/binman/image.py                 |  9 +++++++--
  tools/binman/test/219_fit_gennode.dts | 24 ++++++++++++++++++++++++
  4 files changed, 50 insertions(+), 3 deletions(-)
  create mode 100644 tools/binman/test/219_fit_gennode.dts

diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py
index 6e5f020c502..6ad4a686df5 100644
--- a/tools/binman/etype/fit.py
+++ b/tools/binman/etype/fit.py
@@ -194,7 +194,7 @@ class Entry_fit(Entry):
                      # the FIT (e.g. "/images/kernel/u-boot"), so don't call
                      # fsw.add_node() or _AddNode() for it.
                      pass
-                elif subnode.name.startswith('@'):
+                elif self.GetImage().generate and subnode.name.startswith('@'):
                      if self._fdts:
                          # Generate notes for each FDT
                          for seq, fdt_fname in enumerate(self._fdts):
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index ca200ae9f8f..5400f76c676 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -5100,6 +5100,24 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
          self.assertIn('Documentation is missing for modules: mkimage',
                        str(e.exception))
  
+    def testListWithGenNode(self):
+        """Check handling of an FDT map when the section cannot be found"""
+        entry_args = {
+            'of-list': 'test-fdt1 test-fdt2',
+        }
+        data = self._DoReadFileDtb(
+            '219_fit_gennode.dts',
+            entry_args=entry_args,
+            use_real_dtb=True,
+            extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])
+
+        try:
+            tmpdir, updated_fname = self._SetupImageInTmpdir()
+            with test_util.capture_sys_output() as (stdout, stderr):
+                self._RunBinman('ls', '-i', updated_fname)
+        finally:
+            shutil.rmtree(tmpdir)
+
  
  if __name__ == "__main__":
      unittest.main()
diff --git a/tools/binman/image.py b/tools/binman/image.py
index 0f0c1d29e80..cb5279c7ead 100644
--- a/tools/binman/image.py
+++ b/tools/binman/image.py
@@ -67,9 +67,13 @@ class Image(section.Entry_section):
              does not exist in binman. This is useful if an image was created by
              binman a newer version of binman but we want to list it in an older
              version which does not support all the entry types.
+        generate: If true, generator nodes are processed. If false they are
+            ignored which is useful when an existing image is read back from a
+            file.
      """
      def __init__(self, name, node, copy_to_orig=True, test=False,
-                 ignore_missing=False, use_expanded=False, missing_etype=False):
+                 ignore_missing=False, use_expanded=False, missing_etype=False,
+                 generate=True):
          super().__init__(None, 'section', node, test=test)
          self.copy_to_orig = copy_to_orig
          self.name = 'main-section'
@@ -83,6 +87,7 @@ class Image(section.Entry_section):
          self.use_expanded = use_expanded
          self.test_section_timeout = False
          self.bintools = {}
+        self.generate = generate
          if not test:
              self.ReadNode()
  
@@ -131,7 +136,7 @@ class Image(section.Entry_section):
          # Return an Image with the associated nodes
          root = dtb.GetRoot()
          image = Image('image', root, copy_to_orig=False, ignore_missing=True,
-                      missing_etype=True)
+                      missing_etype=True, generate=False)
  
          image.image_node = fdt_util.GetString(root, 'image-node', 'image')
          image.fdtmap_dtb = dtb
diff --git a/tools/binman/test/219_fit_gennode.dts b/tools/binman/test/219_fit_gennode.dts
new file mode 100644
index 00000000000..7820c472808
--- /dev/null
+++ b/tools/binman/test/219_fit_gennode.dts
@@ -0,0 +1,24 @@
+/dts-v1/;
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	binman {
+		fit {
+			description = "test-desc";
+			#address-cells = <1>;
+			fit,fdt-list = "of-list";
+
+			images {
+				@fdt-SEQ {
+					description = "fdt-NAME.dtb";
+					type = "flat_dt";
+					compression = "none";
+				};
+			};
+		};
+		fdtmap {
+		};
+	};
+};
-- 
2.31.1


More information about the U-Boot mailing list