Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 | .. SPDX-License-Identifier: GPL-2.0+ .. sectionauthor:: Aiden Park <aiden.park@intel.com> 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 <Slim Bootloader Dir>/PayloadPkg/PayloadBins/ $ cp <U-Boot Dir>/u-boot-dtb.bin <Slim Bootloader Dir>/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_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 Test Linux booting on QEMU target --------------------------------- Let's use LeafHill (APL) Yocto image for testing. Download it from http://downloads.yoctoproject.org/releases/yocto/yocto-2.0/machines/leafhill/. 1. Prepare Yocto hard disk image:: $ wget http://downloads.yoctoproject.org/releases/yocto/yocto-2.0/machines/leafhill/leafhill-4.0-jethro-2.0.tar.bz2 $ tar -xvf leafhill-4.0-jethro-2.0.tar.bz2 $ ls -l leafhill-4.0-jethro-2.0/binary/core-image-sato-intel-corei7-64.hddimg 2. Launch Slim Bootloader on QEMU with disk image:: $ 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 3. Update boot environment values on shell:: => setenv bootfile vmlinuz => setenv bootdev scsi => boot Build Instruction for Slim Bootloader for LeafHill (APL) target --------------------------------------------------------------- Prepare U-Boot and Slim Bootloader as described at the beginning of this page. Also, the PayloadId needs to be set for APL board. 1. 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' 2. Update payload text base. * PAYLOAD_EXE_BASE must be the same as U-Boot CONFIG_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 3. 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" 4. Stitch IFWI. Refer to Apollolake_ page in Slim Bootloader document site:: $ python Platform/ApollolakeBoardPkg/Script/StitchLoader.py -i <Existing IFWI> -s Outputs/apl/Stitch_Components.zip -o <Output IFWI> 5. 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 distclean $ 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 <qemu or apl> -p "OsLoader.efi:LLDR:Lz4;u-boot:U-BT:Lzma" .. _U-Boot: https://source.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 |