summaryrefslogtreecommitdiff
path: root/tools/binman
Commit message (Collapse)AuthorAgeFilesLines
* binman: Avoid calculated section data repeatedlySimon Glass2020-10-291-11/+13
| | | | | | | | | | | | | Refactor the implementation slightly so that section data is not rebuilt when it is already available. We still have GetData() set up to rebuild the section, since we don't currently track when things change that might affect a section. For example, if a blob is updated within a section, we must rebuild it. Tracking that would be possible but is more complex, so it left for another time. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Support compression of sectionsSimon Glass2020-10-297-0/+323
| | | | | | | | | | With the previous changes, it is now possible to compress entire sections. Add some tests to check that compression works correctly, including updating the metadata. Also update the documentation. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Use the actual contents in CheckSize()Simon Glass2020-10-292-8/+5
| | | | | | | | | | | | | | | | | | At present this function adds up the total size of entries to work out the size of a section's contents. With compression this is no-longer enough. We may as well bite the bullet and build the section contents instead. Call _BuildSectionData() to get the (possibly compressed) contents and GetPaddedData() to get the same but with padding added. Note that this is inefficient since the section contents is calculated twice. Future work will improve this. This affects testPackOverlapMap() since the error is reported with a different section size now (enough to hold the contents). Update that at the same time. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Update CheckEntries() for compressed sectionsSimon Glass2020-10-291-2/+4
| | | | | | | | At present this function assumes that the size of a section is at least as large as its contents. With compression this is often not the case. Relax this constraint by using the uncompressed size, if available. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Drop CheckEntries()Simon Glass2020-10-293-14/+13
| | | | | | | | | | | | | This method introduces a separation between packing and checking that is different for sections. In order to handle compression properly, we need to be able to deal with a section's size being smaller than the uncompressed size of its contents. It is easier to make this work if everything happens in the Pack() method. The only real user of CheckEntries() is entry_Section and it can call it directly. Drop the call from 'control' and handle it locally. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Call CheckSize() from the section's Pack() methodSimon Glass2020-10-291-1/+4
| | | | | | | | At present CheckSize() is called from the function that packs the entries. Move it up to the main Pack() function so that _PackEntries() can just do the packing. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Drop the Entry.CheckSize() methodSimon Glass2020-10-292-12/+10
| | | | | | | This is only used by entry_Section and that class already calls it. Avoid calling it twice. Also drop it from the documentation. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Move sort and expand to the main Pack() functionSimon Glass2020-10-291-3/+4
| | | | | | | | | | At present sorting and expanding entries are side-effects of the CheckEntries() function. This is a bit confusing, as 'checking' would not normally involve making changes. Move these steps into the Pack() function instead. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Drop Entry.CheckOffset()Simon Glass2020-10-292-5/+2
| | | | | | | This function just calls CheckEntries() in the only non-trivial implementation. Drop it and use CheckEntries() directly. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Avoid reporting image-pos with compressionSimon Glass2020-10-294-13/+26
| | | | | | | | | | | | | | | When a section is compressed, all entries within it are grouped together into a compressed block of data. This obscures the start of each individual child entry. Avoid reporting bogus 'image-pos' properties in this case, since it is not possible to access the entry at the location provided. The entire section must be decompressed first. CBFS does not support compressing whole sections, only individual files, so needs no special handling here. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Set section contents in GetData()Simon Glass2020-10-293-2/+22
| | | | | | | | | | | | | | Section contents is not set up when ObtainContents() is called, since packing often changes the layout of the contents. Ensure that the contents are correctly recorded by making this function regenerate the section. It is normally only called by the parent section (when packing) or by the top-level image code, when writing out the image. So the performance impact is fairly small. Now that sections have their contents in their 'data' property, update testSkipAtStartSectionPad() to check it. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Store the original data before compressionSimon Glass2020-10-292-1/+18
| | | | | | | When compressing an entry, the original uncompressed data is overwritten. Store it so it is available if needed. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Make section padding consistent with other entriesSimon Glass2020-10-294-2/+86
| | | | | | | | | | | | | | | | | At present padding of sections is inconsistent with other entry types, in that different pad bytes are used. When a normal entry is padded by its parent, the parent's pad byte is used. But for sections, the section's pad byte is used. Adjust logic to always do this the same way. Note there is still a special case in entry_Section.GetPaddedData() where an image is padded with the pad byte of the top-level section. This is necessary since otherwise there would be no way to set the pad byte of the image, without adding a top-level section to every image. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Move section padding to the parentSimon Glass2020-10-292-12/+12
| | | | | | | | | | Each section is padded up to its size, if the contents are not large enough. Move this logic from _BuildSectionData() to GetPaddedDataForEntry() so that all the padding is in one place. With this, the testDual test is working again, so enable it. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Refactor _BuildSectionData()Simon Glass2020-10-292-10/+51
| | | | | | | | | | At present this function does the padding needed around an entry. It is easier to understand what is going on if we have a function that returns the contents of an entry, with padding included. Refactor the code accordingly, adding a new GetPaddedData() method. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Move section-building code into a functionSimon Glass2020-10-292-8/+31
| | | | | | | | | | | | | | | | | Create a new _BuildSectionData() to hold the code that is now in GetData(), so that it is clearly separated from entry.GetData() base function. Separate out the 'pad-before' processing to make this easier to understand. Unfortunately this breaks the testDual test. Rather than squash several patches into an un-reviewable glob, disable the test for now. This also affects testSkipAtStartSectionPad(), although it still not quite what it should be. Update that temporarily for now. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Expand docs and test for alignmentSimon Glass2020-10-293-12/+56
| | | | | | | | Alignment does form part of the entry once the image is written out, but within binman the entry contents does not include the padding. Add documentation to make this clear, as well as a test. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Expand docs and test for paddingSimon Glass2020-10-293-7/+45
| | | | | | | | Padding becomes part of the entry once the image is written out, but within binman the entry contents does not include the padding. Add documentation to make this clear, as well as a test. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Update testPackExtra with more checksSimon Glass2020-10-292-6/+23
| | | | | | | | | Check the contents of each section to make sure it is actually in the right place. Also fix a whitespace error in the .dts file. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Use 'files-compress' to set compression for filesSimon Glass2020-10-294-7/+8
| | | | | | | | | | | | | At present we use 'compress' as the property to set the compression of a 'files' entry. But this conflicts with the same property for entries, of which Entry_section is a subclass. Strictly speaking, since Entry_files is in fact a subclass of Entry_section, the files can be compressed individually but also the section (that contains all the files) can itself be compressed. With this change, it is possible to express that. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Move CompressData() into Entry base classSimon Glass2020-10-292-7/+17
| | | | | | | | | At present this is only used by blobs. To allow it to be used by other entry types (such as sections), move it into the base class. Also read the compression type in the base class. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Expand the error message for breaching a sectionSimon Glass2020-10-292-6/+9
| | | | | | | Add in a few more details to this error message to make it easier to see what is going on. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Remove references to 'image' in entry_SectionSimon Glass2020-10-291-4/+4
| | | | | | | While a section is the base class of Image, it is more correct to refer to sections in most places in this file. Fix these comments. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Fix return from u-boot-ucode if there is no DTSimon Glass2020-10-291-0/+1
| | | | | | This should return empty contents, not leave it unset. Fix it. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Give a sensible error if no command is givenSimon Glass2020-10-291-0/+1
| | | | | | | | | | At present if 'binman' is typed on the command line, a strange error about a missing argument is displayed. Fix this. These does not seem to be standard way to add the 'required' argument in all recent Python versions, so set it manually. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Add tests for skip-at-start sectionsSimon Glass2020-10-294-0/+121
| | | | | | | | | | | At present this feature is tested view the end-at-4gb feature. Add some tests of its own, including the operation of padding. The third test here shows binman's current, inconsistent approach to padding in the top-level section. Future patches in this series will address this. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Drop unused return variable for _DoTestFile()Simon Glass2020-10-291-2/+2
| | | | | | | This function returns the exit code from binman, not any data. Fix up a few callers in the tests. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Update the entry docsSimon Glass2020-10-291-0/+23
| | | | | | This has got out of sync with the entries. Regenerate it. Signed-off-by: Simon Glass <sjg@chromium.org>
* sunxi: binman: Add support for including SCP firmwareSamuel Holland2020-10-221-0/+4
| | | | | | | | | | | | | | | | | Allwinner sun50i SoCs contain an OpenRISC 1000 CPU that functions as a System Control Processor, or SCP. ARM Trusted Firmware (ATF) communicates with the SCP over SCPI to implement the PSCI system suspend, shutdown and reset functionality. Currently, SCP firmware is optional; the system will boot and run without it, but system suspend will be unavailable. Since all communication with the SCP is mediated by ATF, the only thing U-Boot needs to do is load the firmware into SRAM. The SCP firmware occupies the last 16KiB of SRAM A2, immediately following ATF. Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Samuel Holland <samuel@sholland.org> Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
* binman: Add support for SCP firmwareSamuel Holland2020-10-223-0/+42
| | | | | | | | | Add an entry type for a firmware blob for a System Control Processor, given by an entry arg. This firmware is a raw binary blob. Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Samuel Holland <samuel@sholland.org> Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
* sunxi: binman: Update FIT component descriptionsSamuel Holland2020-10-222-4/+4
| | | | | | | | | | | | | | | | | | | | | | | Since commit d879616e9e64 ("spl: fit: simplify logic for FDT loading for non-OS boots"), the SPL looks at the "os" properties of FIT images to determine where to append the FDT. The "os" property of the "firmware" image also determines how to execute the next stage of the boot process, as in 1d3790905d9c ("spl: atf: introduce spl_invoke_atf and make bl31_entry private"). For this reason, the next stage must be specified in "firmware", not in "loadables". To support this additional functionality, and to properly model the boot process, where ATF runs before U-Boot, add the "os" properties and swap the firmware/loadable images in the FIT image. Since this description was copied as an example in commit 70248d6a2916 ("binman: Support generating FITs with multiple dtbs"), update those examples as well for correctness and consistency. Acked-by: Patrick Wildt <patrick@blueri.se> Signed-off-by: Samuel Holland <samuel@sholland.org> Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
* binman: Only write FDT once per nodeSamuel Holland2020-10-221-4/+4
| | | | | | | | | | | | Due to an extra level of indentation, the "data" property containing the FDT was being written repeatedly after every other property in the node. This caused the generated FIT image to be invalid. Move the block up one level, so the property is added exactly once. Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Samuel Holland <samuel@sholland.org> Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
* binman: Support adding a U-Boot environmentSimon Glass2020-09-255-0/+132
| | | | | | | | | | | | | In some cases it is useful to include a U-Boot environment region in an image. This allows the board to start up with an environment ready to go. Add a new entry type for this. The input is a text file containing the environment entries, one per line, in the format: var=value Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
* binman: Show an error when a file is missingSimon Glass2020-09-253-2/+24
| | | | | | | | | | | | The recent support for missing external binaries does not show an error message when a file is genuinely missing (i.e. it is missing but not marked as 'external'). This means that when -m is passed to binman, it will never report a missing file. Fix this and add a test. Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
* binman: sunxi: Add help message for missing sunxi ATF BL31Simon Glass2020-09-221-0/+4
| | | | | | Add a special help message pointing to the relevant README. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Support help messages for missing blobsSimon Glass2020-09-226-3/+119
| | | | | | | | When an external blob is missing it can be quite confusing for the user. Add a way to provide a help message that is shown. Signed-off-by: Simon Glass <sjg@chromium.org> Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
* binman: Allow selecting default FIT configurationSimon Glass2020-09-224-4/+69
| | | | | | | | | | | | 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>
* binman: Document how CROSS_COMPILE, CC, HOSTCC etc. are used in READMEAlper Nebi Yasak2020-09-221-0/+24
| | | | | | | | | | Explain that binman interprets these environment variables in the "External tools" section to run target/host specific versions of the tools, and add a new section on how to use CROSS_COMPILE to run the tests on non-x86 machines. Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* binman: Use target-specific tools when cross-compilingAlper Nebi Yasak2020-09-222-3/+7
| | | | | | | | | | | | | | | | | | | | | Currently, binman always runs the compile tools like cc, objcopy, strip, etc. using their literal name. Instead, this patch makes it use the target-specific versions by default, derived from the tool-specific environment variables (CC, OBJCOPY, STRIP, etc.) or from the CROSS_COMPILE environment variable. For example, the u-boot-elf etype directly uses 'strip'. Trying to run the tests with 'CROSS_COMPILE=i686-linux-gnu- binman test' on an arm64 host results in the '097_elf_strip.dts' test to fail as the arm64 version of 'strip' can't understand the format of the x86 ELF file. This also adjusts some command.Output() calls that caused test errors or failures to use the target versions of the tools they call. After this, patch, an arm64 host can run all tests with no errors or failures using a correct CROSS_COMPILE value. Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* binman: Support cross-compiling test files to x86Alper Nebi Yasak2020-09-221-1/+14
| | | | | | | | | | | | | | | | | | | | | | These test files are currently "intended for use on x86 hosts", but most of the tests using them can still pass when cross-compiled to x86 on an arm64 host. This patch enables non-x86 hosts to run the tests by specifying a cross-compiler via CROSS_COMPILE. The list of variables it sets is taken from the top-level Makefile. It would be possible to automatically set an x86 cross-compiler with a few blocks like: ifneq ($(shell i386-linux-gnu-gcc --version 2> /dev/null),) CROSS_COMPILE = i386-linux-gnu- endif But it wouldn't propagate to the binman process calling this Makefile, so it's better just raise an error and expect 'binman test' to be run with a correct CROSS_COMPILE. Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* binman: Support generating FITs with multiple dtbsSimon Glass2020-09-225-11/+346
| | | | | | | | In some cases it is useful to generate a FIT which has a number of DTB images, selectable by configuration. Add support for this in binman, using a simple iterator and string substitution. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Add support for ATF BL31Simon Glass2020-09-224-0/+63
| | | | | | | Add an entry for ARM Trusted Firmware's 'BL31' payload, which is the device's main firmware. Typically this is U-Boot. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Move 'external' support into base classSimon Glass2020-09-225-25/+24
| | | | | | | | | At present we have an Entry_blob_ext which implement a blob which holds an external binary. We need to support other entry types that hold external binaries, e.g. Entry_blob_named_by_arg. Move the support into the base Entry class to allow this. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Fix up a few missing commentsSimon Glass2020-09-222-1/+26
| | | | | | | | | Tidy up a few test functions which lack argument comments. Rename one that has the same name as a different test. Also fix up the comment for PrepareImagesAndDtbs(). Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Allow entry args to be requiredSimon Glass2020-09-224-11/+24
| | | | | | | | | | | | | | If an entry argument is needed by an entry but the entry argument is not present, then a strange error can occur when trying to read the file. Fix this by allowing arguments to be required. Select this option for the cros-ec-rw entry. If a filename is provided in the node, allow that to be used. Also tidy up a few related tests to make the error string easier to find, and fully ignore unused return values. Signed-off-by: Simon Glass <sjg@chromium.org>
* tools: Drop unnecessary use of __file__Simon Glass2020-09-221-2/+0
| | | | | | | There are few places where the path of the current modules is calculated but not used. Drop them. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Use pkg_resources to find resourcesSimon Glass2020-09-221-2/+4
| | | | | | | | | | At present we look for resources based on the path of the Python module that wants them. Instead we should use Python's pkg_resources feature which is designed for this purpose. Update binman to use this. Signed-off-by: Simon Glass <sjg@chromium.org>
* binman: Build FIT image subentries with the section etypeAlper Nebi Yasak2020-09-224-17/+169
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When reading subentries of each image, the FIT entry type directly concatenates their contents without padding them according to their offset, size, align, align-size, align-end, pad-before, pad-after properties. This patch makes sure these properties are respected by offloading this image-data building to the section etype, where each subnode of the "images" node is processed as a section. Alignments and offsets are respective to the beginning of each image. For example, the following fragment can end up having "u-boot-spl" start at 0x88 within the final FIT binary, while "u-boot" would then end up starting at e.g. 0x20088. fit { description = "example"; images { kernel-1 { description = "U-Boot with SPL"; type = "kernel"; arch = "arm64"; os = "linux"; compression = "none"; u-boot-spl { }; u-boot { align = <0x10000>; }; }; }; } Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org> Reinstate check in testPadInSections(), squash in "binman: Allow FIT binaries to have missing external blobs" Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
* binman: Respect pad-before property of section subentriesAlper Nebi Yasak2020-09-223-1/+35
| | | | | | | | | | Other relevant properties (pad-after, offset, size, align, align-size, align-end) already work since Pack() sets correct ranges for subentries' data (.offset, .size variables), but some padding here is necessary to align the data within this range to match the pad-before property. Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* binman: Ignore hash*, signature* nodes in sectionsAlper Nebi Yasak2020-09-223-1/+47
| | | | | | | | Switch to str.startswith for matching like the FIT etype does since the current version doesn't ignore 'hash-1', 'hash-2', etc. Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>