binman: Allow device-tree entries to be compressed

At present the logic skips the blob class' handling of compression, so
this is not supported with device tree entries. Fix this.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2019-07-08 14:25:38 -06:00
parent c52c9e7da8
commit 6c223fda1e
4 changed files with 53 additions and 12 deletions

View File

@ -41,17 +41,26 @@ class Entry_blob(Entry):
self.ReadBlobContents()
return True
def ReadBlobContents(self):
# We assume the data is small enough to fit into memory. If this
# is used for large filesystem image that might not be true.
# In that case, Image.BuildImage() could be adjusted to use a
# new Entry method which can read in chunks. Then we could copy
# the data in chunks and avoid reading it all at once. For now
# this seems like an unnecessary complication.
indata = tools.ReadFile(self._pathname)
def CompressData(self, indata):
if self.compress != 'none':
self.uncomp_size = len(indata)
data = tools.Compress(indata, self.compress)
return data
def ReadBlobContents(self):
"""Read blob contents into memory
This function compresses the data before storing if needed.
We assume the data is small enough to fit into memory. If this
is used for large filesystem image that might not be true.
In that case, Image.BuildImage() could be adjusted to use a
new Entry method which can read in chunks. Then we could copy
the data in chunks and avoid reading it all at once. For now
this seems like an unnecessary complication.
"""
indata = tools.ReadFile(self._pathname)
data = self.CompressData(indata)
self.SetContents(data)
return True

View File

@ -23,11 +23,11 @@ class Entry_blob_dtb(Entry_blob):
def ObtainContents(self):
"""Get the device-tree from the list held by the 'state' module"""
self._filename = self.GetDefaultFilename()
self._pathname, data = state.GetFdtContents(self._filename)
self.SetContents(data)
return True
self._pathname, _ = state.GetFdtContents(self._filename)
return Entry_blob.ReadBlobContents(self)
def ProcessContents(self):
"""Re-read the DTB contents so that we get any calculated properties"""
_, data = state.GetFdtContents(self._filename)
_, indata = state.GetFdtContents(self._filename)
data = self.CompressData(indata)
return self.ProcessContentsUpdate(data)

View File

@ -2142,6 +2142,24 @@ class TestFunctional(unittest.TestCase):
self.assertEqual(U_BOOT_DATA, data[2:2 + len(U_BOOT_DATA)])
self.assertEqual(b'aa', data[-2:])
def testCompressDtb(self):
"""Test that compress of device-tree files is supported"""
self._CheckLz4()
data = self.data = self._DoReadFileRealDtb('124_compress_dtb.dts')
self.assertEqual(U_BOOT_DATA, data[:len(U_BOOT_DATA)])
comp_data = data[len(U_BOOT_DATA):]
orig = self._decompress(comp_data)
dtb = fdt.Fdt.FromData(orig)
dtb.Scan()
props = self._GetPropTree(dtb, ['size', 'uncomp-size'])
expected = {
'u-boot:size': len(U_BOOT_DATA),
'u-boot-dtb:uncomp-size': len(orig),
'u-boot-dtb:size': len(comp_data),
'size': len(data),
}
self.assertEqual(expected, props)
if __name__ == "__main__":
unittest.main()

View File

@ -0,0 +1,14 @@
/dts-v1/;
/ {
#address-cells = <1>;
#size-cells = <1>;
binman {
u-boot {
};
u-boot-dtb {
compress = "lz4";
};
};
};