# Power Management References - Special Files
[TOC]
## References
1. [Symbols under /sys/power](https://docs.kernel.org/admin-guide/abi-testing.html#symbols-under-sys-power) of Linux ABI documentation.
2. [File testing/sysfs-devices-power](https://docs.kernel.org/admin-guide/abi-testing.html#abi-file-testing-sysfs-devices-power) for device power management ABIs.
3. Under debugfs (usually mounted under `/sys/kernel/debug/`) also contains some files. Note that debugfs is not a part of Linux ABI and may subject to change. Documentation is relatively sparse.
## Useful files
### `/sys/power/pm_debug_messages`: enable debugging message in kernel log
Use the following to enable extra debugging message in the `dmesg`:
```=
$ sudo sh -c 'echo 1 > /sys/power/pm_debug_messages'
```
If the machine is send into suspension, you'll see the log starting with `PM` indicating the steps for suspension. In this case, it is the `s2idle`:
```
[ 2426.895635] PM: suspend entry (s2idle)
[ 2426.902296] Filesystems sync: 0.006 seconds
[ 2426.904284] Freezing user space processes
[ 2426.907261] Freezing user space processes completed (elapsed 0.002 seconds)
[ 2426.907263] OOM killer disabled.
[ 2426.907263] Freezing remaining freezable tasks
[ 2426.908255] Freezing remaining freezable tasks completed (elapsed 0.000 seconds)
[ 2426.908256] printk: Suspending console(s) (use no_console_suspend to debug)
[ 2427.460539] nvme-apple 27bcc0000.nvme: RTKit: syslog message: cmd.c:8123: NVMe shutdown start seg->lba: 0, seg->size: 0
[ 2428.406433] nvme-apple 27bcc0000.nvme: RTKit: syslog message: cmd.c:8151: seg->lba 0 saveCtx 1 took 945 ms - clog 985629
[ 2428.460658] PM: suspend of devices complete after 1552.305 msecs
[ 2428.460671] PM: start suspend of devices complete after 1552.399 msecs
[ 2428.460676] PM: suspend devices took 1.552 seconds
[ 2428.461569] PM: late suspend of devices complete after 0.888 msecs
[ 2428.474528] PM: noirq suspend of devices complete after 12.886 msecs
[ 2428.474534] PM: suspend-to-idle
```
And if it is resumed (for example, if I open the lid), then it'll show the resume steps as well:
```
[ 2428.474697] macsmc-hid macsmc-hid: Lid wakeup
[ 2428.474724] PM: resume from suspend-to-idle
[ 2428.487450] PM: noirq resume of devices complete after 12.722 msecs
[ 2428.487974] PM: early resume of devices complete after 0.401 msecs
[ 2428.488742] nvme-apple 27bcc0000.nvme: RTKit: Initializing (protocol version 12)
[ 2428.488793] nvme-apple 27bcc0000.nvme: RTKit: Unknown system endpoint: 0x0a
[ 2428.518728] nvme-apple 27bcc0000.nvme: RTKit: syslog message: pre_nand_eng.c:6162: enabled 1p0v 1, enabled prog-no-exec 1
[ 2428.518735] nvme-apple 27bcc0000.nvme: RTKit: syslog message: pre_nand_eng.c:6162: enabled 1p0v 1, enabled prog-no-exec 1
[ 2428.522091] nvme-apple 27bcc0000.nvme: RTKit: syslog message: cmd.c:6416: boot mode normal
[ 2428.532284] PM: resume of devices complete after 44.304 msecs
[ 2428.532633] PM: resume devices took 0.045 seconds
[ 2428.532738] OOM killer enabled.
[ 2428.532741] Restarting tasks ... done.
[ 2428.536390] random: crng reseeded on system resumption
[ 2428.536591] PM: suspend exit
```
### `/sys/kernel/debug/suspend_stats`: statistics for stagex of suspension
Linux divided system-wide suspension into different stages:
1. The suspend path are divided into `suspend`-`suspend_late`-`suspend_noirq`. Different type of suspensions (or rather "depth" of the suspension), e.g. s2idle vs. s2ram, it may further perform different actions after the `suspend_noirq`.
2. Likewise, the resume path are divided into `resume_noirq` - `resume-early` - `resume`. Depending on the way the system enter suspension, extra steps may be needed before `noirq` stage.
The `/sys/kernel/debug/suspend_stats` include counter for successful suspensions. For failure ones, in addition to the count, it also shows failure count on each stages. For example:
```=
$ cat /sys/kernel/debug/suspend_stats
```
You'll see statistics about successful suspensions, as well as failed ones:
```
success: 1
fail: 0
failed_freeze: 0
failed_prepare: 0
failed_suspend: 0
failed_suspend_late: 0
failed_suspend_noirq: 0
failed_resume: 0
failed_resume_early: 0
failed_resume_noirq: 0
failures:
last_failed_dev:
last_failed_errno: 0
0
last_failed_step:
```
### `/sys/devices/.../power/wakeup`: whether a device serves as wakeup source
The [`/sys/devices/.../power/wakeup`](https://docs.kernel.org/admin-guide/abi-testing.html#abi-sys-devices-power-wakeup) file for a device can be used for setting device as wakeup source for system suspend.
### `/sys/kernel/debug/wakeup_sources`: list of wakeup sources
The `/sys/kernel/debug/wakeup_sources` lists all such devices:
```=
$ cat /sys/kernel/debug/wakeup_sources
```
Will see the following output:
```
name active_count event_count wakeup_count expire_count active_since total_time max_time last_change prevent_suspend_time
0000:01:00.0 0 0 0 0 0 0 00 0
macsmc-hid 1 1 0 0 0 0 02428366 0
tps6598x-source-psy-0-003f 1 1 0 0 0 00 2877 0
tps6598x-source-psy-0-0038 1 1 0 0 0 00 2872 0
tps6598x-source-psy-0-003a 1 1 0 0 0 00 1467 0
macsmc-ac 1 1 0 0 0 1 11459 0
macsmc-battery 1 1 0 0 0 9 91467 0
deleted 0 0 0 0 0 0 00 0
```
Note that for PCI devices, the BDF numbers are used instead. Use the `lspci -s` to see what device it is. For example, to see what `0000:01:00.0` is:
```=
$ lspci -s 0000:01:00.0
```
It'll show the corresponding PCI device:
```
01:00.0 Network controller: Broadcom Inc. and subsidiaries BCM4387 802.11ax Dual Band Wireless LAN Controller (rev 07)
```
Common `lspci` arguments are useful for debugging. For example `-vs`, `-vvs` show verbose output.
The `0000:01:00.0` device on the PCI bus being a wake up source can be verified by looking into its device file in sysfs:
```=
$ cat /sys/class/pci_bus/0000:01/device/0000:01:00.0/power/wakeup
```
It shows `enabled`:
```
enabled
```
This can be disabled by
```=
$ sudo sh -c 'echo disabled > /sys/class/pci_bus/0000:01/device/0000:01:00.0/power/wakeup'
```
Looking into the same file again:
```=
$ cat /sys/class/pci_bus/0000:01/device/0000:01:00.0/power/wakeup
```
You'll see it becomes `disabled`:
```
disabled
```
And under the debugfs entry:
```=
$ cat /sys/kernel/debug/wakeup_sources
```
The `0000:01:00.0` now disappears, indicating the it no longer serve as a wakeup source:
```
name active_count event_count wakeup_count expire_count active_since total_time max_time last_change prevent_suspend_time
macsmc-hid 1 1 0 0 0 0 02428366 0
tps6598x-source-psy-0-003f 1 1 0 0 0 00 2877 0
tps6598x-source-psy-0-0038 1 1 0 0 0 00 2872 0
tps6598x-source-psy-0-003a 1 1 0 0 0 00 1467 0
macsmc-ac 1 1 0 0 0 1 11459 0
macsmc-battery 1 1 0 0 0 9 91467 0
deleted 0 0 0 0 0 0 00 0
```
Note that if I close the lid and open it again, the statistic of `macsmc-hid` will bump up to `2`:
```
name active_count event_count wakeup_count expire_count active_since total_time max_time last_change prevent_suspend_time
macsmc-hid 2 2 0 0 0 0 03294732 0
tps6598x-source-psy-0-003f 1 1 0 0 0 00 2877 0
tps6598x-source-psy-0-0038 1 1 0 0 0 00 2872 0
tps6598x-source-psy-0-003a 1 1 0 0 0 00 1467 0
macsmc-ac 1 1 0 0 0 1 11459 0
macsmc-battery 1 1 0 0 0 9 91467 0
deleted 0 0 0 0 0 0 00 0
```