Jean-Jacques Hiblot | 2f57c95 | 2017-09-15 12:57:32 +0200 | [diff] [blame] | 1 | MULTI DTB FIT and SPL_MULTI_DTB_FIT |
Jean-Jacques Hiblot | 1195559 | 2017-09-15 12:57:24 +0200 | [diff] [blame] | 2 | |
Jean-Jacques Hiblot | 2f57c95 | 2017-09-15 12:57:32 +0200 | [diff] [blame] | 3 | The purpose of this feature is to enable U-Boot or the SPL to select its DTB |
| 4 | from a FIT appended at the end of the binary. |
| 5 | It comes in two flavors: U-Boot (CONFIG_MULTI_DTB_FIT) and SPL |
| 6 | (CONFIG_SPL_MULTI_DTB_FIT). |
Jean-Jacques Hiblot | 1195559 | 2017-09-15 12:57:24 +0200 | [diff] [blame] | 7 | |
Jean-Jacques Hiblot | 2f57c95 | 2017-09-15 12:57:32 +0200 | [diff] [blame] | 8 | U-Boot flavor: |
Jean-Jacques Hiblot | 1195559 | 2017-09-15 12:57:24 +0200 | [diff] [blame] | 9 | Usually the DTB is selected by the SPL and passed down to U-Boot. But some |
| 10 | platforms don't use the SPL. In this case MULTI_DTB_FIT can used to provide |
| 11 | U-Boot with a choice of DTBs. |
Fabio Estevam | eeda3d7 | 2020-07-05 19:04:50 -0300 | [diff] [blame] | 12 | The relevant DTBs are packed into a FIT (list provided by CONFIG_OF_LIST). The |
Jean-Jacques Hiblot | 1195559 | 2017-09-15 12:57:24 +0200 | [diff] [blame] | 13 | FIT is automatically generated at the end of the compilation and appended to |
| 14 | u-boot.bin so that U-Boot can locate it and select the correct DTB from inside |
| 15 | the FIT. |
| 16 | The selection is done using board_fit_config_name_match() (same as what the SPL |
| 17 | uses to select the DTB for U-Boot). The selection happens during fdtdec_setup() |
| 18 | which is called during before relocation by board_init_f(). |
Jean-Jacques Hiblot | 2f57c95 | 2017-09-15 12:57:32 +0200 | [diff] [blame] | 19 | |
| 20 | SPL flavor: |
| 21 | the SPL uses only a small subset of the DTB and it usually depends more |
| 22 | on the SOC than on the board. So it's usually fine to include a DTB in the |
| 23 | SPL that doesn't exactly match the board. There are howerver some cases |
| 24 | where it's not possible. In the later case, in order to support multiple |
| 25 | boards (or board revisions) with the same SPL binary, SPL_MULTI_DTB_FIT |
| 26 | can be used. |
| 27 | The relevant DTBs are packed into a FIT. This FIT is automatically generated |
| 28 | at the end of the compilation, compressed and appended to u-boot-spl.bin, so |
| 29 | that SPL can locate it and select the correct DTB from inside the FIT. |
Fabio Estevam | eeda3d7 | 2020-07-05 19:04:50 -0300 | [diff] [blame] | 30 | CONFIG_SPL_OF_LIST is used to list the relevant DTBs. |
Jean-Jacques Hiblot | 2f57c95 | 2017-09-15 12:57:32 +0200 | [diff] [blame] | 31 | The compression stage is optional but reduces the impact on the size of the |
| 32 | SPL. LZO and GZIP compressions are supported. By default, the area where the |
| 33 | FIT is uncompressed is dynamicaly allocated but this behaviour can be changed |
| 34 | for platforms that don't provide a HEAP big enough to contain the uncompressed |
| 35 | FIT. |
| 36 | The SPL uses board_fit_config_name_match() to find the correct DTB within the |
| 37 | FIT (same as what the SPL uses to select the DTB for U-Boot). |
| 38 | Uncompression and selection stages happen in fdtdec_setup() which is called |
| 39 | during the early initialization stage of the SPL (spl_early_init() or |
| 40 | spl_init()) |
| 41 | |
| 42 | Impacts and performances (SPL flavor): |
| 43 | The impact of this option is relatively small. Here are some numbers measured |
| 44 | for a TI DRA72 platform: |
| 45 | |
| 46 | +----------+------------+-----------+------------+ |
| 47 | | size | size delta | SPL boot | boot time | |
| 48 | | (bytes) | (bytes) | time (s) | delta (s) | |
| 49 | +---------------------------+----------+------------+-----------+------------+ |
| 50 | | 1 DTB | | | | | |
| 51 | +---------------------------+----------+------------+-----------+------------+ |
| 52 | | reference | 125305 | 0 | 1.389 | 0 | |
| 53 | | LZO (dynamic allocation) | 125391 | 86 | 1.381 | -0.008 | |
| 54 | +---------------------------+----------+------------+-----------+------------+ |
| 55 | | 4 DTBs (DRA7, DRA71, | | | | | |
| 56 | | DRA72, DRA72 revC) | | | | | |
| 57 | +---------------------------+----------+------------+-----------+------------+ |
| 58 | | LZO (dynamic allocation) | 125991 | 686 | 1.39 | 0.001 | |
| 59 | | LZO (user defined area) | 125927 | 622 | 1.403 | 0.014 | |
| 60 | | GZIP (user defined area) | 133880 | 8575 | 1.421 | 0.032 | |
| 61 | | No compression (in place) | 137472 | 12167 | 1.412 | 0.023 | |
| 62 | +---------------------------+----------+------------+-----------+------------+ |
| 63 | |
| 64 | Note: SPL boot time is the time elapsed between the 'reset' command is entered |
| 65 | and the time when the first U-Boot (not SPL) version string is displayed. |