]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dtoc: Check that a parent is not missing
authorSimon Glass <sjg@chromium.org>
Sun, 27 Jun 2021 23:51:10 +0000 (17:51 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Thu, 15 Jul 2021 11:50:27 +0000 (19:50 +0800)
With of-platdata-inst we want to set up a reference to each devices'
parent device, if there is one. If we find that the device has a parent
(i.e. is not a root node) but it is not in the list of devices being
written, then we cannot create the reference.

Report an error in this case, since it indicates that the parent node
is either missing a compatible string, is disabled, or perhaps does not
have any properties because it was not tagged for SPL.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/dtoc/dtb_platdata.py
tools/dtoc/test/dtoc_test_noparent.dts [new file with mode: 0644]
tools/dtoc/test_dtoc.py

index 2d42480a9a5a0a40f2353348fd5b73f240905f5b..869c92b49bfcc4ebbf9a763c197bdd12e8b20f5e 100644 (file)
@@ -749,6 +749,15 @@ class DtbPlatdata():
                     break
 
         if node.parent and node.parent.parent:
+            if node.parent not in self._valid_nodes:
+                # This might indicate that the parent node is not in the
+                # SPL/TPL devicetree but the child is. For example if we are
+                # dealing with of-platdata in TPL, the parent has a
+                # u-boot,dm-tpl tag but the child has u-boot,dm-pre-reloc. In
+                # this case the child node exists in TPL but the parent does
+                # not.
+                raise ValueError("Node '%s' requires parent node '%s' but it is not in the valid list" %
+                                 (node.path, node.parent.path))
             self.buf('\t.parent\t\t= DM_DEVICE_REF(%s),\n' %
                      node.parent.var_name)
         if priv_name:
diff --git a/tools/dtoc/test/dtoc_test_noparent.dts b/tools/dtoc/test/dtoc_test_noparent.dts
new file mode 100644 (file)
index 0000000..e976dd2
--- /dev/null
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Test device tree file for dtoc
+ *
+ * Copyright 2017 Google, Inc
+ */
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+       i2c@0 {
+               compatible = "sandbox,i2c";
+               u-boot,dm-tpl;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               spl-test {
+                       u-boot,dm-pre-reloc;
+                       compatible = "sandbox,spl-test";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+                       pmic@9 {
+                               compatible = "sandbox,pmic";
+                               u-boot,dm-pre-reloc;
+                               reg = <9>;
+                               low-power;
+                       };
+               };
+       };
+};
index 0b2805feed2ce8255f8108dfbae6540e5dfc2604..863ede90b7a650dacfe6e41934829d58ae6d17cf 100755 (executable)
@@ -1830,3 +1830,13 @@ U_BOOT_DRVINFO(spl_test2) = {
         dtb_file = get_dtb_file('dtoc_test_single_reg.dts')
         output = tools.GetOutputFilename('output')
         self.run_test(['struct'], dtb_file, output)
+
+    def test_missing_parent(self):
+        """Test detection of a parent node with no properties"""
+        dtb_file = get_dtb_file('dtoc_test_noparent.dts', capture_stderr=True)
+        output = tools.GetOutputFilename('output')
+        with self.assertRaises(ValueError) as exc:
+            self.run_test(['device'], dtb_file, output, instantiate=True)
+        self.assertIn("Node '/i2c@0/spl-test/pmic@9' requires parent node "
+                      "'/i2c@0/spl-test' but it is not in the valid list",
+                      str(exc.exception))