Falcon boot option ------------------ Falcon boot is a short cut boot method for SD/eMMC targets. It skips loading the RAM version U-Boot. Instead, it loads FIT image and boot directly to Linux. CONFIG_SPL_OS_BOOT enables falcon boot. CONFIG_SPL_LOAD_FIT enables the FIT image support (also need CONFIG_SPL_OF_LIBFDT, CONFIG_SPL_FIT and optionally CONFIG_SPL_GZIP). To enable falcon boot, a hook function spl_start_uboot() returns 0 to indicate booting U-Boot is not the first choice. The kernel FIT image needs to be put at CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR. SPL mmc driver reads the header to determine if this is a FIT image. If true, FIT image components are parsed and copied or decompressed (if applicable) to their destinations. If FIT image is not found, normal U-Boot flow will follow. An important part of falcon boot is to prepare the device tree. A normal U-Boot does FDT fixups when booting Linux. For falcon boot, Linux boots directly from SPL, skipping the normal U-Boot. The device tree has to be prepared in advance. A command "spl export" should be called under the normal RAM version U-Boot. It is equivalent to go through "bootm" step-by-step until device tree fixup is done. The device tree in memory is the one needed for falcon boot. Falcon boot flow suggests to save this image to SD/eMMC at the location pointed by macro CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR, with maximum size specified by macro CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS. However, when FIT image is used for Linux, the device tree stored in FIT image overwrites the memory loaded by spl driver from these sectors. We could change this loading order to favor the stored sectors. But when secure boot is enabled, these sectors are used for signature header and needs to be loaded before the FIT image. So it is important to understand the device tree in FIT image should be the one actually used, or leave it absent to favor the stored sectors. It is easier to deploy the FIT image with embedded static device tree to multiple boards. Macro CONFIG_SYS_SPL_ARGS_ADDR serves two purposes. One is the pointer to load the stored sectors to. Normally this is the static device tree. The second purpose is the memory location of signature header for secure boot. After the FIT image is loaded into memory, it is validated against the signature header before individual components are extracted (and optionally decompressed) into their final memory locations, respectively. After the validation, the header is no longer used. The static device tree is copied into this location. So this macro is passed as the location of device tree when booting Linux. Steps to prepare static device tree ----------------------------------- To prepare the static device tree for Layerscape boards, it is important to understand the fixups in U-Boot. Memory size and location, as well as reserved memory blocks are added/updated. Ethernet MAC addressed are updated. FMan microcode (if used) is embedded in the device tree. Kernel command line and initrd information are embedded. Others including CPU status, boot method, Ethernet port status, etc. are also updated. Following normal booting process, all variables are set, all images are loaded before "bootm" command would be issued to boot, run command spl export fdt
where the address is the location of FIT image. U-Boot goes through the booting process as if "bootm start", "bootm loados", "bootm ramdisk"... commands but stops before "bootm go". There we have the fixed-up device tree in memory. We can check the device tree header by these commands fdt addr