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

menu "Unified Kernel Options"

config KERNEL_V2_DEBUG
	bool
	prompt "Kernel V2 debug help"
	default n
	select INIT_STACKS

config NUM_COOP_PRIORITIES
	int
	prompt "Kernel V2: number of coop priorities"
	default 16
	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. If there are more than
	32 total priorities, an extra 4 bytes is required.

config NUM_PREEMPT_PRIORITIES
	int
	prompt "Kernel V2: number of preemptible priorities"
	default 15
	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.

	The idle thread is always installed as a preemptible thread of the
	lowest priority.

	Each priority requires an extra 8 bytes of RAM. If there are more than
	32 total priorities, an extra 4 bytes is required.

config PRIORITY_CEILING
	int
	prompt "Kernel V2: priority inheritance ceiling"
	default 0

config BOOT_BANNER
	bool
	prompt "Boot banner"
	default n
	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 MAIN_THREAD_PRIORITY
	int
	prompt "Priority of initialization/main thread"
	default 0
	default -1 if NUM_PREEMPT_PRIORITIES = 0
	help
	Priority at which the initialization thread runs, including the start
	of the main() function. main() can then change its priority if desired.

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
	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 nanokernel initialization.

config  THREAD_CUSTOM_DATA
	bool
	prompt "Task and fiber custom data"
	default n
	help
	This option allows each task and fiber to store 32 bits of custom data,
	which can be accessed using the sys_thread_custom_data_xxx() APIs.

config  NANO_TIMEOUTS
	bool
	default y
	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
	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 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 NANOKERNEL_TICKLESS_IDLE_SUPPORTED
	bool
	default n
	help
	To be selected by an architecture if it does support tickless idle in
	nanokernel systems.

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.

config SYSTEM_WORKQUEUE_STACK_SIZE
	int "System workqueue stack size"
	default 1024

config SYSTEM_WORKQUEUE_PRIORITY
	int "System workqueue priority"
	default -1

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

config NUM_MBOX_ASYNC_MSGS
	int ""
	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.

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.

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.

endmenu

config SEMAPHORE_GROUPS
	bool "Enable semaphore groups"
	default y
	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.

choice
	prompt "Memory pools auto-defragmentation policy"
	default MEM_POOL_AD_AFTER_SEARCH_FOR_BIGGERBLOCK
	help
	Memory pool auto-defragmentation is performed if a memory
	block of the requested size can not be found. Defragmentation
	can be done:
	Before trying to find a block in the next largest block set.
	This is an attempt to preserve the memory pool's larger blocks
	by fragmenting them only when necessary (i.e. at the cost of
	doing more frequent auto-defragmentations).
	After trying to find a block in the next largest block set.
	This is an attempt to limit the cost of doing auto-defragmentations
	by doing them only when necessary (i.e. at the cost of fragmenting
	the memory pool's larger blocks).

config MEM_POOL_AD_NONE
	bool "No auto-defragmentation"

config MEM_POOL_AD_BEFORE_SEARCH_FOR_BIGGERBLOCK
	bool "Before trying to find a block in the next largest block set"

config MEM_POOL_AD_AFTER_SEARCH_FOR_BIGGERBLOCK
	bool "After trying to find a block in the next largest block set"

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
