[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