1.. SPDX-License-Identifier: GPL-2.0+ 2.. sectionauthor:: Aiden Park <aiden.park@intel.com> 3 4Slim Bootloader 5=============== 6 7Introduction 8------------ 9 10This target is to enable U-Boot_ as a payload of `Slim Bootloader`_ (a.k.a SBL) 11boot firmware which currently supports QEMU, Apollolake, Whiskeylake, 12Coffeelake-R platforms. 13 14The `Slim Bootloader`_ is designed with multi-stages (Stage1A/B, Stage2, Payload) 15architecture to cover from reset vector to OS booting and it consumes 16`Intel FSP`_ for silicon initialization. 17 18* Stage1A: Reset vector, CAR init with FSP-T 19* Stage1B: Memory init with FSP-M, CAR teardown, Continue execution in memory 20* Stage2 : Rest of Silicon init with FSP-S, Create HOB, Hand-off to Payload 21* Payload: Payload init with HOB, Load OS from media, Booting OS 22 23The Slim Bootloader stages (Stage1A/B, Stage2) focus on chipset, hardware and 24platform specific initialization, and it provides useful information to a 25payload in a HOB (Hand-Off Block) which has serial port, memory map, performance 26data info and so on. This is Slim Bootloader architectural design to make a 27payload light-weight, platform independent and more generic across different 28boot solutions or payloads, and to minimize hardware re-initialization in a 29payload. 30 31Build Instruction for U-Boot as a Slim Bootloader payload 32--------------------------------------------------------- 33 34Build U-Boot and obtain u-boot-dtb.bin:: 35 36 $ make distclean 37 $ make slimbootloader_defconfig 38 $ make all 39 40Prepare Slim Bootloader 41----------------------- 42 431. Setup Build Environment for Slim Bootloader. 44 45 Refer to `Getting Started`_ page in `Slim Bootloader`_ document site. 46 472. Get source code. Let's simply clone the repo:: 48 49 $ git clone https://github.com/slimbootloader/slimbootloader.git 50 513. Copy u-boot-dtb.bin to Slim Bootloader. 52 Slim Bootloader looks for a payload from the specific location. 53 Copy the build u-boot-dtb.bin to the expected location:: 54 55 $ mkdir -p <Slim Bootloader Dir>/PayloadPkg/PayloadBins/ 56 $ cp <U-Boot Dir>/u-boot-dtb.bin <Slim Bootloader Dir>/PayloadPkg/PayloadBins/u-boot-dtb.bin 57 58Build Instruction for Slim Bootloader for QEMU target 59----------------------------------------------------- 60 61Slim Bootloader supports multiple payloads, and a board of Slim Bootloader 62detects its target payload by PayloadId in board configuration. 63The PayloadId can be any 4 Bytes value. 64 651. Update PayloadId. Let's use 'U-BT' as an example:: 66 67 $ vi Platform/QemuBoardPkg/CfgData/CfgDataExt_Brd1.dlt 68 -GEN_CFG_DATA.PayloadId | 'AUTO' 69 +GEN_CFG_DATA.PayloadId | 'U-BT' 70 712. Update payload text base. PAYLOAD_EXE_BASE must be the same as U-Boot 72 CONFIG_SYS_TEXT_BASE in board/intel/slimbootloader/Kconfig. 73 PAYLOAD_LOAD_HIGH must be 0:: 74 75 $ vi Platform/QemuBoardPkg/BoardConfig.py 76 + self.PAYLOAD_LOAD_HIGH = 0 77 + self.PAYLOAD_EXE_BASE = 0x00100000 78 793. Build QEMU target. Make sure u-boot-dtb.bin and U-BT PayloadId 80 in build command. The output is Outputs/qemu/SlimBootloader.bin:: 81 82 $ python BuildLoader.py build qemu -p "OsLoader.efi:LLDR:Lz4;u-boot-dtb.bin:U-BT:Lzma" 83 844. Launch Slim Bootloader on QEMU. 85 You should reach at U-Boot serial console:: 86 87 $ qemu-system-x86_64 -machine q35 -nographic -serial mon:stdio -pflash Outputs/qemu/SlimBootloader.bin 88 89Test Linux booting on QEMU target 90--------------------------------- 91 92Let's use LeafHill (APL) Yocto image for testing. 93Download it from http://downloads.yoctoproject.org/releases/yocto/yocto-2.0/machines/leafhill/. 94 951. Prepare Yocto hard disk image:: 96 97 $ wget http://downloads.yoctoproject.org/releases/yocto/yocto-2.0/machines/leafhill/leafhill-4.0-jethro-2.0.tar.bz2 98 $ tar -xvf leafhill-4.0-jethro-2.0.tar.bz2 99 $ ls -l leafhill-4.0-jethro-2.0/binary/core-image-sato-intel-corei7-64.hddimg 100 1012. Launch Slim Bootloader on QEMU with disk image:: 102 103 $ qemu-system-x86_64 -machine q35 -nographic -serial mon:stdio -pflash Outputs/qemu/SlimBootloader.bin -drive id=mydrive,if=none,file=/path/to/core-image-sato-intel-corei7-64.hddimg,format=raw -device ide-hd,drive=mydrive 104 1053. Update boot environment values on shell:: 106 107 => setenv bootfile vmlinuz 108 => setenv bootdev scsi 109 => boot 110 111Build Instruction for Slim Bootloader for LeafHill (APL) target 112--------------------------------------------------------------- 113 114Prepare U-Boot and Slim Bootloader as described at the beginning of this page. 115Also, the PayloadId needs to be set for APL board. 116 1171. Update PayloadId. Let's use 'U-BT' as an example:: 118 119 $ vi Platform/ApollolakeBoardPkg/CfgData/CfgData_Int_LeafHill.dlt 120 -GEN_CFG_DATA.PayloadId | 'AUTO 121 +GEN_CFG_DATA.PayloadId | 'U-BT' 122 1232. Update payload text base. 124 125* PAYLOAD_EXE_BASE must be the same as U-Boot CONFIG_SYS_TEXT_BASE 126 in board/intel/slimbootloader/Kconfig. 127* PAYLOAD_LOAD_HIGH must be 0:: 128 129 $ vi Platform/ApollolakeBoardPkg/BoardConfig.py 130 + self.PAYLOAD_LOAD_HIGH = 0 131 + self.PAYLOAD_EXE_BASE = 0x00100000 132 1333. Build APL target. Make sure u-boot-dtb.bin and U-BT PayloadId 134 in build command. The output is Outputs/apl/Stitch_Components.zip:: 135 136 $ python BuildLoader.py build apl -p "OsLoader.efi:LLDR:Lz4;u-boot-dtb.bin:U-BT:Lzma" 137 1384. Stitch IFWI. 139 140 Refer to Apollolake_ page in Slim Bootloader document site:: 141 142 $ python Platform/ApollolakeBoardPkg/Script/StitchLoader.py -i <Existing IFWI> -s Outputs/apl/Stitch_Components.zip -o <Output IFWI> 143 1445. Flash IFWI. 145 146 Use DediProg to flash IFWI. You should reach at U-Boot serial console. 147 148 149Build Instruction to use ELF U-Boot 150----------------------------------- 151 1521. Enable CONFIG_OF_EMBED:: 153 154 $ vi configs/slimbootloader_defconfig 155 +CONFIG_OF_EMBED=y 156 1572. Build U-Boot:: 158 159 $ make distclean 160 $ make slimbootloader_defconfig 161 $ make all 162 $ strip u-boot (removing symbol for reduced size) 163 1643. Do same steps as above 165 166* Copy u-boot (ELF) to PayloadBins directory 167* Update PayloadId 'U-BT' as above. 168* No need to set PAYLOAD_LOAD_HIGH and PAYLOAD_EXE_BASE. 169* Build Slim Bootloader. Use u-boot instead of u-boot-dtb.bin:: 170 171 $ python BuildLoader.py build <qemu or apl> -p "OsLoader.efi:LLDR:Lz4;u-boot:U-BT:Lzma" 172 173.. _U-Boot: https://source.denx.de/ 174.. _`Slim Bootloader`: https://github.com/slimbootloader/ 175.. _`Intel FSP`: https://github.com/IntelFsp/ 176.. _`Getting Started`: https://slimbootloader.github.io/getting-started/ 177.. _Apollolake: https://slimbootloader.github.io/supported-hardware/apollo-lake-crb.html#stitching 178