[PATCH v3 18/26] binman: Add a consistent way to report errors with fit

Simon Glass sjg at chromium.org
Sun Mar 6 04:19:09 CET 2022


Add a new function to handling reporting errors within a particular
subnode of the FIT description. This can be used to make the format of
these errors consistent.

Signed-off-by: Simon Glass <sjg at chromium.org>
Reviewed-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
---

Changes in v3:
- Drop the base_node argument and use self._node instead
- Rename function to _raise_subnode() so it is clear it is not like Raise()

 tools/binman/etype/fit.py | 31 +++++++++++++++++++++++--------
 tools/binman/ftest.py     |  2 +-
 2 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py
index 0e8d2cf459..169b55887c 100644
--- a/tools/binman/etype/fit.py
+++ b/tools/binman/etype/fit.py
@@ -184,11 +184,11 @@ class Entry_fit(Entry_section):
         self._fit_default_dt = self.GetEntryArgsOrProps([EntryArg('default-dt',
                                                                   str)])[0]
 
-    def _get_operation(self, subnode):
+    def _get_operation(self, base_node, node):
         """Get the operation referenced by a subnode
 
         Args:
-            subnode (Node): Subnode (of the FIT) to check
+            node (Node): Subnode (of the FIT) to check
 
         Returns:
             int: Operation to perform
@@ -196,12 +196,12 @@ class Entry_fit(Entry_section):
         Raises:
             ValueError: Invalid operation name
         """
-        oper_name = subnode.props.get('fit,operation')
+        oper_name = node.props.get('fit,operation')
         if not oper_name:
             return OP_GEN_FDT_NODES
         oper = OPERATIONS.get(oper_name.value)
-        if not oper:
-            self.Raise(f"Unknown operation '{oper_name.value}'")
+        if oper is None:
+            self._raise_subnode(node, f"Unknown operation '{oper_name.value}'")
         return oper
 
     def ReadEntries(self):
@@ -271,6 +271,19 @@ class Entry_fit(Entry_section):
 
         return tools.read_file(output_fname)
 
+    def _raise_subnode(self, node, msg):
+        """Raise an error with a paticular FIT subnode
+
+        Args:
+            node (Node): FIT subnode containing the error
+            msg (str): Message to report
+
+        Raises:
+            ValueError, as requested
+        """
+        rel_path = node.path[len(self._node.path) + 1:]
+        self.Raise(f"subnode '{rel_path}': {msg}")
+
     def _build_input(self):
         """Finish the FIT by adding the 'data' properties to it
 
@@ -354,7 +367,7 @@ class Entry_fit(Entry_section):
                     else:
                         self.Raise("Generator node requires 'fit,fdt-list' property")
 
-        def _gen_node(subnode, depth, in_images):
+        def _gen_node(base_node, subnode, depth, in_images):
             """Generate nodes from a template
 
             This creates one node for each member of self._fdts using the
@@ -364,12 +377,14 @@ class Entry_fit(Entry_section):
             first.
 
             Args:
+                base_node (Node): Base Node of the FIT (with 'description'
+                    property)
                 subnode (Node): Generator node to process
                 depth (int): Current node depth (0 is the base 'fit' node)
                 in_images (bool): True if this is inside the 'images' node, so
                     that 'data' properties should be generated
             """
-            oper = self._get_operation(subnode)
+            oper = self._get_operation(base_node, subnode)
             if oper == OP_GEN_FDT_NODES:
                 _gen_fdt_nodes(subnode, depth, in_images)
 
@@ -410,7 +425,7 @@ class Entry_fit(Entry_section):
                 elif self.GetImage().generate and subnode.name.startswith('@'):
                     subnode_path = f'{rel_path}/{subnode.name}'
                     entry = self._entries.get(subnode_path)
-                    _gen_node(subnode, depth, in_images)
+                    _gen_node(base_node, subnode, depth, in_images)
                     if entry:
                         del self._entries[subnode_path]
                 else:
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 2b0abd8982..690fa96d07 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -5302,7 +5302,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
         """Check handling of an FDT map when the section cannot be found"""
         with self.assertRaises(ValueError) as exc:
             self._DoReadFileDtb('224_fit_bad_oper.dts')
-        self.assertIn("Node '/binman/fit': Unknown operation 'unknown'",
+        self.assertIn("Node '/binman/fit': subnode 'images/@fdt-SEQ': Unknown operation 'unknown'",
                       str(exc.exception))
 
     def test_uses_expand_size(self):
-- 
2.35.1.616.g0bdcbb4464-goog



More information about the U-Boot mailing list