# Copyright (c) 2016 Google, Inc ## Written by Simon Glass # SPDX-License-Identifier: GPL-2.0+ # # Entry-type module for U-Boot device tree with the microcode removed # import fdt_select 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, image, etype, node): Entry_blob.__init__(self, image, etype, node) self.ucode_data = '' self.collate = False self.ucode_offset = None self.ucode_size = None def GetDefaultFilename(self): return 'u-boot.dtb' def ObtainContents(self): Entry_blob.ObtainContents(self) # If the image does not need microcode, there is nothing to do ucode_dest_entry = self.image.FindEntryType('u-boot-spl-with-ucode-ptr') if not ucode_dest_entry or not ucode_dest_entry.target_pos: ucode_dest_entry = self.image.FindEntryType('u-boot-with-ucode-ptr') if not ucode_dest_entry or not ucode_dest_entry.target_pos: return True # Create a new file to hold the copied device tree dtb_name = 'u-boot-dtb-with-ucode.dtb' fname = tools.GetOutputFilename(dtb_name) with open(fname, 'wb') as fd: fd.write(self.data) # Remove the microcode fdt = fdt_select.FdtScan(fname) fdt.Scan() ucode = fdt.GetNode('/microcode') if not 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(ucode.subnodes) > 1 for node in ucode.subnodes: data_prop = node.props.get('data') if data_prop: self.ucode_data += ''.join(data_prop.bytes) if not self.collate: poffset = data_prop.GetOffset() if poffset is None: # We cannot obtain a property offset. Collate instead. self.collate = True else: # Find the offset in the device tree of the ucode data self.ucode_offset = poffset + 12 self.ucode_size = len(data_prop.bytes) if self.collate: prop = node.DeleteProp('data') if self.collate: fdt.Pack() fdt.Flush() # Make this file the contents of this entry self._pathname = fname self.ReadContents() return True