On Thu, 20 Jun 2019 at 18:44, Park, Aiden <aiden.p...@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.p...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot