# SPDX-License-Identifier: GPL-2.0-only
config SUSPEND
	bool "Suspend to RAM and standby"
	depends on ARCH_SUSPEND_POSSIBLE
	default y
	help
	  Allow the system to enter sleep states in which main memory is
	  powered and thus its contents are preserved, such as the
	  suspend-to-RAM state (e.g. the ACPI S3 state).

config SUSPEND_FREEZER
	bool "Enable freezer for suspend to RAM/standby" \
		if ARCH_WANTS_FREEZER_CONTROL || BROKEN
	depends on SUSPEND
	default y
	help
	  This allows you to turn off the freezer for suspend. If this is
	  done, no tasks are frozen for suspend to RAM/standby.

	  Turning OFF this setting is NOT recommended! If in doubt, say Y.

config SUSPEND_SKIP_SYNC
	bool "Skip kernel's sys_sync() on suspend to RAM/standby"
	depends on SUSPEND
	depends on EXPERT
	help
	  Skip the kernel sys_sync() before freezing user processes.
	  Some systems prefer not to pay this cost on every invocation
	  of suspend, or they are content with invoking sync() from
	  user-space before invoking suspend.  There's a run-time switch
	  at '/sys/power/sync_on_suspend' to configure this behaviour.
	  This setting changes the default for the run-tim switch. Say Y
	  to change the default to disable the kernel sys_sync().

config HIBERNATE_CALLBACKS
	bool

config HIBERNATION
	bool "Hibernation (aka 'suspend to disk')"
	depends on SWAP && ARCH_HIBERNATION_POSSIBLE
	select HIBERNATE_CALLBACKS
	select LZO_COMPRESS
	select LZO_DECOMPRESS
	select CRC32
	help
	  Enable the suspend to disk (STD) functionality, which is usually
	  called "hibernation" in user interfaces.  STD checkpoints the
	  system and powers it off; and restores that checkpoint on reboot.

	  You can suspend your machine with 'echo disk > /sys/power/state'
	  after placing resume=/dev/swappartition on the kernel command line
	  in your bootloader's configuration file.

	  Alternatively, you can use the additional userland tools available
	  from <http://suspend.sf.net>.

	  In principle it does not require ACPI or APM, although for example
	  ACPI will be used for the final steps when it is available.  One
	  of the reasons to use software suspend is that the firmware hooks
	  for suspend states like suspend-to-RAM (STR) often don't work very
	  well with Linux.

	  It creates an image which is saved in your active swap. Upon the next
	  boot, pass the 'resume=/dev/swappartition' argument to the kernel to
	  have it detect the saved image, restore memory state from it, and
	  continue to run as before. If you do not want the previous state to
	  be reloaded, then use the 'noresume' kernel command line argument.
	  Note, however, that fsck will be run on your filesystems and you will
	  need to run mkswap against the swap partition used for the suspend.

	  It also works with swap files to a limited extent (for details see
	  <file:Documentation/power/swsusp-and-swap-files.rst>).

	  Right now you may boot without resuming and resume later but in the
	  meantime you cannot use the swap partition(s)/file(s) involved in
	  suspending.  Also in this case you must not use the filesystems
	  that were mounted before the suspend.  In particular, you MUST NOT
	  MOUNT any journaled filesystems mounted before the suspend or they
	  will get corrupted in a nasty way.

	  For more information take a look at <file:Documentation/power/swsusp.rst>.

config HIBERNATION_SNAPSHOT_DEV
	bool "Userspace snapshot device"
	depends on HIBERNATION
	default y
	help
	  Device used by the uswsusp tools.

	  Say N if no snapshotting from userspace is needed, this also
	  reduces the attack surface of the kernel.

	  If in doubt, say Y.

config PM_STD_PARTITION
	string "Default resume partition"
	depends on HIBERNATION
	default ""
	help
	  The default resume partition is the partition that the suspend-
	  to-disk implementation will look for a suspended disk image.

	  The partition specified here will be different for almost every user.
	  It should be a valid swap partition (at least for now) that is turned
	  on before suspending.

	  The partition specified can be overridden by specifying:

		resume=/dev/<other device>

	  which will set the resume partition to the device specified.

	  Note there is currently not a way to specify which device to save the
	  suspended image to. It will simply pick the first available swap
	  device.

config PM_SLEEP
	def_bool y
	depends on SUSPEND || HIBERNATE_CALLBACKS
	select PM
	select SRCU

config PM_SLEEP_SMP
	def_bool y
	depends on SMP
	depends on ARCH_SUSPEND_POSSIBLE || ARCH_HIBERNATION_POSSIBLE
	depends on PM_SLEEP
	select HOTPLUG_CPU

config PM_SLEEP_SMP_NONZERO_CPU
	def_bool y
	depends on PM_SLEEP_SMP
	depends on ARCH_SUSPEND_NONZERO_CPU
	help
	If an arch can suspend (for suspend, hibernate, kexec, etc) on a
	non-zero numbered CPU, it may define ARCH_SUSPEND_NONZERO_CPU. This
	will allow nohz_full mask to include CPU0.

config PM_AUTOSLEEP
	bool "Opportunistic sleep"
	depends on PM_SLEEP
	help
	Allow the kernel to trigger a system transition into a global sleep
	state automatically whenever there are no active wakeup sources.

config PM_USERSPACE_AUTOSLEEP
	bool "Userspace opportunistic sleep"
	depends on PM_SLEEP
	help
	Notify kernel of aggressive userspace autosleep power management policy.

	This option changes the behavior of various sleep-sensitive code to deal
	with frequent userspace-initiated transitions into a global sleep state.

	Saying Y here, disables code paths that most users really should keep
	enabled. In particular, only enable this if it is very common to be
	asleep/awake for very short periods of time (<= 2 seconds).

	Only platforms, such as Android, that implement opportunistic sleep from
	a userspace power manager service should enable this option; and not
	other machines. Therefore, you should say N here, unless you are
	extremely certain that this is what you want. The option otherwise has
	bad, undesirable effects, and should not be enabled just for fun.


config PM_WAKELOCKS
	bool "User space wakeup sources interface"
	depends on PM_SLEEP
	help
	Allow user space to create, activate and deactivate wakeup source
	objects with the help of a sysfs-based interface.

config PM_WAKELOCKS_LIMIT
	int "Maximum number of user space wakeup sources (0 = no limit)"
	range 0 100000
	default 100
	depends on PM_WAKELOCKS

config PM_WAKELOCKS_GC
	bool "Garbage collector for user space wakeup sources"
	depends on PM_WAKELOCKS
	default y

config PM
	bool "Device power management core functionality"
	help
	  Enable functionality allowing I/O devices to be put into energy-saving
	  (low power) states, for example after a specified period of inactivity
	  (autosuspended), and woken up in response to a hardware-generated
	  wake-up event or a driver's request.

	  Hardware support is generally required for this functionality to work
	  and the bus type drivers of the buses the devices are on are
	  responsible for the actual handling of device suspend requests and
	  wake-up events.

config PM_DEBUG
	bool "Power Management Debug Support"
	depends on PM
	help
	This option enables various debugging support in the Power Management
	code. This is helpful when debugging and reporting PM bugs, like
	suspend support.

config PM_ADVANCED_DEBUG
	bool "Extra PM attributes in sysfs for low-level debugging/testing"
	depends on PM_DEBUG
	help
	Add extra sysfs attributes allowing one to access some Power Management
	fields of device objects from user space.  If you are not a kernel
	developer interested in debugging/testing Power Management, say "no".

config PM_TEST_SUSPEND
	bool "Test suspend/resume and wakealarm during bootup"
	depends on SUSPEND && PM_DEBUG && RTC_CLASS=y
	help
	This option will let you suspend your machine during bootup, and
	make it wake up a few seconds later using an RTC wakeup alarm.
	Enable this with a kernel parameter like "test_suspend=mem".

	You probably want to have your system's RTC driver statically
	linked, ensuring that it's available when this test runs.

config PM_SLEEP_DEBUG
	def_bool y
	depends on PM_DEBUG && PM_SLEEP

config DPM_WATCHDOG
	bool "Device suspend/resume watchdog"
	depends on PM_DEBUG && PSTORE && EXPERT
	help
	  Sets up a watchdog timer to capture drivers that are
	  locked up attempting to suspend/resume a device.
	  A detected lockup causes system panic with message
	  captured in pstore device for inspection in subsequent
	  boot session.

config DPM_WATCHDOG_TIMEOUT
	int "Watchdog timeout in seconds"
	range 1 120
	default 120
	depends on DPM_WATCHDOG

config PM_TRACE
	bool
	help
	  This enables code to save the last PM event point across
	  reboot. The architecture needs to support this, x86 for
	  example does by saving things in the RTC, see below.

	  The architecture specific code must provide the extern
	  functions from <linux/resume-trace.h> as well as the
	  <asm/resume-trace.h> header with a TRACE_RESUME() macro.

	  The way the information is presented is architecture-
	  dependent, x86 will print the information during a
	  late_initcall.

config PM_TRACE_RTC
	bool "Suspend/resume event tracing"
	depends on PM_SLEEP_DEBUG
	depends on X86
	select PM_TRACE
	help
	This enables some cheesy code to save the last PM event point in the
	RTC across reboots, so that you can debug a machine that just hangs
	during suspend (or more commonly, during resume).

	To use this debugging feature you should attempt to suspend the
	machine, reboot it and then run

		dmesg -s 1000000 | grep 'hash matches'

	CAUTION: this option will cause your machine's real-time clock to be
	set to an invalid time after a resume.

config APM_EMULATION
	tristate "Advanced Power Management Emulation"
	depends on SYS_SUPPORTS_APM_EMULATION
	help
	  APM is a BIOS specification for saving power using several different
	  techniques. This is mostly useful for battery powered laptops with
	  APM compliant BIOSes. If you say Y here, the system time will be
	  reset after a RESUME operation, the /proc/apm device will provide
	  battery status information, and user-space programs will receive
	  notification of APM "events" (e.g. battery status change).

	  In order to use APM, you will need supporting software. For location
	  and more information, read <file:Documentation/power/apm-acpi.rst>
	  and the Battery Powered Linux mini-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  This driver does not spin down disk drives (see the hdparm(8)
	  manpage ("man 8 hdparm") for that), and it doesn't turn off
	  VESA-compliant "green" monitors.

	  Generally, if you don't have a battery in your machine, there isn't
	  much point in using this driver and you should say N. If you get
	  random kernel OOPSes or reboots that don't seem to be related to
	  anything, try disabling/enabling this option (or disabling/enabling
	  APM in your BIOS).

config PM_CLK
	def_bool y
	depends on PM && HAVE_CLK

config PM_GENERIC_DOMAINS
	bool
	depends on PM

config WQ_POWER_EFFICIENT_DEFAULT
	bool "Enable workqueue power-efficient mode by default"
	depends on PM
	help
	  Per-cpu workqueues are generally preferred because they show
	  better performance thanks to cache locality; unfortunately,
	  per-cpu workqueues tend to be more power hungry than unbound
	  workqueues.

	  Enabling workqueue.power_efficient kernel parameter makes the
	  per-cpu workqueues which were observed to contribute
	  significantly to power consumption unbound, leading to measurably
	  lower power usage at the cost of small performance overhead.

	  This config option determines whether workqueue.power_efficient
	  is enabled by default.

	  If in doubt, say N.

config PM_GENERIC_DOMAINS_SLEEP
	def_bool y
	depends on PM_SLEEP && PM_GENERIC_DOMAINS

config PM_GENERIC_DOMAINS_OF
	def_bool y
	depends on PM_GENERIC_DOMAINS && OF

config CPU_PM
	bool

config ENERGY_MODEL
	bool "Energy Model for devices with DVFS (CPUs, GPUs, etc)"
	depends on SMP
	depends on CPU_FREQ
	help
	  Several subsystems (thermal and/or the task scheduler for example)
	  can leverage information about the energy consumed by devices to
	  make smarter decisions. This config option enables the framework
	  from which subsystems can access the energy models.

	  The exact usage of the energy model is subsystem-dependent.

	  If in doubt, say N.
