David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 1 | .. SPDX-License-Identifier: GPL-2.0 |
| 2 | .. include:: <isonum.txt> |
| 3 | |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 4 | =================== |
| 5 | System Sleep States |
| 6 | =================== |
| 7 | |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 8 | :Copyright: |copy| 2017 Intel Corporation |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 9 | |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 10 | :Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| 11 | |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 12 | |
| 13 | Sleep states are global low-power states of the entire system in which user |
| 14 | space code cannot be executed and the overall system activity is significantly |
| 15 | reduced. |
| 16 | |
| 17 | |
| 18 | Sleep States That Can Be Supported |
| 19 | ================================== |
| 20 | |
| 21 | Depending on its configuration and the capabilities of the platform it runs on, |
| 22 | the Linux kernel can support up to four system sleep states, including |
| 23 | hibernation and up to three variants of system suspend. The sleep states that |
| 24 | can be supported by the kernel are listed below. |
| 25 | |
| 26 | .. _s2idle: |
| 27 | |
| 28 | Suspend-to-Idle |
| 29 | --------------- |
| 30 | |
| 31 | This is a generic, pure software, light-weight variant of system suspend (also |
| 32 | referred to as S2I or S2Idle). It allows more energy to be saved relative to |
| 33 | runtime idle by freezing user space, suspending the timekeeping and putting all |
| 34 | I/O devices into low-power states (possibly lower-power than available in the |
| 35 | working state), such that the processors can spend time in their deepest idle |
| 36 | states while the system is suspended. |
| 37 | |
| 38 | The system is woken up from this state by in-band interrupts, so theoretically |
| 39 | any devices that can cause interrupts to be generated in the working state can |
| 40 | also be set up as wakeup devices for S2Idle. |
| 41 | |
| 42 | This state can be used on platforms without support for :ref:`standby <standby>` |
| 43 | or :ref:`suspend-to-RAM <s2ram>`, or it can be used in addition to any of the |
| 44 | deeper system suspend variants to provide reduced resume latency. It is always |
| 45 | supported if the :c:macro:`CONFIG_SUSPEND` kernel configuration option is set. |
| 46 | |
| 47 | .. _standby: |
| 48 | |
| 49 | Standby |
| 50 | ------- |
| 51 | |
| 52 | This state, if supported, offers moderate, but real, energy savings, while |
| 53 | providing a relatively straightforward transition back to the working state. No |
| 54 | operating state is lost (the system core logic retains power), so the system can |
| 55 | go back to where it left off easily enough. |
| 56 | |
| 57 | In addition to freezing user space, suspending the timekeeping and putting all |
| 58 | I/O devices into low-power states, which is done for :ref:`suspend-to-idle |
| 59 | <s2idle>` too, nonboot CPUs are taken offline and all low-level system functions |
| 60 | are suspended during transitions into this state. For this reason, it should |
| 61 | allow more energy to be saved relative to :ref:`suspend-to-idle <s2idle>`, but |
| 62 | the resume latency will generally be greater than for that state. |
| 63 | |
| 64 | The set of devices that can wake up the system from this state usually is |
| 65 | reduced relative to :ref:`suspend-to-idle <s2idle>` and it may be necessary to |
| 66 | rely on the platform for setting up the wakeup functionality as appropriate. |
| 67 | |
| 68 | This state is supported if the :c:macro:`CONFIG_SUSPEND` kernel configuration |
| 69 | option is set and the support for it is registered by the platform with the |
| 70 | core system suspend subsystem. On ACPI-based systems this state is mapped to |
| 71 | the S1 system state defined by ACPI. |
| 72 | |
| 73 | .. _s2ram: |
| 74 | |
| 75 | Suspend-to-RAM |
| 76 | -------------- |
| 77 | |
| 78 | This state (also referred to as STR or S2RAM), if supported, offers significant |
| 79 | energy savings as everything in the system is put into a low-power state, except |
| 80 | for memory, which should be placed into the self-refresh mode to retain its |
| 81 | contents. All of the steps carried out when entering :ref:`standby <standby>` |
| 82 | are also carried out during transitions to S2RAM. Additional operations may |
| 83 | take place depending on the platform capabilities. In particular, on ACPI-based |
| 84 | systems the kernel passes control to the platform firmware (BIOS) as the last |
| 85 | step during S2RAM transitions and that usually results in powering down some |
| 86 | more low-level components that are not directly controlled by the kernel. |
| 87 | |
| 88 | The state of devices and CPUs is saved and held in memory. All devices are |
| 89 | suspended and put into low-power states. In many cases, all peripheral buses |
| 90 | lose power when entering S2RAM, so devices must be able to handle the transition |
| 91 | back to the "on" state. |
| 92 | |
| 93 | On ACPI-based systems S2RAM requires some minimal boot-strapping code in the |
| 94 | platform firmware to resume the system from it. This may be the case on other |
| 95 | platforms too. |
| 96 | |
| 97 | The set of devices that can wake up the system from S2RAM usually is reduced |
| 98 | relative to :ref:`suspend-to-idle <s2idle>` and :ref:`standby <standby>` and it |
| 99 | may be necessary to rely on the platform for setting up the wakeup functionality |
| 100 | as appropriate. |
| 101 | |
| 102 | S2RAM is supported if the :c:macro:`CONFIG_SUSPEND` kernel configuration option |
| 103 | is set and the support for it is registered by the platform with the core system |
| 104 | suspend subsystem. On ACPI-based systems it is mapped to the S3 system state |
| 105 | defined by ACPI. |
| 106 | |
| 107 | .. _hibernation: |
| 108 | |
| 109 | Hibernation |
| 110 | ----------- |
| 111 | |
| 112 | This state (also referred to as Suspend-to-Disk or STD) offers the greatest |
| 113 | energy savings and can be used even in the absence of low-level platform support |
| 114 | for system suspend. However, it requires some low-level code for resuming the |
| 115 | system to be present for the underlying CPU architecture. |
| 116 | |
| 117 | Hibernation is significantly different from any of the system suspend variants. |
| 118 | It takes three system state changes to put it into hibernation and two system |
| 119 | state changes to resume it. |
| 120 | |
| 121 | First, when hibernation is triggered, the kernel stops all system activity and |
| 122 | creates a snapshot image of memory to be written into persistent storage. Next, |
| 123 | the system goes into a state in which the snapshot image can be saved, the image |
| 124 | is written out and finally the system goes into the target low-power state in |
| 125 | which power is cut from almost all of its hardware components, including memory, |
| 126 | except for a limited set of wakeup devices. |
| 127 | |
| 128 | Once the snapshot image has been written out, the system may either enter a |
| 129 | special low-power state (like ACPI S4), or it may simply power down itself. |
| 130 | Powering down means minimum power draw and it allows this mechanism to work on |
| 131 | any system. However, entering a special low-power state may allow additional |
| 132 | means of system wakeup to be used (e.g. pressing a key on the keyboard or |
| 133 | opening a laptop lid). |
| 134 | |
| 135 | After wakeup, control goes to the platform firmware that runs a boot loader |
| 136 | which boots a fresh instance of the kernel (control may also go directly to |
| 137 | the boot loader, depending on the system configuration, but anyway it causes |
| 138 | a fresh instance of the kernel to be booted). That new instance of the kernel |
| 139 | (referred to as the ``restore kernel``) looks for a hibernation image in |
| 140 | persistent storage and if one is found, it is loaded into memory. Next, all |
| 141 | activity in the system is stopped and the restore kernel overwrites itself with |
| 142 | the image contents and jumps into a special trampoline area in the original |
| 143 | kernel stored in the image (referred to as the ``image kernel``), which is where |
| 144 | the special architecture-specific low-level code is needed. Finally, the |
| 145 | image kernel restores the system to the pre-hibernation state and allows user |
| 146 | space to run again. |
| 147 | |
| 148 | Hibernation is supported if the :c:macro:`CONFIG_HIBERNATION` kernel |
| 149 | configuration option is set. However, this option can only be set if support |
| 150 | for the given CPU architecture includes the low-level code for system resume. |
| 151 | |
| 152 | |
| 153 | Basic ``sysfs`` Interfaces for System Suspend and Hibernation |
| 154 | ============================================================= |
| 155 | |
| 156 | The following files located in the :file:`/sys/power/` directory can be used by |
| 157 | user space for sleep states control. |
| 158 | |
| 159 | ``state`` |
| 160 | This file contains a list of strings representing sleep states supported |
| 161 | by the kernel. Writing one of these strings into it causes the kernel |
| 162 | to start a transition of the system into the sleep state represented by |
| 163 | that string. |
| 164 | |
| 165 | In particular, the strings "disk", "freeze" and "standby" represent the |
| 166 | :ref:`hibernation <hibernation>`, :ref:`suspend-to-idle <s2idle>` and |
| 167 | :ref:`standby <standby>` sleep states, respectively. The string "mem" |
| 168 | is interpreted in accordance with the contents of the ``mem_sleep`` file |
| 169 | described below. |
| 170 | |
| 171 | If the kernel does not support any system sleep states, this file is |
| 172 | not present. |
| 173 | |
| 174 | ``mem_sleep`` |
| 175 | This file contains a list of strings representing supported system |
| 176 | suspend variants and allows user space to select the variant to be |
| 177 | associated with the "mem" string in the ``state`` file described above. |
| 178 | |
| 179 | The strings that may be present in this file are "s2idle", "shallow" |
| 180 | and "deep". The string "s2idle" always represents :ref:`suspend-to-idle |
| 181 | <s2idle>` and, by convention, "shallow" and "deep" represent |
| 182 | :ref:`standby <standby>` and :ref:`suspend-to-RAM <s2ram>`, |
| 183 | respectively. |
| 184 | |
| 185 | Writing one of the listed strings into this file causes the system |
| 186 | suspend variant represented by it to be associated with the "mem" string |
| 187 | in the ``state`` file. The string representing the suspend variant |
| 188 | currently associated with the "mem" string in the ``state`` file |
| 189 | is listed in square brackets. |
| 190 | |
| 191 | If the kernel does not support system suspend, this file is not present. |
| 192 | |
| 193 | ``disk`` |
| 194 | This file contains a list of strings representing different operations |
| 195 | that can be carried out after the hibernation image has been saved. The |
| 196 | possible options are as follows: |
| 197 | |
| 198 | ``platform`` |
| 199 | Put the system into a special low-power state (e.g. ACPI S4) to |
| 200 | make additional wakeup options available and possibly allow the |
| 201 | platform firmware to take a simplified initialization path after |
| 202 | wakeup. |
| 203 | |
| 204 | ``shutdown`` |
| 205 | Power off the system. |
| 206 | |
| 207 | ``reboot`` |
| 208 | Reboot the system (useful for diagnostics mostly). |
| 209 | |
| 210 | ``suspend`` |
| 211 | Hybrid system suspend. Put the system into the suspend sleep |
| 212 | state selected through the ``mem_sleep`` file described above. |
| 213 | If the system is successfully woken up from that state, discard |
| 214 | the hibernation image and continue. Otherwise, use the image |
| 215 | to restore the previous state of the system. |
| 216 | |
| 217 | ``test_resume`` |
| 218 | Diagnostic operation. Load the image as though the system had |
| 219 | just woken up from hibernation and the currently running kernel |
| 220 | instance was a restore kernel and follow up with full system |
| 221 | resume. |
| 222 | |
| 223 | Writing one of the listed strings into this file causes the option |
| 224 | represented by it to be selected. |
| 225 | |
| 226 | The currently selected option is shown in square brackets which means |
| 227 | that the operation represented by it will be carried out after creating |
| 228 | and saving the image next time hibernation is triggered by writing |
| 229 | ``disk`` to :file:`/sys/power/state`. |
| 230 | |
| 231 | If the kernel does not support hibernation, this file is not present. |
| 232 | |
| 233 | According to the above, there are two ways to make the system go into the |
| 234 | :ref:`suspend-to-idle <s2idle>` state. The first one is to write "freeze" |
| 235 | directly to :file:`/sys/power/state`. The second one is to write "s2idle" to |
| 236 | :file:`/sys/power/mem_sleep` and then to write "mem" to |
| 237 | :file:`/sys/power/state`. Likewise, there are two ways to make the system go |
| 238 | into the :ref:`standby <standby>` state (the strings to write to the control |
| 239 | files in that case are "standby" or "shallow" and "mem", respectively) if that |
| 240 | state is supported by the platform. However, there is only one way to make the |
| 241 | system go into the :ref:`suspend-to-RAM <s2ram>` state (write "deep" into |
| 242 | :file:`/sys/power/mem_sleep` and "mem" into :file:`/sys/power/state`). |
| 243 | |
| 244 | The default suspend variant (ie. the one to be used without writing anything |
| 245 | into :file:`/sys/power/mem_sleep`) is either "deep" (on the majority of systems |
| 246 | supporting :ref:`suspend-to-RAM <s2ram>`) or "s2idle", but it can be overridden |
| 247 | by the value of the "mem_sleep_default" parameter in the kernel command line. |
| 248 | On some ACPI-based systems, depending on the information in the ACPI tables, the |
| 249 | default may be "s2idle" even if :ref:`suspend-to-RAM <s2ram>` is supported. |