mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 19:11:53 +00:00
binman: Move state information into a new module
At present the control module has state information in it, since it is the primary user of this. But it is a bit odd to have entries and other modules importing control to obtain this information. It seems better to have a dedicated state module, which control can use as well. Create a new module using code from control and update other modules to use it. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
6c234bfbf7
commit
c55a50f558
5 changed files with 95 additions and 48 deletions
|
@ -7,27 +7,19 @@
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
import os
|
import os
|
||||||
import re
|
|
||||||
import sys
|
import sys
|
||||||
import tools
|
import tools
|
||||||
|
|
||||||
import command
|
import command
|
||||||
import elf
|
import elf
|
||||||
from image import Image
|
from image import Image
|
||||||
|
import state
|
||||||
import tout
|
import tout
|
||||||
|
|
||||||
# List of images we plan to create
|
# List of images we plan to create
|
||||||
# Make this global so that it can be referenced from tests
|
# Make this global so that it can be referenced from tests
|
||||||
images = OrderedDict()
|
images = OrderedDict()
|
||||||
|
|
||||||
# Records the device-tree files known to binman, keyed by filename (e.g.
|
|
||||||
# 'u-boot-spl.dtb')
|
|
||||||
fdt_files = {}
|
|
||||||
|
|
||||||
# Arguments passed to binman to provide arguments to entries
|
|
||||||
entry_args = {}
|
|
||||||
|
|
||||||
|
|
||||||
def _ReadImageDesc(binman_node):
|
def _ReadImageDesc(binman_node):
|
||||||
"""Read the image descriptions from the /binman node
|
"""Read the image descriptions from the /binman node
|
||||||
|
|
||||||
|
@ -60,39 +52,15 @@ def _FindBinmanNode(dtb):
|
||||||
return node
|
return node
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def GetFdt(fname):
|
def WriteEntryDocs(modules, test_missing=None):
|
||||||
"""Get the Fdt object for a particular device-tree filename
|
"""Write out documentation for all entries
|
||||||
|
|
||||||
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:
|
Args:
|
||||||
fname: Filename to look up (e.g. 'u-boot.dtb').
|
modules: List of Module objects to get docs for
|
||||||
|
test_missing: Used for testing only, to force an entry's documeentation
|
||||||
Returns:
|
to show as missing even if it is present. Should be set to None in
|
||||||
Fdt object associated with the filename
|
normal use.
|
||||||
"""
|
"""
|
||||||
return fdt_files[fname]
|
|
||||||
|
|
||||||
def GetFdtPath(fname):
|
|
||||||
return fdt_files[fname]._fname
|
|
||||||
|
|
||||||
def SetEntryArgs(args):
|
|
||||||
global entry_args
|
|
||||||
|
|
||||||
entry_args = {}
|
|
||||||
if args:
|
|
||||||
for arg in args:
|
|
||||||
m = re.match('([^=]*)=(.*)', arg)
|
|
||||||
if not m:
|
|
||||||
raise ValueError("Invalid entry arguemnt '%s'" % arg)
|
|
||||||
entry_args[m.group(1)] = m.group(2)
|
|
||||||
|
|
||||||
def GetEntryArg(name):
|
|
||||||
return entry_args.get(name)
|
|
||||||
|
|
||||||
def WriteEntryDocs(modules, test_missing=None):
|
|
||||||
from entry import Entry
|
from entry import Entry
|
||||||
Entry.WriteDocs(modules, test_missing)
|
Entry.WriteDocs(modules, test_missing)
|
||||||
|
|
||||||
|
@ -141,7 +109,7 @@ def Binman(options, args):
|
||||||
try:
|
try:
|
||||||
tools.SetInputDirs(options.indir)
|
tools.SetInputDirs(options.indir)
|
||||||
tools.PrepareOutputDir(options.outdir, options.preserve)
|
tools.PrepareOutputDir(options.outdir, options.preserve)
|
||||||
SetEntryArgs(options.entry_arg)
|
state.SetEntryArgs(options.entry_arg)
|
||||||
|
|
||||||
# Get the device tree ready by compiling it and copying the compiled
|
# Get the device tree ready by compiling it and copying the compiled
|
||||||
# output into a file in our output directly. Then scan it for use
|
# output into a file in our output directly. Then scan it for use
|
||||||
|
@ -154,7 +122,7 @@ def Binman(options, args):
|
||||||
dtb = fdt.FdtScan(fname)
|
dtb = fdt.FdtScan(fname)
|
||||||
|
|
||||||
# Note the file so that GetFdt() can find it
|
# Note the file so that GetFdt() can find it
|
||||||
fdt_files['u-boot.dtb'] = dtb
|
state.fdt_files['u-boot.dtb'] = dtb
|
||||||
node = _FindBinmanNode(dtb)
|
node = _FindBinmanNode(dtb)
|
||||||
if not node:
|
if not node:
|
||||||
raise ValueError("Device tree '%s' does not have a 'binman' "
|
raise ValueError("Device tree '%s' does not have a 'binman' "
|
||||||
|
|
|
@ -17,10 +17,11 @@ try:
|
||||||
except:
|
except:
|
||||||
have_importlib = False
|
have_importlib = False
|
||||||
|
|
||||||
import fdt_util
|
|
||||||
import control
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
import fdt_util
|
||||||
|
import state
|
||||||
import tools
|
import tools
|
||||||
|
|
||||||
modules = {}
|
modules = {}
|
||||||
|
@ -393,7 +394,7 @@ class Entry(object):
|
||||||
Raises:
|
Raises:
|
||||||
ValueError if the argument cannot be converted to in
|
ValueError if the argument cannot be converted to in
|
||||||
"""
|
"""
|
||||||
value = control.GetEntryArg(name)
|
value = state.GetEntryArg(name)
|
||||||
if value is not None:
|
if value is not None:
|
||||||
if datatype == int:
|
if datatype == int:
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
# Entry-type module for U-Boot device tree with the microcode removed
|
# Entry-type module for U-Boot device tree with the microcode removed
|
||||||
#
|
#
|
||||||
|
|
||||||
import control
|
|
||||||
from entry import Entry
|
from entry import Entry
|
||||||
from blob import Entry_blob
|
from blob import Entry_blob
|
||||||
|
import state
|
||||||
import tools
|
import tools
|
||||||
|
|
||||||
class Entry_u_boot_dtb_with_ucode(Entry_blob):
|
class Entry_u_boot_dtb_with_ucode(Entry_blob):
|
||||||
|
@ -51,7 +51,7 @@ class Entry_u_boot_dtb_with_ucode(Entry_blob):
|
||||||
|
|
||||||
# Remove the microcode
|
# Remove the microcode
|
||||||
fname = self.GetDefaultFilename()
|
fname = self.GetDefaultFilename()
|
||||||
fdt = control.GetFdt(fname)
|
fdt = state.GetFdt(fname)
|
||||||
self.ucode = fdt.GetNode('/microcode')
|
self.ucode = fdt.GetNode('/microcode')
|
||||||
if not self.ucode:
|
if not self.ucode:
|
||||||
raise self.Raise("No /microcode node found in '%s'" % fname)
|
raise self.Raise("No /microcode node found in '%s'" % fname)
|
||||||
|
@ -70,7 +70,7 @@ class Entry_u_boot_dtb_with_ucode(Entry_blob):
|
||||||
def ObtainContents(self):
|
def ObtainContents(self):
|
||||||
# Call the base class just in case it does something important.
|
# Call the base class just in case it does something important.
|
||||||
Entry_blob.ObtainContents(self)
|
Entry_blob.ObtainContents(self)
|
||||||
self._pathname = control.GetFdtPath(self._filename)
|
self._pathname = state.GetFdtPath(self._filename)
|
||||||
self.ReadBlobContents()
|
self.ReadBlobContents()
|
||||||
if self.ucode:
|
if self.ucode:
|
||||||
for node in self.ucode.subnodes:
|
for node in self.ucode.subnodes:
|
||||||
|
|
|
@ -23,6 +23,7 @@ import fdt
|
||||||
import fdt_util
|
import fdt_util
|
||||||
import fmap_util
|
import fmap_util
|
||||||
import test_util
|
import test_util
|
||||||
|
import state
|
||||||
import tools
|
import tools
|
||||||
import tout
|
import tout
|
||||||
|
|
||||||
|
@ -258,7 +259,7 @@ class TestFunctional(unittest.TestCase):
|
||||||
retcode = self._DoTestFile(fname, map=map, update_dtb=update_dtb,
|
retcode = self._DoTestFile(fname, map=map, update_dtb=update_dtb,
|
||||||
entry_args=entry_args)
|
entry_args=entry_args)
|
||||||
self.assertEqual(0, retcode)
|
self.assertEqual(0, retcode)
|
||||||
out_dtb_fname = control.GetFdtPath('u-boot.dtb')
|
out_dtb_fname = state.GetFdtPath('u-boot.dtb')
|
||||||
|
|
||||||
# Find the (only) image, read it and return its contents
|
# Find the (only) image, read it and return its contents
|
||||||
image = control.images['image']
|
image = control.images['image']
|
||||||
|
|
77
tools/binman/state.py
Normal file
77
tools/binman/state.py
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
|
# Copyright 2018 Google, Inc
|
||||||
|
# Written by Simon Glass <sjg@chromium.org>
|
||||||
|
#
|
||||||
|
# Holds and modifies the state information held by binman
|
||||||
|
#
|
||||||
|
|
||||||
|
import re
|
||||||
|
from sets import Set
|
||||||
|
|
||||||
|
import os
|
||||||
|
import tools
|
||||||
|
|
||||||
|
# Records the device-tree files known to binman, keyed by filename (e.g.
|
||||||
|
# 'u-boot-spl.dtb')
|
||||||
|
fdt_files = {}
|
||||||
|
|
||||||
|
# Arguments passed to binman to provide arguments to entries
|
||||||
|
entry_args = {}
|
||||||
|
|
||||||
|
def GetFdt(fname):
|
||||||
|
"""Get the Fdt object 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:
|
||||||
|
fname: Filename to look up (e.g. 'u-boot.dtb').
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Fdt object associated with the filename
|
||||||
|
"""
|
||||||
|
return fdt_files[fname]
|
||||||
|
|
||||||
|
def GetFdtPath(fname):
|
||||||
|
"""Get the full pathname of a particular Fdt object
|
||||||
|
|
||||||
|
Similar to GetFdt() but returns the pathname associated with the Fdt.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
fname: Filename to look up (e.g. 'u-boot.dtb').
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Full path name to the associated Fdt
|
||||||
|
"""
|
||||||
|
return fdt_files[fname]._fname
|
||||||
|
|
||||||
|
def SetEntryArgs(args):
|
||||||
|
"""Set the value of the entry args
|
||||||
|
|
||||||
|
This sets up the entry_args dict which is used to supply entry arguments to
|
||||||
|
entries.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
args: List of entry arguments, each in the format "name=value"
|
||||||
|
"""
|
||||||
|
global entry_args
|
||||||
|
|
||||||
|
entry_args = {}
|
||||||
|
if args:
|
||||||
|
for arg in args:
|
||||||
|
m = re.match('([^=]*)=(.*)', arg)
|
||||||
|
if not m:
|
||||||
|
raise ValueError("Invalid entry arguemnt '%s'" % arg)
|
||||||
|
entry_args[m.group(1)] = m.group(2)
|
||||||
|
|
||||||
|
def GetEntryArg(name):
|
||||||
|
"""Get the value of an entry argument
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: Name of argument to retrieve
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
String value of argument
|
||||||
|
"""
|
||||||
|
return entry_args.get(name)
|
Loading…
Add table
Add a link
Reference in a new issue