[U-Boot] [PATCH v7 8/9] board: intel: Add new slimbootloader board
Bin Meng
bmeng.cn at gmail.com
Thu Aug 1 05:17:24 UTC 2019
Hi Aiden,
On Mon, Jul 29, 2019 at 12:36 PM Park, Aiden <aiden.park at intel.com> wrote:
>
> Add slimbootloader board to run U-boot as a Slim Bootloader payload
> - Add new board/intel/slimbootloader directory with minimum codes
> - Add slimbootloader configuration files
> - Add doc/board/intel/slimbootloader.rst
>
> Signed-off-by: Aiden Park <aiden.park at intel.com>
> Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
> Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
> ---
>
> Changes in v7:
> * Adding slimbootloader.rst in index.rst
>
> Changes in v6:
> * Select CONFIG_SYS_SLIMBOOTLOADER in board Kconfig
> * Move USB_STORAGE and USB_KEYBOARD to board Kconfig
> * Convert README to reST doc/board/intel/slimbootloader.rst
>
> Changes in v5:
> * Remove X86_LOAD_FROM_32_BIT from slimbootloader_defconfig
>
> Changes in v3:
> * Remove VENDOR_SLIMBOOTLOADER
> * Use VENDOR_INTEL
> * Move slimbootloader under board/intel/
> * Enable generic CONFIGs in slimbootloader_defconfig
> * Add more description in board/intel/slimbootloader/README
>
> board/intel/Kconfig | 14 ++
> board/intel/slimbootloader/Kconfig | 28 ++++
> board/intel/slimbootloader/Makefile | 5 +
> board/intel/slimbootloader/slimbootloader.c | 21 +++
> board/intel/slimbootloader/start.S | 9 +
> configs/slimbootloader_defconfig | 22 +++
> doc/board/intel/index.rst | 1 +
> doc/board/intel/slimbootloader.rst | 174 ++++++++++++++++++++
> include/configs/slimbootloader.h | 62 +++++++
> 9 files changed, 336 insertions(+)
> create mode 100644 board/intel/slimbootloader/Kconfig
> create mode 100644 board/intel/slimbootloader/Makefile
> create mode 100644 board/intel/slimbootloader/slimbootloader.c
> create mode 100644 board/intel/slimbootloader/start.S
> create mode 100644 configs/slimbootloader_defconfig
> create mode 100644 doc/board/intel/slimbootloader.rst
> create mode 100644 include/configs/slimbootloader.h
>
> diff --git a/board/intel/Kconfig b/board/intel/Kconfig
> index 5131836cb0..10859b5f08 100644
> --- a/board/intel/Kconfig
> +++ b/board/intel/Kconfig
> @@ -73,6 +73,19 @@ config TARGET_MINNOWMAX
> Note that PCIE_ECAM_BASE is set up by the FSP so the value used
> by U-Boot matches that value.
>
> +config TARGET_SLIMBOOTLOADER
> + bool "slimbootloader"
> + help
> + This target is used for running U-Boot on top of Slim Bootloader
> + boot firmware as a payload. Slim Bootloader does memory initialization
> + and silicon initialization, and it passes necessary information in
> + HOB(Hand Off Block) to a payload. The payload consumes HOB data
nits: should have one space between HOB and (
Please fix this globally in this series. There are many places
including .c file and the reST documentation.
> + which is generated by Slim Bootloader for its driver initialization.
> + Slim Bootloader consumes FSP and its HOB, but FSP HOB is cleared
> + Before launching a payload. Instead, Slim Bootloader generates its
> + HOB data such as memory info, serial port info and so on.
> + Refer to doc/board/intel/slimbootloader.rst for the details.
> +
> endchoice
>
> source "board/intel/bayleybay/Kconfig"
> @@ -82,5 +95,6 @@ source "board/intel/crownbay/Kconfig"
> source "board/intel/edison/Kconfig"
> source "board/intel/galileo/Kconfig"
> source "board/intel/minnowmax/Kconfig"
> +source "board/intel/slimbootloader/Kconfig"
>
> endif
> diff --git a/board/intel/slimbootloader/Kconfig b/board/intel/slimbootloader/Kconfig
> new file mode 100644
> index 0000000000..8c7e22cc33
> --- /dev/null
> +++ b/board/intel/slimbootloader/Kconfig
> @@ -0,0 +1,28 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +# Copyright (C) 2019 Intel Corporation <www.intel.com>
> +
> +if TARGET_SLIMBOOTLOADER
> +
> +config SYS_BOARD
> + default "slimbootloader"
> +
> +config SYS_VENDOR
> + default "intel"
> +
> +config SYS_SOC
> + default "slimbootloader"
> +
> +config SYS_CONFIG_NAME
> + default "slimbootloader"
> +
> +config SYS_TEXT_BASE
> + default 0x00100000
> +
> +config BOARD_SPECIFIC_OPTIONS
> + def_bool y
> + select SYS_SLIMBOOTLOADER
> + select USB_STORAGE
> + select USB_KEYBOARD
> +
> +endif
> diff --git a/board/intel/slimbootloader/Makefile b/board/intel/slimbootloader/Makefile
> new file mode 100644
> index 0000000000..fd8fa98a8d
> --- /dev/null
> +++ b/board/intel/slimbootloader/Makefile
> @@ -0,0 +1,5 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +# Copyright (C) 2019 Intel Corporation <www.intel.com>
> +
> +obj-y += start.o slimbootloader.o
> diff --git a/board/intel/slimbootloader/slimbootloader.c b/board/intel/slimbootloader/slimbootloader.c
> new file mode 100644
> index 0000000000..f50eeb823f
> --- /dev/null
> +++ b/board/intel/slimbootloader/slimbootloader.c
> @@ -0,0 +1,21 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + */
> +
> +#include <common.h>
> +
> +int board_early_init_r(void)
> +{
> + /*
> + * Make sure PCI bus is enumerated so that peripherals on the PCI bus
> + * can be discovered by their drivers.
> + *
> + * Slim Bootloader has already done PCI bus enumeration before loading
> + * U-Boot, so U-Boot needs to preserve PCI configuration.
> + * Therefore, '# CONFIG_PCI_PNP is not set' is included in defconfig.
> + */
> + pci_init();
> +
> + return 0;
> +}
> diff --git a/board/intel/slimbootloader/start.S b/board/intel/slimbootloader/start.S
> new file mode 100644
> index 0000000000..5c3f3df09e
> --- /dev/null
> +++ b/board/intel/slimbootloader/start.S
> @@ -0,0 +1,9 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + */
> +
> +/* board early initialization */
> +.globl early_board_init
> +early_board_init:
> + jmp early_board_init_ret
> diff --git a/configs/slimbootloader_defconfig b/configs/slimbootloader_defconfig
> new file mode 100644
> index 0000000000..b16ed71469
> --- /dev/null
> +++ b/configs/slimbootloader_defconfig
> @@ -0,0 +1,22 @@
> +CONFIG_X86=y
> +CONFIG_VENDOR_INTEL=y
> +CONFIG_TARGET_SLIMBOOTLOADER=y
> +CONFIG_DEFAULT_DEVICE_TREE="slimbootloader"
> +CONFIG_REGMAP=y
> +CONFIG_SYSCON=y
> +CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +CONFIG_BOARD_EARLY_INIT_R=y
> +CONFIG_LAST_STAGE_INIT=y
> +CONFIG_HUSH_PARSER=y
> +CONFIG_CMD_MMC=y
> +CONFIG_CMD_EXT2=y
> +CONFIG_CMD_FAT=y
> +CONFIG_CMD_USB=y
> +CONFIG_DOS_PARTITION=y
> +CONFIG_EFI_PARTITION=y
> +CONFIG_OF_CONTROL=y
> +CONFIG_BOOTSTAGE=y
> +CONFIG_BOOTSTAGE_REPORT=y
> +CONFIG_BOOTDELAY=10
> +CONFIG_CONSOLE_SCROLL_LINES=5
> +# CONFIG_PCI_PNP is not set
> diff --git a/doc/board/intel/index.rst b/doc/board/intel/index.rst
> index f416801910..f545dee87a 100644
> --- a/doc/board/intel/index.rst
> +++ b/doc/board/intel/index.rst
> @@ -13,3 +13,4 @@ Intel
> edison
> galileo
> minnowmax
> + slimbootloader
> diff --git a/doc/board/intel/slimbootloader.rst b/doc/board/intel/slimbootloader.rst
> new file mode 100644
> index 0000000000..4b9c293c2d
> --- /dev/null
> +++ b/doc/board/intel/slimbootloader.rst
> @@ -0,0 +1,174 @@
> +.. SPDX-License-Identifier: GPL-2.0+
> +.. sectionauthor:: Aiden Park <aiden.park at 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
I was trying to test this. However with current slimbootloader head
(commit #723672c5ca13263bf1428997338bdb03b3bc6609) this file does not
exist.
So the documentation here is stale. My major concern regarding the
slimbootloader build itself is: why are these manual steps needed?
Shouldn't the slimbootloader ship a default configuration file for
U-Boot payload, thus we don't need manually modify this file or that?
> + + 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
> diff --git a/include/configs/slimbootloader.h b/include/configs/slimbootloader.h
> new file mode 100644
> index 0000000000..e0011ed446
> --- /dev/null
[snip]
Regards,
Bin
More information about the U-Boot
mailing list