| =================== | |
| System Sleep States | |
| =================== | |
| :: | |
| Copyright (c) 2017 Intel Corp., Rafael J. Wysocki <rafael.j.wysocki@intel.com> | |
| Sleep states are global low-power states of the entire system in which user | |
| space code cannot be executed and the overall system activity is significantly | |
| reduced. | |
| Sleep States That Can Be Supported | |
| ================================== | |
| Depending on its configuration and the capabilities of the platform it runs on, | |
| the Linux kernel can support up to four system sleep states, includig | |
| hibernation and up to three variants of system suspend. The sleep states that | |
| can be supported by the kernel are listed below. | |
| .. _s2idle: | |
| Suspend-to-Idle | |
| --------------- | |
| This is a generic, pure software, light-weight variant of system suspend (also | |
| referred to as S2I or S2Idle). It allows more energy to be saved relative to | |
| runtime idle by freezing user space, suspending the timekeeping and putting all | |
| I/O devices into low-power states (possibly lower-power than available in the | |
| working state), such that the processors can spend time in their deepest idle | |
| states while the system is suspended. | |
| The system is woken up from this state by in-band interrupts, so theoretically | |
| any devices that can cause interrupts to be generated in the working state can | |
| also be set up as wakeup devices for S2Idle. | |
| This state can be used on platforms without support for :ref:`standby <standby>` | |
| or :ref:`suspend-to-RAM <s2ram>`, or it can be used in addition to any of the | |
| deeper system suspend variants to provide reduced resume latency. It is always | |
| supported if the :c:macro:`CONFIG_SUSPEND` kernel configuration option is set. | |
| .. _standby: | |
| Standby | |
| ------- | |
| This state, if supported, offers moderate, but real, energy savings, while | |
| providing a relatively straightforward transition back to the working state. No | |
| operating state is lost (the system core logic retains power), so the system can | |
| go back to where it left off easily enough. | |
| In addition to freezing user space, suspending the timekeeping and putting all | |
| I/O devices into low-power states, which is done for :ref:`suspend-to-idle | |
| <s2idle>` too, nonboot CPUs are taken offline and all low-level system functions | |
| are suspended during transitions into this state. For this reason, it should | |
| allow more energy to be saved relative to :ref:`suspend-to-idle <s2idle>`, but | |
| the resume latency will generally be greater than for that state. | |
| The set of devices that can wake up the system from this state usually is | |
| reduced relative to :ref:`suspend-to-idle <s2idle>` and it may be necessary to | |
| rely on the platform for setting up the wakeup functionality as appropriate. | |
| This state is supported if the :c:macro:`CONFIG_SUSPEND` kernel configuration | |
| option is set and the support for it is registered by the platform with the | |
| core system suspend subsystem. On ACPI-based systems this state is mapped to | |
| the S1 system state defined by ACPI. | |
| .. _s2ram: | |
| Suspend-to-RAM | |
| -------------- | |
| This state (also referred to as STR or S2RAM), if supported, offers significant | |
| energy savings as everything in the system is put into a low-power state, except | |
| for memory, which should be placed into the self-refresh mode to retain its | |
| contents. All of the steps carried out when entering :ref:`standby <standby>` | |
| are also carried out during transitions to S2RAM. Additional operations may | |
| take place depending on the platform capabilities. In particular, on ACPI-based | |
| systems the kernel passes control to the platform firmware (BIOS) as the last | |
| step during S2RAM transitions and that usually results in powering down some | |
| more low-level components that are not directly controlled by the kernel. | |
| The state of devices and CPUs is saved and held in memory. All devices are | |
| suspended and put into low-power states. In many cases, all peripheral buses | |
| lose power when entering S2RAM, so devices must be able to handle the transition | |
| back to the "on" state. | |
| On ACPI-based systems S2RAM requires some minimal boot-strapping code in the | |
| platform firmware to resume the system from it. This may be the case on other | |
| platforms too. | |
| The set of devices that can wake up the system from S2RAM usually is reduced | |
| relative to :ref:`suspend-to-idle <s2idle>` and :ref:`standby <standby>` and it | |
| may be necessary to rely on the platform for setting up the wakeup functionality | |
| as appropriate. | |
| S2RAM is supported if the :c:macro:`CONFIG_SUSPEND` kernel configuration option | |
| is set and the support for it is registered by the platform with the core system | |
| suspend subsystem. On ACPI-based systems it is mapped to the S3 system state | |
| defined by ACPI. | |
| .. _hibernation: | |
| Hibernation | |
| ----------- | |
| This state (also referred to as Suspend-to-Disk or STD) offers the greatest | |
| energy savings and can be used even in the absence of low-level platform support | |
| for system suspend. However, it requires some low-level code for resuming the | |
| system to be present for the underlying CPU architecture. | |
| Hibernation is significantly different from any of the system suspend variants. | |
| It takes three system state changes to put it into hibernation and two system | |
| state changes to resume it. | |
| First, when hibernation is triggered, the kernel stops all system activity and | |
| creates a snapshot image of memory to be written into persistent storage. Next, | |
| the system goes into a state in which the snapshot image can be saved, the image | |
| is written out and finally the system goes into the target low-power state in | |
| which power is cut from almost all of its hardware components, including memory, | |
| except for a limited set of wakeup devices. | |
| Once the snapshot image has been written out, the system may either enter a | |
| special low-power state (like ACPI S4), or it may simply power down itself. | |
| Powering down means minimum power draw and it allows this mechanism to work on | |
| any system. However, entering a special low-power state may allow additional | |
| means of system wakeup to be used (e.g. pressing a key on the keyboard or | |
| opening a laptop lid). | |
| After wakeup, control goes to the platform firmware that runs a boot loader | |
| which boots a fresh instance of the kernel (control may also go directly to | |
| the boot loader, depending on the system configuration, but anyway it causes | |
| a fresh instance of the kernel to be booted). That new instance of the kernel | |
| (referred to as the ``restore kernel``) looks for a hibernation image in | |
| persistent storage and if one is found, it is loaded into memory. Next, all | |
| activity in the system is stopped and the restore kernel overwrites itself with | |
| the image contents and jumps into a special trampoline area in the original | |
| kernel stored in the image (referred to as the ``image kernel``), which is where | |
| the special architecture-specific low-level code is needed. Finally, the | |
| image kernel restores the system to the pre-hibernation state and allows user | |
| space to run again. | |
| Hibernation is supported if the :c:macro:`CONFIG_HIBERNATION` kernel | |
| configuration option is set. However, this option can only be set if support | |
| for the given CPU architecture includes the low-level code for system resume. | |
| Basic ``sysfs`` Interfaces for System Suspend and Hibernation | |
| ============================================================= | |
| The following files located in the :file:`/sys/power/` directory can be used by | |
| user space for sleep states control. | |
| ``state`` | |
| This file contains a list of strings representing sleep states supported | |
| by the kernel. Writing one of these strings into it causes the kernel | |
| to start a transition of the system into the sleep state represented by | |
| that string. | |
| In particular, the strings "disk", "freeze" and "standby" represent the | |
| :ref:`hibernation <hibernation>`, :ref:`suspend-to-idle <s2idle>` and | |
| :ref:`standby <standby>` sleep states, respectively. The string "mem" | |
| is interpreted in accordance with the contents of the ``mem_sleep`` file | |
| described below. | |
| If the kernel does not support any system sleep states, this file is | |
| not present. | |
| ``mem_sleep`` | |
| This file contains a list of strings representing supported system | |
| suspend variants and allows user space to select the variant to be | |
| associated with the "mem" string in the ``state`` file described above. | |
| The strings that may be present in this file are "s2idle", "shallow" | |
| and "deep". The string "s2idle" always represents :ref:`suspend-to-idle | |
| <s2idle>` and, by convention, "shallow" and "deep" represent | |
| :ref:`standby <standby>` and :ref:`suspend-to-RAM <s2ram>`, | |
| respectively. | |
| Writing one of the listed strings into this file causes the system | |
| suspend variant represented by it to be associated with the "mem" string | |
| in the ``state`` file. The string representing the suspend variant | |
| currently associated with the "mem" string in the ``state`` file | |
| is listed in square brackets. | |
| If the kernel does not support system suspend, this file is not present. | |
| ``disk`` | |
| This file contains a list of strings representing different operations | |
| that can be carried out after the hibernation image has been saved. The | |
| possible options are as follows: | |
| ``platform`` | |
| Put the system into a special low-power state (e.g. ACPI S4) to | |
| make additional wakeup options available and possibly allow the | |
| platform firmware to take a simplified initialization path after | |
| wakeup. | |
| ``shutdown`` | |
| Power off the system. | |
| ``reboot`` | |
| Reboot the system (useful for diagnostics mostly). | |
| ``suspend`` | |
| Hybrid system suspend. Put the system into the suspend sleep | |
| state selected through the ``mem_sleep`` file described above. | |
| If the system is successfully woken up from that state, discard | |
| the hibernation image and continue. Otherwise, use the image | |
| to restore the previous state of the system. | |
| ``test_resume`` | |
| Diagnostic operation. Load the image as though the system had | |
| just woken up from hibernation and the currently running kernel | |
| instance was a restore kernel and follow up with full system | |
| resume. | |
| Writing one of the listed strings into this file causes the option | |
| represented by it to be selected. | |
| The currently selected option is shown in square brackets which means | |
| that the operation represented by it will be carried out after creating | |
| and saving the image next time hibernation is triggered by writing | |
| ``disk`` to :file:`/sys/power/state`. | |
| If the kernel does not support hibernation, this file is not present. | |
| According to the above, there are two ways to make the system go into the | |
| :ref:`suspend-to-idle <s2idle>` state. The first one is to write "freeze" | |
| directly to :file:`/sys/power/state`. The second one is to write "s2idle" to | |
| :file:`/sys/power/mem_sleep` and then to write "mem" to | |
| :file:`/sys/power/state`. Likewise, there are two ways to make the system go | |
| into the :ref:`standby <standby>` state (the strings to write to the control | |
| files in that case are "standby" or "shallow" and "mem", respectively) if that | |
| state is supported by the platform. However, there is only one way to make the | |
| system go into the :ref:`suspend-to-RAM <s2ram>` state (write "deep" into | |
| :file:`/sys/power/mem_sleep` and "mem" into :file:`/sys/power/state`). | |
| The default suspend variant (ie. the one to be used without writing anything | |
| into :file:`/sys/power/mem_sleep`) is either "deep" (on the majority of systems | |
| supporting :ref:`suspend-to-RAM <s2ram>`) or "s2idle", but it can be overridden | |
| by the value of the "mem_sleep_default" parameter in the kernel command line. | |
| On some ACPI-based systems, depending on the information in the ACPI tables, the | |
| default may be "s2idle" even if :ref:`suspend-to-RAM <s2ram>` is supported. |