# 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 if SYS_CLOCK_EXISTS
	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.

endmenu
