diff --git a/src/Kconfig b/src/Kconfig index 865f7f5c5b..35628877f7 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -248,6 +248,7 @@ config FLASHMAP_OFFSET help Offset of flash map in firmware image +# TODO: This doesn't belong here, move to src/arch/x86/Kconfig choice prompt "Bootblock behaviour" default BOOTBLOCK_SIMPLE @@ -260,6 +261,12 @@ config BOOTBLOCK_NORMAL endchoice +# To be selected by arch, SoC or mainboard if it does not want use the normal +# src/lib/bootblock.c#main() C entry point. +config BOOTBLOCK_CUSTOM + bool + default n + config BOOTBLOCK_SOURCE string default "bootblock_simple.c" if BOOTBLOCK_SIMPLE diff --git a/src/arch/arm/Kconfig b/src/arch/arm/Kconfig index 2499d2d075..9f14dda4e7 100644 --- a/src/arch/arm/Kconfig +++ b/src/arch/arm/Kconfig @@ -22,12 +22,6 @@ config ARCH_RAMSTAGE_ARM source src/arch/arm/armv4/Kconfig source src/arch/arm/armv7/Kconfig -# If a custom bootblock is necessary, this option should be "select"-ed by -# the thing that needs it, probably the CPU. -config ARM_BOOTBLOCK_CUSTOM - bool - default n - config ARM_LPAE bool default n diff --git a/src/arch/arm/armv4/Makefile.inc b/src/arch/arm/armv4/Makefile.inc index a8c31c8069..ee1879cf8f 100644 --- a/src/arch/arm/armv4/Makefile.inc +++ b/src/arch/arm/armv4/Makefile.inc @@ -24,9 +24,8 @@ armv4_flags = -marm -march=armv4t -I$(src)/arch/arm/include/armv4/ \ ifeq ($(CONFIG_ARCH_BOOTBLOCK_ARMV4),y) -ifneq ($(CONFIG_ARM_BOOTBLOCK_CUSTOM),y) +ifneq ($(CONFIG_BOOTBLOCK_CUSTOM),y) bootblock-y += bootblock.S -bootblock-y += bootblock_simple.c endif bootblock-y += cache.c diff --git a/src/arch/arm/armv7/Makefile.inc b/src/arch/arm/armv7/Makefile.inc index a4391e9b3e..3a489cb259 100644 --- a/src/arch/arm/armv7/Makefile.inc +++ b/src/arch/arm/armv7/Makefile.inc @@ -31,9 +31,8 @@ ifeq ($(CONFIG_ARCH_BOOTBLOCK_ARMV7),y) bootblock-c-ccopts += $(armv7-a_flags) bootblock-S-ccopts += $(armv7-a_asm_flags) -ifneq ($(CONFIG_ARM_BOOTBLOCK_CUSTOM),y) +ifneq ($(CONFIG_BOOTBLOCK_CUSTOM),y) bootblock-y += bootblock.S -bootblock-$(CONFIG_BOOTBLOCK_SIMPLE) += bootblock_simple.c endif bootblock-y += cache.c @@ -46,9 +45,8 @@ else ifeq ($(CONFIG_ARCH_BOOTBLOCK_ARMV7_M),y) bootblock-c-ccopts += $(armv7-m_flags) bootblock-S-ccopts += $(armv7-m_asm_flags) -ifneq ($(CONFIG_ARM_BOOTBLOCK_CUSTOM),y) +ifneq ($(CONFIG_BOOTBLOCK_CUSTOM),y) bootblock-y += bootblock_m.S -bootblock-y += bootblock_simple.c endif bootblock-y += exception_m.c bootblock-y += cache_m.c diff --git a/src/arch/arm64/Kconfig b/src/arch/arm64/Kconfig index 2c8713224c..9b06589f82 100644 --- a/src/arch/arm64/Kconfig +++ b/src/arch/arm64/Kconfig @@ -22,12 +22,6 @@ config ARCH_RAMSTAGE_ARM64 source src/arch/arm64/armv8/Kconfig source src/arch/arm64/cpu/Kconfig -# If a custom bootblock is necessary, this option should be "select"-ed by -# the thing that needs it, probably the CPU. -config ARM64_BOOTBLOCK_CUSTOM - bool - default n - config ARM64_USE_ARM_TRUSTED_FIRMWARE bool default n diff --git a/src/arch/arm64/armv8/Makefile.inc b/src/arch/arm64/armv8/Makefile.inc index 357159d6a7..359a368ab9 100644 --- a/src/arch/arm64/armv8/Makefile.inc +++ b/src/arch/arm64/armv8/Makefile.inc @@ -26,10 +26,6 @@ armv8_asm_flags = $(armv8_flags) ################################################################################ ifeq ($(CONFIG_ARCH_BOOTBLOCK_ARMV8_64),y) -ifneq ($(CONFIG_ARM64_BOOTBLOCK_CUSTOM),y) -bootblock-y += bootblock.S -bootblock-y += bootblock_simple.c -endif bootblock-y += cache.c bootblock-y += cache_helpers.S bootblock-y += cpu.S @@ -38,6 +34,11 @@ bootblock-$(CONFIG_BOOTBLOCK_CONSOLE) += exception.c bootblock-c-ccopts += $(armv8_flags) bootblock-S-ccopts += $(armv8_asm_flags) +# Required to access unaligned timestamp struct members before MMU is active +# (TODO: Maybe use explicit unaligned accesses in timestamp code instead, or +# evaluate redesigning timestamp data structures to avoid misaligned members.) +bootblock-c-ccopts += -mstrict-align + endif ################################################################################ diff --git a/src/arch/arm64/armv8/bootblock_simple.c b/src/arch/arm64/armv8/bootblock_simple.c deleted file mode 100644 index e2002f2a3a..0000000000 --- a/src/arch/arm64/armv8/bootblock_simple.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is part of the coreboot project. - * - * Copyright 2014 Google Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; version 2 of - * the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -static int boot_cpu(void) -{ - /* - * FIXME: This is a stub for now. All non-boot CPUs should be - * waiting for an interrupt. We could move the chunk of assembly - * which puts them to sleep in here... - */ - return 1; -} - -void main(void) -{ - /* Globally disable MMU, caches, and branch prediction (these should - * be disabled by default on reset) */ - mmu_disable(); - - /* - * Re-enable icache and branch prediction. MMU and dcache will be - * set up later. - * - * Note: If booting from USB, we need to disable branch prediction - * before copying from USB into RAM (FIXME: why?) - */ - - if (boot_cpu()) { - //bootblock_cpu_init(); - //bootblock_mainboard_init(); - } - -#if IS_ENABLED(CONFIG_BOOTBLOCK_CONSOLE) - console_init(); - exception_init(); -#endif - - run_romstage(); -} diff --git a/src/arch/arm64/include/bootblock_common.h b/src/arch/arm64/include/bootblock_common.h deleted file mode 100644 index 2fa705f5e1..0000000000 --- a/src/arch/arm64/include/bootblock_common.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifdef CONFIG_BOOTBLOCK_CPU_INIT -#include CONFIG_BOOTBLOCK_CPU_INIT -#endif - -#ifdef CONFIG_BOOTBLOCK_MAINBOARD_INIT -#include CONFIG_BOOTBLOCK_MAINBOARD_INIT -#else -static void bootblock_mainboard_init(void) -{ -} -#endif diff --git a/src/arch/mips/Kconfig b/src/arch/mips/Kconfig index b67fa29584..d0489ace4b 100644 --- a/src/arch/mips/Kconfig +++ b/src/arch/mips/Kconfig @@ -22,6 +22,7 @@ config ARCH_BOOTBLOCK_MIPS bool default n select ARCH_MIPS + select BOOTBLOCK_CUSTOM config ARCH_VERSTAGE_MIPS bool diff --git a/src/arch/mips/bootblock_simple.c b/src/arch/mips/bootblock_simple.c index c37e40ce7f..c3bd82dbee 100644 --- a/src/arch/mips/bootblock_simple.c +++ b/src/arch/mips/bootblock_simple.c @@ -14,7 +14,7 @@ * GNU General Public License for more details. */ -#include +#include #include #include #include diff --git a/src/arch/mips/include/bootblock_common.h b/src/arch/mips/include/arch/bootblock_common.h similarity index 100% rename from src/arch/mips/include/bootblock_common.h rename to src/arch/mips/include/arch/bootblock_common.h diff --git a/src/arch/riscv/Kconfig b/src/arch/riscv/Kconfig index 9618c63577..1849335386 100644 --- a/src/arch/riscv/Kconfig +++ b/src/arch/riscv/Kconfig @@ -6,6 +6,7 @@ config ARCH_BOOTBLOCK_RISCV bool default n select ARCH_RISCV + select BOOTBLOCK_CUSTOM config ARCH_VERSTAGE_RISCV bool @@ -18,9 +19,3 @@ config ARCH_ROMSTAGE_RISCV config ARCH_RAMSTAGE_RISCV bool default n - -# If a custom bootblock is necessary, this option should be "select"-ed by -# the thing that needs it, probably the CPU. -config RISCV_BOOTBLOCK_CUSTOM - bool - default n diff --git a/src/arch/riscv/bootblock_simple.c b/src/arch/riscv/bootblock_simple.c index 3214035bc3..db45ab202a 100644 --- a/src/arch/riscv/bootblock_simple.c +++ b/src/arch/riscv/bootblock_simple.c @@ -14,7 +14,6 @@ * GNU General Public License for more details. */ -#include #include #include #include diff --git a/src/arch/riscv/include/bootblock_common.h b/src/arch/riscv/include/bootblock_common.h deleted file mode 100644 index fe2c982dec..0000000000 --- a/src/arch/riscv/include/bootblock_common.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef CONFIG_BOOTBLOCK_CPU_INIT -#include CONFIG_BOOTBLOCK_CPU_INIT -#endif - -// I'm disappointed that we let this kind of thing creep in. -// we null out functions with this kind of stuff, AND weak symbols, -// AND empty cpp function defines. What's next? Ouija boards? -#if 0 -#ifdef CONFIG_BOOTBLOCK_MAINBOARD_INIT -#include CONFIG_BOOTBLOCK_MAINBOARD_INIT -#else -static void bootblock_mainboard_init(void) -{ -} -#endif -#endif diff --git a/src/arch/x86/Kconfig b/src/arch/x86/Kconfig index 88b259297c..738e7d1c0a 100644 --- a/src/arch/x86/Kconfig +++ b/src/arch/x86/Kconfig @@ -24,6 +24,7 @@ config ARCH_BOOTBLOCK_X86_32 bool default n select ARCH_X86 + select BOOTBLOCK_CUSTOM config ARCH_VERSTAGE_X86_32 bool @@ -43,6 +44,7 @@ config ARCH_BOOTBLOCK_X86_64 bool default n select ARCH_X86 + select BOOTBLOCK_CUSTOM config ARCH_VERSTAGE_X86_64 bool diff --git a/src/arch/x86/bootblock_normal.c b/src/arch/x86/bootblock_normal.c index a4dc3c4d25..d5f03b7699 100644 --- a/src/arch/x86/bootblock_normal.c +++ b/src/arch/x86/bootblock_normal.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include diff --git a/src/arch/x86/bootblock_simple.c b/src/arch/x86/bootblock_simple.c index bb0591fb53..4bff360a08 100644 --- a/src/arch/x86/bootblock_simple.c +++ b/src/arch/x86/bootblock_simple.c @@ -1,5 +1,5 @@ #include -#include +#include #include static void main(unsigned long bist) diff --git a/src/arch/x86/include/bootblock_common.h b/src/arch/x86/include/arch/bootblock_common.h similarity index 100% rename from src/arch/x86/include/bootblock_common.h rename to src/arch/x86/include/arch/bootblock_common.h diff --git a/src/arch/arm/include/bootblock_common.h b/src/include/bootblock_common.h similarity index 87% rename from src/arch/arm/include/bootblock_common.h rename to src/include/bootblock_common.h index 874e84a709..1acbef4855 100644 --- a/src/arch/arm/include/bootblock_common.h +++ b/src/include/bootblock_common.h @@ -13,12 +13,12 @@ * GNU General Public License for more details. */ -#ifndef __ARCH_BOOTBLOCK_COMMON_H -#define __ARCH_BOOTBLOCK_COMMON_H +#ifndef __BOOTBLOCK_COMMON_H +#define __BOOTBLOCK_COMMON_H /* These are defined as weak no-ops that can be overridden by mainboard/SoC. */ void bootblock_mainboard_early_init(void); void bootblock_mainboard_init(void); void bootblock_soc_init(void); -#endif /* __ARCH_BOOTBLOCK_COMMON_H */ +#endif /* __BOOTBLOCK_COMMON_H */ diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc index 7b90819c57..c6e2a5387b 100644 --- a/src/lib/Makefile.inc +++ b/src/lib/Makefile.inc @@ -14,6 +14,11 @@ # subdirs-y += loaders + +ifneq ($(CONFIG_BOOTBLOCK_CUSTOM),y) +bootblock-y += bootblock.c +endif + bootblock-y += assets.c bootblock-y += prog_loaders.c bootblock-y += prog_ops.c diff --git a/src/arch/arm/armv7/bootblock_simple.c b/src/lib/bootblock.c similarity index 90% rename from src/arch/arm/armv7/bootblock_simple.c rename to src/lib/bootblock.c index 0f4965af04..d7d0bb56f4 100644 --- a/src/arch/arm/armv7/bootblock_simple.c +++ b/src/lib/bootblock.c @@ -15,12 +15,10 @@ */ #include -#include #include #include #include #include -#include #include __attribute__((weak)) void bootblock_mainboard_early_init(void) { /* no-op */ } @@ -35,10 +33,10 @@ void main(void) bootblock_mainboard_early_init(); -#if CONFIG_BOOTBLOCK_CONSOLE - console_init(); - exception_init(); -#endif + if (IS_ENABLED(CONFIG_BOOTBLOCK_CONSOLE)) { + console_init(); + exception_init(); + } bootblock_soc_init(); bootblock_mainboard_init(); diff --git a/src/soc/broadcom/cygnus/Kconfig b/src/soc/broadcom/cygnus/Kconfig index 871d84c208..8cafc4bc64 100644 --- a/src/soc/broadcom/cygnus/Kconfig +++ b/src/soc/broadcom/cygnus/Kconfig @@ -33,10 +33,6 @@ config CHROMEOS select SEPARATE_VERSTAGE select RETURN_FROM_VERSTAGE -config BOOTBLOCK_CPU_INIT - string - default "soc/broadcom/cygnus/bootblock.c" - config CONSOLE_SERIAL_UART_ADDRESS hex depends on DRIVERS_UART diff --git a/src/soc/marvell/bg4cd/Kconfig b/src/soc/marvell/bg4cd/Kconfig index 255ce57302..2e5b15c5bc 100644 --- a/src/soc/marvell/bg4cd/Kconfig +++ b/src/soc/marvell/bg4cd/Kconfig @@ -17,10 +17,10 @@ config SOC_MARVELL_BG4CD bool default n select ARCH_BOOTBLOCK_ARMV7_M + select BOOTBLOCK_CUSTOM if VBOOT_VERIFY_FIRMWARE select ARCH_RAMSTAGE_ARMV7 select ARCH_ROMSTAGE_ARMV7 select ARCH_VERSTAGE_ARMV7_M - select ARM_BOOTBLOCK_CUSTOM if VBOOT_VERIFY_FIRMWARE select BOOTBLOCK_CONSOLE select GENERIC_UDELAY select HAVE_MONOTONIC_TIMER @@ -31,8 +31,4 @@ if SOC_MARVELL_BG4CD config CHROMEOS select VBOOT_STARTS_IN_BOOTBLOCK -config BOOTBLOCK_CPU_INIT - string - default "soc/marvell/bg4cd/bootblock.c" - endif diff --git a/src/soc/nvidia/tegra124/Kconfig b/src/soc/nvidia/tegra124/Kconfig index c35e2c200c..bd38d7619a 100644 --- a/src/soc/nvidia/tegra124/Kconfig +++ b/src/soc/nvidia/tegra124/Kconfig @@ -2,6 +2,7 @@ config SOC_NVIDIA_TEGRA124 bool default n select ARCH_BOOTBLOCK_ARMV4 + select BOOTBLOCK_CUSTOM select ARCH_VERSTAGE_ARMV7 select ARCH_ROMSTAGE_ARMV7 select ARCH_RAMSTAGE_ARMV7 @@ -10,20 +11,11 @@ config SOC_NVIDIA_TEGRA124 select HAVE_MONOTONIC_TIMER select GENERIC_UDELAY select BOOTBLOCK_CONSOLE - select ARM_BOOTBLOCK_CUSTOM select ARM_LPAE select GENERIC_GPIO_LIB if SOC_NVIDIA_TEGRA124 -config BOOTBLOCK_CPU_INIT - string - default "soc/nvidia/tegra124/bootblock.c" - help - CPU/SoC-specific bootblock code. This is useful if the - bootblock must load microcode or copy data from ROM before - searching for the bootblock. - config TEGRA124_MODEL_TD570D bool "TD570D" diff --git a/src/soc/nvidia/tegra132/Kconfig b/src/soc/nvidia/tegra132/Kconfig index cb6798c8ac..4be9a4c2a8 100644 --- a/src/soc/nvidia/tegra132/Kconfig +++ b/src/soc/nvidia/tegra132/Kconfig @@ -2,6 +2,7 @@ config SOC_NVIDIA_TEGRA132 bool default n select ARCH_BOOTBLOCK_ARMV4 + select BOOTBLOCK_CUSTOM select ARCH_VERSTAGE_ARMV4 select ARCH_ROMSTAGE_ARMV4 select ARCH_RAMSTAGE_ARMV8_64 @@ -11,7 +12,6 @@ config SOC_NVIDIA_TEGRA132 select GENERIC_UDELAY select HAVE_HARD_RESET select HAVE_UART_SPECIAL - select ARM_BOOTBLOCK_CUSTOM select GENERIC_GPIO_LIB select HAS_PRECBMEM_TIMESTAMP_REGION @@ -31,14 +31,6 @@ config MAINBOARD_DO_SOR_INIT help Initialize dp display -config BOOTBLOCK_CPU_INIT - string - default "soc/nvidia/tegra132/bootblock.c" - help - CPU/SoC-specific bootblock code. This is useful if the - bootblock must load microcode or copy data from ROM before - searching for the bootblock. - config MAX_CPUS int default 2 diff --git a/src/soc/nvidia/tegra210/Kconfig b/src/soc/nvidia/tegra210/Kconfig index 2d910bec6e..e70cdc6517 100644 --- a/src/soc/nvidia/tegra210/Kconfig +++ b/src/soc/nvidia/tegra210/Kconfig @@ -2,6 +2,7 @@ config SOC_NVIDIA_TEGRA210 bool default n select ARCH_BOOTBLOCK_ARMV4 + select BOOTBLOCK_CUSTOM select ARCH_VERSTAGE_ARMV4 select ARCH_ROMSTAGE_ARMV4 select ARCH_RAMSTAGE_ARMV8_64 @@ -12,7 +13,6 @@ config SOC_NVIDIA_TEGRA210 select GENERIC_UDELAY select HAVE_HARD_RESET select HAVE_UART_SPECIAL - select ARM_BOOTBLOCK_CUSTOM select ARM64_USE_ARM_TRUSTED_FIRMWARE select HAS_PRECBMEM_TIMESTAMP_REGION select GENERIC_GPIO_LIB @@ -36,14 +36,6 @@ config MAINBOARD_DO_SOR_INIT help Initialize dp display -config BOOTBLOCK_CPU_INIT - string - default "soc/nvidia/tegra210/bootblock.c" - help - CPU/SoC-specific bootblock code. This is useful if the - bootblock must load microcode or copy data from ROM before - searching for the bootblock. - config MAX_CPUS int default 4 diff --git a/src/soc/rockchip/rk3288/Kconfig b/src/soc/rockchip/rk3288/Kconfig index c3ff7cfc66..65e6dc32f8 100644 --- a/src/soc/rockchip/rk3288/Kconfig +++ b/src/soc/rockchip/rk3288/Kconfig @@ -36,10 +36,6 @@ config CHROMEOS select SEPARATE_VERSTAGE select RETURN_FROM_VERSTAGE -config BOOTBLOCK_CPU_INIT - string - default "soc/rockchip/rk3288/bootblock.c" - config PMIC_BUS int default -1