Message ID | A1484485FD99714DB2AB2C5EF81E7AC2AA707F62@ORSMSX116.amr.corp.intel.com |
---|---|
State | Superseded |
Delegated to: | Bin Meng |
Headers | show |
Series | [U-Boot,1/1] x86: Add basic Slim Bootloader payload support | expand |
On Thu, 20 Jun 2019 at 18:44, Park, Aiden <aiden.park@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@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
Hi Aiden, On Fri, Jun 21, 2019 at 1:44 AM Park, Aiden <aiden.park@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@intel.com> Thanks for the patch. One generic comment, please split your commit into at least the following parts: - introduce a CPU type for slimbootloader - add a slimbootloader specific serial DM driver into driver/serial - add a generic board that boots from slimbootloader (like coreboot) - add some documentation about slimbootloader support > --- > 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 > I will take a further look once the patch division is done. Thanks! Regards, Bin
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@chromium.org] > Sent: Saturday, June 22, 2019 12:11 PM > To: Park, Aiden <aiden.park@intel.com> > Cc: U-Boot Mailing List <u-boot@lists.denx.de>; Bin Meng > <bmeng.cn@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@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@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
Hi Bin, Thanks for your feedback. I am going to make new series of split patches with proper descriptions as Simon mentioned. For Slim Bootloader support documentation, let me add README file in board/slimbootloader/slimbootloader. By the way, it looks this patch needs to be abandoned to avoid mismatched commit number/subject. I am not sure how to deal with this in u-boot community. Can you help or give me your suggestion? Thanks in advance. Best Regards, Aiden > -----Original Message----- > From: Bin Meng [mailto:bmeng.cn@gmail.com] > Sent: Sunday, June 23, 2019 9:55 PM > To: Park, Aiden <aiden.park@intel.com> > Cc: U-Boot Mailing List <u-boot@lists.denx.de>; Simon Glass > <sjg@chromium.org> > Subject: Re: [PATCH 1/1] x86: Add basic Slim Bootloader payload support > > Hi Aiden, > > On Fri, Jun 21, 2019 at 1:44 AM Park, Aiden <aiden.park@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@intel.com> > > Thanks for the patch. > > One generic comment, please split your commit into at least the following parts: > > - introduce a CPU type for slimbootloader > - add a slimbootloader specific serial DM driver into driver/serial > - add a generic board that boots from slimbootloader (like coreboot) > - add some documentation about slimbootloader support > > > --- > > 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 > > > > I will take a further look once the patch division is done. Thanks! > > Regards, > Bin
Hi Aiden, On Mon, Jun 24, 2019 at 3:07 PM Park, Aiden <aiden.park@intel.com> wrote: > > Hi Bin, > > Thanks for your feedback. I am going to make new series of split patches with proper descriptions as Simon mentioned. For Slim Bootloader support documentation, let me add README file in board/slimbootloader/slimbootloader. > By the way, it looks this patch needs to be abandoned to avoid mismatched commit number/subject. I am not sure how to deal with this in u-boot community. Can you help or give me your suggestion? Thanks in advance. > I am not sure what do you mean by avoiding mismatched commit number/subject? Please avoid top-posting. Thanks! Regards, Bin
Hi Bin, I mean [PATCH 1/1] pre-fix and commit subject in this email title. If I make new series of patches, it should be [PATCH N/M] with each commits' subject. I thought it makes a little confusion. So, to avoid top-posting, what I need to do is posting new series of patches in this email, right? Best Regards, Aiden > -----Original Message----- > From: Bin Meng [mailto:bmeng.cn@gmail.com] > Sent: Monday, June 24, 2019 12:17 AM > To: Park, Aiden <aiden.park@intel.com> > Cc: U-Boot Mailing List <u-boot@lists.denx.de>; Simon Glass > <sjg@chromium.org> > Subject: Re: [PATCH 1/1] x86: Add basic Slim Bootloader payload support > > Hi Aiden, > > On Mon, Jun 24, 2019 at 3:07 PM Park, Aiden <aiden.park@intel.com> wrote: > > > > Hi Bin, > > > > Thanks for your feedback. I am going to make new series of split patches with > proper descriptions as Simon mentioned. For Slim Bootloader support > documentation, let me add README file in > board/slimbootloader/slimbootloader. > > By the way, it looks this patch needs to be abandoned to avoid mismatched > commit number/subject. I am not sure how to deal with this in u-boot > community. Can you help or give me your suggestion? Thanks in advance. > > > > I am not sure what do you mean by avoiding mismatched commit > number/subject? > > Please avoid top-posting. Thanks! > > Regards, > Bin
Hi Aiden, On Mon, Jun 24, 2019 at 3:39 PM Park, Aiden <aiden.park@intel.com> wrote: > > Hi Bin, > > I mean [PATCH 1/1] pre-fix and commit subject in this email title. If I make new series of patches, it should be [PATCH N/M] with each commits' subject. I thought it makes a little confusion. No problem. You can add the version number in the commit message. > So, to avoid top-posting, what I need to do is posting new series of patches in this email, right? I mean avoiding top-posting when replying in the ML. Regards, Bin
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; + } + + 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) + 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)) { + 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) { + 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) +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; + } + + 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 { + 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); + +#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. + +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__ */
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@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