dtoc: Make properties dirty when purging them

Without the 'dirty' flag properties are not written back to the
devicetree when synced. This means that new properties copied over to a
node are not always written out.

Fix this and add a test.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2023-07-22 21:43:53 -06:00
parent b2f47a599c
commit 7155646b22
3 changed files with 18 additions and 5 deletions

View file

@ -272,6 +272,7 @@ class Prop:
the FDT is synced the FDT is synced
""" """
self._offset = None self._offset = None
self.dirty = True
class Node: class Node:
"""A device tree node """A device tree node

View file

@ -37,11 +37,12 @@
new-prop; new-prop;
}; };
second1 { second1: second1 {
new-prop; new-prop;
}; };
second4 { second4 {
use_second1 = <&second1>;
}; };
}; };
}; };
@ -65,12 +66,13 @@
}; };
second: second { second: second {
second1 { second_1_bad: second1 {
some-prop; some-prop;
}; };
second2 { second2 {
some-prop; some-prop;
use_second1_bad = <&second_1_bad>;
}; };
}; };
}; };

View file

@ -308,7 +308,7 @@ class TestNode(unittest.TestCase):
def test_copy_node(self): def test_copy_node(self):
"""Test copy_node() function""" """Test copy_node() function"""
def do_copy_checks(dtb, dst, expect_none): def do_copy_checks(dtb, dst, second1_ph_val, expect_none):
self.assertEqual( self.assertEqual(
['/dest/base', '/dest/first@0', '/dest/existing'], ['/dest/base', '/dest/first@0', '/dest/existing'],
[n.path for n in dst.subnodes]) [n.path for n in dst.subnodes])
@ -365,12 +365,22 @@ class TestNode(unittest.TestCase):
['second1', 'second2', 'second3', 'second4'], ['second1', 'second2', 'second3', 'second4'],
[n.name for n in second.subnodes]) [n.name for n in second.subnodes])
# Check the 'second_1_bad' phandle is not copied over
second1 = second.FindNode('second1')
self.assertTrue(second1)
sph = second1.props.get('phandle')
self.assertTrue(sph)
self.assertEqual(second1_ph_val, sph.bytes)
dtb = fdt.FdtScan(find_dtb_file('dtoc_test_copy.dts')) dtb = fdt.FdtScan(find_dtb_file('dtoc_test_copy.dts'))
tmpl = dtb.GetNode('/base') tmpl = dtb.GetNode('/base')
dst = dtb.GetNode('/dest') dst = dtb.GetNode('/dest')
second1_ph_val = (dtb.GetNode('/dest/base/second/second1').
props['phandle'].bytes)
dst.copy_node(tmpl) dst.copy_node(tmpl)
do_copy_checks(dtb, dst, expect_none=True) do_copy_checks(dtb, dst, second1_ph_val, expect_none=True)
dtb.Sync(auto_resize=True) dtb.Sync(auto_resize=True)
@ -378,7 +388,7 @@ class TestNode(unittest.TestCase):
new_dtb = fdt.Fdt.FromData(dtb.GetContents()) new_dtb = fdt.Fdt.FromData(dtb.GetContents())
new_dtb.Scan() new_dtb.Scan()
dst = new_dtb.GetNode('/dest') dst = new_dtb.GetNode('/dest')
do_copy_checks(new_dtb, dst, expect_none=False) do_copy_checks(new_dtb, dst, second1_ph_val, expect_none=False)
def test_copy_subnodes_from_phandles(self): def test_copy_subnodes_from_phandles(self):
"""Test copy_node() function""" """Test copy_node() function"""