[U-Boot] [PATCH v7 8/9] board: intel: Add new slimbootloader board

Park, Aiden aiden.park at intel.com
Fri Aug 2 02:34:11 UTC 2019


Hi Bin,

> -----Original Message-----
> From: Bin Meng [mailto:bmeng.cn at gmail.com]
> Sent: Thursday, August 1, 2019 2:17 PM
> To: Park, Aiden <aiden.park at intel.com>
> Cc: Andy Shevchenko <andy.shevchenko at gmail.com>; U-Boot Mailing List <u-
> boot at lists.denx.de>; Simon Glass <sjg at chromium.org>
> Subject: Re: [PATCH v7 8/9] board: intel: Add new slimbootloader board
> 
> 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.
> 
I will do. Thanks.

> > +         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.
> 
I did double-check it, but all files are still there. Your commit head also has the one.
Directory exists, but files are missing? Can you let me know the details?
 
> 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?
> 
Basically, Slim Bootloader supports ELF, EFI FV and PE32 format. It can be loaded
at any location and no additional change is required.
At the same time, Slim Bootloader also supports RAW binary which has different
TEXT_BASE and varies on binaries. We do not enforce to have fixed TEXT_BASE
and allow users to make it configurable in its BoardConfig.py.
In U-Boot case, 0x100000 is TEXT_BASE and Slim Bootloader will load U-Boot to
the specific address. And then, U-Boot will be self-relocated to usable high memory
under 4GB. We will also improve this as well, ex) TEXT_BASE in Config Blob
, but this is simple way for RAW binary for now.

> > +    +               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.h
> > +tml#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

Best Regards,
Aiden


More information about the U-Boot mailing list