arm/arm64: Generalize bootblock C entry point

When we first added ARM support to coreboot, it was clear that the
bootblock would need to do vastly different tasks than on x86, so we
moved its main logic under arch/. Now that we have several more
architectures, it turns out (as with so many things lately) that x86 is
really the odd one out, and all the others are trying to do pretty much
the same thing. This has already caused maintenance issues as the ARM32
bootblock developed and less-mature architectures were left behind with
old cruft.

This patch tries to address that problem by centralizing that logic
under lib/ for use by all architectures/SoCs that don't explicitly
opt-out (with the slightly adapted existing BOOTBLOCK_CUSTOM option).
This works great out of the box for ARM32 and ARM64. It could probably
be easily applied to MIPS and RISCV as well, but I don't have any of
those boards to test so I'll mark them as BOOTBLOCK_CUSTOM for now and
leave that for later cleanup.

BRANCH=None
BUG=None
TEST=Built Jerry and Falco, booted Oak.

Change-Id: Ibbf727ad93651e388aef20e76f03f5567f9860cb
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: http://review.coreboot.org/12076
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Tested-by: build bot (Jenkins)
This commit is contained in:
Julius Werner 2015-10-09 13:37:58 -07:00
parent fe4cbf1167
commit 86fc11d0c9
27 changed files with 38 additions and 168 deletions

View File

@ -248,6 +248,7 @@ config FLASHMAP_OFFSET
help help
Offset of flash map in firmware image Offset of flash map in firmware image
# TODO: This doesn't belong here, move to src/arch/x86/Kconfig
choice choice
prompt "Bootblock behaviour" prompt "Bootblock behaviour"
default BOOTBLOCK_SIMPLE default BOOTBLOCK_SIMPLE
@ -260,6 +261,12 @@ config BOOTBLOCK_NORMAL
endchoice 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 config BOOTBLOCK_SOURCE
string string
default "bootblock_simple.c" if BOOTBLOCK_SIMPLE default "bootblock_simple.c" if BOOTBLOCK_SIMPLE

View File

@ -22,12 +22,6 @@ config ARCH_RAMSTAGE_ARM
source src/arch/arm/armv4/Kconfig source src/arch/arm/armv4/Kconfig
source src/arch/arm/armv7/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 config ARM_LPAE
bool bool
default n default n

View File

@ -24,9 +24,8 @@ armv4_flags = -marm -march=armv4t -I$(src)/arch/arm/include/armv4/ \
ifeq ($(CONFIG_ARCH_BOOTBLOCK_ARMV4),y) ifeq ($(CONFIG_ARCH_BOOTBLOCK_ARMV4),y)
ifneq ($(CONFIG_ARM_BOOTBLOCK_CUSTOM),y) ifneq ($(CONFIG_BOOTBLOCK_CUSTOM),y)
bootblock-y += bootblock.S bootblock-y += bootblock.S
bootblock-y += bootblock_simple.c
endif endif
bootblock-y += cache.c bootblock-y += cache.c

View File

@ -31,9 +31,8 @@ ifeq ($(CONFIG_ARCH_BOOTBLOCK_ARMV7),y)
bootblock-c-ccopts += $(armv7-a_flags) bootblock-c-ccopts += $(armv7-a_flags)
bootblock-S-ccopts += $(armv7-a_asm_flags) bootblock-S-ccopts += $(armv7-a_asm_flags)
ifneq ($(CONFIG_ARM_BOOTBLOCK_CUSTOM),y) ifneq ($(CONFIG_BOOTBLOCK_CUSTOM),y)
bootblock-y += bootblock.S bootblock-y += bootblock.S
bootblock-$(CONFIG_BOOTBLOCK_SIMPLE) += bootblock_simple.c
endif endif
bootblock-y += cache.c bootblock-y += cache.c
@ -46,9 +45,8 @@ else ifeq ($(CONFIG_ARCH_BOOTBLOCK_ARMV7_M),y)
bootblock-c-ccopts += $(armv7-m_flags) bootblock-c-ccopts += $(armv7-m_flags)
bootblock-S-ccopts += $(armv7-m_asm_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_m.S
bootblock-y += bootblock_simple.c
endif endif
bootblock-y += exception_m.c bootblock-y += exception_m.c
bootblock-y += cache_m.c bootblock-y += cache_m.c

View File

@ -22,12 +22,6 @@ config ARCH_RAMSTAGE_ARM64
source src/arch/arm64/armv8/Kconfig source src/arch/arm64/armv8/Kconfig
source src/arch/arm64/cpu/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 config ARM64_USE_ARM_TRUSTED_FIRMWARE
bool bool
default n default n

View File

@ -26,10 +26,6 @@ armv8_asm_flags = $(armv8_flags)
################################################################################ ################################################################################
ifeq ($(CONFIG_ARCH_BOOTBLOCK_ARMV8_64),y) 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.c
bootblock-y += cache_helpers.S bootblock-y += cache_helpers.S
bootblock-y += cpu.S bootblock-y += cpu.S
@ -38,6 +34,11 @@ bootblock-$(CONFIG_BOOTBLOCK_CONSOLE) += exception.c
bootblock-c-ccopts += $(armv8_flags) bootblock-c-ccopts += $(armv8_flags)
bootblock-S-ccopts += $(armv8_asm_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 endif
################################################################################ ################################################################################

View File

@ -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 <bootblock_common.h>
#include <arch/cache.h>
#include <arch/stages.h>
#include <arch/exception.h>
#include <cbfs.h>
#include <console/console.h>
#include <program_loading.h>
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();
}

View File

@ -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

View File

@ -22,6 +22,7 @@ config ARCH_BOOTBLOCK_MIPS
bool bool
default n default n
select ARCH_MIPS select ARCH_MIPS
select BOOTBLOCK_CUSTOM
config ARCH_VERSTAGE_MIPS config ARCH_VERSTAGE_MIPS
bool bool

View File

@ -14,7 +14,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include <bootblock_common.h> #include <arch/bootblock_common.h>
#include <console/console.h> #include <console/console.h>
#include <halt.h> #include <halt.h>
#include <program_loading.h> #include <program_loading.h>

View File

@ -6,6 +6,7 @@ config ARCH_BOOTBLOCK_RISCV
bool bool
default n default n
select ARCH_RISCV select ARCH_RISCV
select BOOTBLOCK_CUSTOM
config ARCH_VERSTAGE_RISCV config ARCH_VERSTAGE_RISCV
bool bool
@ -18,9 +19,3 @@ config ARCH_ROMSTAGE_RISCV
config ARCH_RAMSTAGE_RISCV config ARCH_RAMSTAGE_RISCV
bool bool
default n 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

View File

@ -14,7 +14,6 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include <bootblock_common.h>
#include <arch/cache.h> #include <arch/cache.h>
#include <arch/hlt.h> #include <arch/hlt.h>
#include <arch/stages.h> #include <arch/stages.h>

View File

@ -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

View File

@ -24,6 +24,7 @@ config ARCH_BOOTBLOCK_X86_32
bool bool
default n default n
select ARCH_X86 select ARCH_X86
select BOOTBLOCK_CUSTOM
config ARCH_VERSTAGE_X86_32 config ARCH_VERSTAGE_X86_32
bool bool
@ -43,6 +44,7 @@ config ARCH_BOOTBLOCK_X86_64
bool bool
default n default n
select ARCH_X86 select ARCH_X86
select BOOTBLOCK_CUSTOM
config ARCH_VERSTAGE_X86_64 config ARCH_VERSTAGE_X86_64
bool bool

View File

@ -1,5 +1,5 @@
#include <smp/node.h> #include <smp/node.h>
#include <bootblock_common.h> #include <arch/bootblock_common.h>
#include <pc80/mc146818rtc.h> #include <pc80/mc146818rtc.h>
#include <halt.h> #include <halt.h>

View File

@ -1,5 +1,5 @@
#include <smp/node.h> #include <smp/node.h>
#include <bootblock_common.h> #include <arch/bootblock_common.h>
#include <halt.h> #include <halt.h>
static void main(unsigned long bist) static void main(unsigned long bist)

View File

@ -13,12 +13,12 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#ifndef __ARCH_BOOTBLOCK_COMMON_H #ifndef __BOOTBLOCK_COMMON_H
#define __ARCH_BOOTBLOCK_COMMON_H #define __BOOTBLOCK_COMMON_H
/* These are defined as weak no-ops that can be overridden by mainboard/SoC. */ /* These are defined as weak no-ops that can be overridden by mainboard/SoC. */
void bootblock_mainboard_early_init(void); void bootblock_mainboard_early_init(void);
void bootblock_mainboard_init(void); void bootblock_mainboard_init(void);
void bootblock_soc_init(void); void bootblock_soc_init(void);
#endif /* __ARCH_BOOTBLOCK_COMMON_H */ #endif /* __BOOTBLOCK_COMMON_H */

View File

@ -14,6 +14,11 @@
# #
subdirs-y += loaders subdirs-y += loaders
ifneq ($(CONFIG_BOOTBLOCK_CUSTOM),y)
bootblock-y += bootblock.c
endif
bootblock-y += assets.c bootblock-y += assets.c
bootblock-y += prog_loaders.c bootblock-y += prog_loaders.c
bootblock-y += prog_ops.c bootblock-y += prog_ops.c

View File

@ -15,12 +15,10 @@
*/ */
#include <arch/exception.h> #include <arch/exception.h>
#include <arch/stages.h>
#include <bootblock_common.h> #include <bootblock_common.h>
#include <console/console.h> #include <console/console.h>
#include <delay.h> #include <delay.h>
#include <program_loading.h> #include <program_loading.h>
#include <smp/node.h>
#include <timestamp.h> #include <timestamp.h>
__attribute__((weak)) void bootblock_mainboard_early_init(void) { /* no-op */ } __attribute__((weak)) void bootblock_mainboard_early_init(void) { /* no-op */ }
@ -35,10 +33,10 @@ void main(void)
bootblock_mainboard_early_init(); bootblock_mainboard_early_init();
#if CONFIG_BOOTBLOCK_CONSOLE if (IS_ENABLED(CONFIG_BOOTBLOCK_CONSOLE)) {
console_init(); console_init();
exception_init(); exception_init();
#endif }
bootblock_soc_init(); bootblock_soc_init();
bootblock_mainboard_init(); bootblock_mainboard_init();

View File

@ -33,10 +33,6 @@ config CHROMEOS
select SEPARATE_VERSTAGE select SEPARATE_VERSTAGE
select RETURN_FROM_VERSTAGE select RETURN_FROM_VERSTAGE
config BOOTBLOCK_CPU_INIT
string
default "soc/broadcom/cygnus/bootblock.c"
config CONSOLE_SERIAL_UART_ADDRESS config CONSOLE_SERIAL_UART_ADDRESS
hex hex
depends on DRIVERS_UART depends on DRIVERS_UART

View File

@ -17,10 +17,10 @@ config SOC_MARVELL_BG4CD
bool bool
default n default n
select ARCH_BOOTBLOCK_ARMV7_M select ARCH_BOOTBLOCK_ARMV7_M
select BOOTBLOCK_CUSTOM if VBOOT_VERIFY_FIRMWARE
select ARCH_RAMSTAGE_ARMV7 select ARCH_RAMSTAGE_ARMV7
select ARCH_ROMSTAGE_ARMV7 select ARCH_ROMSTAGE_ARMV7
select ARCH_VERSTAGE_ARMV7_M select ARCH_VERSTAGE_ARMV7_M
select ARM_BOOTBLOCK_CUSTOM if VBOOT_VERIFY_FIRMWARE
select BOOTBLOCK_CONSOLE select BOOTBLOCK_CONSOLE
select GENERIC_UDELAY select GENERIC_UDELAY
select HAVE_MONOTONIC_TIMER select HAVE_MONOTONIC_TIMER
@ -31,8 +31,4 @@ if SOC_MARVELL_BG4CD
config CHROMEOS config CHROMEOS
select VBOOT_STARTS_IN_BOOTBLOCK select VBOOT_STARTS_IN_BOOTBLOCK
config BOOTBLOCK_CPU_INIT
string
default "soc/marvell/bg4cd/bootblock.c"
endif endif

View File

@ -2,6 +2,7 @@ config SOC_NVIDIA_TEGRA124
bool bool
default n default n
select ARCH_BOOTBLOCK_ARMV4 select ARCH_BOOTBLOCK_ARMV4
select BOOTBLOCK_CUSTOM
select ARCH_VERSTAGE_ARMV7 select ARCH_VERSTAGE_ARMV7
select ARCH_ROMSTAGE_ARMV7 select ARCH_ROMSTAGE_ARMV7
select ARCH_RAMSTAGE_ARMV7 select ARCH_RAMSTAGE_ARMV7
@ -10,20 +11,11 @@ config SOC_NVIDIA_TEGRA124
select HAVE_MONOTONIC_TIMER select HAVE_MONOTONIC_TIMER
select GENERIC_UDELAY select GENERIC_UDELAY
select BOOTBLOCK_CONSOLE select BOOTBLOCK_CONSOLE
select ARM_BOOTBLOCK_CUSTOM
select ARM_LPAE select ARM_LPAE
select GENERIC_GPIO_LIB select GENERIC_GPIO_LIB
if SOC_NVIDIA_TEGRA124 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 config TEGRA124_MODEL_TD570D
bool "TD570D" bool "TD570D"

View File

@ -2,6 +2,7 @@ config SOC_NVIDIA_TEGRA132
bool bool
default n default n
select ARCH_BOOTBLOCK_ARMV4 select ARCH_BOOTBLOCK_ARMV4
select BOOTBLOCK_CUSTOM
select ARCH_VERSTAGE_ARMV4 select ARCH_VERSTAGE_ARMV4
select ARCH_ROMSTAGE_ARMV4 select ARCH_ROMSTAGE_ARMV4
select ARCH_RAMSTAGE_ARMV8_64 select ARCH_RAMSTAGE_ARMV8_64
@ -11,7 +12,6 @@ config SOC_NVIDIA_TEGRA132
select GENERIC_UDELAY select GENERIC_UDELAY
select HAVE_HARD_RESET select HAVE_HARD_RESET
select HAVE_UART_SPECIAL select HAVE_UART_SPECIAL
select ARM_BOOTBLOCK_CUSTOM
select GENERIC_GPIO_LIB select GENERIC_GPIO_LIB
select HAS_PRECBMEM_TIMESTAMP_REGION select HAS_PRECBMEM_TIMESTAMP_REGION
@ -31,14 +31,6 @@ config MAINBOARD_DO_SOR_INIT
help help
Initialize dp display 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 config MAX_CPUS
int int
default 2 default 2

View File

@ -2,6 +2,7 @@ config SOC_NVIDIA_TEGRA210
bool bool
default n default n
select ARCH_BOOTBLOCK_ARMV4 select ARCH_BOOTBLOCK_ARMV4
select BOOTBLOCK_CUSTOM
select ARCH_VERSTAGE_ARMV4 select ARCH_VERSTAGE_ARMV4
select ARCH_ROMSTAGE_ARMV4 select ARCH_ROMSTAGE_ARMV4
select ARCH_RAMSTAGE_ARMV8_64 select ARCH_RAMSTAGE_ARMV8_64
@ -12,7 +13,6 @@ config SOC_NVIDIA_TEGRA210
select GENERIC_UDELAY select GENERIC_UDELAY
select HAVE_HARD_RESET select HAVE_HARD_RESET
select HAVE_UART_SPECIAL select HAVE_UART_SPECIAL
select ARM_BOOTBLOCK_CUSTOM
select ARM64_USE_ARM_TRUSTED_FIRMWARE select ARM64_USE_ARM_TRUSTED_FIRMWARE
select HAS_PRECBMEM_TIMESTAMP_REGION select HAS_PRECBMEM_TIMESTAMP_REGION
select GENERIC_GPIO_LIB select GENERIC_GPIO_LIB
@ -36,14 +36,6 @@ config MAINBOARD_DO_SOR_INIT
help help
Initialize dp display 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 config MAX_CPUS
int int
default 4 default 4

View File

@ -36,10 +36,6 @@ config CHROMEOS
select SEPARATE_VERSTAGE select SEPARATE_VERSTAGE
select RETURN_FROM_VERSTAGE select RETURN_FROM_VERSTAGE
config BOOTBLOCK_CPU_INIT
string
default "soc/rockchip/rk3288/bootblock.c"
config PMIC_BUS config PMIC_BUS
int int
default -1 default -1