diff mbox series

[U-Boot,17/31] binman: Obtain the list of device trees from the config

Message ID 20180914105736.162666-18-sjg@chromium.org
State Accepted
Commit 539aece516d87084437a38d879a1b91c661209f8
Delegated to: Simon Glass
Headers show
Series binman: Expand support for SPL and TPL | expand

Commit Message

Simon Glass Sept. 14, 2018, 10:57 a.m. UTC
We always have a device tree for U-Boot proper. But we may also have one
for SPL and TPL. Add a new Entry method to find out what DTs an entry
has, and use that list when updating DTs.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 tools/binman/bsection.py |  8 ++++++++
 tools/binman/control.py  |  2 +-
 tools/binman/entry.py    | 15 +++++++++++++++
 tools/binman/image.py    |  4 ++++
 tools/binman/state.py    | 20 ++++++++++++++++++--
 5 files changed, 46 insertions(+), 3 deletions(-)

Comments

Simon Glass Oct. 2, 2018, 11:19 a.m. UTC | #1
On 14 September 2018 at 03:57, Simon Glass <sjg@chromium.org> wrote:
> We always have a device tree for U-Boot proper. But we may also have one
> for SPL and TPL. Add a new Entry method to find out what DTs an entry
> has, and use that list when updating DTs.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
>  tools/binman/bsection.py |  8 ++++++++
>  tools/binman/control.py  |  2 +-
>  tools/binman/entry.py    | 15 +++++++++++++++
>  tools/binman/image.py    |  4 ++++
>  tools/binman/state.py    | 20 ++++++++++++++++++--
>  5 files changed, 46 insertions(+), 3 deletions(-)

Applied to u-boot-dm, and now in mainline.
diff mbox series

Patch

diff --git a/tools/binman/bsection.py b/tools/binman/bsection.py
index 4f5c33f048b..44adb82795b 100644
--- a/tools/binman/bsection.py
+++ b/tools/binman/bsection.py
@@ -8,6 +8,7 @@ 
 from __future__ import print_function
 
 from collections import OrderedDict
+from sets import Set
 import sys
 
 import fdt_util
@@ -92,6 +93,13 @@  class Section(object):
             entry.SetPrefix(self._name_prefix)
             self._entries[node.name] = entry
 
+    def GetFdtSet(self):
+        """Get the set of device tree files used by this image"""
+        fdt_set = Set()
+        for entry in self._entries.values():
+            fdt_set.update(entry.GetFdtSet())
+        return fdt_set
+
     def SetOffset(self, offset):
         self._offset = offset
 
diff --git a/tools/binman/control.py b/tools/binman/control.py
index fd8b779945d..49d49a001c7 100644
--- a/tools/binman/control.py
+++ b/tools/binman/control.py
@@ -137,7 +137,7 @@  def Binman(options, args):
                 if skip:
                     print 'Skipping images: %s\n' % ', '.join(skip)
 
-            state.Prepare(dtb)
+            state.Prepare(images, dtb)
 
             # Prepare the device tree by making sure that any missing
             # properties are added (e.g. 'pos' and 'size'). The values of these
diff --git a/tools/binman/entry.py b/tools/binman/entry.py
index 4b87156ff80..e5f557749f6 100644
--- a/tools/binman/entry.py
+++ b/tools/binman/entry.py
@@ -18,6 +18,7 @@  except:
     have_importlib = False
 
 import os
+from sets import Set
 import sys
 
 import fdt_util
@@ -164,6 +165,20 @@  class Entry(object):
     def GetDefaultFilename(self):
         return None
 
+    def GetFdtSet(self):
+        """Get the set of device trees used by this entry
+
+        Returns:
+            Set containing the filename from this entry, if it is a .dtb, else
+            an empty set
+        """
+        fname = self.GetDefaultFilename()
+        # It would be better to use isinstance(self, Entry_blob_dtb) here but
+        # we cannot access Entry_blob_dtb
+        if fname and fname.endswith('.dtb'):
+            return Set([fname])
+        return Set()
+
     def AddMissingProperties(self):
         """Add new properties to the device tree as needed for this entry"""
         for prop in ['offset', 'size', 'image-pos']:
diff --git a/tools/binman/image.py b/tools/binman/image.py
index 68126bc3e69..1fb5eb65db3 100644
--- a/tools/binman/image.py
+++ b/tools/binman/image.py
@@ -54,6 +54,10 @@  class Image:
             self._filename = filename
         self._section = bsection.Section('main-section', self._node)
 
+    def GetFdtSet(self):
+        """Get the set of device tree files used by this image"""
+        return self._section.GetFdtSet()
+
     def AddMissingProperties(self):
         """Add properties that are not present in the device tree
 
diff --git a/tools/binman/state.py b/tools/binman/state.py
index 5f25b907b9e..600eb86cfe2 100644
--- a/tools/binman/state.py
+++ b/tools/binman/state.py
@@ -18,6 +18,10 @@  fdt_files = {}
 # Arguments passed to binman to provide arguments to entries
 entry_args = {}
 
+# True to use fake device-tree files for testing (see U_BOOT_DTB_DATA in
+# ftest.py)
+use_fake_dtb = True
+
 # Set of all device tree files references by images
 fdt_set = Set()
 
@@ -85,13 +89,14 @@  def GetEntryArg(name):
     """
     return entry_args.get(name)
 
-def Prepare(dtb):
+def Prepare(images, dtb):
     """Get device tree files ready for use
 
     This sets up a set of device tree files that can be retrieved by GetFdts().
     At present there is only one, that for U-Boot proper.
 
     Args:
+        images: List of images being used
         dtb: Main dtb
     """
     global fdt_set, fdt_subset, fdt_files, main_dtb
@@ -107,8 +112,19 @@  def Prepare(dtb):
     main_dtb = dtb
     fdt_files.clear()
     fdt_files['u-boot.dtb'] = dtb
-    fdt_set = Set()
     fdt_subset = Set()
+    if not use_fake_dtb:
+        for image in images.values():
+            fdt_subset.update(image.GetFdtSet())
+        fdt_subset.discard('u-boot.dtb')
+        for other_fname in fdt_subset:
+            infile = tools.GetInputFilename(other_fname)
+            other_fname_dtb = fdt_util.EnsureCompiled(infile)
+            out_fname = tools.GetOutputFilename('%s.out' %
+                    os.path.split(other_fname)[1])
+            tools.WriteFile(out_fname, tools.ReadFile(other_fname_dtb))
+            other_dtb = fdt.FdtScan(out_fname)
+            fdt_files[other_fname] = other_dtb
 
 def GetFdts():
     """Yield all device tree files being used by binman