mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 10:26:10 +01: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:
		| @@ -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) | ||||||
		Reference in New Issue
	
	Block a user