| MULTI DTB FIT and SPL_MULTI_DTB_FIT | |
| The purpose of this feature is to enable U-Boot or the SPL to select its DTB | |
| from a FIT appended at the end of the binary. | |
| It comes in two flavors: U-Boot (CONFIG_MULTI_DTB_FIT) and SPL | |
| (CONFIG_SPL_MULTI_DTB_FIT). | |
| U-Boot flavor: | |
| Usually the DTB is selected by the SPL and passed down to U-Boot. But some | |
| platforms don't use the SPL. In this case MULTI_DTB_FIT can used to provide | |
| U-Boot with a choice of DTBs. | |
| The relevant DTBs are packed into a FIT (list provided by CONFIG_OF_LIST). The | |
| FIT is automatically generated at the end of the compilation and appended to | |
| u-boot.bin so that U-Boot can locate it and select the correct DTB from inside | |
| the FIT. | |
| The selection is done using board_fit_config_name_match() (same as what the SPL | |
| uses to select the DTB for U-Boot). The selection happens during fdtdec_setup() | |
| which is called during before relocation by board_init_f(). | |
| SPL flavor: | |
| the SPL uses only a small subset of the DTB and it usually depends more | |
| on the SOC than on the board. So it's usually fine to include a DTB in the | |
| SPL that doesn't exactly match the board. There are howerver some cases | |
| where it's not possible. In the later case, in order to support multiple | |
| boards (or board revisions) with the same SPL binary, SPL_MULTI_DTB_FIT | |
| can be used. | |
| The relevant DTBs are packed into a FIT. This FIT is automatically generated | |
| at the end of the compilation, compressed and appended to u-boot-spl.bin, so | |
| that SPL can locate it and select the correct DTB from inside the FIT. | |
| CONFIG_SPL_OF_LIST is used to list the relevant DTBs. | |
| The compression stage is optional but reduces the impact on the size of the | |
| SPL. LZO and GZIP compressions are supported. By default, the area where the | |
| FIT is uncompressed is dynamicaly allocated but this behaviour can be changed | |
| for platforms that don't provide a HEAP big enough to contain the uncompressed | |
| FIT. | |
| The SPL uses board_fit_config_name_match() to find the correct DTB within the | |
| FIT (same as what the SPL uses to select the DTB for U-Boot). | |
| Uncompression and selection stages happen in fdtdec_setup() which is called | |
| during the early initialization stage of the SPL (spl_early_init() or | |
| spl_init()) | |
| Impacts and performances (SPL flavor): | |
| The impact of this option is relatively small. Here are some numbers measured | |
| for a TI DRA72 platform: | |
| +----------+------------+-----------+------------+ | |
| | size | size delta | SPL boot | boot time | | |
| | (bytes) | (bytes) | time (s) | delta (s) | | |
| +---------------------------+----------+------------+-----------+------------+ | |
| | 1 DTB | | | | | | |
| +---------------------------+----------+------------+-----------+------------+ | |
| | reference | 125305 | 0 | 1.389 | 0 | | |
| | LZO (dynamic allocation) | 125391 | 86 | 1.381 | -0.008 | | |
| +---------------------------+----------+------------+-----------+------------+ | |
| | 4 DTBs (DRA7, DRA71, | | | | | | |
| | DRA72, DRA72 revC) | | | | | | |
| +---------------------------+----------+------------+-----------+------------+ | |
| | LZO (dynamic allocation) | 125991 | 686 | 1.39 | 0.001 | | |
| | LZO (user defined area) | 125927 | 622 | 1.403 | 0.014 | | |
| | GZIP (user defined area) | 133880 | 8575 | 1.421 | 0.032 | | |
| | No compression (in place) | 137472 | 12167 | 1.412 | 0.023 | | |
| +---------------------------+----------+------------+-----------+------------+ | |
| Note: SPL boot time is the time elapsed between the 'reset' command is entered | |
| and the time when the first U-Boot (not SPL) version string is displayed. |