[U-Boot,v7,8/9] board: intel: Add new slimbootloader board
diff mbox series

Message ID A1484485FD99714DB2AB2C5EF81E7AC2AA75B6FD@ORSMSX116.amr.corp.intel.com
State Superseded
Delegated to: Bin Meng
Headers show
Series
  • x86: Add basic Slim Bootloader payload support
Related show

Commit Message

Park, Aiden July 29, 2019, 4:36 a.m. UTC
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@intel.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@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

Comments

Bin Meng Aug. 1, 2019, 5:17 a.m. UTC | #1
Hi Aiden,

On Mon, Jul 29, 2019 at 12:36 PM Park, Aiden <aiden.park@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@intel.com>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> Reviewed-by: Andy Shevchenko <andy.shevchenko@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@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
Park, Aiden Aug. 2, 2019, 2:34 a.m. UTC | #2
Hi Bin,

> -----Original Message-----
> From: Bin Meng [mailto:bmeng.cn@gmail.com]
> Sent: Thursday, August 1, 2019 2:17 PM
> To: Park, Aiden <aiden.park@intel.com>
> Cc: Andy Shevchenko <andy.shevchenko@gmail.com>; U-Boot Mailing List <u-
> boot@lists.denx.de>; Simon Glass <sjg@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@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@intel.com>
> > Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> > Reviewed-by: Andy Shevchenko <andy.shevchenko@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@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

Patch
diff mbox series

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
+	  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@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
diff --git a/include/configs/slimbootloader.h b/include/configs/slimbootloader.h
new file mode 100644
index 0000000000..e0011ed446
--- /dev/null
+++ b/include/configs/slimbootloader.h
@@ -0,0 +1,62 @@ 
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ */
+
+#ifndef __SLIMBOOTLOADER_CONFIG_H__
+#define __SLIMBOOTLOADER_CONFIG_H__
+
+#include <configs/x86-common.h>
+
+/*
+ * By default, CONFIG_SYS_NS16550_PORT_MAPPED is enabled for port io serial.
+ * To use mmio base serial, enable CONFIG_SYS_NS16550_MEM32 and disable
+ * CONFIG_SYS_NS16550_PORT_MAPPED until ns16550 driver supports serial port
+ * configuration in run-time.
+ *
+ * #define CONFIG_SYS_NS16550_MEM32
+ * #undef CONFIG_SYS_NS16550_PORT_MAPPED
+ */
+#ifdef CONFIG_SYS_NS16550_MEM32
+#undef CONFIG_SYS_NS16550_PORT_MAPPED
+#endif
+
+#define CONFIG_STD_DEVICES_SETTINGS		\
+	"stdin=serial,i8042-kbd,usbkbd\0"	\
+	"stdout=serial\0"			\
+	"stderr=serial\0"
+
+/*
+ * Override CONFIG_EXTRA_ENV_SETTINGS in x86-common.h
+ */
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#define CONFIG_EXTRA_ENV_SETTINGS		\
+	CONFIG_STD_DEVICES_SETTINGS		\
+	"netdev=eth0\0"				\
+	"consoledev=ttyS0\0"			\
+	"ramdiskaddr=0x4000000\0"		\
+	"ramdiskfile=initrd\0"			\
+	"bootdev=usb\0"				\
+	"bootdevnum=0\0"			\
+	"bootdevpart=0\0"			\
+	"bootfsload=fatload\0"			\
+	"bootusb=setenv bootdev usb; boot\0"	\
+	"bootscsi=setenv bootdev scsi; boot\0"	\
+	"bootmmc=setenv bootdev mmc; boot\0"	\
+	"bootargs=console=ttyS0,115200 console=tty0\0"
+
+/*
+ * Override CONFIG_BOOTCOMMAND in x86-common.h
+ */
+#undef CONFIG_BOOTCOMMAND
+#define CONFIG_BOOTCOMMAND						\
+	"if test ${bootdev} = \"usb\"; then ${bootdev} start; fi; "	\
+	"if test ${bootdev} = \"scsi\"; then ${bootdev} scan; fi; "	\
+	"${bootdev} info; "						\
+	"${bootfsload} ${bootdev} ${bootdevnum}:${bootdevpart} "	\
+	"${loadaddr} ${bootfile}; "					\
+	"${bootfsload} ${bootdev} ${bootdevnum}:${bootdevpart} "	\
+	"${ramdiskaddr} ${ramdiskfile}; "				\
+	"zboot ${loadaddr} 0 ${ramdiskaddr} ${filesize}"
+
+#endif /* __SLIMBOOTLOADER_CONFIG_H__ */