diff --git a/tools/binman/README.entries b/tools/binman/README.entries index 5c6663e2c7..1dbdd0be03 100644 --- a/tools/binman/README.entries +++ b/tools/binman/README.entries @@ -1011,6 +1011,15 @@ a device tree to operate on your platform. You can add a u-boot-spl-dtb entry after this one, or use a u-boot-spl entry instead (which contains both SPL and the device tree). +SPL can access binman symbols at runtime. See: + + 'Access to binman entry offsets at run time (symbols)' + +in the binman README for more information. + +The ELF file 'spl/u-boot-spl' must also be available for this to work, since +binman uses that to look up symbols to write into the SPL binary. + Entry: u-boot-spl-with-ucode-ptr: U-Boot SPL with embedded microcode pointer diff --git a/tools/binman/etype/u_boot_spl_nodtb.py b/tools/binman/etype/u_boot_spl_nodtb.py index 41d7505491..dbf2f12743 100644 --- a/tools/binman/etype/u_boot_spl_nodtb.py +++ b/tools/binman/etype/u_boot_spl_nodtb.py @@ -5,6 +5,7 @@ # Entry-type module for 'u-boot-spl-nodtb.bin' # +from binman import elf from binman.entry import Entry from binman.etype.blob import Entry_blob @@ -19,9 +20,22 @@ class Entry_u_boot_spl_nodtb(Entry_blob): a device tree to operate on your platform. You can add a u-boot-spl-dtb entry after this one, or use a u-boot-spl entry instead (which contains both SPL and the device tree). + + SPL can access binman symbols at runtime. See: + + 'Access to binman entry offsets at run time (symbols)' + + in the binman README for more information. + + The ELF file 'spl/u-boot-spl' must also be available for this to work, since + binman uses that to look up symbols to write into the SPL binary. """ def __init__(self, section, etype, node): super().__init__(section, etype, node) + self.elf_fname = 'spl/u-boot-spl' def GetDefaultFilename(self): return 'spl/u-boot-spl-nodtb.bin' + + def WriteSymbols(self, section): + elf.LookupAndWriteSymbols(self.elf_fname, self, section.GetImage()) diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py index 814e91d42e..e056601b9a 100644 --- a/tools/binman/ftest.py +++ b/tools/binman/ftest.py @@ -1337,21 +1337,43 @@ class TestFunctional(unittest.TestCase): data = self._DoReadFile('052_u_boot_spl_nodtb.dts') self.assertEqual(U_BOOT_SPL_NODTB_DATA, data[:len(U_BOOT_SPL_NODTB_DATA)]) - def testSymbols(self): - """Test binman can assign symbols embedded in U-Boot""" + def checkSymbols(self, dts, base_data, u_boot_offset): + """Check the image contains the expected symbol values + + Args: + dts: Device tree file to use for test + base_data: Data before and after 'u-boot' section + u_boot_offset: Offset of 'u-boot' section in image + """ elf_fname = self.ElfTestFile('u_boot_binman_syms') syms = elf.GetSymbols(elf_fname, ['binman', 'image']) addr = elf.GetSymbolAddress(elf_fname, '__image_copy_start') - self.assertEqual(syms['_binman_u_boot_spl_prop_offset'].address, addr) + self.assertEqual(syms['_binman_u_boot_spl_any_prop_offset'].address, + addr) self._SetupSplElf('u_boot_binman_syms') - data = self._DoReadFile('053_symbols.dts') - sym_values = struct.pack('; + offset = <0x18>; }; u-boot-spl2 { diff --git a/tools/binman/test/192_symbols_nodtb.dts b/tools/binman/test/192_symbols_nodtb.dts new file mode 100644 index 0000000000..5c900d6070 --- /dev/null +++ b/tools/binman/test/192_symbols_nodtb.dts @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0+ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + binman { + pad-byte = <0xff>; + u-boot-spl-nodtb { + }; + u-boot-spl-dtb { + }; + + u-boot { + offset = <0x38>; + }; + + u-boot-spl2 { + type = "u-boot-spl-nodtb"; + }; + u-boot-spl-dtb2 { + type = "u-boot-spl-dtb"; + }; + }; +}; diff --git a/tools/binman/test/u_boot_binman_syms.c b/tools/binman/test/u_boot_binman_syms.c index 4520b319f1..37fc339ce8 100644 --- a/tools/binman/test/u_boot_binman_syms.c +++ b/tools/binman/test/u_boot_binman_syms.c @@ -8,7 +8,7 @@ #define CONFIG_BINMAN #include -binman_sym_declare(unsigned long, u_boot_spl, offset); +binman_sym_declare(unsigned long, u_boot_spl_any, offset); binman_sym_declare(unsigned long long, u_boot_spl2, offset); binman_sym_declare(unsigned long, u_boot_any, image_pos); binman_sym_declare(unsigned long, u_boot_any, size);