# SPDX-License-Identifier: GPL-2.0
#
# ACPI Configuration
#

config ARCH_SUPPORTS_ACPI
	bool

menuconfig ACPI
	bool "ACPI (Advanced Configuration and Power Interface) Support"
	depends on ARCH_SUPPORTS_ACPI
	select PNP
	select NLS
	default y if X86
	help
	  Advanced Configuration and Power Interface (ACPI) support for 
	  Linux requires an ACPI-compliant platform (hardware/firmware),
	  and assumes the presence of OS-directed configuration and power
	  management (OSPM) software.  This option will enlarge your 
	  kernel by about 70K.

	  Linux ACPI provides a robust functional replacement for several 
	  legacy configuration and power management interfaces, including
	  the Plug-and-Play BIOS specification (PnP BIOS), the 
	  MultiProcessor Specification (MPS), and the Advanced Power 
	  Management (APM) specification.  If both ACPI and APM support 
	  are configured, ACPI is used.

	  The project home page for the Linux ACPI subsystem is here:
	  <https://01.org/linux-acpi>

	  Linux support for ACPI is based on Intel Corporation's ACPI
	  Component Architecture (ACPI CA).  For more information on the
	  ACPI CA, see:
	  <http://acpica.org/>

	  ACPI is an open industry specification originally co-developed by
	  Hewlett-Packard, Intel, Microsoft, Phoenix, and Toshiba. Currently,
	  it is developed by the ACPI Specification Working Group (ASWG) under
	  the UEFI Forum and any UEFI member can join the ASWG and contribute
	  to the ACPI specification.
	  The specification is available at:
	  <http://www.acpi.info>
	  <http://www.uefi.org/acpi/specs>

if ACPI

config ACPI_LEGACY_TABLES_LOOKUP
	bool

config ARCH_MIGHT_HAVE_ACPI_PDC
	bool

config ACPI_GENERIC_GSI
	bool

config ACPI_SYSTEM_POWER_STATES_SUPPORT
	bool

config ACPI_CCA_REQUIRED
	bool

config ACPI_DEBUGGER
	bool "AML debugger interface"
	select ACPI_DEBUG
	help
	  Enable in-kernel debugging of AML facilities: statistics,
	  internal object dump, single step control method execution.
	  This is still under development, currently enabling this only
	  results in the compilation of the ACPICA debugger files.

if ACPI_DEBUGGER

config ACPI_DEBUGGER_USER
	tristate "Userspace debugger accessiblity"
	depends on DEBUG_FS
	help
	  Export /sys/kernel/debug/acpi/acpidbg for userspace utilities
	  to access the debugger functionalities.

endif

config ACPI_SPCR_TABLE
	bool "ACPI Serial Port Console Redirection Support"
	default y if X86
	help
	  Enable support for Serial Port Console Redirection (SPCR) Table.
	  This table provides information about the configuration of the
	  earlycon console.

config ACPI_LPIT
	bool
	depends on X86_64
	default y

config ACPI_SLEEP
	bool
	depends on SUSPEND || HIBERNATION
	depends on ACPI_SYSTEM_POWER_STATES_SUPPORT
	default y

config ACPI_PROCFS_POWER
	bool "Deprecated power /proc/acpi directories"
	depends on X86 && PROC_FS
	help
	  For backwards compatibility, this option allows
	  deprecated power /proc/acpi/ directories to exist, even when
	  they have been replaced by functions in /sys.
	  The deprecated directories (and their replacements) include:
	  /proc/acpi/battery/* (/sys/class/power_supply/*) and
	  /proc/acpi/ac_adapter/* (sys/class/power_supply/*).
	  This option has no effect on /proc/acpi/ directories
	  and functions which do not yet exist in /sys.
	  This option, together with the proc directories, will be
	  deleted in the future.

	  Say N to delete power /proc/acpi/ directories that have moved to /sys.

config ACPI_REV_OVERRIDE_POSSIBLE
	bool "Allow supported ACPI revision to be overridden"
	depends on X86
	default y
	help
	  The platform firmware on some systems expects Linux to return "5" as
	  the supported ACPI revision which makes it expose system configuration
	  information in a special way.

	  For example, based on what ACPI exports as the supported revision,
	  Dell XPS 13 (2015) configures its audio device to either work in HDA
	  mode or in I2S mode, where the former is supposed to be used on Linux
	  until the latter is fully supported (in the kernel as well as in user
	  space).

	  This option enables a DMI-based quirk for the above Dell machine (so
	  that HDA audio is exposed by the platform firmware to the kernel) and
	  makes it possible to force the kernel to return "5" as the supported
	  ACPI revision via the "acpi_rev_override" command line switch.

config ACPI_EC_DEBUGFS
	tristate "EC read/write access through /sys/kernel/debug/ec"
	help
	  Say N to disable Embedded Controller /sys/kernel/debug interface

	  Be aware that using this interface can confuse your Embedded
	  Controller in a way that a normal reboot is not enough. You then
	  have to power off your system, and remove the laptop battery for
	  some seconds.
	  An Embedded Controller typically is available on laptops and reads
	  sensor values like battery state and temperature.
	  The kernel accesses the EC through ACPI parsed code provided by BIOS
	  tables. This option allows to access the EC directly without ACPI
	  code being involved.
	  Thus this option is a debug option that helps to write ACPI drivers
	  and can be used to identify ACPI code or EC firmware bugs.

config ACPI_AC
	tristate "AC Adapter"
	select POWER_SUPPLY
	default y
	help
	  This driver supports the AC Adapter object, which indicates
	  whether a system is on AC or not.  If you have a system that can
	  switch between A/C and battery, say Y.

	  To compile this driver as a module, choose M here:
	  the module will be called ac.

config ACPI_BATTERY
	tristate "Battery"
	select POWER_SUPPLY
	default y
	help
	  This driver adds support for battery information through
	  /proc/acpi/battery. If you have a mobile system with a battery, 
	  say Y.

	  To compile this driver as a module, choose M here:
	  the module will be called battery.

config ACPI_BUTTON
	tristate "Button"
	depends on INPUT
	default y
	help
	  This driver handles events on the power, sleep, and lid buttons.
	  A daemon reads events from input devices or via netlink and
	  performs user-defined actions such as shutting down the system.
	  This is necessary for software-controlled poweroff.

	  To compile this driver as a module, choose M here:
	  the module will be called button.

config ACPI_TINY_POWER_BUTTON
	tristate "Tiny Power Button Driver"
	depends on !ACPI_BUTTON
	help
	  This driver provides a tiny alternative to the ACPI Button driver.
	  The tiny power button driver only handles the power button. Rather
	  than notifying userspace via the input layer or a netlink event, this
	  driver directly signals the init process to shut down.

	  This driver is particularly suitable for cloud and VM environments,
	  which use a simulated power button to initiate a controlled poweroff,
	  but which may not want to run a separate userspace daemon to process
	  input events.

config ACPI_TINY_POWER_BUTTON_SIGNAL
	int "Tiny Power Button Signal"
	depends on ACPI_TINY_POWER_BUTTON
	default 38
	help
	  Default signal to send to init in response to the power button.

	  Likely values here include 38 (SIGRTMIN+4) to power off, or 2
	  (SIGINT) to simulate Ctrl+Alt+Del.

config ACPI_VIDEO
	tristate "Video"
	depends on X86 && BACKLIGHT_CLASS_DEVICE
	depends on INPUT
	select THERMAL
	help
	  This driver implements the ACPI Extensions For Display Adapters
	  for integrated graphics devices on motherboard, as specified in
	  ACPI 2.0 Specification, Appendix B.  This supports basic operations
	  such as defining the video POST device, retrieving EDID information,
	  and setting up a video output.

	  To compile this driver as a module, choose M here:
	  the module will be called video.

config ACPI_FAN
	tristate "Fan"
	depends on THERMAL
	default y
	help
	  This driver supports ACPI fan devices, allowing user-mode
	  applications to perform basic fan control (on, off, status).

	  To compile this driver as a module, choose M here:
	  the module will be called fan.

config ACPI_TAD
	tristate "ACPI Time and Alarm (TAD) Device Support"
	depends on SYSFS && PM_SLEEP
	help
	  The ACPI Time and Alarm (TAD) device is an alternative to the Real
	  Time Clock (RTC).  Its wake timers allow the system to transition from
	  the S3 (or optionally S4/S5) state to S0 state after a time period
	  elapses.  In comparison with the RTC Alarm, the TAD provides a larger
	  scale of flexibility in the wake timers.  The time capabilities of the
	  TAD maintain the time of day information across platform power
	  transitions, and keep track of time even when the platform is turned
	  off.

config ACPI_DOCK
	bool "Dock"
	help
	  This driver supports ACPI-controlled docking stations and removable
	  drive bays such as the IBM Ultrabay and the Dell Module Bay.

config ACPI_CPU_FREQ_PSS
	bool
	select THERMAL

config ACPI_PROCESSOR_CSTATE
	def_bool y
	depends on ACPI_PROCESSOR
	depends on IA64 || X86

config ACPI_PROCESSOR_IDLE
	bool
	select CPU_IDLE

config ACPI_MCFG
	bool

config ACPI_CPPC_LIB
	bool
	depends on ACPI_PROCESSOR
	select MAILBOX
	select PCC
	help
	  If this option is enabled, this file implements common functionality
	  to parse CPPC tables as described in the ACPI 5.1+ spec. The
	  routines implemented are meant to be used by other
	  drivers to control CPU performance using CPPC semantics.
	  If your platform does not support CPPC in firmware,
	  leave this option disabled.

config ACPI_PROCESSOR
	tristate "Processor"
	depends on X86 || IA64 || ARM64
	select ACPI_PROCESSOR_IDLE
	select ACPI_CPU_FREQ_PSS if X86 || IA64
	default y
	help
	  This driver adds support for the ACPI Processor package. It is required
	  by several flavors of cpufreq performance-state, thermal, throttling and
	  idle drivers.

	  To compile this driver as a module, choose M here:
	  the module will be called processor.

config ACPI_IPMI
	tristate "IPMI"
	depends on IPMI_HANDLER
	help
	  This driver enables the ACPI to access the BMC controller. And it
	  uses the IPMI request/response message to communicate with BMC
	  controller, which can be found on on the server.

	  To compile this driver as a module, choose M here:
	  the module will be called as acpi_ipmi.

config ACPI_HOTPLUG_CPU
	bool
	depends on ACPI_PROCESSOR && HOTPLUG_CPU
	select ACPI_CONTAINER
	default y

config ACPI_PROCESSOR_AGGREGATOR
	tristate "Processor Aggregator"
	depends on ACPI_PROCESSOR
	depends on X86
	help
	  ACPI 4.0 defines processor Aggregator, which enables OS to perform
	  specific processor configuration and control that applies to all
	  processors in the platform. Currently only logical processor idling
	  is defined, which is to reduce power consumption. This driver
	  supports the new device.

config ACPI_THERMAL
	tristate "Thermal Zone"
	depends on ACPI_PROCESSOR
	select THERMAL
	default y
	help
	  This driver supports ACPI thermal zones.  Most mobile and
	  some desktop systems support ACPI thermal zones.  It is HIGHLY
	  recommended that this option be enabled, as your processor(s)
	  may be damaged without it.

	  To compile this driver as a module, choose M here:
	  the module will be called thermal.

config ACPI_CUSTOM_DSDT_FILE
	string "Custom DSDT Table file to include"
	default ""
	depends on !STANDALONE
	help
	  This option supports a custom DSDT by linking it into the kernel.
	  See Documentation/admin-guide/acpi/dsdt-override.rst

	  Enter the full path name to the file which includes the AmlCode
	  or dsdt_aml_code declaration.

	  If unsure, don't enter a file name.

config ACPI_CUSTOM_DSDT
	bool
	default ACPI_CUSTOM_DSDT_FILE != ""

config ARCH_HAS_ACPI_TABLE_UPGRADE
	def_bool n

config ACPI_TABLE_UPGRADE
	bool "Allow upgrading ACPI tables via initrd"
	depends on BLK_DEV_INITRD && ARCH_HAS_ACPI_TABLE_UPGRADE
	default y
	help
	  This option provides functionality to upgrade arbitrary ACPI tables
	  via initrd. No functional change if no ACPI tables are passed via
	  initrd, therefore it's safe to say Y.
	  See Documentation/admin-guide/acpi/initrd_table_override.rst for details

config ACPI_TABLE_OVERRIDE_VIA_BUILTIN_INITRD
	bool "Override ACPI tables from built-in initrd"
	depends on ACPI_TABLE_UPGRADE
	depends on INITRAMFS_SOURCE!="" && INITRAMFS_COMPRESSION=""
	help
	  This option provides functionality to override arbitrary ACPI tables
	  from built-in uncompressed initrd.

	  See Documentation/admin-guide/acpi/initrd_table_override.rst for details

config ACPI_DEBUG
	bool "Debug Statements"
	help
	  The ACPI subsystem can produce debug output.  Saying Y enables this
	  output and increases the kernel size by around 50K.

	  Use the acpi.debug_layer and acpi.debug_level kernel command-line
	  parameters documented in Documentation/firmware-guide/acpi/debug.rst and
	  Documentation/admin-guide/kernel-parameters.rst to control the type and
	  amount of debug output.

config ACPI_PCI_SLOT
	bool "PCI slot detection driver"
	depends on SYSFS && PCI
	help
	  This driver creates entries in /sys/bus/pci/slots/ for all PCI
	  slots in the system.  This can help correlate PCI bus addresses,
	  i.e., segment/bus/device/function tuples, with physical slots in
	  the system.  If you are unsure, say N.

config ACPI_CONTAINER
	bool "Container and Module Devices"
	default (ACPI_HOTPLUG_MEMORY || ACPI_HOTPLUG_CPU)
	help
	  This driver supports ACPI Container and Module devices (IDs
	  ACPI0004, PNP0A05, and PNP0A06).

	  This helps support hotplug of nodes, CPUs, and memory.

	  To compile this driver as a module, choose M here:
	  the module will be called container.

config ACPI_HOTPLUG_MEMORY
	bool "Memory Hotplug"
	depends on MEMORY_HOTPLUG
	help
	  This driver supports ACPI memory hotplug.  The driver
	  fields notifications on ACPI memory devices (PNP0C80),
	  which represent memory ranges that may be onlined or
	  offlined during runtime.

	  If your hardware and firmware do not support adding or
	  removing memory devices at runtime, you need not enable
	  this driver.

	  To compile this driver as a module, choose M here:
	  the module will be called acpi_memhotplug.

config ACPI_HOTPLUG_IOAPIC
	bool
	depends on PCI
	depends on X86_IO_APIC
	default y

config ACPI_SBS
	tristate "Smart Battery System"
	depends on X86
	select POWER_SUPPLY
	help
	  This driver supports the Smart Battery System, another
	  type of access to battery information, found on some laptops.

	  To compile this driver as a module, choose M here:
	  the modules will be called sbs and sbshc.

config ACPI_HED
	tristate "Hardware Error Device"
	help
	  This driver supports the Hardware Error Device (PNP0C33),
	  which is used to report some hardware errors notified via
	  SCI, mainly the corrected errors.

config ACPI_CUSTOM_METHOD
	tristate "Allow ACPI methods to be inserted/replaced at run time"
	depends on DEBUG_FS
	help
	  This debug facility allows ACPI AML methods to be inserted and/or
	  replaced without rebooting the system. For details refer to:
	  Documentation/firmware-guide/acpi/method-customizing.rst.

	  NOTE: This option is security sensitive, because it allows arbitrary
	  kernel memory to be written to by root (uid=0) users, allowing them
	  to bypass certain security measures (e.g. if root is not allowed to
	  load additional kernel modules after boot, this feature may be used
	  to override that restriction).

config ACPI_BGRT
	bool "Boottime Graphics Resource Table support"
	depends on EFI && (X86 || ARM64)
	help
	  This driver adds support for exposing the ACPI Boottime Graphics
	  Resource Table, which allows the operating system to obtain
	  data from the firmware boot splash. It will appear under
	  /sys/firmware/acpi/bgrt/ .

config ACPI_REDUCED_HARDWARE_ONLY
	bool "Hardware-reduced ACPI support only" if EXPERT
	def_bool n
	help
	  This config item changes the way the ACPI code is built.  When this
	  option is selected, the kernel will use a specialized version of
	  ACPICA that ONLY supports the ACPI "reduced hardware" mode.  The
	  resulting kernel will be smaller but it will also be restricted to
	  running in ACPI reduced hardware mode ONLY.

	  If you are unsure what to do, do not enable this option.

source "drivers/acpi/nfit/Kconfig"
source "drivers/acpi/numa/Kconfig"
source "drivers/acpi/apei/Kconfig"
source "drivers/acpi/dptf/Kconfig"

config ACPI_WATCHDOG
	bool

config ACPI_EXTLOG
	tristate "Extended Error Log support"
	depends on X86_MCE && X86_LOCAL_APIC && EDAC
	select UEFI_CPER
	help
	  Certain usages such as Predictive Failure Analysis (PFA) require
	  more information about the error than what can be described in
	  processor machine check banks. Most server processors log
	  additional information about the error in processor uncore
	  registers. Since the addresses and layout of these registers vary
	  widely from one processor to another, system software cannot
	  readily make use of them. To complicate matters further, some of
	  the additional error information cannot be constructed without
	  detailed knowledge about platform topology.

	  Enhanced MCA Logging allows firmware to provide additional error
	  information to system software, synchronous with MCE or CMCI. This
	  driver adds support for that functionality with corresponding
	  tracepoint which carries that information to userspace.

config ACPI_ADXL
	bool

menuconfig PMIC_OPREGION
	bool "PMIC (Power Management Integrated Circuit) operation region support"
	help
	  Select this option to enable support for ACPI operation
	  region of the PMIC chip. The operation region can be used
	  to control power rails and sensor reading/writing on the
	  PMIC chip.

if PMIC_OPREGION
config BYTCRC_PMIC_OPREGION
	bool "ACPI operation region support for Bay Trail Crystal Cove PMIC"
	depends on INTEL_SOC_PMIC
	help
	  This config adds ACPI operation region support for the Bay Trail
	  version of the Crystal Cove PMIC.

config CHTCRC_PMIC_OPREGION
	bool "ACPI operation region support for Cherry Trail Crystal Cove PMIC"
	depends on INTEL_SOC_PMIC
	help
	  This config adds ACPI operation region support for the Cherry Trail
	  version of the Crystal Cove PMIC.

config XPOWER_PMIC_OPREGION
	bool "ACPI operation region support for XPower AXP288 PMIC"
	depends on MFD_AXP20X_I2C && IOSF_MBI=y
	help
	  This config adds ACPI operation region support for XPower AXP288 PMIC.

config BXT_WC_PMIC_OPREGION
	bool "ACPI operation region support for BXT WhiskeyCove PMIC"
	depends on INTEL_SOC_PMIC_BXTWC
	help
	  This config adds ACPI operation region support for BXT WhiskeyCove PMIC.

config CHT_WC_PMIC_OPREGION
	bool "ACPI operation region support for CHT Whiskey Cove PMIC"
	depends on INTEL_SOC_PMIC_CHTWC
	help
	  This config adds ACPI operation region support for CHT Whiskey Cove PMIC.

config CHT_DC_TI_PMIC_OPREGION
	bool "ACPI operation region support for Dollar Cove TI PMIC"
	depends on INTEL_SOC_PMIC_CHTDC_TI
	help
	  This config adds ACPI operation region support for Dollar Cove TI PMIC.

endif

config ACPI_CONFIGFS
	tristate "ACPI configfs support"
	select CONFIGFS_FS
	help
	  Select this option to enable support for ACPI configuration from
	  userspace. The configurable ACPI groups will be visible under
	  /config/acpi, assuming configfs is mounted under /config.

if ARM64
source "drivers/acpi/arm64/Kconfig"

config ACPI_PPTT
	bool
endif

config TPS68470_PMIC_OPREGION
	bool "ACPI operation region support for TPS68470 PMIC"
	depends on MFD_TPS68470
	help
	  This config adds ACPI operation region support for TI TPS68470 PMIC.
	  TPS68470 device is an advanced power management unit that powers
	  a Compact Camera Module (CCM), generates clocks for image sensors,
	  drives a dual LED for flash and incorporates two LED drivers for
	  general purpose indicators.
	  This driver enables ACPI operation region support control voltage
	  regulators and clocks.

	  This option is a bool as it provides an ACPI operation
	  region, which must be available before any of the devices
	  using this, are probed.

endif	# ACPI

config X86_PM_TIMER
	bool "Power Management Timer Support" if EXPERT
	depends on X86 && (ACPI || JAILHOUSE_GUEST)
	default y
	help
	  The Power Management Timer is available on all ACPI-capable,
	  in most cases even if ACPI is unusable or blacklisted.

	  This timing source is not affected by power management features
	  like aggressive processor idling, throttling, frequency and/or
	  voltage scaling, unlike the commonly used Time Stamp Counter
	  (TSC) timing source.

	  You should nearly always say Y here because many modern
	  systems require this timer.
