binman: Add support for adding a name prefix to entries

Sometimes we have several sections which repeat the same entries (e.g. for
a read-only and read-write version of the same section). It is useful to
be able to tell these entries apart by name.

Add a new 'name-prefix' property for sections, which causes all entries
within that section to have a given name prefix.

Signed-off-by: Simon Glass <sjg@chromium.org>
lime2-spi
Simon Glass 6 years ago
parent 3b0c3821d6
commit c8d48efb2b
  1. 8
      tools/binman/README
  2. 8
      tools/binman/bsection.py
  3. 13
      tools/binman/entry.py
  4. 10
      tools/binman/ftest.py
  5. 30
      tools/binman/test/56_name_prefix.dts

@ -417,11 +417,13 @@ and can be programmed:
binman {
section@0 {
read-only;
name-prefix = "ro-";
size = <0x100000>;
u-boot {
};
};
section@1 {
name-prefix = "rw-";
size = <0x100000>;
u-boot {
};
@ -437,6 +439,12 @@ read-only:
Indicates that this section is read-only. This has no impact on binman's
operation, but his property can be read at run time.
name-prefix:
This string is prepended to all the names of the binaries in the
section. In the example above, the 'u-boot' binaries which actually be
renamed to 'ro-u-boot' and 'rw-u-boot'. This can be useful to
distinguish binaries with otherwise identical names.
Special properties
------------------

@ -41,6 +41,8 @@ class Section(object):
memory address (like 0xff800000) is the first entry position.
This causes _skip_at_start to be set to the starting memory
address.
_name_prefix: Prefix to add to the name of all entries within this
section
_entries: OrderedDict() of entries
"""
def __init__(self, name, node, test=False):
@ -58,6 +60,7 @@ class Section(object):
self._sort = False
self._skip_at_start = 0
self._end_4gb = False
self._name_prefix = ''
self._entries = OrderedDict()
if not test:
self._ReadNode()
@ -79,10 +82,13 @@ class Section(object):
self._Raise("Section size must be provided when using end-at-4gb")
if self._end_4gb:
self._skip_at_start = 0x100000000 - self._size
self._name_prefix = fdt_util.GetString(self._node, 'name-prefix')
def _ReadEntries(self):
for node in self._node.subnodes:
self._entries[node.name] = Entry.Create(self, node)
entry = Entry.Create(self, node)
entry.SetPrefix(self._name_prefix)
self._entries[node.name] = entry
def CheckSize(self):
"""Check that the section contents does not exceed its size, etc."""

@ -48,11 +48,11 @@ class Entry(object):
pad_after: Number of pad bytes after the contents, 0 if none
data: Contents of entry (string of bytes)
"""
def __init__(self, section, etype, node, read_node=True):
def __init__(self, section, etype, node, read_node=True, name_prefix=''):
self.section = section
self.etype = etype
self._node = node
self.name = node and node.name or 'none'
self.name = node and (name_prefix + node.name) or 'none'
self.pos = None
self.size = None
self.contents_size = 0
@ -129,6 +129,15 @@ class Entry(object):
self.align_end = fdt_util.GetInt(self._node, 'align-end')
self.pos_unset = fdt_util.GetBool(self._node, 'pos-unset')
def SetPrefix(self, prefix):
"""Set the name prefix for a node
Args:
prefix: Prefix to set, or '' to not use a prefix
"""
if prefix:
self.name = prefix + self.name
def ObtainContents(self):
"""Figure out the contents of an entry.

@ -950,5 +950,15 @@ class TestFunctional(unittest.TestCase):
00000000 00000004 u-boot
''', map_data)
def testNamePrefix(self):
"""Tests that name prefixes are used"""
_, _, map_data = self._DoReadFileDtb('56_name_prefix.dts', map=True)
self.assertEqual('''Position Size Name
00000000 00000010 section@0
00000000 00000004 ro-u-boot
00000010 00000010 section@1
00000000 00000004 rw-u-boot
''', map_data)
if __name__ == "__main__":
unittest.main()

@ -0,0 +1,30 @@
// SPDX-License-Identifier: GPL-2.0+
/dts-v1/;
/ {
#address-cells = <1>;
#size-cells = <1>;
binman {
pad-byte = <0x26>;
size = <0x28>;
section@0 {
read-only;
name-prefix = "ro-";
size = <0x10>;
pad-byte = <0x21>;
u-boot {
};
};
section@1 {
name-prefix = "rw-";
size = <0x10>;
pad-byte = <0x61>;
u-boot {
};
};
};
};
Loading…
Cancel
Save