--- /dev/null
- kernel
+ .. SPDX-License-Identifier: GPL-2.0+
+
+ Flattened Image Tree (FIT) Format
+ =================================
+
+ Introduction
+ ------------
+
+ The number of elements playing a role in the kernel booting process has
+ increased over time and now typically includes the devicetree, kernel image and
+ possibly a ramdisk image. Generally, all must be placed in the system memory and
+ booted together.
+
+ For firmware images a similar process has taken place, with various binaries
+ loaded at different addresses, such as ARM's ATF, OpenSBI, FPGA and U-Boot
+ itself.
+
+ FIT provides a flexible and extensible format to deal with this complexity. It
+ provides support for multiple components. It also supports multiple
+ configurations, so that the same FIT can be used to boot multiple boards, with
+ some components in common (e.g. kernel) and some specific to that board (e.g.
+ devicetree).
+
+ Terminology
+ ~~~~~~~~~~~
+
+ This document defines FIT by providing FDT (Flat Device Tree) bindings. These
+ describe the final form of the FIT at the moment when it is used. The user
+ perspective may be simpler, as some of the properties (like timestamps and
+ hashes) are filled in automatically by the U-Boot mkimage tool.
+
+ To avoid confusion with the kernel FDT the following naming convention is used:
+
+ FIT
+ Flattened Image Tree
+
+ FIT is formally a flattened devicetree (in the libfdt meaning), which conforms
+ to bindings defined in this document.
+
+ .its
+ image tree source
+
+ .itb
+ flattened image tree blob
+
+ Image-building procedure
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+
+ The following picture shows how the FIT is prepared. Input consists of
+ image source file (.its) and a set of data files. Image is created with the
+ help of standard U-Boot mkimage tool which in turn uses dtc (device tree
+ compiler) to produce image tree blob (.itb). The resulting .itb file is the
+ actual binary of a new FIT::
+
+ tqm5200.its
+ +
+ vmlinux.bin.gz mkimage + dtc xfer to target
+ eldk-4.2-ramdisk --------------> tqm5200.itb --------------> boot
+ tqm5200.dtb /|\
+ |
+ 'new FIT'
+
+ Steps:
+
+ #. Create .its file, automatically filled-in properties are omitted
+
+ #. Call mkimage tool on a .its file
+
+ #. mkimage calls dtc to create .itb image and assures that
+ missing properties are added
+
+ #. .itb (new FIT) is uploaded onto the target and used therein
+
+
+ Unique identifiers
+ ~~~~~~~~~~~~~~~~~~
+
+ To identify FIT sub-nodes representing images, hashes, configurations (which
+ are defined in the following sections), the "unit name" of the given sub-node
+ is used as it's identifier as it assures uniqueness without additional
+ checking required.
+
+
+ External data
+ ~~~~~~~~~~~~~
+
+ FIT is normally built initially with image data in the 'data' property of each
+ image node. It is also possible for this data to reside outside the FIT itself.
+ This allows the 'FDT' part of the FIT to be quite small, so that it can be
+ loaded and scanned without loading a large amount of data. Then when an image is
+ needed it can be loaded from an external source.
+
+ External FITs use 'data-offset' or 'data-position' instead of 'data'.
+
+ The mkimage tool can convert a FIT to use external data using the `-E` argument,
+ optionally using `-p` to specific a fixed position.
+
+ It is often desirable to align each image to a block size or cache-line size
+ (e.g. 512 bytes), so that there is no need to copy it to an aligned address when
+ reading the image data. The mkimage tool provides a `-B` argument to support
+ this.
+
+ Root-node properties
+ --------------------
+
+ The root node of the FIT should have the following layout::
+
+ / o image-tree
+ |- description = "image description"
+ |- timestamp = <12399321>
+ |- #address-cells = <1>
+ |
+ o images
+ | |
+ | o image-1 {...}
+ | o image-2 {...}
+ | ...
+ |
+ o configurations
+ |- default = "conf-1"
+ |
+ o conf-1 {...}
+ o conf-2 {...}
+ ...
+
+ Optional property
+ ~~~~~~~~~~~~~~~~~
+
+ description
+ Textual description of the FIT
+
+ Mandatory property
+ ~~~~~~~~~~~~~~~~~~
+
+ timestamp
+ Last image modification time being counted in seconds since
+ 1970-01-01 00:00:00 - to be automatically calculated by mkimage tool.
+
+ Conditionally mandatory property
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ #address-cells
+ Number of 32bit cells required to represent entry and
+ load addresses supplied within sub-image nodes. May be omitted when no
+ entry or load addresses are used.
+
+ Mandatory nodes
+ ~~~~~~~~~~~~~~~
+
+ images
+ This node contains a set of sub-nodes, each of them representing
+ single component sub-image (like kernel, ramdisk, etc.). At least one
+ sub-image is required.
+
+ configurations
+ Contains a set of available configuration nodes and
+ defines a default configuration.
+
+
+ '/images' node
+ --------------
+
+ This node is a container node for component sub-image nodes. Each sub-node of
+ the '/images' node should have the following layout::
+
+ o image-1
+ |- description = "component sub-image description"
+ |- data = /incbin/("path/to/data/file.bin")
+ |- type = "sub-image type name"
+ |- arch = "ARCH name"
+ |- os = "OS name"
+ |- compression = "compression name"
+ |- load = <00000000>
+ |- entry = <00000000>
+ |
+ o hash-1 {...}
+ o hash-2 {...}
+ ...
+
+ Mandatory properties
+ ~~~~~~~~~~~~~~~~~~~~
+
+ description
+ Textual description of the component sub-image
+
+ type
+ Name of component sub-image type. Supported types are:
+
+ ==================== ==================
+ Sub-image type Meaning
+ ==================== ==================
+ invalid Invalid Image
+ aisimage Davinci AIS image
+ atmelimage ATMEL ROM-Boot Image
+ copro Coprocessor Image}
+ fdt_legacy legacy Image with Flat Device Tree
+ filesystem Filesystem Image
+ firmware Firmware
+ firmware_ivt Firmware with HABv4 IVT }
+ flat_dt Flat Device Tree
+ fpga FPGA Image }
+ gpimage TI Keystone SPL Image
+ imx8image NXP i.MX8 Boot Image
+ imx8mimage NXP i.MX8M Boot Image
+ imximage Freescale i.MX Boot Image
+ kernel Kernel Image
+ kernel_noload Kernel Image (no loading done)
+ kwbimage Kirkwood Boot Image
+ lpc32xximage LPC32XX Boot Image
+ mtk_image MediaTek BootROM loadable Image }
+ multi Multi-File Image
+ mxsimage Freescale MXS Boot Image
+ omapimage TI OMAP SPL With GP CH
+ pblimage Freescale PBL Boot Image
+ pmmc TI Power Management Micro-Controller Firmware
+ ramdisk RAMDisk Image
+ rkimage Rockchip Boot Image }
+ rksd Rockchip SD Boot Image }
+ rkspi Rockchip SPI Boot Image }
+ script Script
+ socfpgaimage Altera SoCFPGA CV/AV preloader
+ socfpgaimage_v1 Altera SoCFPGA A10 preloader
+ spkgimage Renesas SPKG Image }
+ standalone Standalone Program
+ stm32image STMicroelectronics STM32 Image }
+ sunxi_egon Allwinner eGON Boot Image }
+ sunxi_toc0 Allwinner TOC0 Boot Image }
+ tee Trusted Execution Environment Image
+ ublimage Davinci UBL image
+ vybridimage Vybrid Boot Image
+ x86_setup x86 setup.bin
+ zynqimage Xilinx Zynq Boot Image }
+ zynqmpbif Xilinx ZynqMP Boot Image (bif) }
+ zynqmpimage Xilinx ZynqMP Boot Image }
+ ==================== ==================
+
+ compression
+ Compression used by included data. If no compression is used, the
+ compression property should be set to "none". If the data is compressed but
+ it should not be uncompressed by the loader (e.g. compressed ramdisk), this
+ should also be set to "none".
+
+ Supported compression types are:
+
+ ==================== ==================
+ Compression type Meaning
+ ==================== ==================
+ none uncompressed
+ bzip2 bzip2 compressed
+ gzip gzip compressed
+ lz4 lz4 compressed
+ lzma lzma compressed
+ lzo lzo compressed
+ zstd zstd compressed
+ ==================== ==================
+
+ data-size
+ size of the data in bytes
+
+
+ Conditionally mandatory property
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ data
+ Path to the external file which contains this node's binary data. Within
+ the FIT this is the contents of the file. This is mandatory unless
+ external data is used.
+
+ data-offset
+ Offset of the data in a separate image store. The image store is placed
+ immediately after the last byte of the device tree binary, aligned to a
+ 4-byte boundary. This is mandatory if external data is used, with an offset.
+
+ data-position
+ Machine address at which the data is to be found. This is a fixed address
+ not relative to the loading of the FIT. This is mandatory if external data
+ used with a fixed address.
+
+ os
+ OS name, mandatory for types "kernel". Valid OS names are:
+
+ ==================== ==================
+ OS name Meaning
+ ==================== ==================
+ invalid Invalid OS
+ 4_4bsd 4_4BSD
+ arm-trusted-firmware ARM Trusted Firmware
+ dell Dell
+ efi EFI Firmware
+ esix Esix
+ freebsd FreeBSD
+ integrity INTEGRITY
+ irix Irix
+ linux Linux
+ ncr NCR
+ netbsd NetBSD
+ openbsd OpenBSD
+ openrtos OpenRTOS
+ opensbi RISC-V OpenSBI
+ ose Enea OSE
+ plan9 Plan 9
+ psos pSOS
+ qnx QNX
+ rtems RTEMS
+ sco SCO
+ solaris Solaris
+ svr4 SVR4
+ tee Trusted Execution Environment
+ u-boot U-Boot
+ vxworks VxWorks
+ ==================== ==================
+
+ arch
+ Architecture name, mandatory for types: "standalone", "kernel",
+ "firmware", "ramdisk" and "fdt". Valid architecture names are:
+
+ ==================== ==================
+ Architecture type Meaning
+ ==================== ==================
+ invalid Invalid ARCH
+ alpha Alpha
+ arc ARC
+ arm64 AArch64
+ arm ARM
+ avr32 AVR32
+ blackfin Blackfin
+ ia64 IA64
+ m68k M68K
+ microblaze MicroBlaze
+ mips64 MIPS 64 Bit
+ mips MIPS
+ nds32 NDS32
+ nios2 NIOS II
+ or1k OpenRISC 1000
+ powerpc PowerPC
+ ppc PowerPC
+ riscv RISC-V
+ s390 IBM S390
+ sandbox Sandbox
+ sh SuperH
+ sparc64 SPARC 64 Bit
+ sparc SPARC
+ x86_64 AMD x86_64
+ x86 Intel x86
+ xtensa Xtensa
+ ==================== ==================
+
+ entry
+ entry point address, address size is determined by
+ '#address-cells' property of the root node.
+ Mandatory for types: "firmware", and "kernel".
+
+ load
+ load address, address size is determined by '#address-cells'
+ property of the root node.
+ Mandatory for types: "firmware", and "kernel".
+
+ compatible
+ compatible method for loading image.
+ Mandatory for types: "fpga", and images that do not specify a load address.
+ Supported compatible methods:
+
+ ========================== =========================================
+ Compatible string Meaning
+ ========================== =========================================
+ u-boot,fpga-legacy Generic fpga loading routine.
+ u-boot,zynqmp-fpga-ddrauth Signed non-encrypted FPGA bitstream for
+ Xilinx Zynq UltraScale+ (ZymqMP) device.
+ u-boot,zynqmp-fpga-enc Encrypted FPGA bitstream for Xilinx Zynq
+ UltraScale+ (ZynqMP) device.
+ ========================== =========================================
+
+ phase
+ U-Boot phase for which the image is intended.
+
+ "spl"
+ image is an SPL image
+
+ "u-boot"
+ image is a U-Boot image
+
+ Optional nodes:
+
+ hash-1
+ Each hash sub-node represents separate hash or checksum
+ calculated for node's data according to specified algorithm.
+
+ signature-1
+ Each signature sub-node represents separate signature
+ calculated for node's data according to specified algorithm.
+
+
+ Hash nodes
+ ----------
+
+ ::
+
+ o hash-1
+ |- algo = "hash or checksum algorithm name"
+ |- value = [hash or checksum value]
+
+ Mandatory properties
+ ~~~~~~~~~~~~~~~~~~~~
+
+ algo
+ Algorithm name. Supported algoriths and their value sizes are:
+
+ ==================== ============ =========================================
+ Sub-image type Size (bytes) Meaning
+ ==================== ============ =========================================
+ crc16-ccitt 2 Cyclic Redundancy Check 16-bit
+ (Consultative Committee for International
+ Telegraphy and Telephony)
+ crc32 4 Cyclic Redundancy Check 32-bit
+ md5 16 Message Digest 5 (MD5)
+ sha1 20 Secure Hash Algorithm 1 (SHA1)
+ sha256 32 Secure Hash Algorithm 2 (SHA256)
+ sha384 48 Secure Hash Algorithm 2 (SHA384)
+ sha512 64 Secure Hash Algorithm 2 (SHA512)
+ ==================== ============ =========================================
+
+ value
+ Actual checksum or hash value.
+
+ Image-signature nodes
+ ---------------------
+
+ ::
+
+ o signature-1
+ |- algo = "algorithm name"
+ |- key-name-hint = "key name"
+ |- value = [hash or checksum value]
+
+
+ Mandatory properties
+ ~~~~~~~~~~~~~~~~~~~~
+
+ _`FIT Algorithm`:
+
+ algo
+ Algorithm name. Supported algoriths and their value sizes are shown below.
+ Note that the hash is specified separately from the signing algorithm, so
+ it is possible to mix and match any SHA algorithm with any signing
+ algorithm. The size of the signature relates to the signing algorithm, not
+ the hash, since it is the hash that is signed.
+
+ ==================== ============ =========================================
+ Sub-image type Size (bytes) Meaning
+ ==================== ============ =========================================
+ sha1,rsa2048 256 SHA1 hash signed with 2048-bit
+ Rivest–Shamir–Adleman algorithm
+ sha1,rsa3072 384 SHA1 hash signed with 2048-bit RSA
+ sha1,rsa4096 512 SHA1 hash signed with 2048-bit RSA
+ sha1,ecdsa256 32 SHA1 hash signed with 256-bit Elliptic
+ Curve Digital Signature Algorithm
+ sha256,...
+ sha384,...
+ sha512,...
+ ==================== ============ =========================================
+
+ key-name-hint
+ Name of key to use for signing. The keys will normally be in
+ a single directory (parameter -k to mkimage). For a given key <name>, its
+ private key is stored in <name>.key and the certificate is stored in
+ <name>.crt.
+
+ sign-images
+ A list of images to sign, each being a property of the conf
+ node that contains then. The default is "kernel,fdt" which means that these
+ two images will be looked up in the config and signed if present. This is
+ used by mkimage to determine which images to sign.
+
+ The following properies are added as part of signing, and are mandatory:
+
+ value
+ Actual signature value. This is added by mkimage.
+
+ hashed-nodes
+ A list of nodes which were hashed by the signer. Each is
+ a string - the full path to node. A typical value might be::
+
+ hashed-nodes = "/", "/configurations/conf-1", "/images/kernel",
+ "/images/kernel/hash-1", "/images/fdt-1",
+ "/images/fdt-1/hash-1";
+
+ hashed-strings
+ The start and size of the string region of the FIT that was hashed. The
+ start is normally 0, indicating the first byte of the string table. The size
+ indicates the number of bytes hashed as part of signing.
+
+ The following properies are added as part of signing, and are optional:
+
+ timestamp
+ Time when image was signed (standard Unix time_t format)
+
+ signer-name
+ Name of the signer (e.g. "mkimage")
+
+ signer-version
+ Version string of the signer (e.g. "2013.01")
+
+ comment
+ Additional information about the signer or image
+
+ padding
+ The padding algorithm, it may be pkcs-1.5 or pss,
+ if no value is provided we assume pkcs-1.5
+
+
+ '/configurations' node
+ ----------------------
+
+ The 'configurations' node creates convenient, labeled boot configurations,
+ which combine together kernel images with their ramdisks and fdt blobs.
+
+ The 'configurations' node has the following structure::
+
+ o configurations
+ |- default = "default configuration sub-node unit name"
+ |
+ o config-1 {...}
+ o config-2 {...}
+ ...
+
+
+ Optional property
+ ~~~~~~~~~~~~~~~~~
+
+ default
+ Selects one of the configuration sub-nodes as a default configuration.
+
+ Mandatory nodes
+ ~~~~~~~~~~~~~~~
+
+ configuration-sub-node-unit-name
+ At least one of the configuration sub-nodes is required.
+
+ Optional nodes
+ ~~~~~~~~~~~~~~
+
+ signature-1
+ Each signature sub-node represents separate signature
+ calculated for the configuration according to specified algorithm.
+
+
+ Configuration nodes
+ -------------------
+
+ Each configuration has the following structure::
+
+ o config-1
+ |- description = "configuration description"
+ |- kernel = "kernel sub-node unit name"
+ |- fdt = "fdt sub-node unit-name" [, "fdt overlay sub-node unit-name", ...]
+ |- loadables = "loadables sub-node unit-name"
+ |- script = "
+ |- compatible = "vendor,board-style device tree compatible string"
+ o signature-1 {...}
+
+ Mandatory properties
+ ~~~~~~~~~~~~~~~~~~~~
+
+ description
+ Textual configuration description.
+
+ kernel or firmware
+ Unit name of the corresponding kernel or firmware
+ (u-boot, op-tee, etc) image. If both "kernel" and "firmware" are specified,
+ control is passed to the firmware image.
+
+ Optional properties
+ ~~~~~~~~~~~~~~~~~~~
+
+ fdt
+ Unit name of the corresponding fdt blob (component image node of a
+ "fdt type"). Additional fdt overlay nodes can be supplied which signify
+ that the resulting device tree blob is generated by the first base fdt
+ blob with all subsequent overlays applied.
+
+ fpga
+ Unit name of the corresponding fpga bitstream blob
+ (component image node of a "fpga type").
+
+ loadables
+ Unit name containing a list of additional binaries to be
+ loaded at their given locations. "loadables" is a comma-separated list
+ of strings. U-Boot will load each binary at its given start-address and
+ may optionally invoke additional post-processing steps on this binary based
+ on its component image node type.
+
+ script
+ The image to use when loading a U-Boot script (for use with the
+ source command).
+
+ compatible
+ The root compatible string of the U-Boot device tree that
+ this configuration shall automatically match when CONFIG_FIT_BEST_MATCH is
+ enabled. If this property is not provided, the compatible string will be
+ extracted from the fdt blob instead. This is only possible if the fdt is
+ not compressed, so images with compressed fdts that want to use compatible
+ string matching must always provide this property.
+
+ The FDT blob is required to properly boot FDT based kernel, so the minimal
+ configuration for 2.6 FDT kernel is (kernel, fdt) pair.
+
+ Older, 2.4 kernel and 2.6 non-FDT kernel do not use FDT blob, in such cases
+ 'struct bd_info' must be passed instead of FDT blob, thus fdt property *must
+ not* be specified in a configuration node.
+
+ Configuration-signature nodes
+ -----------------------------
+
+ ::
+
+ o signature-1
+ |- algo = "algorithm name"
+ |- key-name-hint = "key name"
+ |- sign-images = "path1", "path2";
+ |- value = [hash or checksum value]
+ |- hashed-strings = <0 len>
+
+
+ Mandatory properties
+ ~~~~~~~~~~~~~~~~~~~~
+
+ algo
+ See `FIT Algorithm`_.
+
+ key-name-hint
+ Name of key to use for signing. The keys will normally be in
+ a single directory (parameter -k to mkimage). For a given key <name>, its
+ private key is stored in <name>.key and the certificate is stored in
+ <name>.crt.
+
+ The following properies are added as part of signing, and are mandatory:
+
+ value
+ Actual signature value. This is added by mkimage.
+
+ The following properies are added as part of signing, and are optional:
+
+ timestamp
+ Time when image was signed (standard Unix time_t format)
+
+ signer-name
+ Name of the signer (e.g. "mkimage")
+
+ signer-version
+ Version string of the signer (e.g. "2013.01")
+
+ comment
+ Additional information about the signer or image
+
+ padding
+ The padding algorithm, it may be pkcs-1.5 or pss,
+ if no value is provided we assume pkcs-1.5
+
+
+
+ Examples
+ --------
+
+ Some example files are available here, showing various scenarios
+
+ .. toctree::
+ :maxdepth: 1
+
+ kernel
+ kernel_fdt
+ kernel_fdts_compressed
+ multi
+ multi_spl
+ multi-with-fpga
+ multi-with-loadables
+ sec_firmware_ppa
+ sign-configs
+ sign-images
+ uefi
+ update3
+ update_uboot
+
+ .. sectionauthor:: Marian Balakowicz <m8@semihalf.com>
+ .. sectionauthor:: External data additions, 25/1/16 Simon Glass <sjg@chromium.org>