# Kconfig - kernel configuration options

#
# Copyright (c) 2014-2015 Wind River Systems, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

choice
prompt "Kernel Type"
default MICROKERNEL

config NANOKERNEL
	bool "Nano Kernel"

config MICROKERNEL
	bool "Micro Kernel"

endchoice

menu "General Kernel Options"

config SYS_CLOCK_TICKS_PER_SEC
	int
	prompt "System tick frequency (in ticks/second)"
	default 100
	help
	This option specifies the frequency of the system clock in Hz.

config SYS_CLOCK_HW_CYCLES_PER_SEC
	int "System clock's h/w timer frequency"
	help
	This option specifies the frequency of the hardware timer used for the
	system clock (in Hz). This option is set by the platform's Kconfig file
	and the user should generally avoid modifying it via the menu configuration.

config  SYS_CLOCK_EXISTS
	bool
	# omit prompt to signify a "hidden" option
	default n if (SYS_CLOCK_TICKS_PER_SEC = 0)
	default y
	help
	This option specifies that the kernel lacks timer support.

config  INIT_STACKS
	bool
	prompt "Initialize stack areas"
	default n
	help
	This option instructs the kernel to initialize stack areas with a
	known value (0xaa) before they are first used, so that the high
	water mark can be easily determined. This applies to the stack areas
	for both tasks and fibers, as well as for the microkernel server's command
	stack.

config  XIP
	bool
	prompt "Execute in place"
	help
	  This option allows the kernel to operate with its text and read-only
	  sections residing in ROM (or similar read-only memory). Not all platforms
	  support this option so it must be used with care; you must also
	  supply a linker command file when building your image. Enabling this
	  option increases both the code and data footprint of the image.


config RING_BUFFER
	bool
	prompt "Enable ring buffers"
	default n
	help
	Enable usage of ring buffers. Similar to nanokernel FIFOs but manage
	their own buffer memory and can store arbitrary data. For optimal
	performance, use buffer sizes that are a power of 2.

config EVENT_LOGGER
	bool
	prompt "Enable event logger"
	default n
	select RING_BUFFER
	help
	Enable event logging feature. Allow the usage of a ring buffer to
	transmit event messages with a single interface to collect them.

config KERNEL_EVENT_LOGGER
	bool
	prompt "Enable kernel event logger features"
	default n
	select EVENT_LOGGER
	help
	This feature enables the usage of the profiling logger. Provides the
	logging of sleep events (either entering or leaving low power conditions),
	context switch events, interrupt events, boot events and a method to
	collect these event messages.

config KERNEL_EVENT_LOGGER_BUFFER_SIZE
	int
	prompt "Kernel event logger buffer size"
	default 128
	depends on KERNEL_EVENT_LOGGER
	help
	Buffer size in 32-bit words.

config KERNEL_INIT_PRIORITY_DEFAULT
	int
	prompt "Default init priority"
	help
	Defaut minimal init priority for each init level.

config KERNEL_INIT_PRIORITY_DEVICE
	int
	prompt "Default init priority for device drivers"
	help
	Device driver, that depends on common components, such as
	interrupt controller, but does not depend on other devices,
	uses this init priority.

menu "Kernel event logging points"
depends on KERNEL_EVENT_LOGGER

config KERNEL_EVENT_LOGGER_CONTEXT_SWITCH
	bool
	prompt "Context switch event logging point"
	default n
	depends on KERNEL_EVENT_LOGGER
	help
	Enable the context switch event messages.

config KERNEL_EVENT_LOGGER_INTERRUPT
	bool
	prompt "Interrupt event logging point"
	default n
	depends on KERNEL_EVENT_LOGGER
	help
	Enable interrupt event messages. These messages provide the following
	information: The time when interrupts occur.

config KERNEL_EVENT_LOGGER_SLEEP
	bool
	prompt "Sleep event logging point"
	default n
	depends on KERNEL_EVENT_LOGGER && ((MICROKERNEL && ADVANCED_POWER_MANAGEMENT) || NANOKERNEL)
	help
	Enable low power condition event messages. These messages provide the
	following information:

		- When the CPU went to sleep mode.
		- When the CPU woke up.
		- The ID of the interrupt that woke the CPU up.
endmenu

menu "Security Options"

config STACK_CANARIES
	bool
	prompt "Compiler stack canaries"
	default n
	help
	This option enables compiler stack canaries support kernel functions.

	If stack canaries are supported by the compiler, it will emit
	extra code that inserts a canary value into the stack frame when
	a function is entered and validates this value upon exit.
	Stack corruption (such as that caused by buffer overflow) results
	in a fatal error condition for the running entity.
	Enabling this option can result in a significant increase
	in footprint and an associated decrease in performance.

	If stack canaries are not supported by the compiler, enabling this
	option has no effect.
endmenu

endmenu
source "kernel/nanokernel/Kconfig"

config ADVANCED_POWER_MANAGEMENT
	bool
	prompt "Advanced power management"
	default n
	help
	This option enables the platform to implement extra power management
	policies whenever the kernel becomes idle. The kernel invokes
	_sys_power_save_idle() to inform the power management subsystem of the
	number of ticks until the next kernel timer is due to expire.

menu "Advanced Power Management Features"
	depends on ADVANCED_POWER_MANAGEMENT

config  ADVANCED_IDLE
	bool
	prompt "Advanced idle state"
	default n
	depends on MICROKERNEL && ADVANCED_POWER_MANAGEMENT && ADVANCED_IDLE_SUPPORTED
	help
	This option enables the kernel to interface to a custom advanced idle
	power saving manager. This permits the system to enter a custom
	power saving state when the kernel becomes idle for extended periods,
	and then to restore the system to its previous state (rather than
	booting up from scratch) when the kernel is re-activated.

config TICKLESS_IDLE
	bool
	prompt "Tickless idle"
	default y
	depends on MICROKERNEL || NANOKERNEL_TICKLESS_IDLE_SUPPORTED
	help
	This option suppresses periodic system clock interrupts whenever the
	kernel becomes idle. This permits the system to remain in a power
	saving state for extended periods without having to wake up to
	service each tick as it occurs.

	As a policy, an architecture should always provide support for tickless in
	the microkernel. If an architecture also provides support for nanokernel
	systems, it must select the NANOKERNEL_TICKLESS_IDLE_SUPPORTED kconfig
	option.

config TICKLESS_IDLE_THRESH
	int
	prompt "Tickless idle threshold"
	default 3
	depends on TICKLESS_IDLE
	help
	This option enables clock interrupt suppression when the kernel idles
	for only a short period of time. It specifies the minimum number of
	ticks that must occur before the next kernel timer expires in order
	for suppression to happen.

endmenu

if MICROKERNEL
source "kernel/microkernel/Kconfig"
endif
