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 { binman {
section@0 { section@0 {
read-only; read-only;
name-prefix = "ro-";
size = <0x100000>; size = <0x100000>;
u-boot { u-boot {
}; };
}; };
section@1 { section@1 {
name-prefix = "rw-";
size = <0x100000>; size = <0x100000>;
u-boot { u-boot {
}; };
@ -437,6 +439,12 @@ read-only:
Indicates that this section is read-only. This has no impact on binman's Indicates that this section is read-only. This has no impact on binman's
operation, but his property can be read at run time. 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 Special properties
------------------ ------------------

@ -41,6 +41,8 @@ class Section(object):
memory address (like 0xff800000) is the first entry position. memory address (like 0xff800000) is the first entry position.
This causes _skip_at_start to be set to the starting memory This causes _skip_at_start to be set to the starting memory
address. address.
_name_prefix: Prefix to add to the name of all entries within this
section
_entries: OrderedDict() of entries _entries: OrderedDict() of entries
""" """
def __init__(self, name, node, test=False): def __init__(self, name, node, test=False):
@ -58,6 +60,7 @@ class Section(object):
self._sort = False self._sort = False
self._skip_at_start = 0 self._skip_at_start = 0
self._end_4gb = False self._end_4gb = False
self._name_prefix = ''
self._entries = OrderedDict() self._entries = OrderedDict()
if not test: if not test:
self._ReadNode() self._ReadNode()
@ -79,10 +82,13 @@ class Section(object):
self._Raise("Section size must be provided when using end-at-4gb") self._Raise("Section size must be provided when using end-at-4gb")
if self._end_4gb: if self._end_4gb:
self._skip_at_start = 0x100000000 - self._size self._skip_at_start = 0x100000000 - self._size
self._name_prefix = fdt_util.GetString(self._node, 'name-prefix')
def _ReadEntries(self): def _ReadEntries(self):
for node in self._node.subnodes: 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): def CheckSize(self):
"""Check that the section contents does not exceed its size, etc.""" """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 pad_after: Number of pad bytes after the contents, 0 if none
data: Contents of entry (string of bytes) 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.section = section
self.etype = etype self.etype = etype
self._node = node 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.pos = None
self.size = None self.size = None
self.contents_size = 0 self.contents_size = 0
@ -129,6 +129,15 @@ class Entry(object):
self.align_end = fdt_util.GetInt(self._node, 'align-end') self.align_end = fdt_util.GetInt(self._node, 'align-end')
self.pos_unset = fdt_util.GetBool(self._node, 'pos-unset') 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): def ObtainContents(self):
"""Figure out the contents of an entry. """Figure out the contents of an entry.

@ -950,5 +950,15 @@ class TestFunctional(unittest.TestCase):
00000000 00000004 u-boot 00000000 00000004 u-boot
''', map_data) ''', 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__": if __name__ == "__main__":
unittest.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