mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-14 00:33:31 +09:00
3ab9598df7
After some thought, I believe there is an unfortunate naming flaw in binman. Entries have a position and size, but now that we support hierarchical sections it is unclear whether a position should be an absolute position within the image, or a relative position within its parent section. At present 'position' actually means the relative position. This indicates a need for an 'image position' for code that wants to find the location of an entry without having to do calculations back through parents to discover this image position. A better name for the current 'position' or 'pos' is 'offset'. It is not always an absolute position, but it is always an offset from its parent offset. It is unfortunate to rename this concept now, 18 months after binman was introduced. However I believe it is the right thing to do. The impact is mostly limited to binman itself and a few changes to in-tree users to binman: tegra sunxi x86 The change makes old binman definitions (e.g. downstream or out-of-tree) incompatible if they use the 'pos = <...>' property. Later work will adjust binman to generate an error when it is used. Signed-off-by: Simon Glass <sjg@chromium.org>
74 lines
2.6 KiB
Python
74 lines
2.6 KiB
Python
# SPDX-License-Identifier: GPL-2.0+
|
|
# Copyright (c) 2016 Google, Inc
|
|
# Written by Simon Glass <sjg@chromium.org>
|
|
#
|
|
# Entry-type module for U-Boot device tree with the microcode removed
|
|
#
|
|
|
|
import control
|
|
import fdt
|
|
from entry import Entry
|
|
from blob import Entry_blob
|
|
import tools
|
|
|
|
class Entry_u_boot_dtb_with_ucode(Entry_blob):
|
|
"""A U-Boot device tree file, with the microcode removed
|
|
|
|
See Entry_u_boot_ucode for full details of the 3 entries involved in this
|
|
process.
|
|
"""
|
|
def __init__(self, section, etype, node):
|
|
Entry_blob.__init__(self, section, etype, node)
|
|
self.ucode_data = ''
|
|
self.collate = False
|
|
self.ucode_offset = None
|
|
self.ucode_size = None
|
|
self.ucode = None
|
|
self.ready = False
|
|
|
|
def GetDefaultFilename(self):
|
|
return 'u-boot.dtb'
|
|
|
|
def ProcessFdt(self, fdt):
|
|
# If the section does not need microcode, there is nothing to do
|
|
ucode_dest_entry = self.section.FindEntryType(
|
|
'u-boot-spl-with-ucode-ptr')
|
|
if not ucode_dest_entry or not ucode_dest_entry.target_offset:
|
|
ucode_dest_entry = self.section.FindEntryType(
|
|
'u-boot-with-ucode-ptr')
|
|
if not ucode_dest_entry or not ucode_dest_entry.target_offset:
|
|
return True
|
|
|
|
# Remove the microcode
|
|
fname = self.GetDefaultFilename()
|
|
fdt = control.GetFdt(fname)
|
|
self.ucode = fdt.GetNode('/microcode')
|
|
if not self.ucode:
|
|
raise self.Raise("No /microcode node found in '%s'" % fname)
|
|
|
|
# There's no need to collate it (move all microcode into one place)
|
|
# if we only have one chunk of microcode.
|
|
self.collate = len(self.ucode.subnodes) > 1
|
|
for node in self.ucode.subnodes:
|
|
data_prop = node.props.get('data')
|
|
if data_prop:
|
|
self.ucode_data += ''.join(data_prop.bytes)
|
|
if self.collate:
|
|
node.DeleteProp('data')
|
|
return True
|
|
|
|
def ObtainContents(self):
|
|
# Call the base class just in case it does something important.
|
|
Entry_blob.ObtainContents(self)
|
|
self._pathname = control.GetFdtPath(self._filename)
|
|
self.ReadContents()
|
|
if self.ucode:
|
|
for node in self.ucode.subnodes:
|
|
data_prop = node.props.get('data')
|
|
if data_prop and not self.collate:
|
|
# Find the offset in the device tree of the ucode data
|
|
self.ucode_offset = data_prop.GetOffset() + 12
|
|
self.ucode_size = len(data_prop.bytes)
|
|
self.ready = True
|
|
return True
|