[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