mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 16:52:14 +02:00
binman: Add info to allow safely repacking an image later
At present it is not possible to discover the contraints to repacking an image (e.g. maximum section size) since this information is not preserved from the original image description. Add new 'orig-offset' and 'orig-size' properties to hold this. Add them to the main device tree in the image. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -75,6 +75,9 @@ EXTRACT_DTB_SIZE = 0x3c9
|
||||
# Properties expected to be in the device tree when update_dtb is used
|
||||
BASE_DTB_PROPS = ['offset', 'size', 'image-pos']
|
||||
|
||||
# Extra properties expected to be in the device tree when allow-repack is used
|
||||
REPACK_DTB_PROPS = ['orig-offset', 'orig-size']
|
||||
|
||||
|
||||
class TestFunctional(unittest.TestCase):
|
||||
"""Functional tests for binman
|
||||
@@ -1244,7 +1247,7 @@ class TestFunctional(unittest.TestCase):
|
||||
update_dtb=True)
|
||||
dtb = fdt.Fdt(out_dtb_fname)
|
||||
dtb.Scan()
|
||||
props = self._GetPropTree(dtb, BASE_DTB_PROPS)
|
||||
props = self._GetPropTree(dtb, BASE_DTB_PROPS + REPACK_DTB_PROPS)
|
||||
self.assertEqual({
|
||||
'image-pos': 0,
|
||||
'offset': 0,
|
||||
@@ -1587,7 +1590,8 @@ class TestFunctional(unittest.TestCase):
|
||||
for item in ['', 'spl', 'tpl']:
|
||||
dtb = fdt.Fdt.FromData(data[start:])
|
||||
dtb.Scan()
|
||||
props = self._GetPropTree(dtb, BASE_DTB_PROPS + ['spl', 'tpl'])
|
||||
props = self._GetPropTree(dtb, BASE_DTB_PROPS + REPACK_DTB_PROPS +
|
||||
['spl', 'tpl'])
|
||||
expected = dict(base_expected)
|
||||
if item:
|
||||
expected[item] = 0
|
||||
@@ -2821,5 +2825,67 @@ class TestFunctional(unittest.TestCase):
|
||||
# Check the state looks right.
|
||||
self.assertEqual('/binman/first-image', state.fdt_path_prefix)
|
||||
|
||||
def testUpdateFdtAllRepack(self):
|
||||
"""Test that all device trees are updated with offset/size info"""
|
||||
data = self._DoReadFileRealDtb('134_fdt_update_all_repack.dts')
|
||||
SECTION_SIZE = 0x300
|
||||
DTB_SIZE = 602
|
||||
FDTMAP_SIZE = 608
|
||||
base_expected = {
|
||||
'offset': 0,
|
||||
'size': SECTION_SIZE + DTB_SIZE * 2 + FDTMAP_SIZE,
|
||||
'image-pos': 0,
|
||||
'section:offset': 0,
|
||||
'section:size': SECTION_SIZE,
|
||||
'section:image-pos': 0,
|
||||
'section/u-boot-dtb:offset': 4,
|
||||
'section/u-boot-dtb:size': 636,
|
||||
'section/u-boot-dtb:image-pos': 4,
|
||||
'u-boot-spl-dtb:offset': SECTION_SIZE,
|
||||
'u-boot-spl-dtb:size': DTB_SIZE,
|
||||
'u-boot-spl-dtb:image-pos': SECTION_SIZE,
|
||||
'u-boot-tpl-dtb:offset': SECTION_SIZE + DTB_SIZE,
|
||||
'u-boot-tpl-dtb:image-pos': SECTION_SIZE + DTB_SIZE,
|
||||
'u-boot-tpl-dtb:size': DTB_SIZE,
|
||||
'fdtmap:offset': SECTION_SIZE + DTB_SIZE * 2,
|
||||
'fdtmap:size': FDTMAP_SIZE,
|
||||
'fdtmap:image-pos': SECTION_SIZE + DTB_SIZE * 2,
|
||||
}
|
||||
main_expected = {
|
||||
'section:orig-size': SECTION_SIZE,
|
||||
'section/u-boot-dtb:orig-offset': 4,
|
||||
}
|
||||
|
||||
# We expect three device-tree files in the output, with the first one
|
||||
# within a fixed-size section.
|
||||
# Read them in sequence. We look for an 'spl' property in the SPL tree,
|
||||
# and 'tpl' in the TPL tree, to make sure they are distinct from the
|
||||
# main U-Boot tree. All three should have the same positions and offset
|
||||
# except that the main tree should include the main_expected properties
|
||||
start = 4
|
||||
for item in ['', 'spl', 'tpl', None]:
|
||||
if item is None:
|
||||
start += 16 # Move past fdtmap header
|
||||
dtb = fdt.Fdt.FromData(data[start:])
|
||||
dtb.Scan()
|
||||
props = self._GetPropTree(dtb,
|
||||
BASE_DTB_PROPS + REPACK_DTB_PROPS + ['spl', 'tpl'],
|
||||
prefix='/' if item is None else '/binman/')
|
||||
expected = dict(base_expected)
|
||||
if item:
|
||||
expected[item] = 0
|
||||
else:
|
||||
# Main DTB and fdtdec should include the 'orig-' properties
|
||||
expected.update(main_expected)
|
||||
# Helpful for debugging:
|
||||
#for prop in sorted(props):
|
||||
#print('prop %s %s %s' % (prop, props[prop], expected[prop]))
|
||||
self.assertEqual(expected, props)
|
||||
if item == '':
|
||||
start = SECTION_SIZE
|
||||
else:
|
||||
start += dtb._fdt_obj.totalsize()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
Reference in New Issue
Block a user