mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-25 13:14:19 +08:00
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:
parent
af53f5aafc
commit
e21c27af47
@ -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.
|
||||
|
@ -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):
|
||||
|
Loading…
Reference in New Issue
Block a user