Recent from talks
Contribute something
Nothing was collected or created yet.
| Advanced Configuration and Power Interface | |
|---|---|
| Abbreviation | ACPI |
| Status | Published |
| First published | December 1996 |
| Latest version | 6.6 May 2025 |
| Organization |
|
| Related standards | UEFI |
| Predecessor | |
| Domain | Power management firmware |
| Website | uefi |
Advanced Configuration and Power Interface (ACPI) is an open standard that operating systems can use to discover and configure computer hardware components, to perform power management (e.g. putting unused hardware components to sleep), auto configuration (e.g. plug and play and hot swapping), and status monitoring. It was first released in December 1996. ACPI aims to replace Advanced Power Management (APM), the MultiProcessor Specification, and the Plug and Play BIOS (PnP) Specification.[1] ACPI brings power management under the control of the operating system, as opposed to the previous BIOS-centric system that relied on platform-specific firmware to determine power management and configuration policies.[2] The specification is central to the Operating System-directed configuration and Power Management (OSPM) system. ACPI defines hardware abstraction interfaces between the device's firmware (e.g. BIOS, UEFI), the computer hardware components, and the operating systems.[3][4]
Internally, ACPI advertises the available components and their functions to the operating system kernel using instruction lists ("methods") provided through the system firmware (UEFI or BIOS), which the kernel parses. ACPI then executes the desired operations written in ACPI Machine Language (such as the initialization of hardware components) using an embedded minimal virtual machine.
Intel, Microsoft and Toshiba originally developed the standard, while HP, Huawei and Phoenix also participated later. In October 2013, ACPI Special Interest Group (ACPI SIG), the original developers of the ACPI standard, agreed to transfer all assets to the UEFI Forum, in which all future development will take place.[5] The latest version[update] of the standard 6.6 was released in 13 May 2025.[6]
Architecture
[edit]The firmware-level ACPI has three main components: the ACPI tables, the ACPI BIOS, and the ACPI registers. The ACPI BIOS generates ACPI tables and loads ACPI tables into main memory. Much of the firmware ACPI functionality is provided in bytecode of ACPI Machine Language (AML), a Turing-complete, domain-specific low-level language, stored in the ACPI tables.[7] To make use of the ACPI tables, the operating system must have an interpreter for the AML bytecode. A reference AML interpreter implementation is provided by the ACPI Component Architecture (ACPICA). At the BIOS development time, AML bytecode is compiled from the ASL (ACPI Source Language) code.[8][9]
ACPI Component Architecture (ACPICA)
[edit]The ACPI Component Architecture (ACPICA), mainly written by Intel's engineers, provides an open-source platform-independent reference implementation of the operating system–related ACPI code.[10] The ACPICA code is used by Linux, Haiku, ArcaOS[11] and FreeBSD,[8] which supplement it with their operating-system specific code.
History
[edit]The first revision of the ACPI specification was released in December 1996, supporting 16, 24 and 32-bit addressing spaces. It was not until August 2000 that ACPI received 64-bit address support as well as support for multiprocessor workstations and servers with revision 2.0.
In 1999, then Microsoft CEO Bill Gates stated in an e-mail that Linux would benefit from ACPI without them having to do work and suggested to make it Windows-only.[12][13][14]
In September 2004, revision 3.0 was released, bringing to the ACPI specification support for SATA interfaces, PCI Express bus, multiprocessor support for more than 256 processors, ambient light sensors and user-presence devices, as well as extending the thermal model beyond the previous processor-centric support.
Released in June 2009, revision 4.0 of the ACPI specification added various new features to the design; most notable are the USB 3.0 support, logical processor idling support, and x2APIC support.
Initially ACPI was exclusive to x86 architecture; Revision 5.0 of the ACPI specification was released in December 2011,[15] which added the ARM architecture support. The revision 5.1 was released in July 2014.[16] The latest revision 6.6, which was released in May 2025, added the RISC-V support.
Operating systems
[edit]


Microsoft's Windows 98 was the first operating system to implement ACPI,[17][18] but its implementation was somewhat buggy or incomplete,[19][20] although some of the problems associated with it were caused by the first-generation ACPI hardware.[21] Other operating systems, including later versions of Windows, macOS (x86 macOS only), eComStation, ArcaOS,[22] FreeBSD (since FreeBSD 5.0[23]), NetBSD (since NetBSD 1.6[24]), OpenBSD (since OpenBSD 3.8[25]), HP-UX, OpenVMS, Linux, GNU/Hurd and PC versions of Solaris, have at least some support for ACPI.[26] Some newer operating systems, like Windows Vista, require the computer to have an ACPI-compliant BIOS, and since Windows 8, the S0ix/Modern Standby state was implemented.[27]
Windows operating systems use acpi.sys[28] to access ACPI events.
The 2.4 series of the Linux kernel had only minimal support for ACPI, with better support implemented (and enabled by default) from kernel version 2.6.0 onwards.[29] Old ACPI BIOS implementations tend to be quite buggy, and consequently are not supported by later operating systems. For example, Windows 2000, Windows XP, and Windows Server 2003 only use ACPI if the BIOS date is after January 1, 1999.[30] Similarly, Linux kernel 2.6 may not use ACPI if the BIOS date is before January 1, 2001.[29]
Linux-based operating systems can provide handling of ACPI events via acpid.[31]
OSPM responsibilities
[edit]Once an OSPM-compatible operating system activates ACPI, it takes exclusive control of all aspects of power management and device configuration. The OSPM implementation must expose an ACPI-compatible environment to device drivers, which exposes certain system, device and processor states.
Power states
[edit]Global states
[edit]The ACPI Specification defines the following four global "Gx" states and six sleep "Sx" states for an ACPI-compliant computer system:[32][33]
| Gx | Name | Sx | Description |
|---|---|---|---|
| G0 | Working | S0 | The computer is running and the CPU executes instructions. "Away mode" is a subset of S0, where monitor is off but background tasks are running. |
| G1 | Sleeping | S0ix | Modern Standby,[34] or "Low Power S0 Idle". Partial processor SoC sleep.[35][36] Sub states include S0i1, S0i2 and S0i3. Known to ARM and x86 devices. |
| S1 | Power on Suspend (POS): Processor is powered off, and the CPU(s) stops executing instructions. The power to the CPU(s) and RAM is maintained. Peripherals such as monitor and hard disk may be turned off. | ||
| S2 | CPU powered off. CPU cache is flushed to RAM. | ||
| S3 | Commonly referred to as Standby, Sleep, or Suspend to RAM (STR): RAM remains powered, and RAM enters self refresh mode. Most peripherals are turned off. Fans are usually turned off. Requires GPU drivers on Windows. | ||
| S4 | Hibernation or Suspend to Disk: All content of the main memory is saved to non-volatile memory such as a hard drive, and the system is powered down. | ||
| G2 | Soft Off | S5 | Shutdown: system is powered down. |
| G3 | Mechanical Off | The computer's power has been totally removed via a mechanical switch (as on the rear of a PSU). The power cord can be removed and the system is safe for disassembly (typically, only the real-time clock continues to run using its own small battery). |
The specification also defines a Legacy state: the state of an operating system which does not support ACPI. In this state, the hardware and power are not managed via ACPI, effectively disabling ACPI.
Device states
[edit]The device states D0–D3 are device dependent:
- D0 or Fully On is the operating state.
- As with S0ix, Intel has D0ix states for intermediate levels on the SoC.[37]
- D1 and D2 are intermediate power-states whose definition varies by device.
- D3: The D3 state is further divided into D3 Hot (has auxiliary power), and D3 Cold (no power provided):
- Hot: A device can assert power management requests to transition to higher power states.
- Cold or Off has the device powered off and unresponsive to its bus.
Processor states
[edit]The CPU power states C0–C3 are defined as follows:
- C0 is the operating state.
- C1 (often known as Halt) is a state where the processor is not executing instructions, but can return to an executing state essentially instantaneously. All ACPI-conformant processors must support this power state. Some processors, such as the Pentium 4 and AMD Athlon, also support an Enhanced C1 state (C1E or Enhanced Halt State) for lower power consumption, however this proved to be buggy on some systems.[38][39]
- C2 (often known as Stop-Clock) is a state where the processor maintains all software-visible state, but may take longer to wake up. This processor state is optional.
- C3 (often known as Sleep) is a state where the processor does not need to keep its cache coherent, but maintains other state. Some processors have variations on the C3 state (Deep Sleep, Deeper Sleep, etc.) that differ in how long it takes to wake the processor. This processor state is optional.
Additional states are defined by manufacturers for some processors. They are reported to the system via the _CST table.[40] For example, Intel's Haswell platform has states up to C10, where it distinguishes core states and package states: the difference being that the package not only includes the processor cores, but also components such as the L3 cache, memory controller, and other IO functions.[41] Similarly, AMD Zen 4 CPUs diffentiate between C-states and P-states for the core and the Data Fabric.[42]
For describing the idle states of groupings of components (e.g. a package containing several cores), the _LPI (low power idle) table is used.[43] This should not be confused with Intel's private LPIT table, used to describe S0ix sleep in package C10 or PCH SLP_S0 state.[44]
Performance state
[edit]While a device or processor operates (D0 and C0, respectively), it can be in one of several power-performance states. These states are implementation-dependent. P0 is always the highest-performance state, with P1 to Pn being successively lower-performance states. The total number of states is device or processor dependent, but can be no greater than 16.[45]
P-states have become known as SpeedStep in Intel processors, as PowerNow! or Cool'n'Quiet in AMD processors, and as PowerSaver in VIA processors.
- P0 maximum power and frequency
- P1 less than P0, voltage and frequency scaled
- P2 less than P1, voltage and frequency scaled[46]
- Pn less than P(n–1), voltage and frequency scaled
See Dynamic frequency scaling § Autonomous frequency scaling for a brief description of a newer control method based on the ACPI Collaborative Processor Performance Control (CPPC). This new method allows hundreds of possible states, and for the processor to autonomously to choose from a given range of states.
Interfaces
[edit]Hardware
[edit]ACPI-compliant systems interact with hardware through either a "Function Fixed Hardware (FFH) Interface", or a platform-independent hardware programming model which relies on platform-specific ACPI Machine Language (AML) provided by the original equipment manufacturer (OEM).
Function Fixed Hardware interfaces are platform-specific features, provided by platform manufacturers for the purposes of performance and failure recovery. Standard Intel-based PCs have a fixed function interface defined by Intel,[47] which provides a set of core functionality that reduces an ACPI-compliant system's need for full driver stacks for providing basic functionality during boot time or in the case of major system failure.
ACPI Platform Error Interface (APEI) is a specification for reporting of hardware errors, e.g. chipset, RAM to the operating system.
Firmware
[edit]ACPI defines many tables that provide the interface between an ACPI-compliant operating system and system firmware (BIOS or UEFI). This includes RSDP, RSDT, XSDT, FADT, FACS, DSDT, SSDT, MADT, and MCFG, for example.[48][49]
The tables allow description of system hardware in a platform-independent manner, and are presented as either fixed-formatted data structures or in AML. The main AML table is the DSDT (differentiated system description table). The AML can be decompiled by tools like Intel's iASL (open-source, part of ACPICA) for purposes like patching the tables for expanding OS compatibility.[50][51]
The Root System Description Pointer (RSDP) is located in a platform-dependent manner, and describes the rest of the tables.
A custom ACPI table called the Windows Platform Binary Table (WPBT) is used by Microsoft to allow vendors to add software into the Windows OS automatically. Some vendors, such as Lenovo, have been caught using this feature to install harmful software such as Superfish.[52] Samsung shipped PCs with Windows Update disabled.[52] Windows versions older than Windows 7 do not support this feature, but alternative techniques can be used. This behavior has been compared to rootkits.[53][54]
Criticism
[edit]In November 2003, Linus Torvalds—author of the Linux kernel—described ACPI as "a complete design disaster in every way".[55][56]
See also
[edit]Further reading
[edit]- Garrett, Matthew (October 31, 2023). "Why ACPI?".
References
[edit]- ^ "ACPI Overview" (PDF). www.acpi.info. Archived from the original (slide show in PDF) on May 25, 2019.
- ^ "APM BIOS Specification". Intel Corporation, Microsoft Corporation. February 1996. Archived from the original (RTF) on February 6, 2012. Retrieved July 2, 2010.
- ^ "What is ACPI (Advanced Configuration and Power Interface)? - Definition from WhatIs.com". SearchWindowsServer. Retrieved September 18, 2020.
- ^ "ACPI Device Tree - Representation of ACPI Namespace — The Linux Kernel documentation". www.kernel.org. Retrieved September 18, 2020.
- ^ "The Advanced Configuration & Power Interface web page has a prominent note that links to the Preexisting ACPI Specifications page on the UEFI web site". acpi.org. July 23, 2014. Archived from the original on June 22, 2011. Retrieved January 25, 2016.
- ^ "Advanced Configuration and Power Interface (ACPI) Specification Release 6.6" (PDF). May 13, 2025. Retrieved July 19, 2025.
- ^ Bernhard Kauer (August 2009). "ATARE: ACPI Tables and Regular Expressions" (PDF). Retrieved February 18, 2019.
- ^ a b ACPI implementation on FreeBSD - Usenix
- ^ ACPI in Linux, 2005
- ^ ACPICA: ACPI Component Architecture
- ^ "Readme for the ACPI Driver Package". arcanoae.com. Retrieved September 6, 2020.
- ^ "Microsoft wollte ACPI nur für Windows". Der Standard (in Austrian German). Retrieved November 6, 2022.
- ^ "Microsoft: ACPI sollte nur unter Windows funktionieren". Golem.de. Retrieved November 6, 2022.
- ^ Gates, Bill (January 24, 1999). "ACPI extensions" (PDF). Archived from the original (PDF) on February 2, 2007.
- ^ Hewlett-Packard; Intel Corporation; Microsoft; Phoenix Technologies; Toshiba (December 6, 2011). "Advanced Configuration and Power Interface Specification (Revision 5.0)" (PDF). acpi.info. Archived from the original (PDF) on September 14, 2012. Retrieved November 17, 2013.
- ^ "Advanced Configuration and Power Interface Specification (Revision 5.1)" (PDF). uefi.org. July 23, 2014. Retrieved May 24, 2015.
- ^ "Limitations When Using Microsoft Windows 98 on Compaq Armada Portables" (PDF). physik.hu-berlin.de (FTP). October 1998. p. 3. Retrieved January 27, 2014.[dead ftp link] (To view documents see Help:FTP)
- ^ "Windows 98 on ThinkPad systems - ThinkPad General". Support.lenovo.com. Archived from the original on February 3, 2014. Retrieved January 27, 2014.
- ^ Robert Cowart; Brian Knittel (2000). Using Microsoft Windows 2000 Professional. Que Publishing. p. 30. ISBN 978-0-7897-2125-9.
- ^ Windows 98 Does Not Support ACPI Passive Cooling Mode
- ^ "Cover Story: Win98 Bugs & Fixes - December 1998". winmag.com. Archived from the original on October 13, 1999.
- ^ "ArcaOS Changelog". Retrieved August 24, 2020.
- ^ "FreeBSD 5.0-RELEASE Announcement". www.freebsd.org. Retrieved December 3, 2020.
- ^ "acpi(4) - NetBSD Manual Pages". man.netbsd.org. Retrieved December 3, 2020.
- ^ "acpi(4) - OpenBSD manual pages". man.openbsd.org. Retrieved December 3, 2020.
- ^ Therien, Guy (January 6, 2000). "ACPI 2.0 Specification Technical Review, Intel Developer Forum" (PPT). Intel Corporation. Archived from the original on July 21, 2011. Retrieved August 21, 2011.
- ^ Marshall, Allen. "ACPI in Windows Vista" (PPT). Microsoft Corporation. Retrieved July 2, 2010.
- ^ "Acpi.sys: The Windows ACPI Driver". Microsoft Corporation. June 15, 2017. Retrieved September 20, 2019.
- ^ a b The State of ACPI in the Linux Kernel
- ^ ACPI BIOS. msdn.microsoft.com.
- ^ Siever, Ellen; Weber, Aaron; Figgins, Stephen; Love, Robert; Robbins, Arnold (2005). Linux in a nutshell (5th ed.). Sebastopol, California: O'Reilly. p. 36. ISBN 978-0-596-52949-9. OCLC 773210086.
- ^ ACPI Spec Rev 5.0 - dated December 6, 2011
- ^ Anand Lal Shimpi (October 5, 2012). "Intel's Haswell Architecture Analyzed". AnandTech. Archived from the original on October 7, 2012. Retrieved October 20, 2013.
- ^ windows-driver-content. "Modern Standby". docs.microsoft.com. Retrieved March 20, 2020.
- ^ "S0ix States". software.intel.com. March 9, 2020.
- ^ Wang, Wendy (October 17, 2018). "How to achieve S0ix states in Linux*". 01.org.
- ^ "D0ix States". software.intel.com. March 9, 2020.
- ^ "Athlon II X2: Hardware C1E and Return of the CnQ Bug". AnandTech. Archived from the original on April 19, 2010. Retrieved October 26, 2020.
- ^ Wasson, Scott (February 21, 2005). "Intel's Pentium 4 600 series processors". The Tech Report. p. 2.
- ^ https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/08_Processor_Configuration_and_Control/processor-power-states.html
- ^ "Processor Package and Core C-States". AnandTech. June 9, 2013. Archived from the original on September 27, 2013. Retrieved October 20, 2013.
- ^ "[Public] TUNING GUIDE AMD EPYC 9004 BIOS & Workload" (PDF).
- ^ "8.4. Declaring Processors — ACPI Specification 6.4 documentation". uefi.org.
- ^ "Low Power Idle Table (LPIT) — The Linux Kernel documentation". docs.kernel.org.
- ^ "Advanced Configuration and Power Interface Specification, Revision 3.0, Section 2.6 Device and Processor Performance State Definitions" (PDF). ACPI.info. September 2, 2004. p. 23. Archived from the original (PDF) on November 28, 2015. Retrieved August 19, 2015.
- ^ Link aggregation
- ^ Intel Corporation (September 2006). "Intel Processor Vendor-Specific ACPI" (PDF). Archived from the original (PDF) on January 18, 2007. Retrieved October 5, 2014.
- ^ Brown, Len (July 20, 2005). "ACPI in Linux". Ottawa Linux Symposium: 3. CiteSeerX 10.1.1.173.2206.
- ^ "ACPI Tables — The Linux Kernel documentation". www.kernel.org. Archived from the original on October 20, 2020. Retrieved November 8, 2020.
- ^ "DSDT". ArchWiki.
- ^ "Getting Started With ACPI". GitBook.
- ^ a b Hoffman, Chris (August 19, 2015). "Zombie Crapware: How the Windows Platform Binary Table Works". How-To Geek.
- ^ "Vendors 'rootkit': 'Windows Platform Binary Table' (WPBT)". Born's Tech and Windows World. December 6, 2017.
- ^ Mayank Sharma (September 27, 2021). "Millions of Windows 10 PCs exposed by nasty security vulnerability". TechRadar. Retrieved November 10, 2022.
- ^ Linux Magazine issue 162, May 2014, page 9
- ^ Searls, Doc (November 25, 2003). "Linus & the Lunatics, Part II". Linux Journal. Retrieved January 13, 2010.
External links
[edit]- Official website (UEFI and ACPI specifications)
- Everything You Need to Know About the CPU C-States Power Saving Modes
- Sample EFI ASL code Archived April 12, 2023, at the Wayback Machine used by VirtualBox; EFI/ASL code itself is from the open source Intel EFI Development Kit II (TianoCore)
- ACPICA
Overview
Definition and Purpose
The Advanced Configuration and Power Interface (ACPI) is an open industry standard that defines interfaces for device configuration and power management in computer systems.[5] It was originally developed by Intel, Microsoft, and Toshiba, with subsequent contributions from other vendors such as Hewlett-Packard.[6] ACPI enables operating systems to discover and configure hardware components in a vendor-neutral manner, extending beyond traditional BIOS limitations to support modern system capabilities.[5] The primary purpose of ACPI is to facilitate Operating System-directed configuration and Power Management (OSPM), allowing the operating system to exert direct control over power states, hardware resource allocation, and device enumeration without reliance on BIOS-specific code.[7] Through OSPM, ACPI shifts power management responsibilities from firmware to the OS, enabling dynamic adjustments to system and device behaviors based on usage patterns and policy.[5] This approach ensures consistent behavior across diverse hardware platforms while supporting advanced features like interrupt routing and bus enumeration.[8] ACPI delivers key benefits by enhancing energy efficiency through mechanisms that transition idle devices and subsystems into lower power states, thereby reducing overall power consumption.[9] In mobile systems, it extends battery life by optimizing resource usage and enabling fine-grained control over components like batteries and processors.[5] Additionally, ACPI improves system responsiveness by allowing rapid state transitions and replaces legacy methods such as Advanced Power Management (APM) with a more robust, OS-integrated framework.[5] Its scope encompasses hardware discovery akin to Plug and Play standards, alongside enforcement of power policies for both individual devices and the entire platform.[7]Key Components
ACPI tables form the foundational data structures that convey hardware configuration and capabilities from the platform firmware to the operating system. The Root System Description Table (RSDT) provides 32-bit pointers to other ACPI tables, ensuring compatibility with earlier specifications, while the Extended System Description Table (XSDT) uses 64-bit pointers for modern systems and supersedes the RSDT when present.[8] These root tables, located via the Root System Description Pointer (RSDP) in low memory, enable the operating system present manager (OSPM) to discover and load subsequent tables that describe the system's hardware features beyond fixed registers.[8] The Differentiated System Description Table (DSDT) serves as the primary table, containing the core Differentiated Definition Block encoded in ACPI Machine Language (AML) to outline the system's devices, resources, and control logic.[8] Secondary System Description Tables (SSDTs) supplement the DSDT by providing additional definition blocks, which are loaded in the order listed in the RSDT or XSDT, allowing for modular extensions to hardware descriptions without altering the base configuration.[8] The ACPI Namespace establishes a hierarchical, tree-structured object model that represents the system's devices, methods, and resources, constructed by the OSPM through the loading and evaluation of definition blocks from the DSDT and SSDTs.[8] This namespace organizes enumerable objects—such as device nodes and data fields—into a unified view accessible via pathnames, facilitating dynamic queries and modifications during runtime.[8] Central to this model is ACPI Machine Language (AML), a compact bytecode format compiled from the ACPI Source Language (ASL), which the OSPM's AML interpreter executes to evaluate namespace objects, perform calculations, access I/O or memory, and implement platform-specific behaviors.[10] AML enables the namespace to support both static data and dynamic operations, ensuring portable hardware abstraction across diverse platforms. Control methods within the namespace provide standardized interfaces for device identification and resource management, implemented as AML code under specific object names. The _HID (Hardware ID) method returns a unique identifier, such as a Plug and Play EISA-compatible ID or ACPI string (e.g., "PNP0C0C" for a power button), allowing OSPM to match devices with appropriate drivers during enumeration.[11] The _CRS (Current Resource Settings) method delivers a package of resource descriptors detailing the device's current allocations, including interrupt, I/O, and memory ranges, which OSPM uses to assess and reconfigure resources without hardware probing.[11] Complementing this, the _SRS (Set Resource Settings) method accepts a similar resource package from OSPM to program the device's hardware registers, enabling precise configuration for non-PCI bus devices and ensuring resource conflicts are resolved.[11] These methods collectively support Plug and Play functionality by abstracting hardware details into interpretable objects. Fixed ACPI hardware registers offer a direct, platform-independent interface for core system control, mapped via addresses in the Fixed ACPI Description Table (FADT). The PM1a and PM1b control and status register blocks (PM1x_CNT_BLK and PM1x_EVT_BLK) handle global power events, with the event blocks including status and enable registers for detecting and arming interrupts from sources like power buttons (PWRBTN_STS/EN) and wake events (WAK_STS).[12] The control blocks, accessed in system I/O or memory space, feature fields such as SLP_TYPx to specify sleep states (S1-S5) and SLP_EN to trigger transitions, allowing OSPM to initiate low-level power management without relying solely on namespace methods.[12] OSPM interprets these components to orchestrate hardware behavior across the system.History
Early Development
The Advanced Configuration and Power Interface (ACPI) originated in 1996 as a collaborative effort by Intel Corporation, Microsoft Corporation, and Toshiba Corporation to establish a standardized framework for power management and hardware configuration in personal computers.[13] This development was driven by the growing popularity of mobile computing, which demanded more efficient battery life and seamless power control, while addressing the shortcomings of prior standards like Advanced Power Management (APM) and Plug and Play (PnP) BIOS.[14] APM's reliance on BIOS-level, real-mode calls limited operating system (OS) oversight, resulting in inflexible power policies and compatibility issues across hardware vendors, whereas PnP BIOS inadequately handled dynamic device enumeration and power integration.[14] The partnership aimed to shift control to the OS—termed OS-directed power management (OSPM)—enabling hardware vendors to build interoperable systems without proprietary extensions.[6] The first ACPI specification, version 1.0, was released on December 22, 1996, following industry reviews involving over 70 companies such as Compaq, Dell, and Hewlett-Packard.[13][6] It introduced foundational elements including the Root System Description Table (RSDT), which points to other system tables; the Fixed ACPI Description Table (FADT), detailing hardware registers for power events and timers; and a hierarchical ACPI namespace for abstracting devices and resources via ACPI Machine Language (AML).[13] Basic system power states (S-states) were defined, ranging from S0 (working) to S5 (soft off), allowing OS-managed transitions with varying power savings and wake latencies while preserving context where possible.[13] This version was ratified by the PC industry as part of Microsoft's OnNow initiative, with products anticipated for late 1997 to support instant-on capabilities across desktops, laptops, and servers.[6] Early adoption of ACPI 1.0 faced significant hurdles due to immature hardware and firmware implementations, particularly in BIOS configurations from the late 1990s.[15] Many pre-2001 systems exhibited bugs such as unreliable PCI interrupt routing via the ACPI namespace's _CRS objects and failures in System Control Interrupt (SCI) setup, often requiring OS workarounds like forcing ACPI enablement or disabling local APIC timers to prevent boot hangs.[15] These issues stemmed from the specification's complexity—spanning over 500 pages—and the challenge of transitioning from APM's simpler, firmware-centric model, leading to widespread blacklisting of early hardware in OS kernels until BIOS updates became more reliable.[14][15]Specification Versions and Evolution
The ACPI specification has evolved significantly since version 2.0, incorporating enhancements for power management, hardware configuration, and support for emerging architectures. Version 2.0, released in August 2000, introduced 64-bit addressing support, processor and device performance states (P-states), multiprocessor enhancements for power and performance dependencies, and improved consistency across the namespace for better OS compatibility.[16] These additions built on earlier foundations by enabling more dynamic control over processor frequencies and voltages, facilitating energy-efficient computing on 64-bit systems like Itanium.[17] Subsequent versions from 3.0 to 5.0, spanning 2004 to 2014, expanded ACPI's scope to address server-scale systems, storage interfaces, and mobile platforms. ACPI 3.0, released in September 2004, added support for more than 256 processors, Non-Uniform Memory Access (NUMA) configurations, PCI Express and SATA device descriptions, ambient light sensors for display power management, user presence detection, and an extended thermal model with multiple cooling devices per zone.[17] ACPI 4.0, released in June 2009, introduced low-power idle states (S0ix) for modern standby modes, clock power management domains, x2APIC interrupt controllers, logical processor idling, power metering and budgeting interfaces, Intelligent Platform Management Interface (IPMI) integration, USB 3.0 support in device location descriptors, and hardware error reporting structures.[18] ACPI 5.0, released in December 2011, focused on system-on-chip (SoC) optimizations with hardware-reduced ACPI profiles, Generic Timer Description Table (GTDT) for Arm systems, Collaborative Processor Performance Control (CPPC) for heterogeneous cores, Platform Communications Channel (PCC) for low-latency messaging, GPIO and Serial Peripheral Bus (SPB) abstractions, and the Device-Specific Data (_DSD) object for vendor extensions.[19] In October 2013, ownership of the specification transferred from Intel, Microsoft, and others to the UEFI Forum, broadening contributor involvement and aligning ACPI with UEFI advancements for diverse platforms including Arm.[20] From version 6.0 onward, released starting in May 2015, ACPI has emphasized heterogeneous computing, security, and non-x86 architectures to support IoT devices, cloud infrastructure, and mobile systems. ACPI 6.0 introduced support for non-volatile memory interfaces, the Low Power Idle Table (LPIT), Processor Properties Topology Table (PPTT) for cache hierarchies, Heterogeneous Memory Attribute Table (HMAT) for memory performance attributes, and enhancements to CPPC for big.LITTLE processor configurations common in Arm-based heterogeneous systems.[21] ACPI 6.5, released in August 2022, further enhanced Arm64 support through updates to the Generic Interrupt Controller (GIC) structures, improved Platform Timer support, and extensions for Scalable Platform Error Handling (RAS2), enabling better error correction and telemetry on Arm servers.[22] The most recent version, 6.6, released on May 13, 2025, adds features for confidential computing including the Confidential Computing Event Log (CCEL) table, Secure Devices (SDEV) extensions, and cache coherency attributes (_CCA); PCIe power management improvements via enhanced wake status bits and hot-plug settings; updates to the I/O Virtualization Reporting Structure (IVRS) for AMD-based virtualization; and RISC-V architecture support with new interrupt controllers (RINTC, IMSIC, PLIC) and the RISC-V Hart Capabilities Table (RHCT).[1] This progression reflects a shift toward modern hardware paradigms, with increased focus on Arm and RISC-V processors for edge and server applications, low-power IoT optimizations like S0ix and LPIT, and security enhancements such as confidential computing and error reporting to meet demands for resilient, efficient systems. The UEFI Forum's stewardship since 2013 has fostered open collaboration, ensuring ACPI remains adaptable to evolving technologies while maintaining backward compatibility.[2]Architecture
Core Architecture
The Advanced Configuration and Power Interface (ACPI) employs a layered architecture that separates hardware, firmware, and software components to enable operating system-directed power management (OSPM) and device configuration. At the hardware layer, ACPI relies on fixed and generic registers, interrupts, and power planes to support device states and event signaling, such as those defined in the Fixed ACPI Description Table (FADT). The firmware layer consists of ACPI Machine Language (AML) code, interpreted by the OSPM to execute control methods that abstract hardware details, including power resource management objects like _PRx for power resources. The software layer, implemented by OSPM, coordinates these elements to manage system power, device enumeration, and performance based on user policies and quality-of-service requirements.[7] During system boot, the ACPI namespace—a hierarchical tree structure representing the device's logical view—is constructed through table loading and enumeration. The BIOS locates the Root System Description Pointer (RSDP) in low memory or the EFI System Table, which points to the Root System Description Table (RSDT) or Extended System Description Table (XSDT); these in turn reference tables like the FADT and Differentiated System Description Table (DSDT). The DSDT, containing the primary AML definition block, is loaded first into memory, followed by Secondary System Description Tables (SSDTs) to extend the namespace without overwriting existing definitions. OSPM then parses this namespace using an AML interpreter to enumerate the device tree, evaluating objects for hardware discovery and configuration capabilities.[8] ACPI's event model facilitates asynchronous hardware notifications to the operating system via the System Control Interrupt (SCI) and General-Purpose Events (GPEs). The SCI serves as the primary OS-visible interrupt, triggered when enabled status bits in power management or GPE registers are set, allowing OSPM to respond without firmware intervention once control is transferred from System Management Mode (SMM). GPE blocks, defined in the FADT as GPE0_BLK and GPE1_BLK, handle device-specific events like thermal changes or docking through status (GPEx_STS) and enable (GPEx_EN) registers, which OSPM polls or services via interrupt handlers. This model ensures efficient, low-latency communication between hardware changes and OSPM actions, such as invoking control methods for event processing.[12][8] Resource allocation in ACPI distinguishes between static and dynamic assignments to support Plug and Play functionality. Static resources are fixed at boot and require no runtime reconfiguration, typically for non-configurable devices without a _PRS object. Dynamic resources, however, allow OSPM to reassign settings like IRQs or I/O ranges based on system needs; the _PRS (Possible Resource Settings) method returns a buffer of feasible resource descriptors in the same format as _CRS (Current Resource Settings), enabling OSPM to select conflict-free options. OSPM evaluates _PRS during enumeration, coordinates allocations across dependent devices using extended resource descriptors, and applies selections via the _SRS (Set Resource Settings) method to update hardware registers.[11]ACPI Component Architecture (ACPICA)
The ACPI Component Architecture (ACPICA) serves as the reference open-source implementation of the ACPI specification, providing an operating system-independent framework for interpreting ACPI Machine Language (AML) and managing hardware configuration and power features.[23] Initially developed by Intel in 2001 as an open-source subsystem to simplify ACPI adoption across platforms, ACPICA has evolved into a community-maintained project that isolates operating system dependencies, enabling seamless integration into various kernels.[23] The latest release, version 20250807 from August 2025, ensures ongoing alignment with evolving ACPI standards.[24] Key components of ACPICA include the AML interpreter, which executes bytecode from ACPI tables; the OS services layer, which abstracts platform-specific operations; and tools such as the AML debugger and disassembler for analysis and troubleshooting.[25] Additionally, it supports the compilation of ACPI Source Language (ASL) into AML via the iASL compiler, facilitating the development and validation of ACPI tables by firmware engineers.[26] These elements form a modular structure that allows developers to build custom ACPI subsystems without modifying core code, emphasizing portability across 32-bit and 64-bit environments.[23] ACPICA is widely integrated into open-source operating systems, notably as the acpi_subsystem in the Linux kernel, where it handles table parsing, event processing, and resource management.[27] FreeBSD also incorporates ACPICA for similar purposes, leveraging its tools for system validation and porting ACPI features to new hardware. Beyond kernel use, ACPICA's utilities, including the iASL compiler, are essential for developing and debugging ACPI tables during BIOS/UEFI firmware creation, ensuring compliance and functionality.[26] In terms of development, ACPICA transitioned from Intel-led maintenance to an independent community-driven project, with source code hosted on GitHub under dual BSD and GPL licenses to encourage broad contributions.[25] This shift has sustained regular updates, with the codebase maintaining full compatibility with the ACPI 6.6 specification released in May 2025, including support for new features like RISC-V architecture integration.[28] The project's rigorous release cycle, typically every 1-3 months, focuses on bug fixes, spec conformance, and enhancements to tools for improved developer productivity.[29]Power Management
OSPM Responsibilities
The Operating System-directed Power Management (OSPM) is the component of the operating system, typically implemented as a kernel-level driver or subsystem, that directs ACPI operations to enforce policies for power management, device configuration, performance optimization, and thermal control on compliant platforms. During operating system boot, OSPM assumes control from any pre-existing legacy hardware mechanisms, becoming the sole authority for coordinating these functions through the ACPI namespace and control methods.[7] OSPM's primary responsibilities encompass policy-driven decisions for transitioning between power states, negotiating resource allocations for motherboard and peripheral devices, and managing dynamic events such as device insertion or removal via system notifications. To align platform capabilities with operating system support, OSPM invokes the _OSC (Operating System Capabilities) control method, which allows it to query and request control over specific features—like power management protocols or hardware interfaces—by passing a UUID-identified capabilities buffer to the firmware and receiving a status response indicating granted permissions.[7][30] In practice, OSPM implements configurable policies such as user-defined timeouts that trigger entry into low-power sleep modes to conserve energy during periods of inactivity, and adaptive thermal management that responds to firmware-reported temperature thresholds by throttling device or processor activity to prevent overheating. These policies enable OSPM to balance system responsiveness with efficiency based on real-time platform feedback.[31][32] For error handling and safe hardware operations, OSPM relies on dedicated ACPI control methods, including _EJ0, which it executes to initiate the ejection of hot-pluggable devices by coordinating power shutdown and mechanical removal, followed by status checks to confirm successful detachment.[33]System and Device States
ACPI defines global system power states, known as S-states, which represent the overall power management levels of the entire platform. These states range from fully operational to powered off, balancing power savings with wake-up latency. The working state, S0, maintains full system functionality with all components active and consuming normal power.[34] Sleeping states S1 through S3 provide progressive power reductions while preserving context for quick resumption. In S1, the system enters a low-latency sleep where processor caches are flushed but most context remains intact, with clocks halted except for essential ones like the real-time clock (RTC); power draw is low but higher than deeper states. S2 extends this by powering off the processor and caches, requiring a reset on wake, yet maintaining low latency and memory context. S3, or suspend-to-RAM, achieves minimal power usage by self-refreshing DRAM while cutting power to nearly all other components, offering low wake latency through enabled wake events. S4, hibernate or suspend-to-disk, saves the entire system context to non-volatile storage for the lowest power consumption among sleeping states, though with the highest latency due to full restoration on resume. Finally, S5 denotes soft off, where the system is logically powered down with no context preserved, necessitating a full boot sequence for reactivation, and power is minimal or zero.[34]| State | Description | Power Consumption | Wake Latency | Context Preservation |
|---|---|---|---|---|
| S0 | Working | Full | None | All |
| S1 | Sleep | Low | Low | Most (except caches) |
| S2 | Sleep | Very low | Low | Memory |
| S3 | Suspend-to-RAM | Minimal | Low | Memory only |
| S4 | Hibernate | Near zero | High | Saved to disk |
| S5 | Soft off | Off | Full boot | None |
| State | Description | Power Consumption | Context Retention | Restore Time |
|---|---|---|---|---|
| D0 | Fully on | Full | All | Immediate |
| D1 | Intermediate | < D0, > D2 | Partial | Short |
| D2 | Intermediate | < D1, > D3 | Minimal | Medium |
| D3hot | Off (hot) | Minimal | Optional | Long |
| D3cold | Off (cold) | Zero | None | Longest |
