
Hi Ahmad,
On Tue, 5 Dec 2023 at 04:48, Ahmad Fatoum a.fatoum@pengutronix.de wrote:
Hello Simon,
On 02.12.23 04:54, Simon Glass wrote:
Add a script which produces a Flat Image Tree (FIT), a single file containing the built kernel and associated devicetree files. Compression defaults to gzip which gives a good balance of size and performance.
The files compress from about 86MB to 24MB using this approach.
The FIT can be used by bootloaders which support it, such as U-Boot and Linuxboot. It permits automatic selection of the correct devicetree, matching the compatible string of the running board with the closest compatible string in the FIT. There is no need for filenames or other workarounds.
Add a 'make image.fit' build target for arm64, as well. Use FIT_COMPRESSION to select a different algorithm.
The FIT can be examined using 'dumpimage -l'.
This features requires pylibfdt (use 'pip install libfdt'). It also requires compression utilities for the algorithm being used. Supported compression options are the same as the Image.xxx files. For now there is no way to change the compression other than by editing the rule for $(obj)/image.fit
While FIT supports a ramdisk / initrd, no attempt is made to support this here, since it must be built separately from the Linux build.
Signed-off-by: Simon Glass sjg@chromium.org
kernel_noload support is now in barebox next branch and I tested this series against it:
Tested-by: Ahmad Fatoum a.fatoum@pengutronix.de # barebox
OK great thank you.
+"""Build a FIT containing a lot of devicetree files
+Usage:
- make_fit.py -A arm64 -n 'Linux-6.6' -O linux
-f arch/arm64/boot/image.fit -k /tmp/kern/arch/arm64/boot/image.itk
/tmp/kern/arch/arm64/boot/dts/ -E -c gzip
+Creates a FIT containing the supplied kernel and a directory containing the +devicetree files.
+Use -E to generate an external FIT (where the data is placed after the +FIT data structure). This allows parsing of the data without loading +the entire FIT.
+Use -c to compress the data, using bzip2, gzip, lz4, lzma, lzo and +zstd algorithms.
+The resulting FIT can be booted by bootloaders which support FIT, such +as U-Boot, Linuxboot, Tianocore, etc.
Feel free to add barebox to the list. Did you check whether Linuxboot and Tianocore support kernel_noload?
Only what I was told by people in those projects. They may not even look at the load address, but I am not an expert on that.
fsw.property_u32('load', 0)
fsw.property_u32('entry', 0)
I still think load and entry dummy values are confusing and should be dropped.
This is what the spec requires at present. But I agree we should change it. I will dig into that at some point to see what is needed.
- with fsw.add_node(f'fdt-{seq}'):
# Get the compatible / model information
with open(fname, 'rb') as inf:
data = inf.read()
fdt = libfdt.FdtRo(data)
model = fdt.getprop(0, 'model').as_str()
compat = fdt.getprop(0, 'compatible')
fsw.property_string('description', model)
fsw.property_string('type', 'flat_dt')
fsw.property_string('arch', arch)
fsw.property_string('compression', compress)
fsw.property('compatible', bytes(compat))
with open(fname, 'rb') as inf:
compressed = compress_data(inf, compress)
fsw.property('data', compressed)
- return model, compat
After Doug's elaboration, extracting multiple compatibles is fine by me.
OK good.
Regards, Simon