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

Park, Aiden aiden.park at intel.com
Mon Jun 24 06:56:27 UTC 2019


Hi Simon,

Thanks for your feedback. I will add more comment/description on new structures/functions as well as general documentation.

Best Regards,
Aiden

> -----Original Message-----
> From: Simon Glass [mailto:sjg at chromium.org]
> Sent: Saturday, June 22, 2019 12:11 PM
> To: Park, Aiden <aiden.park at intel.com>
> Cc: U-Boot Mailing List <u-boot at lists.denx.de>; Bin Meng
> <bmeng.cn at gmail.com>
> Subject: Re: [PATCH 1/1] x86: Add basic Slim Bootloader payload support
> 
> 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