Merge tag 'xilinx-for-v2021.01' of https://gitlab.denx.de/u-boot/custodians/u-boot...
[platform/kernel/u-boot.git] / tools / binman / etype / blob.py
1 # SPDX-License-Identifier: GPL-2.0+
2 # Copyright (c) 2016 Google, Inc
3 # Written by Simon Glass <sjg@chromium.org>
4 #
5 # Entry-type module for blobs, which are binary objects read from files
6 #
7
8 from binman.entry import Entry
9 from dtoc import fdt_util
10 from patman import tools
11 from patman import tout
12
13 class Entry_blob(Entry):
14     """Entry containing an arbitrary binary blob
15
16     Note: This should not be used by itself. It is normally used as a parent
17     class by other entry types.
18
19     Properties / Entry arguments:
20         - filename: Filename of file to read into entry
21         - compress: Compression algorithm to use:
22             none: No compression
23             lz4: Use lz4 compression (via 'lz4' command-line utility)
24
25     This entry reads data from a file and places it in the entry. The
26     default filename is often specified specified by the subclass. See for
27     example the 'u_boot' entry which provides the filename 'u-boot.bin'.
28
29     If compression is enabled, an extra 'uncomp-size' property is written to
30     the node (if enabled with -u) which provides the uncompressed size of the
31     data.
32     """
33     def __init__(self, section, etype, node):
34         super().__init__(section, etype, node)
35         self._filename = fdt_util.GetString(self._node, 'filename', self.etype)
36         self.compress = fdt_util.GetString(self._node, 'compress', 'none')
37
38     def ObtainContents(self):
39         self._filename = self.GetDefaultFilename()
40         self._pathname = tools.GetInputFilename(self._filename,
41                                                 self.section.GetAllowMissing())
42         # Allow the file to be missing
43         if self.external and not self._pathname:
44             self.SetContents(b'')
45             self.missing = True
46             return True
47         self.ReadBlobContents()
48         return True
49
50     def CompressData(self, indata):
51         if self.compress != 'none':
52             self.uncomp_size = len(indata)
53         data = tools.Compress(indata, self.compress)
54         return data
55
56     def ReadBlobContents(self):
57         """Read blob contents into memory
58
59         This function compresses the data before storing if needed.
60
61         We assume the data is small enough to fit into memory. If this
62         is used for large filesystem image that might not be true.
63         In that case, Image.BuildImage() could be adjusted to use a
64         new Entry method which can read in chunks. Then we could copy
65         the data in chunks and avoid reading it all at once. For now
66         this seems like an unnecessary complication.
67         """
68         indata = tools.ReadFile(self._pathname)
69         data = self.CompressData(indata)
70         self.SetContents(data)
71         return True
72
73     def GetDefaultFilename(self):
74         return self._filename