[U-Boot] [PATCH 1/1] x86: Add basic Slim Bootloader payload support

Simon Glass sjg at chromium.org
Sat Jun 22 19:11:02 UTC 2019


On Thu, 20 Jun 2019 at 18:44, Park, Aiden <aiden.park at intel.com> wrote:
>
> This patch is to enable u-boot as a payload which runs on top of
> Slim Bootloader(https://github.com/slimbootloader/slimbootloader)
> boot firmware for x86 platforms.
>
> Added new SLIMBOOTLOADER SYS/VENDOR/TARGET CONFIG
> - New arch/x86/cpu/slimbootloader directory with minimum codes
> - New board/slimbootloader directory with minimum codes
> - New dts, defconfig and configuration files
>
> Modified x86 files with minimum changes
> - Kconfig and Makefile to enable new CONFIG
> - arch_global_data structure to enable hob_list pointer
> - init_cache_f_r to skip mtrr_commit
>
> Signed-off-by: Aiden Park <aiden.park at intel.com>
> ---
>  arch/x86/Kconfig                              |   5 +
>  arch/x86/cpu/Makefile                         |   1 +
>  arch/x86/cpu/slimbootloader/Kconfig           |  23 ++++
>  arch/x86/cpu/slimbootloader/Makefile          |   5 +
>  arch/x86/cpu/slimbootloader/car.S             |  10 ++
>  arch/x86/cpu/slimbootloader/slimbootloader.c  | 117 ++++++++++++++++++
>  .../cpu/slimbootloader/slimbootloader_hob.c   |  67 ++++++++++
>  .../slimbootloader/slimbootloader_serial.c    |  66 ++++++++++
>  arch/x86/dts/Makefile                         |   3 +-
>  arch/x86/dts/slimbootloader.dts               |  33 +++++
>  .../asm/arch-slimbootloader/slimbootloader.h  |  78 ++++++++++++
>  arch/x86/include/asm/global_data.h            |   2 +-
>  arch/x86/lib/asm-offsets.c                    |   2 +-
>  arch/x86/lib/init_helpers.c                   |   2 +-
>  board/slimbootloader/Kconfig                  |  21 ++++
>  board/slimbootloader/slimbootloader/Kconfig   |  51 ++++++++
>  board/slimbootloader/slimbootloader/Makefile  |   5 +
>  .../slimbootloader/slimbootloader.c           |  60 +++++++++
>  .../slimbootloader/slimbootloader_start.S     |  31 +++++
>  configs/slimbootloader_defconfig              |  64 ++++++++++
>  include/configs/slimbootloader.h              |  54 ++++++++
>  21 files changed, 696 insertions(+), 4 deletions(-)
>  create mode 100644 arch/x86/cpu/slimbootloader/Kconfig
>  create mode 100644 arch/x86/cpu/slimbootloader/Makefile
>  create mode 100644 arch/x86/cpu/slimbootloader/car.S
>  create mode 100644 arch/x86/cpu/slimbootloader/slimbootloader.c
>  create mode 100644 arch/x86/cpu/slimbootloader/slimbootloader_hob.c
>  create mode 100644 arch/x86/cpu/slimbootloader/slimbootloader_serial.c
>  create mode 100644 arch/x86/dts/slimbootloader.dts
>  create mode 100644 arch/x86/include/asm/arch-slimbootloader/slimbootloader.h
>  create mode 100644 board/slimbootloader/Kconfig
>  create mode 100644 board/slimbootloader/slimbootloader/Kconfig
>  create mode 100644 board/slimbootloader/slimbootloader/Makefile
>  create mode 100644 board/slimbootloader/slimbootloader/slimbootloader.c
>  create mode 100644 board/slimbootloader/slimbootloader/slimbootloader_start.S
>  create mode 100644 configs/slimbootloader_defconfig
>  create mode 100644 include/configs/slimbootloader.h

My main comment is that this needs some documetation.

>
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 70f939869a..3d57466a63 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -77,6 +77,9 @@ config VENDOR_GOOGLE
>  config VENDOR_INTEL
>         bool "Intel"
>
> +config VENDOR_SLIMBOOTLOADER
> +       bool "slimbootloader"
> +
>  endchoice
>
>  # subarchitectures-specific options below
> @@ -104,6 +107,7 @@ source "board/efi/Kconfig"
>  source "board/emulation/Kconfig"
>  source "board/google/Kconfig"
>  source "board/intel/Kconfig"
> +source "board/slimbootloader/Kconfig"
>
>  # platform-specific options below
>  source "arch/x86/cpu/baytrail/Kconfig"
> @@ -116,6 +120,7 @@ source "arch/x86/cpu/qemu/Kconfig"
>  source "arch/x86/cpu/quark/Kconfig"
>  source "arch/x86/cpu/queensbay/Kconfig"
>  source "arch/x86/cpu/tangier/Kconfig"
> +source "arch/x86/cpu/slimbootloader/Kconfig"
>
>  # architecture-specific options below
>
> diff --git a/arch/x86/cpu/Makefile b/arch/x86/cpu/Makefile
> index 85fd5e616e..a5c0113fa4 100644
> --- a/arch/x86/cpu/Makefile
> +++ b/arch/x86/cpu/Makefile
> @@ -48,6 +48,7 @@ obj-$(CONFIG_NORTHBRIDGE_INTEL_IVYBRIDGE) += ivybridge/
>  obj-$(CONFIG_INTEL_QUARK) += quark/
>  obj-$(CONFIG_INTEL_QUEENSBAY) += queensbay/
>  obj-$(CONFIG_INTEL_TANGIER) += tangier/
> +obj-$(CONFIG_SYS_SLIMBOOTLOADER) += slimbootloader/
>  obj-$(CONFIG_APIC) += lapic.o ioapic.o
>  obj-y += irq.o
>  ifndef CONFIG_$(SPL_)X86_64
> diff --git a/arch/x86/cpu/slimbootloader/Kconfig b/arch/x86/cpu/slimbootloader/Kconfig
> new file mode 100644
> index 0000000000..e7513afd5b
> --- /dev/null
> +++ b/arch/x86/cpu/slimbootloader/Kconfig
> @@ -0,0 +1,23 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +# Copyright (C) 2019 Intel Corporation <www.intel.com>
> +
> +if TARGET_SLIMBOOTLOADER
> +
> +config SYS_SLIMBOOTLOADER
> +       bool
> +       default y
> +       imply SYS_NS16550
> +       imply AHCI_PCI
> +       imply SCSI
> +       imply SCSI_AHCI
> +       imply MMC
> +       imply MMC_PCI
> +       imply MMC_SDHCI
> +       imply MMC_SDHCI_SDMA
> +       imply USB
> +       imply USB_EHCI_HCD
> +       imply USB_XHCI_HCD
> +       imply USB_STORAGE
> +
> +endif
> diff --git a/arch/x86/cpu/slimbootloader/Makefile b/arch/x86/cpu/slimbootloader/Makefile
> new file mode 100644
> index 0000000000..45a62d5e43
> --- /dev/null
> +++ b/arch/x86/cpu/slimbootloader/Makefile
> @@ -0,0 +1,5 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +# Copyright (C) 2019 Intel Corporation <www.intel.com>
> +
> +obj-y += car.o slimbootloader.o slimbootloader_hob.o slimbootloader_serial.o
> diff --git a/arch/x86/cpu/slimbootloader/car.S b/arch/x86/cpu/slimbootloader/car.S
> new file mode 100644
> index 0000000000..5d71cf7034
> --- /dev/null
> +++ b/arch/x86/cpu/slimbootloader/car.S
> @@ -0,0 +1,10 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + */
> +
> +.section .text
> +
> +.globl car_init
> +car_init:
> +       jmp     car_init_ret
> diff --git a/arch/x86/cpu/slimbootloader/slimbootloader.c b/arch/x86/cpu/slimbootloader/slimbootloader.c
> new file mode 100644
> index 0000000000..86bae393b3
> --- /dev/null
> +++ b/arch/x86/cpu/slimbootloader/slimbootloader.c
> @@ -0,0 +1,117 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + */
> +
> +#include <common.h>
> +#include <asm/e820.h>
> +#include <asm/arch/slimbootloader.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +int arch_cpu_init(void)
> +{
> +       return x86_cpu_init_f();
> +}
> +
> +int checkcpu(void)
> +{
> +       return 0;
> +}
> +
> +int print_cpuinfo(void)
> +{
> +       return default_print_cpuinfo();
> +}
> +
> +ulong board_get_usable_ram_top(ulong total_size)
> +{
> +       struct memory_map_info *data = NULL;
> +       const struct efi_guid guid = LOADER_MEMORY_MAP_INFO_GUID;
> +       int i = 0;
> +       phys_addr_t addr_max = 0;
> +       phys_addr_t addr_end = 0;
> +       phys_addr_t size_max = 0;
> +       phys_addr_t size_cur = 0;
> +
> +       data = (struct memory_map_info *)
> +               get_guid_hob_data_len(gd->arch.hob_list, NULL, &guid);
> +       if (!data) {
> +               debug("memory map info hob not found\n");
> +               return gd->ram_size;
> +       }
> +
> +       for (i = 0; i < data->count; i++) {
> +               if (data->entry[i].type == E820_RAM) {
> +                       size_cur = data->entry[i].size;
> +                       addr_end = data->entry[i].addr + size_cur;
> +                       if (addr_end < 1ULL << 32 && size_cur > size_max) {
> +                               size_max = size_cur;
> +                               addr_max = addr_end;
> +                       }
> +               }
> +       }
> +
> +       return addr_max;
> +}
> +
> +int dram_init(void)
> +{
> +       struct memory_map_info *data = NULL;
> +       const struct efi_guid guid = LOADER_MEMORY_MAP_INFO_GUID;
> +       int i = 0;
> +       phys_addr_t addr_max = 0;
> +       phys_addr_t addr_end = 0;
> +
> +       data = (struct memory_map_info *)
> +               get_guid_hob_data_len(gd->arch.hob_list, NULL, &guid);
> +       if (!data) {
> +               debug("memory map info hob not found\n");
> +               return -1;

return -ENOENT perhaps?

> +       }
> +
> +       for (i = 0; i < data->count; i++) {
> +               if (data->entry[i].type == E820_RAM) {
> +                       addr_end = data->entry[i].addr + data->entry[i].size;
> +                       if (addr_end > addr_max)
> +                               addr_max = addr_end;
> +               }
> +       }
> +
> +       gd->ram_size = (unsigned long)addr_max;
> +
> +       return 0;
> +}
> +
> +int dram_init_banksize(void)
> +{
> +       gd->bd->bi_dram[0].start = 0;
> +       gd->bd->bi_dram[0].size = gd->ram_size;
> +
> +       return 0;
> +}
> +
> +unsigned int install_e820_map(unsigned int max_entries,
> +                             struct e820_entry *entries)
> +{
> +       struct memory_map_info *data = NULL;
> +       const struct efi_guid guid = LOADER_MEMORY_MAP_INFO_GUID;
> +       int i = 0;
> +       unsigned int num_entries = 0;
> +
> +       data = (struct memory_map_info *)
> +               get_guid_hob_data_len(gd->arch.hob_list, NULL, &guid);
> +       if (!data) {
> +               debug("memory map info hob not found\n");
> +               return 0;
> +       }
> +
> +       for (i = 0; i < data->count; i++) {
> +               entries[num_entries].addr = data->entry[i].addr;
> +               entries[num_entries].size = data->entry[i].size;
> +               entries[num_entries].type = data->entry[i].type;
> +               num_entries++;
> +       }
> +
> +       return num_entries;
> +}
> diff --git a/arch/x86/cpu/slimbootloader/slimbootloader_hob.c b/arch/x86/cpu/slimbootloader/slimbootloader_hob.c
> new file mode 100644
> index 0000000000..dd1a19757f
> --- /dev/null
> +++ b/arch/x86/cpu/slimbootloader/slimbootloader_hob.c
> @@ -0,0 +1,67 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + */
> +
> +#include <common.h>
> +#include <asm/fsp/fsp_types.h>
> +#include <asm/fsp/fsp_hob.h>
> +
> +bool compare_guid(const struct efi_guid *guid1,
> +                 const struct efi_guid *guid2)
> +{
> +       if (memcmp(guid1, guid2, sizeof(struct efi_guid)) == 0)

if (!memcmp(...

> +               return true;
> +       else
> +               return false;
> +}
> +
> +const struct hob_header *get_next_hob_from_hdr(uint type,
> +                                              const void *hob_list)
> +{
> +       const struct hob_header *hdr;
> +
> +       hdr = hob_list;
> +
> +       /* Parse the HOB list until end of list or matching type is found */
> +       while (!end_of_hob(hdr)) {

Could be a for() loop

> +               if (hdr->type == type)
> +                       return hdr;
> +
> +               hdr = get_next_hob(hdr);
> +       }
> +
> +       return NULL;
> +}
> +
> +const struct hob_header *get_next_guid_hob(const struct efi_guid *guid,
> +                                          const void *hob_list)
> +{
> +       const struct hob_header *hdr;
> +       struct hob_guid *guid_hob;
> +
> +       hdr = hob_list;
> +       while ((hdr = get_next_hob_from_hdr(HOB_TYPE_GUID_EXT, hdr)) != NULL) {

s/!= NULL//

> +               guid_hob = (struct hob_guid *)hdr;
> +               if (compare_guid(guid, &guid_hob->name))
> +                       break;
> +               hdr = get_next_hob(hdr);
> +       }
> +
> +       return hdr;
> +}
> +
> +void *get_guid_hob_data_len(const void *hob_list, u32 *len,
> +                           const struct efi_guid *guid)
> +{
> +       const struct hob_header *guid_hob;
> +
> +       guid_hob = get_next_guid_hob(guid, hob_list);
> +       if (!guid_hob)
> +               return NULL;
> +
> +       if (len)
> +               *len = get_guid_hob_data_size(guid_hob);
> +
> +       return get_guid_hob_data(guid_hob);
> +}
> diff --git a/arch/x86/cpu/slimbootloader/slimbootloader_serial.c b/arch/x86/cpu/slimbootloader/slimbootloader_serial.c
> new file mode 100644
> index 0000000000..81bd085a35
> --- /dev/null
> +++ b/arch/x86/cpu/slimbootloader/slimbootloader_serial.c
> @@ -0,0 +1,66 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <ns16550.h>
> +#include <serial.h>
> +#include <asm/arch/slimbootloader.h>
> +
> +#if CONFIG_IS_ENABLED(DM_SERIAL)
> +#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)

You should be able to drop all of these, since you contract the
options used by slimbootloader.

> +int slimbootloader_serial_ofdata_to_platdata(struct udevice *dev)
> +{
> +       const struct efi_guid guid = LOADER_SERIAL_PORT_INFO_GUID;
> +       struct serial_port_info *serial_info = NULL;
> +       struct ns16550_platdata *plat = dev->platdata;
> +
> +       if (!gd->arch.hob_list) {
> +               debug("hoblist not found\n");
> +               return -1;

Please use proper error codes throughout.

> +       }
> +
> +       serial_info = (struct serial_port_info *)
> +           get_guid_hob_data_len(gd->arch.hob_list, NULL, &guid);
> +
> +       if (!serial_info) {
> +               debug("failed to get serial port information\n");
> +               return -1;
> +       }
> +       debug("type:%d base=0x%08x baudrate=%d stride=%d clk=%d\n",
> +             serial_info->type,
> +             serial_info->base,
> +             serial_info->baud,
> +             serial_info->stride,
> +             serial_info->clk);
> +
> +       plat->base = serial_info->base;
> +       plat->reg_shift = (serial_info->stride >> 1);
> +       plat->clock = serial_info->clk;
> +
> +       return 0;
> +}
> +
> +static const struct udevice_id slimbootloader_serial_ids[] = {
> +       { .compatible = "intel,slimbootloader-uart" },
> +       {}
> +};
> +#endif /* OF_CONTROL && !OF_PLATDATA */
> +
> +#if CONFIG_IS_ENABLED(SERIAL_PRESENT)
> +U_BOOT_DRIVER(serial_slimbootloader) = {
> +       .name   = "serial_slimbootloader",
> +       .id     = UCLASS_SERIAL,
> +#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
> +       .of_match = slimbootloader_serial_ids,
> +       .ofdata_to_platdata = slimbootloader_serial_ofdata_to_platdata,
> +       .platdata_auto_alloc_size = sizeof(struct ns16550_platdata),
> +#endif
> +       .priv_auto_alloc_size = sizeof(struct NS16550),
> +       .probe  = ns16550_serial_probe,
> +       .ops    = &ns16550_serial_ops,
> +};
> +#endif /* SERIAL_PRESENT */
> +#endif /* DM_SERIAL */
> diff --git a/arch/x86/dts/Makefile b/arch/x86/dts/Makefile
> index fa717bc096..7c382f416b 100644
> --- a/arch/x86/dts/Makefile
> +++ b/arch/x86/dts/Makefile
> @@ -18,7 +18,8 @@ dtb-y += bayleybay.dtb \
>         qemu-x86_i440fx.dtb \
>         qemu-x86_q35.dtb \
>         theadorable-x86-dfi-bt700.dtb \
> -       baytrail_som-db5800-som-6867.dtb
> +       baytrail_som-db5800-som-6867.dtb \
> +       slimbootloader.dtb
>
>  targets += $(dtb-y)
>
> diff --git a/arch/x86/dts/slimbootloader.dts b/arch/x86/dts/slimbootloader.dts
> new file mode 100644
> index 0000000000..c8eec610a8
> --- /dev/null
> +++ b/arch/x86/dts/slimbootloader.dts
> @@ -0,0 +1,33 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + */
> +
> +/dts-v1/;
> +
> +/include/ "skeleton.dtsi"
> +/include/ "keyboard.dtsi"
> +/include/ "reset.dtsi"
> +/include/ "rtc.dtsi"
> +/include/ "tsc_timer.dtsi"
> +
> +/ {
> +       model = "slimbootloader x86 payload";
> +       compatible = "slimbootloader,x86-payload";
> +
> +       config {
> +               silent_console = <0>;
> +       };
> +
> +       chosen {
> +               stdout-path = &serial;
> +       };
> +
> +       serial: serial {
> +               compatible = "intel,slimbootloader-uart";
> +       };
> +
> +       pci {
> +               compatible = "pci-x86";
> +       };
> +};
> diff --git a/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h b/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h
> new file mode 100644
> index 0000000000..d9edaa5e36
> --- /dev/null
> +++ b/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h
> @@ -0,0 +1,78 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + */
> +
> +#ifndef __SLIMBOOTLOADER_ARCH_H__
> +#define __SLIMBOOTLOADER_ARCH_H__
> +
> +#include <common.h>
> +#include <asm/fsp/fsp_types.h>
> +#include <asm/fsp/fsp_hob.h>
> +
> +#define LOADER_SERIAL_PORT_INFO_GUID \
> +       { \
> +       0x6c6872fe, 0x56a9, 0x4403, \
> +       { 0xbb, 0x98, 0x95, 0x8d, 0x62, 0xde, 0x87, 0xf1 } \
> +       }
> +
> +#define LOADER_MEMORY_MAP_INFO_GUID \
> +       { \
> +       0xa1ff7424, 0x7a1a, 0x478e, \
> +       { 0xa9, 0xe4, 0x92, 0xf3, 0x57, 0xd1, 0x28, 0x32 } \
> +       }
> +
> +#define LOADER_PERFORMANCE_INFO_GUID \
> +       { \
> +       0x868204be, 0x23d0, 0x4ff9, \
> +       { 0xac, 0x34, 0xb9, 0x95, 0xac, 0x04, 0xb1, 0xb9 } \
> +       }
> +
> +struct performance_info {

Comments on these structs

> +       u8      rev;
> +       u8      rsvd0[3];
> +       u16     count;
> +       u16     flags;
> +       u32     frequency;
> +       u64     timestamp[0];
> +} __packed;
> +
> +struct memory_map_entry {
> +       phys_addr_t     addr;
> +       phys_size_t     size;
> +       u8      type;
> +       u8      flag;
> +       u8      rsvd[6];
> +} __packed;
> +
> +struct memory_map_info {
> +       u8      rev;
> +       u8      rsvd0[3];
> +       u32     count;
> +       struct memory_map_entry entry[0];
> +} __packed;
> +
> +struct serial_port_info {
> +       u8      rev;
> +       u8      rsvd0[3];
> +       u32     type;
> +       u32     base;
> +       u32     baud;
> +       u32     stride;
> +       u32     clk;
> +       u32     rsvd1;
> +} __packed;
> +
> +bool compare_guid(const struct efi_guid *guid1,
> +                 const struct efi_guid *guid2);
> +
> +const struct hob_header *get_next_hob_from_hdr(uint type,
> +                                              const void *hob_list);
> +
> +const struct hob_header *get_next_guid_hob(const struct efi_guid *guid,
> +                                          const void *hob_list);
> +
> +void *get_guid_hob_data_len(const void *hob_list, u32 *len,
> +                           const struct efi_guid *guid);

and these functions

> +
> +#endif
> diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
> index 9398ec33b2..674efaaa01 100644
> --- a/arch/x86/include/asm/global_data.h
> +++ b/arch/x86/include/asm/global_data.h
> @@ -83,7 +83,7 @@ struct arch_global_data {
>         const struct pch_gpio_map *gpio_map;    /* board GPIO map */
>         struct memory_info meminfo;     /* Memory information */
>         struct pei_memory_info pei_meminfo;     /* PEI memory information */
> -#ifdef CONFIG_HAVE_FSP
> +#if defined(CONFIG_HAVE_FSP) || defined(CONFIG_SYS_SLIMBOOTLOADER)
>         void *hob_list;                 /* FSP HOB list */
>  #endif
>         struct mtrr_request mtrr_req[MAX_MTRR_REQUESTS];
> diff --git a/arch/x86/lib/asm-offsets.c b/arch/x86/lib/asm-offsets.c
> index 90dce22b25..258c0bbc2c 100644
> --- a/arch/x86/lib/asm-offsets.c
> +++ b/arch/x86/lib/asm-offsets.c
> @@ -17,7 +17,7 @@
>  int main(void)
>  {
>         DEFINE(GD_BIST, offsetof(gd_t, arch.bist));
> -#ifdef CONFIG_HAVE_FSP
> +#if defined(CONFIG_HAVE_FSP) || defined(CONFIG_SYS_SLIMBOOTLOADER)
>         DEFINE(GD_HOB_LIST, offsetof(gd_t, arch.hob_list));
>  #endif
>         DEFINE(GD_TABLE, offsetof(gd_t, arch.table));
> diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c
> index ac85278cdf..2c6e6a4252 100644
> --- a/arch/x86/lib/init_helpers.c
> +++ b/arch/x86/lib/init_helpers.c
> @@ -21,7 +21,7 @@ int init_cache_f_r(void)
>  #if (CONFIG_IS_ENABLED(X86_32BIT_INIT) || \
>       (!defined(CONFIG_SPL_BUILD) && \
>        !CONFIG_IS_ENABLED(CONFIG_X86_RUN_64BIT))) && \
> -    !defined(CONFIG_HAVE_FSP)
> +    !defined(CONFIG_HAVE_FSP) && !defined(CONFIG_SYS_SLIMBOOTLOADER)
>         int ret;
>
>         ret = mtrr_commit(false);
> diff --git a/board/slimbootloader/Kconfig b/board/slimbootloader/Kconfig
> new file mode 100644
> index 0000000000..4822c451e6
> --- /dev/null
> +++ b/board/slimbootloader/Kconfig
> @@ -0,0 +1,21 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +# Copyright (C) 2019 Intel Corporation <www.intel.com>
> +
> +if VENDOR_SLIMBOOTLOADER
> +
> +choice
> +       prompt "Select a board"
> +       optional
> +
> +config TARGET_SLIMBOOTLOADER
> +       bool "slimbootloader"
> +       help
> +         This target is used for running U-Boot on top of
> +         Slim Bootloader as a payload.

This needs more detail. Perhaps a pointer to a README also.

> +
> +endchoice
> +
> +source "board/slimbootloader/slimbootloader/Kconfig"
> +
> +endif
> diff --git a/board/slimbootloader/slimbootloader/Kconfig b/board/slimbootloader/slimbootloader/Kconfig
> new file mode 100644
> index 0000000000..7262f2bf1b
> --- /dev/null
> +++ b/board/slimbootloader/slimbootloader/Kconfig
> @@ -0,0 +1,51 @@
> +# 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 "slimbootloader"
> +
> +config SYS_SOC
> +       default "slimbootloader"
> +
> +config SYS_TEXT_BASE
> +       default 0x00100000
> +
> +comment "slimbootloader-specific options"
> +
> +config SYS_CONFIG_NAME
> +       string "Board configuration file"
> +       default "slimbootloader"
> +       help
> +         This option selects the board configuration file in include/configs/
> +         directory to be used to build U-Boot for Slim Bootloader.
> +
> +config DEFAULT_DEVICE_TREE
> +       string "Board Device Tree Source (dts) file"
> +       default "slimbootloader"
> +       help
> +         This option selects the board Device Tree Source (dts) file in
> +         arch/x86/dts/ directory to be used to build U-Boot for Slim Bootloader.
> +
> +config SYS_CAR_ADDR
> +       hex "Board specific Cache-As-RAM (CAR) address"
> +       default 0x00000000
> +       help
> +         This option specifies the board specific Cache-As-RAM (CAR) address.
> +         But, CAR is not required for Slim Bootloader environment since it
> +         has already initialized memory and launched u-boot as a payload.
> +
> +config SYS_CAR_SIZE
> +       hex "Board specific Cache-As-RAM (CAR) size"
> +       default 0x0000
> +       help
> +         This option specifies the board specific Cache-As-RAM (CAR) size.
> +         But, CAR is not required for Slim Bootloader environment since it
> +         has already initialized memory and launched u-boot as a payload.
> +
> +endif
> diff --git a/board/slimbootloader/slimbootloader/Makefile b/board/slimbootloader/slimbootloader/Makefile
> new file mode 100644
> index 0000000000..f591943a78
> --- /dev/null
> +++ b/board/slimbootloader/slimbootloader/Makefile
> @@ -0,0 +1,5 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +# Copyright (C) 2019 Intel Corporation <www.intel.com>
> +
> +obj-y  += slimbootloader_start.o slimbootloader.o
> diff --git a/board/slimbootloader/slimbootloader/slimbootloader.c b/board/slimbootloader/slimbootloader/slimbootloader.c
> new file mode 100644
> index 0000000000..653e6ec077
> --- /dev/null
> +++ b/board/slimbootloader/slimbootloader/slimbootloader.c
> @@ -0,0 +1,60 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + */
> +
> +#include <common.h>
> +#include <debug_uart.h>
> +#include <asm/io.h>
> +#include <asm/arch/slimbootloader.h>
> +#include <relocate.h>
> +#include <dm.h>
> +#include <ns16550.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static void board_early_init_tsc(void)
> +{
> +       struct performance_info *data = NULL;
> +       const struct efi_guid guid = LOADER_PERFORMANCE_INFO_GUID;
> +
> +       gd->arch.tsc_base = rdtsc();
> +       debug("tsc_base=0x%llx\n", gd->arch.tsc_base);
> +
> +       data = (struct performance_info *)
> +               get_guid_hob_data_len(gd->arch.hob_list, NULL, &guid);
> +
> +       if (!data) {
> +               debug("performance info hob not found\n");
> +               return;
> +       }
> +       gd->arch.clock_rate = data->frequency * 1000;
> +       debug("freq=0x%lx\n", gd->arch.clock_rate);
> +}
> +
> +int board_early_init_f(void)
> +{
> +       return 0;
> +}
> +
> +int arch_early_init_r(void)
> +{
> +       return 0;
> +}
> +
> +int board_early_init_r(void)
> +{
> +       pci_init();
> +       return 0;
> +}
> +
> +int slimbootloader_main(void)
> +{
> +       debug("%s\n", __func__);
> +       debug("hoblist=0x%p\n", gd->arch.hob_list);
> +       board_early_init_tsc();
> +       board_init_f(0);
> +       board_init_f_r_trampoline(gd->start_addr_sp);
> +
> +       return 0;
> +}
> diff --git a/board/slimbootloader/slimbootloader/slimbootloader_start.S b/board/slimbootloader/slimbootloader/slimbootloader_start.S
> new file mode 100644
> index 0000000000..d884708b69
> --- /dev/null
> +++ b/board/slimbootloader/slimbootloader/slimbootloader_start.S
> @@ -0,0 +1,31 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + */
> +
> +#include <generated/asm-offsets.h>
> +
> +.globl slimbootloader_start
> +slimbootloader_start:
> +       mov     0x4(%esp), %esi
> +
> +       /* Set up global data */
> +       mov     %esp, %eax
> +       call    board_init_f_alloc_reserve
> +       mov     %eax, %esp
> +       call    board_init_f_init_reserve
> +
> +#ifdef CONFIG_DEBUG_UART
> +       call    debug_uart_init
> +#endif
> +
> +       /* Get address of global_data */
> +       mov     %fs:0, %edx
> +
> +       movl    %esi, GD_HOB_LIST(%edx)
> +       call    slimbootloader_main
> +
> +/* board early initialization */
> +.globl early_board_init
> +early_board_init:
> +       jmp     slimbootloader_start
> diff --git a/configs/slimbootloader_defconfig b/configs/slimbootloader_defconfig
> new file mode 100644
> index 0000000000..77ff3257b6
> --- /dev/null
> +++ b/configs/slimbootloader_defconfig
> @@ -0,0 +1,64 @@
> +CONFIG_X86=y
> +CONFIG_VENDOR_SLIMBOOTLOADER=y
> +CONFIG_TARGET_SLIMBOOTLOADER=y
> +CONFIG_X86_LOAD_FROM_32_BIT=y
> +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_OF_EMBED=y
> +CONFIG_BOOTSTAGE=y
> +CONFIG_BOOTSTAGE_REPORT=y
> +CONFIG_BOOTDELAY=10
> +CONFIG_CONSOLE_SCROLL_LINES=5
> +# CONFIG_PCI_PNP is not set
> +# CONFIG_I8259_PIC is not set
> +# CONFIG_APIC is not set
> +# CONFIG_CMD_EXT4_WRITE is not set
> +# CONFIG_CMD_FS_GENERIC is not set
> +# CONFIG_CMD_PART is not set
> +# CONFIG_CMD_TIME is not set
> +# CONFIG_CMD_BOOTSTAGE is not set
> +# CONFIG_CMD_DM is not set
> +# CONFIG_CMD_FLASH is not set
> +# CONFIG_CMD_LOADB is not set
> +# CONFIG_CMD_LOADS is not set
> +# CONFIG_CMD_SF_TEST is not set
> +# CONFIG_CMD_ECHO is not set
> +# CONFIG_CMD_ITEST is not set
> +# CONFIG_CMD_SETEXPR is not set
> +# CONFIG_CMD_NET is not set
> +# CONFIG_CMD_BOOTP is not set
> +# CONFIG_CMD_BLOCK_CACHE is not set
> +# CONFIG_CMD_DATE is not set
> +# CONFIG_CMD_GETTIME is not set
> +# CONFIG_CMD_MISC is not set
> +# CONFIG_CMD_IRQ is not set
> +# CONFIG_CMD_ELF is not set
> +# CONFIG_CMD_IMI is not set
> +# CONFIG_CMD_XIMG is not set
> +# CONFIG_CMD_EXPORTENV is not set
> +# CONFIG_CMD_IMPORTENV is not set
> +# CONFIG_CMD_FDT is not set
> +# CONFIG_CMD_GO is not set
> +# CONFIG_CMD_SAVEENV is not set
> +# CONFIG_CMD_SOURCE is not set
> +# CONFIG_DM_KEYBOARD is not set
> +# CONFIG_DM_VIDEO is not set
> +# CONFIG_DM_GPIO is not set
> +# CONFIG_MMC_VERBOSE is not set
> +# CONFIG_GZIP is not set
> +# CONFIG_HEXDUMP is not set
> +# CONFIG_EFI_LOADER is not set
> +# CONFIG_GENERATE_SMBIOS_TABLE is not set
> +# CONFIG_IMAGE_FORMAT_LEGACY is not set
> +# CONFIG_FIT is not set
> diff --git a/include/configs/slimbootloader.h b/include/configs/slimbootloader.h
> new file mode 100644
> index 0000000000..bfd188de2c
> --- /dev/null
> +++ b/include/configs/slimbootloader.h
> @@ -0,0 +1,54 @@
> +/* 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>
> +
> +#undef CONFIG_NFSBOOTCOMMAND
> +#undef CONFIG_RAMBOOTCOMMAND
> +#undef CONFIG_EXTRA_ENV_SETTINGS
> +#undef CONFIG_BOOTCOMMAND
> +
> +/*-----------------------------------------------------------------------
> + * For MEM32 uart
> + */
> +/*#define CONFIG_SYS_NS16550_MEM32*/
> +#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"
> +
> +#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"
> +
> +#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__ */
> --
>
 2.20.1
>

Regards,
Simon


More information about the U-Boot mailing list