]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
binman: Support templates at any level
authorSimon Glass <sjg@chromium.org>
Tue, 18 Jul 2023 13:24:07 +0000 (07:24 -0600)
committerSimon Glass <sjg@chromium.org>
Thu, 20 Jul 2023 20:10:58 +0000 (14:10 -0600)
Allow templates to be used inside a section, not just in the top-level
/binman node.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/binman/control.py
tools/binman/ftest.py
tools/binman/test/289_template_section.dts [new file with mode: 0644]

index f92c152285ced7bc0ab2c6a6f084694f405843a7..25e66814837d71a34029ee74912d80921ff0b430 100644 (file)
@@ -493,8 +493,8 @@ def _ProcessTemplates(parent):
     Processing involves copying each subnode of the template node into the
     target node.
 
-    For now this is not done recursively, so templates must be at the top level
-    of the binman image.
+    This is done recursively, so templates can be at any level of the binman
+    image, e.g. inside a section.
 
     See 'Templates' in the Binman documnentation for details.
     """
@@ -502,6 +502,7 @@ def _ProcessTemplates(parent):
         tmpl = fdt_util.GetPhandleList(node, 'insert-template')
         if tmpl:
             node.copy_subnodes_from_phandles(tmpl)
+        _ProcessTemplates(node)
 
 def PrepareImagesAndDtbs(dtb_fname, select_images, update_fdt, use_expanded):
     """Prepare the images to be processed and select the device tree
index dfca6316624caed5ce22aabbaf9b77539740a8f8..e96223cbd892d1ce217d1af8b943099e0bc122aa 100644 (file)
@@ -6812,6 +6812,14 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
         tools.write_file(fname, fit_data)
         out = tools.run('dumpimage', '-l', fname)
 
+    def testTemplateSection(self):
+        """Test using a template in a section (not at top level)"""
+        TestFunctional._MakeInputFile('vga2.bin', b'#' + VGA_DATA)
+        data = self._DoReadFile('289_template_section.dts')
+        first = U_BOOT_DATA + VGA_DATA + U_BOOT_DTB_DATA
+        second = U_BOOT_DATA + b'#' + VGA_DATA + U_BOOT_DTB_DATA
+        self.assertEqual(U_BOOT_IMG_DATA + first + second + first, data)
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/tools/binman/test/289_template_section.dts b/tools/binman/test/289_template_section.dts
new file mode 100644 (file)
index 0000000..8a744a0
--- /dev/null
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               u-boot-img {
+               };
+
+               common_part: template {
+                       u-boot {
+                       };
+
+                       intel-vga {
+                               filename = "vga.bin";
+                       };
+               };
+
+               first {
+                       type = "section";
+                       insert-template = <&common_part>;
+
+                       u-boot-dtb {
+                       };
+               };
+
+               section {
+                       second {
+                               type = "section";
+                               insert-template = <&common_part>;
+
+                               u-boot-dtb {
+                               };
+
+                               intel-vga {
+                                       filename = "vga2.bin";
+                               };
+                       };
+               };
+
+               second {
+                       type = "section";
+                       insert-template = <&common_part>;
+
+                       u-boot-dtb {
+                       };
+               };
+       };
+};