# 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.

	  A custom SoC hook soc_early_init_hook() is executed before the kernel and
	  devices are initialized

config SOC_LATE_INIT_HOOK
	bool "Run late SoC hook"
	help
	  Run a late SoC initialization hook.

	  A custom SoC hook soc_late_init_hook() is executed after the kernel and
	  devices are initialized

config SOC_PER_CORE_INIT_HOOK
	bool "Run SoC per-core initialization hook"
	help
	  Run an SoC initialization hook for every core

	  A custom SoC hook soc_per_core_init_hook() is executeds at the end of
	  arch_kernel_init() for the primary core, and at the end of arch_secondary_cpu_init()
	  for secondary cores.

config BOARD_EARLY_INIT_HOOK
	bool "Run early board hook"
	help
	  Run an early board initialization hook.

	  A custom board hook board_early_init_hook() is executed before the kernel and
	  devices are initialized

config BOARD_LATE_INIT_HOOK
	bool "Run late board hook"
	help
	  Run a late board initialization hook.

	  A custom board hook board_late_init_hook() is executed after the kernel and
	  devices are initialized

endmenu
