.. SPDX-License-Identifier: GPL-2.0+ .. sectionauthor:: Aiden Park Slim Bootloader =============== Introduction ------------ This target is to enable U-Boot_ as a payload of `Slim Bootloader`_ (a.k.a SBL) boot firmware which currently supports QEMU, Apollolake, Whiskeylake, Coffeelake-R platforms. The `Slim Bootloader`_ is designed with multi-stages (Stage1A/B, Stage2, Payload) architecture to cover from reset vector to OS booting and it consumes `Intel FSP`_ for silicon initialization. * Stage1A: Reset vector, CAR init with FSP-T * Stage1B: Memory init with FSP-M, CAR teardown, Continue execution in memory * Stage2 : Rest of Silicon init with FSP-S, Create HOB, Hand-off to Payload * Payload: Payload init with HOB, Load OS from media, Booting OS The Slim Bootloader stages (Stage1A/B, Stage2) focus on chipset, hardware and platform specific initialization, and it provides useful information to a payload in a HOB (Hand-Off Block) which has serial port, memory map, performance data info and so on. This is Slim Bootloader architectural design to make a payload light-weight, platform independent and more generic across different boot solutions or payloads, and to minimize hardware re-initialization in a payload. Build Instruction for U-Boot as a Slim Bootloader payload --------------------------------------------------------- Build U-Boot and obtain u-boot-dtb.bin:: $ make distclean $ make slimbootloader_defconfig $ make all Prepare Slim Bootloader ----------------------- 1. Setup Build Environment for Slim Bootloader. Refer to `Getting Started`_ page in `Slim Bootloader`_ document site. 2. Get source code. Let's simply clone the repo:: $ git clone https://github.com/slimbootloader/slimbootloader.git 3. Copy u-boot-dtb.bin to Slim Bootloader. Slim Bootloader looks for a payload from the specific location. Copy the build u-boot-dtb.bin to the expected location:: $ mkdir -p /PayloadPkg/PayloadBins/ $ cp /u-boot-dtb.bin /PayloadPkg/PayloadBins/u-boot-dtb.bin Build Instruction for Slim Bootloader for QEMU target ----------------------------------------------------- Slim Bootloader supports multiple payloads, and a board of Slim Bootloader detects its target payload by PayloadId in board configuration. The PayloadId can be any 4 Bytes value. 1. Update PayloadId. Let's use 'U-BT' as an example:: $ vi Platform/QemuBoardPkg/CfgData/CfgDataExt_Brd1.dlt -GEN_CFG_DATA.PayloadId | 'AUTO' +GEN_CFG_DATA.PayloadId | 'U-BT' 2. Update payload text base. PAYLOAD_EXE_BASE must be the same as U-Boot CONFIG_SYS_TEXT_BASE in board/intel/slimbootloader/Kconfig. PAYLOAD_LOAD_HIGH must be 0:: $ vi Platform/QemuBoardPkg/BoardConfig.py + self.PAYLOAD_LOAD_HIGH = 0 + self.PAYLOAD_EXE_BASE = 0x00100000 3. Build QEMU target. Make sure u-boot-dtb.bin and U-BT PayloadId in build command. The output is Outputs/qemu/SlimBootloader.bin:: $ python BuildLoader.py build qemu -p "OsLoader.efi:LLDR:Lz4;u-boot-dtb.bin:U-BT:Lzma" 4. Launch Slim Bootloader on QEMU. You should reach at U-Boot serial console:: $ qemu-system-x86_64 -machine q35 -nographic -serial mon:stdio -pflash Outputs/qemu/SlimBootloader.bin Build Instruction for Slim Bootloader for LeafHill (APL) target -------------------------------------------------------------- LeafHill is using PCI UART2 device as a serial port. For MEM32 serial port, CONFIG_SYS_NS16550_MEM32 needs to be enabled in U-Boot. 1. Enable CONFIG_SYS_NS16550_MEM32 in U-Boot:: $ vi include/configs/slimbootloader.h +#define CONFIG_SYS_NS16550_MEM32 #ifdef CONFIG_SYS_NS16550_MEM3 2. Build U-Boot:: $ make disclean $ make slimbootloader_defconfig $ make all 3. Copy u-boot-dtb.bin to Slim Bootloader. Slim Bootloader looks for a payload from the specific location. Copy the build u-boot-dtb.bin to the expected location:: $ mkdir -p /PayloadPkg/PayloadBins/ $ cp /u-boot-dtb.bin /PayloadPkg/PayloadBins/u-boot-dtb.bin 4. Update PayloadId. Let's use 'U-BT' as an example:: $ vi Platform/ApollolakeBoardPkg/CfgData/CfgData_Int_LeafHill.dlt -GEN_CFG_DATA.PayloadId | 'AUTO +GEN_CFG_DATA.PayloadId | 'U-BT' 5. Update payload text base. * PAYLOAD_EXE_BASE must be the same as U-Boot CONFIG_SYS_TEXT_BASE in board/intel/slimbootloader/Kconfig. * PAYLOAD_LOAD_HIGH must be 0:: $ vi Platform/ApollolakeBoardPkg/BoardConfig.py + self.PAYLOAD_LOAD_HIGH = 0 + self.PAYLOAD_EXE_BASE = 0x00100000 6. Build APL target. Make sure u-boot-dtb.bin and U-BT PayloadId in build command. The output is Outputs/apl/Stitch_Components.zip:: $ python BuildLoader.py build apl -p "OsLoader.efi:LLDR:Lz4;u-boot-dtb.bin:U-BT:Lzma" 7. Stitch IFWI. Refer to Apollolake_ page in Slim Bootloader document site:: $ python Platform/ApollolakeBoardPkg/Script/StitchLoader.py -i -s Outputs/apl/Stitch_Components.zip -o 8. Flash IFWI. Use DediProg to flash IFWI. You should reach at U-Boot serial console. Build Instruction to use ELF U-Boot ----------------------------------- 1. Enable CONFIG_OF_EMBED:: $ vi configs/slimbootloader_defconfig +CONFIG_OF_EMBED=y 2. Build U-Boot:: $ make disclean $ make slimbootloader_defconfig $ make all $ strip u-boot (removing symbol for reduced size) 3. Do same steps as above * Copy u-boot (ELF) to PayloadBins directory * Update PayloadId 'U-BT' as above. * No need to set PAYLOAD_LOAD_HIGH and PAYLOAD_EXE_BASE. * Build Slim Bootloader. Use u-boot instead of u-boot-dtb.bin:: $ python BuildLoader.py build -p "OsLoader.efi:LLDR:Lz4;u-boot:U-BT:Lzma" .. _U-Boot: https://gitlab.denx.de/ .. _`Slim Bootloader`: https://github.com/slimbootloader/ .. _`Intel FSP`: https://github.com/IntelFsp/ .. _`Getting Started`: https://slimbootloader.github.io/getting-started/ .. _Apollolake: https://slimbootloader.github.io/supported-hardware/apollo-lake-crb.html#stitching