dtoc: Add functions to add integer properties
authorSimon Glass <sjg@chromium.org>
Fri, 6 Jul 2018 16:27:38 +0000 (10:27 -0600)
committerSimon Glass <sjg@chromium.org>
Mon, 9 Jul 2018 15:11:00 +0000 (09:11 -0600)
Add a few simple functions to add a placeholder integer property, and
set its value.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/dtoc/fdt.py
tools/dtoc/test_fdt.py

index e7703c1c7538dc2da5ea60d3962840b026536144..9d69b426c14b9cbe1b1b6c6cacdd57694e10b329 100644 (file)
@@ -270,6 +270,33 @@ class Node:
         del self.props[prop_name]
         self._fdt.Invalidate()
 
+    def AddZeroProp(self, prop_name):
+        """Add a new property to the device tree with an integer value of 0.
+
+        Args:
+            prop_name: Name of property
+        """
+        fdt_obj = self._fdt._fdt_obj
+        if fdt_obj.setprop_u32(self.Offset(), prop_name, 0,
+                               (libfdt.NOSPACE,)) == -libfdt.NOSPACE:
+            fdt_obj.open_into(fdt_obj.totalsize() + 1024)
+            fdt_obj.setprop_u32(self.Offset(), prop_name, 0)
+        self.props[prop_name] = Prop(self, -1, prop_name, '\0' * 4)
+        self._fdt.Invalidate()
+
+    def SetInt(self, prop_name, val):
+        """Update an integer property int the device tree.
+
+        This is not allowed to change the size of the FDT.
+
+        Args:
+            prop_name: Name of property
+            val: Value to set
+        """
+        fdt_obj = self._fdt._fdt_obj
+        fdt_obj.setprop_u32(self.Offset(), prop_name, val)
+
+
 class Fdt:
     """Provides simple access to a flat device tree blob using libfdts.
 
index 49d188b1c124f3f9f97cf2a023e04eac2460b002..f085b1dd1a9f65d85a78ce1c1358295042f74908 100755 (executable)
@@ -319,6 +319,26 @@ class TestProp(unittest.TestCase):
         self.assertTrue(isinstance(prop.value, list))
         self.assertEqual(3, len(prop.value))
 
+    def testAdd(self):
+        """Test adding properties"""
+        self.fdt.pack()
+        # This function should automatically expand the device tree
+        self.node.AddZeroProp('one')
+        self.node.AddZeroProp('two')
+        self.node.AddZeroProp('three')
+
+        # Updating existing properties should be OK, since the device-tree size
+        # does not change
+        self.fdt.pack()
+        self.node.SetInt('one', 1)
+        self.node.SetInt('two', 2)
+        self.node.SetInt('three', 3)
+
+        # This should fail since it would need to increase the device-tree size
+        with self.assertRaises(libfdt.FdtException) as e:
+            self.node.SetInt('four', 4)
+        self.assertIn('FDT_ERR_NOSPACE', str(e.exception))
+
 
 class TestFdtUtil(unittest.TestCase):
     """Tests for the fdt_util module