# Kconfig - kernel configuration options

#
# Copyright (c) 2014-2015 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#


menu "General Kernel Options"

config HAS_DTS
	bool "Uses Device Tree"
	help
	This option specifies that the target platform supports device tree
	configuration.

config MULTITHREADING
	bool
	prompt "Multi-threading"
	default y
	help
	If disabled, only the main thread is available, so a main() function
	must be provided. Interrupts are available. Kernel objects will most
	probably not behave as expected, especially with regards to pending,
	since the main thread cannot pend, it being the only thread in the
	system.

	Many drivers and subsystems will not work with this option; use only
	when you REALLY know what you are doing.

config NUM_COOP_PRIORITIES
	int
	prompt "Number of coop priorities" if MULTITHREADING
	default 16
	default 1 if !MULTITHREADING
	range 0 128
	help
	Number of cooperative priorities configured in the system. Gives access
	to priorities:

		K_PRIO_COOP(0) to K_PRIO_COOP(CONFIG_NUM_COOP_PRIORITIES - 1)

	or seen another way, priorities:

		-CONFIG_NUM_COOP_PRIORITIES to -1

	This can be set to zero to disable cooperative scheduling. Cooperative
	threads always preempt preemptible threads.

	Each priority requires an extra 8 bytes of RAM. Each set of 32 extra
	total priorities require an extra 4 bytes and add one possible
	iteration to loops that search for the next thread to run.

	The total number of priorities is

	   NUM_COOP_PRIORITIES + NUM_PREEMPT_PRIORITIES + 1

	The extra one is for the idle thread, which must run at the lowest
	priority, and be the only thread at that priority.

config NUM_PREEMPT_PRIORITIES
	int
	prompt "Number of preemptible priorities" if MULTITHREADING
	default 15
	default 0 if !MULTITHREADING
	range 0 128
	help
	Number of preemptible priorities available in the system. Gives access
	to priorities 0 to CONFIG_NUM_PREEMPT_PRIORITIES - 1.

	This can be set to 0 to disable preemptible scheduling.

	Each priority requires an extra 8 bytes of RAM. Each set of 32 extra
	total priorities require an extra 4 bytes and add one possible
	iteration to loops that search for the next thread to run.

	The total number of priorities is

	   NUM_COOP_PRIORITIES + NUM_PREEMPT_PRIORITIES + 1

	The extra one is for the idle thread, which must run at the lowest
	priority, and be the only thread at that priority.

config MAIN_THREAD_PRIORITY
	int
	prompt "Priority of initialization/main thread"
	default 0
	default -2 if !PREEMPT_ENABLED
	help
	Priority at which the initialization thread runs, including the start
	of the main() function. main() can then change its priority if desired.

config COOP_ENABLED
	bool
	default y
	default n if (NUM_COOP_PRIORITIES = 0)

config PREEMPT_ENABLED
	bool
	default y
	default n if (NUM_PREEMPT_PRIORITIES = 0)

config PRIORITY_CEILING
	int
	prompt "Priority inheritance ceiling"
	default 0

config MAIN_STACK_SIZE
	int
	prompt "Size of stack for initialization and main thread"
	default 1024
	help
	When the intitialization is complete, the thread executing it then
	executes the main() routine, so as to reuse the stack used by the
	initialization, which would be wasted RAM otherwise.

	After initialization is complete, the thread runs main().

config IDLE_STACK_SIZE
	int
	prompt "Size of stack for idle thread"
	default 256
	default 320 if ARC
	default 512 if RISCV32
	default 1024 if XTENSA
	help
	Depending on the work that the idle task must do, most likely due to
	power management but possibly to other features like system event
	logging (e.g. logging when the system goes to sleep), the idle thread
	may need more stack space than the default value.

config ISR_STACK_SIZE
	int
	prompt "ISR and initialization stack size (in bytes)"
	default 2048
	help
	This option specifies the size of the stack used by interrupt
	service routines (ISRs), and during kernel initialization.

config  THREAD_CUSTOM_DATA
	bool
	prompt "Thread custom data"
	default n
	help
	This option allows each thread to store 32 bits of custom data,
	which can be accessed using the k_thread_custom_data_xxx() APIs.

config NUM_DYNAMIC_TIMERS
	int
	prompt "Number of timers available for dynamic allocation"
	default 0
	depends on NANO_TIMERS
	help
	Number of timers available for dynamic allocation via the
	k_timer_alloc()/k_timer_free() API.

config ERRNO
	bool
	prompt "Enable errno support"
	default y
	help
	Enable per-thread errno in the kernel. Application and library code must
	include errno.h provided by the C library (libc) to use the errno
	symbol. The C library must access the per-thread errno via the
	_get_errno() symbol.

menu "Kernel Debugging and Metrics"
config KERNEL_DEBUG
	bool
	prompt "Kernel debugging"
	default n
	select INIT_STACKS
	help
	  Enable kernel debugging.

	  Note that debugging the kernel internals can be very verbose.

config BOOT_BANNER
	bool
	prompt "Boot banner"
	default n
	depends on CONSOLE_HAS_DRIVER
	select PRINTK
	select EARLY_CONSOLE
	help
	This option outputs a banner to the console device during boot up. It
	also embeds a date & time stamp in the kernel and in each USAP image.

config BUILD_TIMESTAMP
	bool
	prompt "Build Timestamp"
	help
	Build timestamp and add it to the boot banner.

config INT_LATENCY_BENCHMARK
	bool
	prompt "Interrupt latency metrics [EXPERIMENTAL]"
	default n
	depends on ARCH="x86"
	help
	This option enables the tracking of interrupt latency metrics;
	the exact set of metrics being tracked is board-dependent.
	Tracking begins when int_latency_init() is invoked by an application.
	The metrics are displayed (and a new sampling interval is started)
	each time int_latency_show() is called thereafter.

config THREAD_MONITOR
	bool
	prompt "Thread monitoring [EXPERIMENTAL]"
	default n
	help
	  This option instructs the kernel to maintain a list of all threads
	  (excluding those that have not yet started or have already
	  terminated).
endmenu

menu "Work Queue Options"
config SYSTEM_WORKQUEUE_STACK_SIZE
	int "System workqueue stack size"
	default 1024

config SYSTEM_WORKQUEUE_PRIORITY
	int "System workqueue priority"
	default -1
	default  0 if !COOP_ENABLED
	default -2 if COOP_ENABLED && !PREEMPT_ENABLED

config OFFLOAD_WORKQUEUE_STACK_SIZE
	int "Workqueue stack size for thread offload requests"
	default 1024

config OFFLOAD_WORKQUEUE_PRIORITY
	int "Offload requests workqueue priority"
	default -1

endmenu

menu "Atomic Operations"
config ATOMIC_OPERATIONS_BUILTIN
	bool
	help
	Use the compiler builtin functions for atomic operations. This is
	the preferred method. However, support for all arches in GCC is
	incomplete.

config ATOMIC_OPERATIONS_CUSTOM
	bool
	help
	Use when there isn't support for compiler built-ins, but you have
	written optimized assembly code under arch/ which implements these.

config ATOMIC_OPERATIONS_C
	bool
	help
	Use atomic operations routines that are implemented entirely
	in C by locking interrupts. Selected by architectures which either
	do not have support for atomic operations in their instruction
	set, or haven't been implemented yet during bring-up, and also
	the compiler does not have support for the atomic __sync_* builtins.
endmenu

menu "Timer API Options"

config TIMESLICING
	bool "Thread time slicing"
	default y
	depends on SYS_CLOCK_EXISTS && (NUM_PREEMPT_PRIORITIES != 0)
	help
	This option enables time slicing between preemptible threads of
	equal priority.

config TIMESLICE_SIZE
	int "Time slice size (in ms)"
	default 0
	range 0 2147483647
	depends on TIMESLICING
	help
	This option specifies the maximum amount of time a thread can execute
	before other threads of equal priority are given an opportunity to run.
	A time slice size of zero means "no limit" (i.e. an infinitely large
	time slice).

config TIMESLICE_PRIORITY
	int "Time slicing thread priority ceiling"
	default 0
	range 0 NUM_PREEMPT_PRIORITIES
	depends on TIMESLICING
	help
	This option specifies the thread priority level at which time slicing
	takes effect; threads having a higher priority than this ceiling are
	not subject to time slicing.

config POLL
	bool
	prompt "async I/O framework"
	default n
	help
	Asynchronous notification framework. Enable the k_poll() and
	k_poll_signal() APIs.  The former can wait on multiple events
	concurrently, which can be either directly triggered or triggered by
	the availability of some kernel objects (semaphores and fifos).

endmenu

menu "Other Kernel Object Options"

config SEMAPHORE_GROUPS
	bool "Enable semaphore groups"
	default y if LEGACY_KERNEL
	help
	This option enables support for semaphore groups. Threads that use
	semaphore groups require more stack space. Disabling this option will
	both decrease the footprint as well as improve the performance of
	the k_sem_give() routine.

config NUM_MBOX_ASYNC_MSGS
	int "Maximum number of in-flight asynchronous mailbox messages"
	default 10
	help
	This option specifies the total number of asynchronous mailbox
	messages that can exist simultaneously, across all mailboxes
	in the system.

	Setting this option to 0 disables support for asynchronous
	mailbox messages.

config NUM_PIPE_ASYNC_MSGS
	int "Maximum number of in-flight asynchronous pipe messages"
	default 10
	help
	This option specifies the total number of asynchronous pipe
	messages that can exist simultaneously, across all pipes in
	the system.

	Setting this option to 0 disables support for asynchronous
	pipe messages.
endmenu

menu "Memory Pool Options"
choice
	prompt "Memory pool block allocation policy"
	default MEM_POOL_SPLIT_BEFORE_DEFRAG
	help
	This option specifies how a memory pool reacts if an unused memory
	block of the required size is not available.

config MEM_POOL_SPLIT_BEFORE_DEFRAG
	bool "Split a larger block before merging smaller blocks"
	help
	This option instructs a memory pool to try splitting a larger unused
	block if an unused block of the required size is not available; only
	if no such blocks exist will the memory pool try merging smaller unused
	blocks. This policy attempts to limit the cost of performing automatic
	partial defragmention of the memory pool, at the cost of fragmenting
	the memory pool's larger blocks.

config MEM_POOL_DEFRAG_BEFORE_SPLIT
	bool "Merge smaller blocks before splitting a larger block"
	help
	This option instructs a memory pool to try merging smaller unused
	blocks if an unused block of the required size is not available; only
	if this does not generate a sufficiently large block will the memory
	pool try splitting a larger unused block. This policy attempts to
	preserve the memory pool's larger blocks, at the cost of performing
	automatic partial defragmentations more frequently.

config MEM_POOL_SPLIT_ONLY
	bool "Split a larger block, but never merge smaller blocks"
	help
	This option instructs a memory pool to try splitting a larger unused
	block if an unused block of the required size is not available; if no
	such blocks exist the block allocation operation fails. This policy
	attempts to limit the cost of defragmenting the memory pool by avoiding
	automatic partial defragmentation, at the cost of requiring the
	application to explicitly request a full defragmentation of the memory
	pool when an allocation fails. Depending on how a memory pool is used,
	it may be more efficient for a memory pool to perform an occasional
	full defragmentation than to perform frequent partial defragmentations.

endchoice

config HEAP_MEM_POOL_SIZE
	int
	prompt "Heap memory pool size (in bytes)"
	default 0
	help
	This option specifies the size of the heap memory pool used when
	dynamically allocating memory using k_malloc(). Supported values
	are: 256, 1024, 4096, and 16384. A size of zero means that no
	heap memory pool is defined.
endmenu


config ARCH_HAS_CUSTOM_SWAP_TO_MAIN
	bool
	# hidden
	default n
	help
	It's possible that an architecture port cannot use _Swap() to swap to
	the _main() thread, but instead must do something custom. It must
	enable this option in that case.

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.

	Depending on the choice made, an amount of possibly expensive math must
	occur when converting ticks to milliseconds and vice-versa. Some values
	are optimized, and yield significantly less math.

	The optimal values from a computational point-of-view are 1000, 500,
	250 and 125, since in these cases there is either no computation
	required, or it is all done via bit-shifting. These also give a
	granularity from 1ms to 8ms.

	Other good values are 100, 50, 25, 20 and 10. In this case, some math
	is required but is minimized. These are also values that necessitate a
	reduced number of clock interrupts per second, at the cost of
	granularity (10ms to 100ms).

	All other values require some extensive 64-bit math, and in some
	configurations even require calls to compiler built-in functions, and
	can require a non-trivial extra amount of stack space (e.g. around 80
	bytes on x86).

	Using the legacy API also incurs an extra penalty, since when asking
	for a timeout, a translation is made from ticks to milliseconds to call
	the native kernel APIs, and then another translation is made back to
	ticks, since the kernel is tick-based.

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 board'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 y
	default n if (SYS_CLOCK_TICKS_PER_SEC = 0)
	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 threads.

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 boards
	  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. This is similar to kernel FIFOs but ring
	buffers manage their own buffer memory and can store arbitrary data.
	For optimal performance, use buffer sizes that are a power of 2.

menu "Initialization Priorities"

config KERNEL_INIT_PRIORITY_OBJECTS
	int
	prompt "Kernel objects initialization priority"
	default 30
	help
	Kernel objects use this priority for initialization. This
	priority needs to be higher than minimal default initialization
	priority.

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

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

config APPLICATION_INIT_PRIORITY
	int
	prompt "Default init priority for application level drivers"
	default 90
	help
	This priority level is for end-user drivers such as sensors and display
	which have no inward dependencies.
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

menu "Legacy Kernel Options"

config LEGACY_KERNEL
	bool "Legacy Kernel Options"
	default y
	help
	Enable legacy kernel features.

config MDEF
	bool
	prompt "Use MDEF files for statically configured kernel objects"
	default y if LEGACY_KERNEL
	help
	Using an MDEF file can help the startup time of the application since
	the objects it lists are statically allocated and initialized, and may
	also reduce code size if no subsystem uses the initialization routines.

	Disabling this option can reduce the compilation time slightly.

	In doubt, select 'y'.

config  NANO_TIMEOUTS
	bool
	default y if LEGACY_KERNEL
	depends on SYS_CLOCK_EXISTS
	help
	Only here for common (ie. non-unified kernel) code that rely on this.
	Unified kernel uses SYS_CLOCK_EXISTS everywhere instead.

config  NANO_TIMERS
	bool
	default y if LEGACY_KERNEL
	depends on SYS_CLOCK_EXISTS
	help
	Only here for common (ie. non-unified kernel) code that rely on this.
	Unified kernel uses SYS_CLOCK_EXISTS everywhere instead.

endmenu

source "kernel/Kconfig.event_logger"

source "kernel/Kconfig.power_mgmt"

endmenu
