mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 07:31:15 +00:00
board: intel: Add new slimbootloader board
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> Tested-by: Bin Meng <bmeng.cn@gmail.com> [bmeng: add slimbootloader board MAINTAINERS file] Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
19cad267d9
commit
d8f6db4768
10 changed files with 342 additions and 0 deletions
|
@ -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
|
||||
|
|
28
board/intel/slimbootloader/Kconfig
Normal file
28
board/intel/slimbootloader/Kconfig
Normal file
|
@ -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
|
6
board/intel/slimbootloader/MAINTAINERS
Normal file
6
board/intel/slimbootloader/MAINTAINERS
Normal file
|
@ -0,0 +1,6 @@
|
|||
Intel Slim Bootloader Payload
|
||||
M: Aiden Park <aiden.park@intel.com>
|
||||
S: Maintained
|
||||
F: board/intel/slimbootloader
|
||||
F: include/configs/slimbootloader.h
|
||||
F: configs/slimbootloader_defconfig
|
5
board/intel/slimbootloader/Makefile
Normal file
5
board/intel/slimbootloader/Makefile
Normal file
|
@ -0,0 +1,5 @@
|
|||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Copyright (C) 2019 Intel Corporation <www.intel.com>
|
||||
|
||||
obj-y += start.o slimbootloader.o
|
21
board/intel/slimbootloader/slimbootloader.c
Normal file
21
board/intel/slimbootloader/slimbootloader.c
Normal file
|
@ -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;
|
||||
}
|
9
board/intel/slimbootloader/start.S
Normal file
9
board/intel/slimbootloader/start.S
Normal file
|
@ -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
|
22
configs/slimbootloader_defconfig
Normal file
22
configs/slimbootloader_defconfig
Normal file
|
@ -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
|
|
@ -13,3 +13,4 @@ Intel
|
|||
edison
|
||||
galileo
|
||||
minnowmax
|
||||
slimbootloader
|
||||
|
|
174
doc/board/intel/slimbootloader.rst
Normal file
174
doc/board/intel/slimbootloader.rst
Normal file
|
@ -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
|
62
include/configs/slimbootloader.h
Normal file
62
include/configs/slimbootloader.h
Normal file
|
@ -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__ */
|
Loading…
Reference in a new issue