# Kconfig - microkernel 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 "Microkernel Options"

config MICROKERNEL_SERVER_STACK_SIZE
	int
	prompt "Microkernel server fiber (_k_server) stack size"
	default 1024
	depends on MICROKERNEL
	help
	This option specifies the size of the stack used by the microkernel
	server fiber, whose entry point is _k_server().  This must be able
	to handle the deepest call stack for internal handling of microkernel

config MICROKERNEL_SERVER_PRIORITY
	int
	prompt "Priority of the kernel service fiber"
	default 0
	depends on MICROKERNEL
	help
	Priority of the microkernel server fiber that performs
	kernel requests and task scheduling assignments.

config PRIORITY_CEILING
	int
	prompt "Maximum priority for priority inheritance algorithm"
	default 0
	depends on MICROKERNEL
	help
	The highest task priority for the mutex priority inheritance
	algorithm.
	A task of low priority holding a mutex will see its priority
	bumped to the priority of a task trying to acquire the mutex.
	This option puts an upper boundary to the priority a task may
	get bumped to.

config COMMAND_STACK_SIZE
	int
	prompt "Microkernel server command stack size (in packets)"
	default 64
	depends on MICROKERNEL
	help
	This option specifies the maximum number of command packets that
	can be queued up for processing by the kernel's _k_server fiber.

config NUM_COMMAND_PACKETS
	int
	prompt "Number of command packets"
	default 16
	depends on MICROKERNEL
	help
	This option specifies the number of packets in the command packet pool.
	This pool needs to be large enough to accommodate all in-flight
	asynchronous command requests as well as those internally issued by
	the microkernel server fiber (_k_server).

config NUM_TIMER_PACKETS
	int
	prompt "Number of timer packets" if SYS_CLOCK_EXISTS
	default 0 if !SYS_CLOCK_EXISTS
	default 10
	depends on MICROKERNEL
	help
	This option specifies the number of timer packets to create. Each
	explicit and implicit timer usage consumes one timer packet.

config  NUM_TASK_PRIORITIES
	int
	prompt "Number of task priorities"
	default 16
	range 1 256
	depends on MICROKERNEL
	help
	This option specifies the number of task priorities supported by the
	task scheduler. Specifying "N" provides support for task priorities
	ranging from 0 (highest) through N-2; task priority N-1 (lowest) is
	reserved for the kernel's idle task.

config	WORKLOAD_MONITOR
	bool
	prompt "Workload monitoring [EXPERIMENTAL]"
	default n
	depends on MICROKERNEL
	help
	This option instructs the kernel to record the percentage of time
	the system is doing useful work (i.e. is not idle).

config	MAX_NUM_TASK_IRQS
	int
	prompt "Number of task IRQ objects"
	default 0
	depends on MICROKERNEL
	help
	This option specifies the maximum number of IRQs that may be
	utilized by task level device drivers. A value of zero disables
	this feature.

menu "Timer API Options"

config TIMESLICING
	bool
	prompt "Task time slicing"
	default y
	depends on MICROKERNEL && SYS_CLOCK_EXISTS
	help
	This option enables time slicing between tasks of equal priority.

config TIMESLICE_SIZE
	int
	prompt "Time slice size (in ticks)"
	default 0
	depends on TIMESLICING
	help
	This option specifies the maximum amount of time a task can execute
	before other tasks 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
	prompt "Time slicing task priority threshold"
	default 0
	depends on TIMESLICING
	help
	This option specifies the task priority level at which time slicing
	takes effect; tasks having a higher priority than this threshold
	are not subject to time slicing. A threshold level of zero means
	that all tasks are potentially subject to time slicing.
endmenu

config  TASK_MONITOR
	bool
	prompt "Task monitoring [EXPERIMENTAL]"
	default n
	depends on MICROKERNEL && KERNEL_EVENT_LOGGER
	help
	This option instructs the kernel to record significant task
	activities. These can include: task switches, task state changes,
	kernel service requests, and the signalling of events.

config  TASK_MONITOR_MASK
	int
	prompt "Trace buffer mask"
	default 15
	depends on TASK_MONITOR
	help
	This option specifies which task execution activities are captured
	in the task monitor's trace buffer. The following values can be
	OR-ed together to form the mask:

		1 (MON_TSWAP): task switch
		2 (MON_STATE): task state change
		4 (MON_KSERV): task execution of kernel APIs
		8 (MON_EVENT): task event signalled

config  OBJECT_MONITOR
	bool
	prompt "Kernel object monitoring [EXPERIMENTAL]"
	default n
	depends on MICROKERNEL
	help
	  This option instructs the kernel to record statistics about
	  microkernel object usage.

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

endmenu
