mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-25 06:00:43 +00:00
binman: Allow selecting default FIT configuration
Add a new entry argument to the fit entry which allows selection of the default configuration to use. This is the 'default' property in the 'configurations' node. Update the Makefile to pass in the value of DEVICE_TREE or CONFIG_DEFAULT_DEVICE_TREE to provide this information. Signed-off-by: Simon Glass <sjg@chromium.org> Suggested-by: Michal Simek <michal.simek@xilinx.com>
This commit is contained in:
parent
4ec40a7208
commit
c0f1ebe9c1
5 changed files with 71 additions and 4 deletions
2
Makefile
2
Makefile
|
@ -1321,6 +1321,7 @@ u-boot.ldr: u-boot
|
||||||
# binman
|
# binman
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Use 'make BINMAN_DEBUG=1' to enable debugging
|
# Use 'make BINMAN_DEBUG=1' to enable debugging
|
||||||
|
default_dt := $(if $(DEVICE_TREE),$(DEVICE_TREE),$(CONFIG_DEFAULT_DEVICE_TREE))
|
||||||
quiet_cmd_binman = BINMAN $@
|
quiet_cmd_binman = BINMAN $@
|
||||||
cmd_binman = $(srctree)/tools/binman/binman $(if $(BINMAN_DEBUG),-D) \
|
cmd_binman = $(srctree)/tools/binman/binman $(if $(BINMAN_DEBUG),-D) \
|
||||||
--toolpath $(objtree)/tools \
|
--toolpath $(objtree)/tools \
|
||||||
|
@ -1329,6 +1330,7 @@ cmd_binman = $(srctree)/tools/binman/binman $(if $(BINMAN_DEBUG),-D) \
|
||||||
-I . -I $(srctree) -I $(srctree)/board/$(BOARDDIR) \
|
-I . -I $(srctree) -I $(srctree)/board/$(BOARDDIR) \
|
||||||
-I arch/$(ARCH)/dts -a of-list=$(CONFIG_OF_LIST) \
|
-I arch/$(ARCH)/dts -a of-list=$(CONFIG_OF_LIST) \
|
||||||
-a atf-bl31-path=${BL31} \
|
-a atf-bl31-path=${BL31} \
|
||||||
|
-a default-dt=$(default_dt) \
|
||||||
$(BINMAN_$(@F))
|
$(BINMAN_$(@F))
|
||||||
|
|
||||||
OBJCOPYFLAGS_u-boot.ldr.hex := -I binary -O ihex
|
OBJCOPYFLAGS_u-boot.ldr.hex := -I binary -O ihex
|
||||||
|
|
|
@ -402,6 +402,10 @@ Available substitutions for '@' nodes are:
|
||||||
Note that if no devicetree files are provided (with '-a of-list' as above)
|
Note that if no devicetree files are provided (with '-a of-list' as above)
|
||||||
then no nodes will be generated.
|
then no nodes will be generated.
|
||||||
|
|
||||||
|
The 'default' property, if present, will be automatically set to the name
|
||||||
|
if of configuration whose devicetree matches the 'default-dt' entry
|
||||||
|
argument, e.g. with '-a default-dt=sun50i-a64-pine64-lts'.
|
||||||
|
|
||||||
|
|
||||||
Properties (in the 'fit' node itself):
|
Properties (in the 'fit' node itself):
|
||||||
fit,external-offset: Indicates that the contents of the FIT are external
|
fit,external-offset: Indicates that the contents of the FIT are external
|
||||||
|
|
|
@ -90,6 +90,14 @@ class Entry_fit(Entry):
|
||||||
Note that if no devicetree files are provided (with '-a of-list' as above)
|
Note that if no devicetree files are provided (with '-a of-list' as above)
|
||||||
then no nodes will be generated.
|
then no nodes will be generated.
|
||||||
|
|
||||||
|
The 'default' property, if present, will be automatically set to the name
|
||||||
|
if of configuration whose devicetree matches the 'default-dt' entry
|
||||||
|
argument, e.g. with '-a default-dt=sun50i-a64-pine64-lts'.
|
||||||
|
|
||||||
|
Available substitutions for '@' property values are:
|
||||||
|
|
||||||
|
DEFAULT-SEQ Sequence number of the default fdt,as provided by the
|
||||||
|
'default-dt' entry argument
|
||||||
|
|
||||||
Properties (in the 'fit' node itself):
|
Properties (in the 'fit' node itself):
|
||||||
fit,external-offset: Indicates that the contents of the FIT are external
|
fit,external-offset: Indicates that the contents of the FIT are external
|
||||||
|
@ -121,6 +129,8 @@ class Entry_fit(Entry):
|
||||||
[EntryArg(self._fit_list_prop.value, str)])
|
[EntryArg(self._fit_list_prop.value, str)])
|
||||||
if fdts is not None:
|
if fdts is not None:
|
||||||
self._fdts = fdts.split()
|
self._fdts = fdts.split()
|
||||||
|
self._fit_default_dt = self.GetEntryArgsOrProps([EntryArg('default-dt',
|
||||||
|
str)])[0]
|
||||||
|
|
||||||
def ReadNode(self):
|
def ReadNode(self):
|
||||||
self._ReadSubnodes()
|
self._ReadSubnodes()
|
||||||
|
@ -142,6 +152,22 @@ class Entry_fit(Entry):
|
||||||
"""
|
"""
|
||||||
for pname, prop in node.props.items():
|
for pname, prop in node.props.items():
|
||||||
if not pname.startswith('fit,'):
|
if not pname.startswith('fit,'):
|
||||||
|
if pname == 'default':
|
||||||
|
val = prop.value
|
||||||
|
# Handle the 'default' property
|
||||||
|
if val.startswith('@'):
|
||||||
|
if not self._fdts:
|
||||||
|
continue
|
||||||
|
if not self._fit_default_dt:
|
||||||
|
self.Raise("Generated 'default' node requires default-dt entry argument")
|
||||||
|
if self._fit_default_dt not in self._fdts:
|
||||||
|
self.Raise("default-dt entry argument '%s' not found in fdt list: %s" %
|
||||||
|
(self._fit_default_dt,
|
||||||
|
', '.join(self._fdts)))
|
||||||
|
seq = self._fdts.index(self._fit_default_dt)
|
||||||
|
val = val[1:].replace('DEFAULT-SEQ', str(seq + 1))
|
||||||
|
fsw.property_string(pname, val)
|
||||||
|
continue
|
||||||
fsw.property(pname, prop.bytes)
|
fsw.property(pname, prop.bytes)
|
||||||
|
|
||||||
rel_path = node.path[len(base_node.path):]
|
rel_path = node.path[len(base_node.path):]
|
||||||
|
|
|
@ -3602,7 +3602,7 @@ class TestFunctional(unittest.TestCase):
|
||||||
"""
|
"""
|
||||||
cnode = dtb.GetNode('/configurations')
|
cnode = dtb.GetNode('/configurations')
|
||||||
self.assertIn('default', cnode.props)
|
self.assertIn('default', cnode.props)
|
||||||
self.assertEqual('config-1', cnode.props['default'].value)
|
self.assertEqual('config-2', cnode.props['default'].value)
|
||||||
|
|
||||||
name = 'config-%d' % seq
|
name = 'config-%d' % seq
|
||||||
fnode = dtb.GetNode('/configurations/%s' % name)
|
fnode = dtb.GetNode('/configurations/%s' % name)
|
||||||
|
@ -3615,9 +3615,10 @@ class TestFunctional(unittest.TestCase):
|
||||||
|
|
||||||
entry_args = {
|
entry_args = {
|
||||||
'of-list': 'test-fdt1 test-fdt2',
|
'of-list': 'test-fdt1 test-fdt2',
|
||||||
|
'default-dt': 'test-fdt2',
|
||||||
}
|
}
|
||||||
data = self._DoReadFileDtb(
|
data = self._DoReadFileDtb(
|
||||||
'170_fit_fdt.dts',
|
'172_fit_fdt.dts',
|
||||||
entry_args=entry_args,
|
entry_args=entry_args,
|
||||||
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
|
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
|
||||||
self.assertEqual(U_BOOT_NODTB_DATA, data[-len(U_BOOT_NODTB_DATA):])
|
self.assertEqual(U_BOOT_NODTB_DATA, data[-len(U_BOOT_NODTB_DATA):])
|
||||||
|
@ -3639,7 +3640,7 @@ class TestFunctional(unittest.TestCase):
|
||||||
def testFitFdtMissingList(self):
|
def testFitFdtMissingList(self):
|
||||||
"""Test handling of a missing 'of-list' entry arg"""
|
"""Test handling of a missing 'of-list' entry arg"""
|
||||||
with self.assertRaises(ValueError) as e:
|
with self.assertRaises(ValueError) as e:
|
||||||
self._DoReadFile('170_fit_fdt.dts')
|
self._DoReadFile('172_fit_fdt.dts')
|
||||||
self.assertIn("Generator node requires 'of-list' entry argument",
|
self.assertIn("Generator node requires 'of-list' entry argument",
|
||||||
str(e.exception))
|
str(e.exception))
|
||||||
|
|
||||||
|
@ -3657,5 +3658,39 @@ class TestFunctional(unittest.TestCase):
|
||||||
self.assertIn("Generator node requires 'fit,fdt-list' property",
|
self.assertIn("Generator node requires 'fit,fdt-list' property",
|
||||||
str(e.exception))
|
str(e.exception))
|
||||||
|
|
||||||
|
def testFitFdtEmptyList(self):
|
||||||
|
"""Test handling of an empty 'of-list' entry arg"""
|
||||||
|
entry_args = {
|
||||||
|
'of-list': '',
|
||||||
|
}
|
||||||
|
data = self._DoReadFileDtb('172_fit_fdt.dts', entry_args=entry_args)[0]
|
||||||
|
|
||||||
|
def testFitFdtMissing(self):
|
||||||
|
"""Test handling of a missing 'default-dt' entry arg"""
|
||||||
|
entry_args = {
|
||||||
|
'of-list': 'test-fdt1 test-fdt2',
|
||||||
|
}
|
||||||
|
with self.assertRaises(ValueError) as e:
|
||||||
|
self._DoReadFileDtb(
|
||||||
|
'172_fit_fdt.dts',
|
||||||
|
entry_args=entry_args,
|
||||||
|
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
|
||||||
|
self.assertIn("Generated 'default' node requires default-dt entry argument",
|
||||||
|
str(e.exception))
|
||||||
|
|
||||||
|
def testFitFdtNotInList(self):
|
||||||
|
"""Test handling of a default-dt that is not in the of-list"""
|
||||||
|
entry_args = {
|
||||||
|
'of-list': 'test-fdt1 test-fdt2',
|
||||||
|
'default-dt': 'test-fdt3',
|
||||||
|
}
|
||||||
|
with self.assertRaises(ValueError) as e:
|
||||||
|
self._DoReadFileDtb(
|
||||||
|
'172_fit_fdt.dts',
|
||||||
|
entry_args=entry_args,
|
||||||
|
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
|
||||||
|
self.assertIn("default-dt entry argument 'test-fdt3' not found in fdt list: test-fdt1, test-fdt2",
|
||||||
|
str(e.exception))
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
default = "config-1";
|
default = "@config-DEFAULT-SEQ";
|
||||||
@config-SEQ {
|
@config-SEQ {
|
||||||
description = "conf-NAME.dtb";
|
description = "conf-NAME.dtb";
|
||||||
firmware = "uboot";
|
firmware = "uboot";
|
Loading…
Reference in a new issue