mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-20 00:48:52 +09:00
![Tom Rini](/assets/img/avatar_default.png)
When U-Boot started using SPDX tags we were among the early adopters and there weren't a lot of other examples to borrow from. So we picked the area of the file that usually had a full license text and replaced it with an appropriate SPDX-License-Identifier: entry. Since then, the Linux Kernel has adopted SPDX tags and they place it as the very first line in a file (except where shebangs are used, then it's second line) and with slightly different comment styles than us. In part due to community overlap, in part due to better tag visibility and in part for other minor reasons, switch over to that style. This commit changes all instances where we have a single declared license in the tag as both the before and after are identical in tag contents. There's also a few places where I found we did not have a tag and have introduced one. Signed-off-by: Tom Rini <trini@konsulko.com>
87 lines
3.8 KiB
Python
87 lines
3.8 KiB
Python
# SPDX-License-Identifier: GPL-2.0+
|
|
# Copyright (c) 2016 Google, Inc
|
|
# Written by Simon Glass <sjg@chromium.org>
|
|
#
|
|
# Entry-type module for a U-Boot binary with an embedded microcode pointer
|
|
#
|
|
|
|
from entry import Entry
|
|
from blob import Entry_blob
|
|
import tools
|
|
|
|
class Entry_u_boot_ucode(Entry_blob):
|
|
"""U-Boot microcode block
|
|
|
|
U-Boot on x86 needs a single block of microcode. This is collected from
|
|
the various microcode update nodes in the device tree. It is also unable
|
|
to read the microcode from the device tree on platforms that use FSP
|
|
(Firmware Support Package) binaries, because the API requires that the
|
|
microcode is supplied before there is any SRAM available to use (i.e.
|
|
the FSP sets up the SRAM / cache-as-RAM but does so in the call that
|
|
requires the microcode!). To keep things simple, all x86 platforms handle
|
|
microcode the same way in U-Boot (even non-FSP platforms). This is that
|
|
a table is placed at _dt_ucode_base_size containing the base address and
|
|
size of the microcode. This is either passed to the FSP (for FSP
|
|
platforms), or used to set up the microcode (for non-FSP platforms).
|
|
This all happens in the build system since it is the only way to get
|
|
the microcode into a single blob and accessible without SRAM.
|
|
|
|
There are two cases to handle. If there is only one microcode blob in
|
|
the device tree, then the ucode pointer it set to point to that. This
|
|
entry (u-boot-ucode) is empty. If there is more than one update, then
|
|
this entry holds the concatenation of all updates, and the device tree
|
|
entry (u-boot-dtb-with-ucode) is updated to remove the microcode. This
|
|
last step ensures that that the microcode appears in one contiguous
|
|
block in the image and is not unnecessarily duplicated in the device
|
|
tree. It is referred to as 'collation' here.
|
|
|
|
Entry types that have a part to play in handling microcode:
|
|
|
|
Entry_u_boot_with_ucode_ptr:
|
|
Contains u-boot-nodtb.bin (i.e. U-Boot without the device tree).
|
|
It updates it with the address and size of the microcode so that
|
|
U-Boot can find it early on start-up.
|
|
Entry_u_boot_dtb_with_ucode:
|
|
Contains u-boot.dtb. It stores the microcode in a
|
|
'self.ucode_data' property, which is then read by this class to
|
|
obtain the microcode if needed. If collation is performed, it
|
|
removes the microcode from the device tree.
|
|
Entry_u_boot_ucode:
|
|
This class. If collation is enabled it reads the microcode from
|
|
the Entry_u_boot_dtb_with_ucode entry, and uses it as the
|
|
contents of this entry.
|
|
"""
|
|
def __init__(self, image, etype, node):
|
|
Entry_blob.__init__(self, image, etype, node)
|
|
|
|
def ObtainContents(self):
|
|
# If the image does not need microcode, there is nothing to do
|
|
ucode_dest_entry = self.image.FindEntryType('u-boot-with-ucode-ptr')
|
|
ucode_dest_entry_spl = self.image.FindEntryType(
|
|
'u-boot-spl-with-ucode-ptr')
|
|
if ((not ucode_dest_entry or not ucode_dest_entry.target_pos) and
|
|
(not ucode_dest_entry_spl or not ucode_dest_entry_spl.target_pos)):
|
|
self.data = ''
|
|
return True
|
|
|
|
# Get the microcode from the device tree entry
|
|
fdt_entry = self.image.FindEntryType('u-boot-dtb-with-ucode')
|
|
if not fdt_entry or not fdt_entry.ucode_data:
|
|
return False
|
|
|
|
if not fdt_entry.collate:
|
|
# This section can be empty
|
|
self.data = ''
|
|
return True
|
|
|
|
# Write it out to a file
|
|
dtb_name = 'u-boot-ucode.bin'
|
|
fname = tools.GetOutputFilename(dtb_name)
|
|
with open(fname, 'wb') as fd:
|
|
fd.write(fdt_entry.ucode_data)
|
|
|
|
self._pathname = fname
|
|
self.ReadContents()
|
|
|
|
return True
|