|
@@ -0,0 +1,174 @@
|
|
|
+.. 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_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 <Slim Bootloader Dir>/PayloadPkg/PayloadBins/
|
|
|
+ $ cp <U-Boot Dir>/u-boot-dtb.bin <Slim Bootloader Dir>/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 <Existing IFWI> -s Outputs/apl/Stitch_Components.zip -o <Output IFWI>
|
|
|
+
|
|
|
+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 <qemu or apl> -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
|