init: introduce soc and board hooks

Introduce soc and board hooks to replace arch specific code
and replace usages of SYS_INIT for platform initialization.

include/zephyr/platform/hooks.h introduces the hooks to be implemented
by boards and SoCs.

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
This commit is contained in:
Anas Nashif 2023-09-13 12:03:10 +00:00 committed by Carles Cufí
commit e260d03686
14 changed files with 179 additions and 0 deletions

View file

@ -23,6 +23,7 @@
#include <zephyr/arch/arc/cluster.h>
#include <zephyr/kernel_structs.h>
#include <kernel_internal.h>
#include <zephyr/platform/hooks.h>
/* XXX - keep for future use in full-featured cache APIs */
#if 0
@ -121,6 +122,10 @@ extern FUNC_NORETURN void z_cstart(void);
void z_prep_c(void)
{
#if defined(CONFIG_SOC_PREP_HOOK)
soc_prep_hook();
#endif
#ifdef CONFIG_ISA_ARCV3
arc_cluster_scm_enable();
#endif

View file

@ -21,6 +21,7 @@
#include <zephyr/linker/linker-defs.h>
#include <zephyr/sys/barrier.h>
#include <zephyr/arch/arm/cortex_a_r/lib_helpers.h>
#include <zephyr/platform/hooks.h>
#if defined(CONFIG_ARMV7_R) || defined(CONFIG_ARMV7_A)
#include <cortex_a_r/stack.h>
@ -147,6 +148,9 @@ extern FUNC_NORETURN void z_cstart(void);
*/
void z_prep_c(void)
{
#if defined(CONFIG_SOC_PREP_HOOK)
soc_prep_hook();
#endif
/* Initialize tpidruro with our struct _cpu instance address */
write_tpidruro((uintptr_t)&_kernel.cpus[0]);

View file

@ -20,6 +20,7 @@
#include <kernel_internal.h>
#include <zephyr/linker/linker-defs.h>
#include <zephyr/sys/barrier.h>
#include <zephyr/platform/hooks.h>
#if defined(__GNUC__)
/*
@ -181,6 +182,10 @@ extern FUNC_NORETURN void z_cstart(void);
*/
void z_prep_c(void)
{
#if defined(CONFIG_SOC_PREP_HOOK)
soc_prep_hook();
#endif
relocate_vector_table();
#if defined(CONFIG_CPU_HAS_FPU)
z_arm_floating_point_init();

View file

@ -16,6 +16,7 @@
#include <kernel_internal.h>
#include <zephyr/linker/linker-defs.h>
#include <zephyr/platform/hooks.h>
extern void z_arm64_mm_init(bool is_primary_core);
@ -30,6 +31,10 @@ __weak void z_arm64_mm_init(bool is_primary_core) { }
*/
void z_prep_c(void)
{
#if defined(CONFIG_SOC_PREP_HOOK)
soc_prep_hook();
#endif
/* Initialize tpidrro_el0 with our struct _cpu instance address */
write_tpidrro_el0((uintptr_t)&_kernel.cpus[0]);

View file

@ -11,6 +11,7 @@
#include <kernel_internal.h>
#include <zephyr/irq.h>
#include <zephyr/platform/hooks.h>
static void interrupt_init(void)
{
@ -44,6 +45,9 @@ static void interrupt_init(void)
void z_prep_c(void)
{
#if defined(CONFIG_SOC_PREP_HOOK)
soc_prep_hook();
#endif
z_bss_zero();
interrupt_init();

View file

@ -21,6 +21,7 @@
#include <zephyr/linker/linker-defs.h>
#include <zephyr/kernel_structs.h>
#include <kernel_internal.h>
#include <zephyr/platform/hooks.h>
/**
* @brief Prepare to and run C code
@ -30,6 +31,10 @@
void z_prep_c(void)
{
#if defined(CONFIG_SOC_PREP_HOOK)
soc_prep_hook();
#endif
z_bss_zero();
z_data_copy();
/* In most XIP scenarios we copy the exception code into RAM, so need

View file

@ -19,6 +19,7 @@
#include <zephyr/toolchain.h>
#include <zephyr/kernel_structs.h>
#include <kernel_internal.h>
#include <zephyr/platform/hooks.h>
#if defined(CONFIG_RISCV_SOC_INTERRUPT_INIT)
void soc_interrupt_init(void);
@ -33,6 +34,10 @@ void soc_interrupt_init(void);
void z_prep_c(void)
{
#if defined(CONFIG_SOC_PREP_HOOK)
soc_prep_hook();
#endif
z_bss_zero();
z_data_copy();
#if defined(CONFIG_RISCV_SOC_INTERRUPT_INIT)

View file

@ -10,6 +10,7 @@
*/
#include <kernel_internal.h>
#include <zephyr/platform/hooks.h>
/**
* @brief Prepare to and run C code
@ -19,6 +20,9 @@
void z_prep_c(void)
{
#if defined(CONFIG_SOC_PREP_HOOK)
soc_prep_hook();
#endif
z_data_copy();
z_cstart();
CODE_UNREACHABLE;

View file

@ -9,6 +9,7 @@
#include <zephyr/arch/x86/multiboot.h>
#include <zephyr/arch/x86/efi.h>
#include <x86_mmu.h>
#include <zephyr/platform/hooks.h>
extern FUNC_NORETURN void z_cstart(void);
extern void x86_64_irq_init(void);
@ -25,6 +26,9 @@ FUNC_NORETURN void z_prep_c(void *arg)
{
x86_boot_arg_t *cpu_arg = arg;
#if defined(CONFIG_SOC_PREP_HOOK)
soc_prep_hook();
#endif
_kernel.cpus[0].nested = 0;
#ifdef CONFIG_MMU

View file

@ -5,6 +5,7 @@
*/
#include <zephyr/kernel.h>
#include <kernel_internal.h>
#include <zephyr/platform/hooks.h>
extern FUNC_NORETURN void z_cstart(void);
@ -20,6 +21,9 @@ extern void soc_num_cpus_init(void);
*/
void z_prep_c(void)
{
#if defined(CONFIG_SOC_PREP_HOOK)
soc_prep_hook();
#endif
#if CONFIG_SOC_HAS_RUNTIME_NUM_CPUS
soc_num_cpus_init();
#endif

View file

@ -0,0 +1,74 @@
/*
* Copyright (c) 2024 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_PLATFORM_PLATFORM_H_
#define ZEPHYR_INCLUDE_PLATFORM_PLATFORM_H_
/**
* @file
* @brief Soc and Board hooks
*
* This header file contains function prototypes for the interfaces between
* zephyr architecture and initialization code and the SoC and board specific logic
* that resides under boards/ and soc/
*
* @note These are all standard soc and board interfaces that are exported from
* soc and board specific logic to OS internal logic. These should never be accessed
* directly from application code but may be freely used within the OS.
*/
/**
* @brief SoC hook executed at the beginning of the reset vector.
*
* This hook is implemented by the SoC and can be used to perform any
* SoC-specific initialization.
*/
void soc_reset_hook(void);
/**
* @brief SoC hook executed after the reset vector.
*
*
* This hook is implemented by the SoC and can be used to perform any
* SoC-specific initialization.
*/
void soc_prep_hook(void);
/*
* @brief SoC hook executed before the kernel and devices are initialized.
*
* This hook is implemented by the SoC and can be used to perform any
* SoC-specific initialization.
*/
void soc_early_init_hook(void);
/*
* @brief SoC hook executed after the kernel and devices are initialized.
*
* This hook is implemented by the SoC and can be used to perform any
* SoC-specific initialization.
*/
void soc_late_init_hook(void);
/*
* @brief Board hook executed before the kernel starts.
*
* This is called before the kernel has started. This hook
* is implemented by the board and can be used to perform any board-specific
* initialization.
*/
void board_early_init_hook(void);
/*
* @brief Board hook executed after the kernel starts.
* This is called after the kernel has started, but before the main function is
* called. This hook is implemented by the board and can be used to perform
* any board-specific initialization.
*/
void board_late_init_hook(void);
#endif

View file

@ -1027,3 +1027,4 @@ endmenu
rsource "Kconfig.device"
rsource "Kconfig.vm"
rsource "Kconfig.init"

45
kernel/Kconfig.init Normal file
View file

@ -0,0 +1,45 @@
# Kernel init hook options
# Copyright (c) 2024 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
menu "SoC and Board Hooks"
config SOC_RESET_HOOK
bool "Run early SoC reset hook"
help
Run an early SoC reset hook.
A custom hook soc_reset_hook() is executed at the beginning of the
startup code (__start). soc_reset_hook() must be implemented by the SoC.
config SOC_PREP_HOOK
bool "Run early SoC preparation hook"
help
Run an early SoC preparation hook.
A custom hook soc_prep_hook() is executed at the beginning of the
c prep code (prep_c). soc_prep_hook() must be implemented by the SoC.
config SOC_EARLY_INIT_HOOK
bool "Run early SoC hook"
help
Run an early SoC initialization hook.
config SOC_LATE_INIT_HOOK
bool "Run late SoC hook"
help
Run a late SoC initialization hook.
config BOARD_EARLY_INIT_HOOK
bool "Run early board hook"
help
Run an early board initialization hook.
config BOARD_LATE_INIT_HOOK
bool "Run late board hook"
help
Run a late board initialization hook.
endmenu

View file

@ -25,6 +25,7 @@
#include <zephyr/device.h>
#include <zephyr/init.h>
#include <zephyr/linker/linker-defs.h>
#include <zephyr/platform/hooks.h>
#include <ksched.h>
#include <kthread.h>
#include <zephyr/sys/dlist.h>
@ -516,6 +517,13 @@ static void bg_thread_main(void *unused1, void *unused2, void *unused3)
z_sys_post_kernel = true;
z_sys_init_run_level(INIT_LEVEL_POST_KERNEL);
#if CONFIG_SOC_LATE_INIT_HOOK
soc_late_init_hook();
#endif
#if CONFIG_BOARD_LATE_INIT_HOOK
board_late_init_hook();
#endif
#if defined(CONFIG_STACK_POINTER_RANDOM) && (CONFIG_STACK_POINTER_RANDOM != 0)
z_stack_adjust_initialized = 1;
#endif /* CONFIG_STACK_POINTER_RANDOM */
@ -757,6 +765,12 @@ FUNC_NORETURN void z_cstart(void)
/* do any necessary initialization of static devices */
z_device_state_init();
#if CONFIG_SOC_EARLY_INIT_HOOK
soc_early_init_hook();
#endif
#if CONFIG_BOARD_EARLY_INIT_HOOK
board_early_init_hook();
#endif
/* perform basic hardware initialization */
z_sys_init_run_level(INIT_LEVEL_PRE_KERNEL_1);
#if defined(CONFIG_SMP)