aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorSimon Glass2022-02-08 11:49:51 -0700
committerSimon Glass2022-02-22 10:05:44 -0700
commita30c39f2f77f4fb57a22a50c6d6b477d5d2f4342 (patch)
treeb7d074377566fa5fc30fd853a85ba2c13a7aee13 /tools
parentbc116029c0ad25b2631629062a70a4d36157d43c (diff)
dtoc: Support deleting a node
Add a function to delete a node. This is synced to the tree when requested. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/dtoc/fdt.py17
-rwxr-xr-xtools/dtoc/test_fdt.py9
2 files changed, 26 insertions, 0 deletions
diff --git a/tools/dtoc/fdt.py b/tools/dtoc/fdt.py
index 026f7a273f9..f69f89cd783 100644
--- a/tools/dtoc/fdt.py
+++ b/tools/dtoc/fdt.py
@@ -548,6 +548,23 @@ class Node:
self.subnodes.append(subnode)
return subnode
+ def Delete(self):
+ """Delete a node
+
+ The node is deleted and the offset cache is invalidated.
+
+ Args:
+ node (Node): Node to delete
+
+ Raises:
+ ValueError if the node does not exist
+ """
+ CheckErr(self._fdt._fdt_obj.del_node(self.Offset()),
+ "Node '%s': delete" % self.path)
+ parent = self.parent
+ self._fdt.Invalidate()
+ parent.subnodes.remove(self)
+
def Sync(self, auto_resize=False):
"""Sync node changes back to the device tree
diff --git a/tools/dtoc/test_fdt.py b/tools/dtoc/test_fdt.py
index 5a5333b1342..ee603cc152d 100755
--- a/tools/dtoc/test_fdt.py
+++ b/tools/dtoc/test_fdt.py
@@ -539,6 +539,15 @@ class TestProp(unittest.TestCase):
data = self.fdt.getprop(self.node.Offset(), 'stringlist')
self.assertEqual(b'123\x00456\0', data)
+ def test_delete_node(self):
+ """Test deleting a node"""
+ old_offset = self.fdt.path_offset('/spl-test')
+ self.assertGreater(old_offset, 0)
+ self.node.Delete()
+ self.dtb.Sync()
+ new_offset = self.fdt.path_offset('/spl-test', libfdt.QUIET_NOTFOUND)
+ self.assertEqual(-libfdt.NOTFOUND, new_offset)
+
def testFromData(self):
dtb2 = fdt.Fdt.FromData(self.dtb.GetContents())
self.assertEqual(dtb2.GetContents(), self.dtb.GetContents())