summaryrefslogtreecommitdiff
path: root/tools/binman/state.py
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2019-07-20 12:23:50 -0600
committerSimon Glass <sjg@chromium.org>2019-07-29 09:38:06 -0600
commit10f9d0066b9e9e14327922fa62c2a1b6bea50785 (patch)
treee8f2edff2c01e0a90f203db9fc3a5d336d15fd0c /tools/binman/state.py
parenta004f29464d14f3535ed8db22e5dfed02c8fc9d8 (diff)
downloadu-boot-10f9d0066b9e9e14327922fa62c2a1b6bea50785.tar.gz
binman: Support updating entries in an existing image
While it is useful and efficient to build images in a single pass from a unified description, it is sometimes desirable to update the image later. Add support for replace an existing file with one of the same size. This avoids needing to repack the file. Support for more advanced updates will come in future patches. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'tools/binman/state.py')
-rw-r--r--tools/binman/state.py74
1 files changed, 53 insertions, 21 deletions
diff --git a/tools/binman/state.py b/tools/binman/state.py
index 34907d9d43..08e627985d 100644
--- a/tools/binman/state.py
+++ b/tools/binman/state.py
@@ -8,8 +8,10 @@
import hashlib
import re
+import fdt
import os
import tools
+import tout
# Records the device-tree files known to binman, keyed by entry type (e.g.
# 'u-boot-spl-dtb'). These are the output FDT files, which can be updated by
@@ -22,6 +24,9 @@ import tools
# Entry object, or None if not known
output_fdt_info = {}
+# Prefix to add to an fdtmap path to turn it into a path to the /binman node
+fdt_path_prefix = ''
+
# Arguments passed to binman to provide arguments to entries
entry_args = {}
@@ -55,24 +60,6 @@ def GetFdtForEtype(etype):
return None
return value[0]
-def GetEntryForEtype(etype):
- """Get the Entry for a particular device-tree filename
-
- Binman keeps track of at least one device-tree file called u-boot.dtb but
- can also have others (e.g. for SPL). This function looks up the given
- filename and returns the associated Fdt object.
-
- Args:
- etype: Entry type of device tree (e.g. 'u-boot-dtb')
-
- Returns:
- Entry object associated with the entry type, if present in the image
- """
- value = output_fdt_info.get(etype);
- if not value:
- return None
- return value[2]
-
def GetFdtPath(etype):
"""Get the full pathname of a particular Fdt object
@@ -153,7 +140,7 @@ def Prepare(images, dtb):
images: List of images being used
dtb: Main dtb
"""
- global output_fdt_info, main_dtb
+ global output_fdt_info, main_dtb, fdt_path_prefix
# Import these here in case libfdt.py is not available, in which case
# the above help option still works.
import fdt
@@ -165,6 +152,7 @@ def Prepare(images, dtb):
# was handled just above.
main_dtb = dtb
output_fdt_info.clear()
+ fdt_path_prefix = ''
output_fdt_info['u-boot-dtb'] = [dtb, 'u-boot.dtb', None]
output_fdt_info['u-boot-spl-dtb'] = [dtb, 'spl/u-boot-spl.dtb', None]
output_fdt_info['u-boot-tpl-dtb'] = [dtb, 'tpl/u-boot-tpl.dtb', None]
@@ -182,13 +170,57 @@ def Prepare(images, dtb):
other_dtb = fdt.FdtScan(out_fname)
output_fdt_info[etype] = [other_dtb, out_fname, entry]
+def PrepareFromLoadedData(image):
+ """Get device tree files ready for use with a loaded image
+
+ Loaded images are different from images that are being created by binman,
+ since there is generally already an fdtmap and we read the description from
+ that. This provides the position and size of every entry in the image with
+ no calculation required.
+
+ This function uses the same output_fdt_info[] as Prepare(). It finds the
+ device tree files, adds a reference to the fdtmap and sets the FDT path
+ prefix to translate from the fdtmap (where the root node is the image node)
+ to the normal device tree (where the image node is under a /binman node).
+
+ Args:
+ images: List of images being used
+ """
+ global output_fdt_info, main_dtb, fdt_path_prefix
+
+ tout.Info('Preparing device trees')
+ output_fdt_info.clear()
+ fdt_path_prefix = ''
+ output_fdt_info['fdtmap'] = [image.fdtmap_dtb, 'u-boot.dtb', None]
+ main_dtb = None
+ tout.Info(" Found device tree type 'fdtmap' '%s'" % image.fdtmap_dtb.name)
+ for etype, value in image.GetFdts().items():
+ entry, fname = value
+ out_fname = tools.GetOutputFilename('%s.dtb' % entry.etype)
+ tout.Info(" Found device tree type '%s' at '%s' path '%s'" %
+ (etype, out_fname, entry.GetPath()))
+ entry._filename = entry.GetDefaultFilename()
+ data = entry.ReadData()
+
+ tools.WriteFile(out_fname, data)
+ dtb = fdt.Fdt(out_fname)
+ dtb.Scan()
+ image_node = dtb.GetNode('/binman')
+ if 'multiple-images' in image_node.props:
+ image_node = dtb.GetNode('/binman/%s' % image.image_node)
+ fdt_path_prefix = image_node.path
+ output_fdt_info[etype] = [dtb, None, entry]
+ tout.Info(" FDT path prefix '%s'" % fdt_path_prefix)
+
+
def GetAllFdts():
"""Yield all device tree files being used by binman
Yields:
Device trees being used (U-Boot proper, SPL, TPL)
"""
- yield main_dtb
+ if main_dtb:
+ yield main_dtb
for etype in output_fdt_info:
dtb = output_fdt_info[etype][0]
if dtb != main_dtb:
@@ -211,7 +243,7 @@ def GetUpdateNodes(node):
yield node
for dtb, fname, _ in output_fdt_info.values():
if dtb != node.GetFdt():
- other_node = dtb.GetNode(node.path)
+ other_node = dtb.GetNode(fdt_path_prefix + node.path)
if other_node:
yield other_node