dtoc: Support adding new nodes

Add a way to add new nodes and sync them back to the blob.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2018-09-14 04:57:15 -06:00
parent af53f5aafc
commit e21c27af47
2 changed files with 28 additions and 0 deletions

View File

@ -337,6 +337,12 @@ class Node:
"""
self.props[prop_name].SetInt(val)
def AddSubnode(self, name):
path = self.path + '/' + name
subnode = Node(self._fdt, self, None, name, path)
self.subnodes.append(subnode)
return subnode
def Sync(self, auto_resize=False):
"""Sync node changes back to the device tree
@ -350,6 +356,20 @@ class Node:
Raises:
FdtException if auto_resize is False and there is not enough space
"""
if self._offset is None:
# The subnode doesn't exist yet, so add it
fdt_obj = self._fdt._fdt_obj
if auto_resize:
while True:
offset = fdt_obj.add_subnode(self.parent._offset, self.name,
(libfdt.NOSPACE,))
if offset != -libfdt.NOSPACE:
break
fdt_obj.resize(fdt_obj.totalsize() + 1024)
else:
offset = fdt_obj.add_subnode(self.parent._offset, self.name)
self._offset = offset
# Sync subnodes in reverse so that we don't disturb node offsets for
# nodes that are earlier in the DT. This avoids an O(n^2) rescan of
# node offsets.

View File

@ -355,6 +355,14 @@ class TestProp(unittest.TestCase):
def testAddNode(self):
self.fdt.pack()
self.node.AddSubnode('subnode')
with self.assertRaises(libfdt.FdtException) as e:
self.dtb.Sync(auto_resize=False)
self.assertIn('FDT_ERR_NOSPACE', str(e.exception))
self.dtb.Sync(auto_resize=True)
offset = self.fdt.path_offset('/spl-test/subnode')
self.assertTrue(offset > 0)
class TestFdtUtil(unittest.TestCase):