# 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 initialization 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 || (ARM && CPU_HAS_FPU)
	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_STACK_INFO
	bool
	prompt "Thread stack info"
	default n
	help
	This option allows each thread to store the thread stack info into
	the k_thread data structure.

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 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 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 defragmentation 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).

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

source "kernel/Kconfig.event_logger"

source "kernel/Kconfig.power_mgmt"

endmenu
