[PATCH v2 1/1] tools: binman: etype: Allow to replace 'NAME' in node names
Paul HENRYS
paul.henrys_ext at softathome.com
Mon Nov 25 18:54:21 CET 2024
This change allows to replace both 'SEQ' and 'NAME' keywords by respectively a
sequence number and the name of the FDT to provide more flexibility in the node
name for the device trees included in the FIT.
Signed-off-by: Paul HENRYS <paul.henrys_ext at softathome.com>
---
Changes for v2:
- Add a test
- Add support to replace DEFAULT-NAME
- Update entries.rst
tools/binman/entries.rst | 18 ++++++++
tools/binman/etype/fit.py | 20 +++++++++
tools/binman/ftest.py | 61 ++++++++++++++++++--------
tools/binman/test/345_fit_fdt_name.dts | 58 ++++++++++++++++++++++++
4 files changed, 138 insertions(+), 19 deletions(-)
create mode 100644 tools/binman/test/345_fit_fdt_name.dts
diff --git a/tools/binman/entries.rst b/tools/binman/entries.rst
index 53024acad4..83068ba6d3 100644
--- a/tools/binman/entries.rst
+++ b/tools/binman/entries.rst
@@ -899,6 +899,9 @@ DEFAULT-SEQ:
Sequence number of the default fdt, as provided by the 'default-dt'
entry argument
+DEFAULT-NAME:
+ Name of the default fdt, as provided by the 'default-dt' entry argument
+
Available operations
~~~~~~~~~~~~~~~~~~~~
@@ -960,6 +963,21 @@ You can create config nodes in a similar way::
This tells binman to create nodes `config-1` and `config-2`, i.e. a config
for each of your two files.
+It is also possible to use NAME in the node names so that the FDT files name
+will be used instead of the sequence number. This can be useful to identify
+easily at runtime in U-Boot, the config to be used::
+
+ configurations {
+ default = "@config-DEFAULT-NAME";
+ @config-NAME {
+ description = "NAME";
+ firmware = "atf";
+ loadables = "uboot";
+ fdt = "fdt-NAME";
+ fit,compatible; // optional
+ };
+ };
+
Note that if no devicetree files are provided (with '-a of-list' as above)
then no nodes will be generated.
diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py
index 70be9bea47..343094a16e 100644
--- a/tools/binman/etype/fit.py
+++ b/tools/binman/etype/fit.py
@@ -138,6 +138,9 @@ class Entry_fit(Entry_section):
Sequence number of the default fdt, as provided by the 'default-dt'
entry argument
+ DEFAULT-NAME:
+ Name of the default fdt, as provided by the 'default-dt' entry argument
+
Available operations
~~~~~~~~~~~~~~~~~~~~
@@ -199,6 +202,21 @@ class Entry_fit(Entry_section):
This tells binman to create nodes `config-1` and `config-2`, i.e. a config
for each of your two files.
+ It is also possible to use NAME in the node names so that the FDT files name
+ will be used instead of the sequence number. This can be useful to identify
+ easily at runtime in U-Boot, the config to be used::
+
+ configurations {
+ default = "@config-DEFAULT-NAME";
+ @config-NAME {
+ description = "NAME";
+ firmware = "atf";
+ loadables = "uboot";
+ fdt = "fdt-NAME";
+ fit,compatible; // optional
+ };
+ };
+
Note that if no devicetree files are provided (with '-a of-list' as above)
then no nodes will be generated.
@@ -674,6 +692,7 @@ class Entry_fit(Entry_section):
f"not found in fdt list: {', '.join(self._fdts)}")
seq = self._fdts.index(default_dt)
val = val[1:].replace('DEFAULT-SEQ', str(seq + 1))
+ val = val.replace('DEFAULT-NAME', self._fit_default_dt)
fsw.property_string(pname, val)
return
elif pname.startswith('fit,'):
@@ -740,6 +759,7 @@ class Entry_fit(Entry_section):
# Generate nodes for each FDT
for seq, fdt_fname in enumerate(self._fdts):
node_name = node.name[1:].replace('SEQ', str(seq + 1))
+ node_name = node_name.replace('NAME', fdt_fname)
if self._fdt_dir:
fname = os.path.join(self._fdt_dir, fdt_fname + '.dtb')
else:
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 92c6e59285..4a2a9f2288 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -4233,44 +4233,54 @@ class TestFunctional(unittest.TestCase):
self.assertEqual(SCP_DATA, data[:len(SCP_DATA)])
def CheckFitFdt(self, dts='170_fit_fdt.dts', use_fdt_list=True,
- default_dt=None):
+ default_dt=None, use_seq_num=True):
"""Check an image with an FIT with multiple FDT images"""
- def _CheckFdt(seq, expected_data):
+ def _CheckFdt(val, expected_data):
"""Check the FDT nodes
Args:
- seq: Sequence number to check (0 or 1)
+ val: Sequence number to check (0 or 1) or fdt name
expected_data: Expected contents of 'data' property
"""
- name = 'fdt-%d' % seq
+ name = 'fdt-%s' % val
fnode = dtb.GetNode('/images/%s' % name)
self.assertIsNotNone(fnode)
self.assertEqual({'description','type', 'compression', 'data'},
set(fnode.props.keys()))
self.assertEqual(expected_data, fnode.props['data'].bytes)
- self.assertEqual('fdt-test-fdt%d.dtb' % seq,
- fnode.props['description'].value)
+ description = (
+ 'fdt-test-fdt%s.dtb' % val if len(val) == 1 else
+ 'fdt-%s.dtb' % val
+ )
+ self.assertEqual(description, fnode.props['description'].value)
self.assertEqual(fnode.subnodes[0].name, 'hash')
- def _CheckConfig(seq, expected_data):
+ def _CheckConfig(val, expected_data):
"""Check the configuration nodes
Args:
- seq: Sequence number to check (0 or 1)
+ val: Sequence number to check (0 or 1) or fdt name
expected_data: Expected contents of 'data' property
"""
cnode = dtb.GetNode('/configurations')
self.assertIn('default', cnode.props)
- self.assertEqual('config-2', cnode.props['default'].value)
+ default = (
+ 'config-2' if len(val) == 1 else
+ 'config-test-fdt2'
+ )
+ self.assertEqual(default, cnode.props['default'].value)
- name = 'config-%d' % seq
+ name = 'config-%s' % val
fnode = dtb.GetNode('/configurations/%s' % name)
self.assertIsNotNone(fnode)
self.assertEqual({'description','firmware', 'loadables', 'fdt'},
set(fnode.props.keys()))
- self.assertEqual('conf-test-fdt%d.dtb' % seq,
- fnode.props['description'].value)
- self.assertEqual('fdt-%d' % seq, fnode.props['fdt'].value)
+ description = (
+ 'conf-test-fdt%s.dtb' % val if len(val) == 1 else
+ 'conf-%s.dtb' % val
+ )
+ self.assertEqual(description, fnode.props['description'].value)
+ self.assertEqual('fdt-%s' % val, fnode.props['fdt'].value)
entry_args = {
'default-dt': 'test-fdt2',
@@ -4291,13 +4301,22 @@ class TestFunctional(unittest.TestCase):
fnode = dtb.GetNode('/images/kernel')
self.assertIn('data', fnode.props)
- # Check all the properties in fdt-1 and fdt-2
- _CheckFdt(1, TEST_FDT1_DATA)
- _CheckFdt(2, TEST_FDT2_DATA)
+ if use_seq_num == True:
+ # Check all the properties in fdt-1 and fdt-2
+ _CheckFdt('1', TEST_FDT1_DATA)
+ _CheckFdt('2', TEST_FDT2_DATA)
- # Check configurations
- _CheckConfig(1, TEST_FDT1_DATA)
- _CheckConfig(2, TEST_FDT2_DATA)
+ # Check configurations
+ _CheckConfig('1', TEST_FDT1_DATA)
+ _CheckConfig('2', TEST_FDT2_DATA)
+ else:
+ # Check all the properties in fdt-1 and fdt-2
+ _CheckFdt('test-fdt1', TEST_FDT1_DATA)
+ _CheckFdt('test-fdt2', TEST_FDT2_DATA)
+
+ # Check configurations
+ _CheckConfig('test-fdt1', TEST_FDT1_DATA)
+ _CheckConfig('test-fdt2', TEST_FDT2_DATA)
def testFitFdt(self):
"""Test an image with an FIT with multiple FDT images"""
@@ -7945,5 +7964,9 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
self.assertIn("Filename 'aes256.bin' not found in input path", str(e.exception))
+ def testFitFdtName(self):
+ """Test an image with an FIT with multiple FDT images using NAME"""
+ self.CheckFitFdt('345_fit_fdt_name.dts', use_seq_num=False)
+
if __name__ == "__main__":
unittest.main()
diff --git a/tools/binman/test/345_fit_fdt_name.dts b/tools/binman/test/345_fit_fdt_name.dts
new file mode 100644
index 0000000000..631a8e5f59
--- /dev/null
+++ b/tools/binman/test/345_fit_fdt_name.dts
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ u-boot {
+ };
+ fit {
+ description = "test-desc";
+ #address-cells = <1>;
+ fit,fdt-list = "of-list";
+
+ images {
+ kernel {
+ description = "Vanilla Linux kernel";
+ type = "kernel";
+ arch = "ppc";
+ os = "linux";
+ compression = "gzip";
+ load = <00000000>;
+ entry = <00000000>;
+ hash-1 {
+ algo = "crc32";
+ };
+ hash-2 {
+ algo = "sha1";
+ };
+ u-boot {
+ };
+ };
+ @fdt-NAME {
+ description = "fdt-NAME.dtb";
+ type = "flat_dt";
+ compression = "none";
+ hash {
+ algo = "sha256";
+ };
+ };
+ };
+
+ configurations {
+ default = "@config-DEFAULT-NAME";
+ @config-NAME {
+ description = "conf-NAME.dtb";
+ firmware = "uboot";
+ loadables = "atf";
+ fdt = "fdt-NAME";
+ };
+ };
+ };
+ u-boot-nodtb {
+ };
+ };
+};
--
2.43.0
More information about the U-Boot
mailing list