#
# Timer subsystem related configuration options
#

# Options selectable by arch Kconfig

# Watchdog function for clocksources to detect instabilities
config CLOCKSOURCE_WATCHDOG
	bool

# Architecture has extra clocksource data
config ARCH_CLOCKSOURCE_DATA
	bool

# Timekeeping vsyscall support
config GENERIC_TIME_VSYSCALL
	bool

# Timekeeping vsyscall support
config GENERIC_TIME_VSYSCALL_OLD
	bool

# ktime_t scalar 64bit nsec representation
config KTIME_SCALAR
	bool

# Old style timekeeping
config ARCH_USES_GETTIMEOFFSET
	bool

# The generic clock events infrastructure
config GENERIC_CLOCKEVENTS
	bool

# Migration helper. Builds, but does not invoke
config GENERIC_CLOCKEVENTS_BUILD
	bool
	default y
	depends on GENERIC_CLOCKEVENTS

# Architecture can handle broadcast in a driver-agnostic way
config ARCH_HAS_TICK_BROADCAST
	bool

# Clockevents broadcasting infrastructure
config GENERIC_CLOCKEVENTS_BROADCAST
	bool
	depends on GENERIC_CLOCKEVENTS

# Automatically adjust the min. reprogramming time for
# clock event device
config GENERIC_CLOCKEVENTS_MIN_ADJUST
	bool

# Generic update of CMOS clock
config GENERIC_CMOS_UPDATE
	bool

if GENERIC_CLOCKEVENTS
menu "Timers subsystem"

# Core internal switch. Selected by NO_HZ_COMMON / HIGH_RES_TIMERS. This is
# only related to the tick functionality. Oneshot clockevent devices
# are supported independ of this.
config TICK_ONESHOT
	bool

config NO_HZ_COMMON
	bool
	depends on !ARCH_USES_GETTIMEOFFSET && GENERIC_CLOCKEVENTS
	select TICK_ONESHOT

choice
	prompt "Timer tick handling"
	default NO_HZ_IDLE if NO_HZ

config HZ_PERIODIC
	bool "Periodic timer ticks (constant rate, no dynticks)"
	help
	  This option keeps the tick running periodically at a constant
	  rate, even when the CPU doesn't need it.

config NO_HZ_IDLE
	bool "Idle dynticks system (tickless idle)"
	depends on !ARCH_USES_GETTIMEOFFSET && GENERIC_CLOCKEVENTS
	select NO_HZ_COMMON
	help
	  This option enables a tickless idle system: timer interrupts
	  will only trigger on an as-needed basis when the system is idle.
	  This is usually interesting for energy saving.

	  Most of the time you want to say Y here.

config NO_HZ_FULL
	bool "Full dynticks system (tickless)"
	# NO_HZ_COMMON dependency
	depends on !ARCH_USES_GETTIMEOFFSET && GENERIC_CLOCKEVENTS
	# We need at least one periodic CPU for timekeeping
	depends on SMP
	# RCU_USER_QS dependency
	depends on HAVE_CONTEXT_TRACKING
	# VIRT_CPU_ACCOUNTING_GEN dependency
	depends on 64BIT
	select NO_HZ_COMMON
	select RCU_USER_QS
	select RCU_NOCB_CPU
	select VIRT_CPU_ACCOUNTING_GEN
	select IRQ_WORK
	help
	 Adaptively try to shutdown the tick whenever possible, even when
	 the CPU is running tasks. Typically this requires running a single
	 task on the CPU. Chances for running tickless are maximized when
	 the task mostly runs in userspace and has few kernel activity.

	 You need to fill up the nohz_full boot parameter with the
	 desired range of dynticks CPUs.

	 This is implemented at the expense of some overhead in user <-> kernel
	 transitions: syscalls, exceptions and interrupts. Even when it's
	 dynamically off.

	 Say N.

endchoice

config NO_HZ_FULL_ALL
       bool "Full dynticks system on all CPUs by default"
       depends on NO_HZ_FULL
       help
         If the user doesn't pass the nohz_full boot option to
	 define the range of full dynticks CPUs, consider that all
	 CPUs in the system are full dynticks by default.
	 Note the boot CPU will still be kept outside the range to
	 handle the timekeeping duty.

config NO_HZ_FULL_SYSIDLE
	bool "Detect full-system idle state for full dynticks system"
	depends on NO_HZ_FULL
	default n
	help
	 At least one CPU must keep the scheduling-clock tick running for
	 timekeeping purposes whenever there is a non-idle CPU, where
	 "non-idle" also includes dynticks CPUs as long as they are
	 running non-idle tasks.  Because the underlying adaptive-tick
	 support cannot distinguish between all CPUs being idle and
	 all CPUs each running a single task in dynticks mode, the
	 underlying support simply ensures that there is always a CPU
	 handling the scheduling-clock tick, whether or not all CPUs
	 are idle.  This Kconfig option enables scalable detection of
	 the all-CPUs-idle state, thus allowing the scheduling-clock
	 tick to be disabled when all CPUs are idle.  Note that scalable
	 detection of the all-CPUs-idle state means that larger systems
	 will be slower to declare the all-CPUs-idle state.

	 Say Y if you would like to help debug all-CPUs-idle detection.

	 Say N if you are unsure.

config NO_HZ_FULL_SYSIDLE_SMALL
	int "Number of CPUs above which large-system approach is used"
	depends on NO_HZ_FULL_SYSIDLE
	range 1 NR_CPUS
	default 8
	help
	 The full-system idle detection mechanism takes a lazy approach
	 on large systems, as is required to attain decent scalability.
	 However, on smaller systems, scalability is not anywhere near as
	 large a concern as is energy efficiency.  The sysidle subsystem
	 therefore uses a fast but non-scalable algorithm for small
	 systems and a lazier but scalable algorithm for large systems.
	 This Kconfig parameter defines the number of CPUs in the largest
	 system that will be considered to be "small".

	 The default value will be fine in most cases.	Battery-powered
	 systems that (1) enable NO_HZ_FULL_SYSIDLE, (2) have larger
	 numbers of CPUs, and (3) are suffering from battery-lifetime
	 problems due to long sysidle latencies might wish to experiment
	 with larger values for this Kconfig parameter.  On the other
	 hand, they might be even better served by disabling NO_HZ_FULL
	 entirely, given that NO_HZ_FULL is intended for HPC and
	 real-time workloads that at present do not tend to be run on
	 battery-powered systems.

	 Take the default if you are unsure.

config NO_HZ
	bool "Old Idle dynticks config"
	depends on !ARCH_USES_GETTIMEOFFSET && GENERIC_CLOCKEVENTS
	help
	  This is the old config entry that enables dynticks idle.
	  We keep it around for a little while to enforce backward
	  compatibility with older config files.

config HIGH_RES_TIMERS
	bool "High Resolution Timer Support"
	depends on !ARCH_USES_GETTIMEOFFSET && GENERIC_CLOCKEVENTS
	select TICK_ONESHOT
	help
	  This option enables high resolution timer support. If your
	  hardware is not capable then this option only increases
	  the size of the kernel image.

endmenu
endif
