ACPI 模块

来自 ArchWiki
(重定向自 Acpi

来自 uefi.org

高级配置和电源接口 (ACPI) 规范的开发旨在建立行业通用接口,从而实现强大的操作系统 (OS) 指导的主板设备配置以及设备和整个系统的电源管理。ACPI 是操作系统指导的配置和电源管理 (OSPM) 的关键要素。

ACPI 模块是用于不同 ACPI 部件的内核模块。它们启用特殊的 ACPI 功能或向 /proc/sys 添加信息。这些信息可以被 acpid 解析以用于事件或其他监控应用程序。

哪些模块可用?

这是一个 ACPI 内核模块的简短列表和摘要

  • ac (电源连接器状态)
  • asus-laptop(在 ASUS/medion 笔记本电脑上很有用)
  • battery(电池状态)
  • bay(托架状态)
  • button(捕获按钮事件,如 LID 或电源按钮)
  • container(容器状态)
  • dock(坞站状态)
  • fan(风扇状态)
  • i2c_ec (EC SMBus 驱动程序)
  • thinkpad_acpi(在 Lenovo ThinkPad 笔记本电脑上很有用)
  • processor(处理器状态)
  • sbs(智能电池状态)
  • thermal(热传感器状态)
  • toshiba_acpi(对 Toshiba 笔记本电脑有用)
  • video(视频设备状态)

可以使用以下命令获取正在运行的内核的完整列表

$ ls -l /usr/lib/modules/$(uname -r)/kernel/drivers/acpi
total 112
-rw-r--r-- 1 root root  2808 Aug 29 23:58 ac.ko.gz
-rw-r--r-- 1 root root  3021 Aug 29 23:58 acpi_ipmi.ko.gz
-rw-r--r-- 1 root root  3354 Aug 29 23:58 acpi_memhotplug.ko.gz
-rw-r--r-- 1 root root  4628 Aug 29 23:58 acpi_pad.ko.gz
drwxr-xr-x 2 root root  4096 Aug 29 23:59 apei
-rw-r--r-- 1 root root  7120 Aug 29 23:58 battery.ko.gz
-rw-r--r-- 1 root root  3700 Aug 29 23:58 button.ko.gz
-rw-r--r-- 1 root root  2181 Aug 29 23:58 container.ko.gz
-rw-r--r-- 1 root root  1525 Aug 29 23:58 custom_method.ko.gz
-rw-r--r-- 1 root root  1909 Aug 29 23:58 ec_sys.ko.gz
-rw-r--r-- 1 root root  2001 Aug 29 23:58 fan.ko.gz
-rw-r--r-- 1 root root  1532 Aug 29 23:58 hed.ko.gz
-rw-r--r-- 1 root root  3241 Aug 29 23:58 pci_slot.ko.gz
-rw-r--r-- 1 root root 17742 Aug 29 23:58 processor.ko.gz
-rw-r--r-- 1 root root  3073 Aug 29 23:58 sbshc.ko.gz
-rw-r--r-- 1 root root  7098 Aug 29 23:58 sbs.ko.gz
-rw-r--r-- 1 root root  6311 Aug 29 23:58 thermal.ko.gz
-rw-r--r-- 1 root root  8891 Aug 29 23:58 video.ko.gz
注意: 官方支持的内核 将一些模块内置到内核镜像中 (CONFIG_ACPI_*=y [1]),因此它们不会出现在模块目录和 lsmod(8) 输出中。

如何选择正确的模块

您必须亲自尝试哪个模块适用于您的机器,使用 modprobe yourmodule,然后使用 dmesg 检查您的硬件是否支持该模块。添加 grep 文本搜索可能有助于缩小结果范围

# dmesg | grep -i acpi
[    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x04] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x05] enabled)
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
[    5.066752] ACPI: acpi_idle yielding to intel_idle
[    5.438998] acpi device:04: registered as cooling_device4

您可以在启动时加载模块,使更改对工作模块永久生效。

获取信息

要读取电池信息,您可以简单地安装软件包 acpi 并运行 acpi -i

自 Linux 2.6.24 以来,已不鼓励和弃用使用 /proc 存储 ACPI 信息。相同的数据现在在 /sys 中可用,感兴趣的各方可以(应该)通过 netlink 从内核订阅 ACPI 事件。例如,对于电池

/sys/class/power_supply/BAT0/

故障排除

DSDT 修复

如果即使加载了正确的模块,电源管理问题仍然存在,则可能是 Linux 不友好的 DSDT 引起的。

笔记本的 ACPI 修复

有时您会看到“ACPI: EC: input buffer is not empty, aborting transaction”。这是 ACPI 的问题,更具体地说是 BIOS 的不兼容性。可能有四种方法可以解决此问题

  • 如果可用,刷新 BIOS
  • 使用 acpi=off 作为内核参数,但是,这将杀死所有 ACPI 功能,如电池充电和省电。
  • 在某些情况下,据报告禁用 DPMS 可以解决此问题 [2]。但是,屏幕亮度可能不再完全可控
    $ xset dpms force off
  • 构建带有 bugs.launchpad.net 补丁的自定义内核

启动循环

某些笔记本电脑或主板可能有启动问题,例如由于错误的 ACPI 固件实现,在从引导加载程序过渡到操作系统期间断电。以下步骤提供几个内核参数,按顺序进行测试

  1. 设置 acpi=off。如果您能够成功启动
    1. 转储 ACPI 表并检查类似于“Windows XXXX”的字符串。找到最新的
      # acpidump -b && for i in *; do echo $i:; strings -a $i | grep -i windows; done
    2. 设置 acpi_osi="Windows XXXX"
  2. 启动循环问题可能是由于不稳定的 C 状态
    1. 通过使用 processor.max_cstate=0 禁用 ACPI C 状态驱动程序
    2. 如果您使用的是 Intel 处理器,请设置 intel_idle.max_cstate=2 以将 C 状态限制为 C1E。更高的 C 状态可能有效,您的结果可能会有所不同。
    3. 使用 idle=nomwait 禁用 MWAIT 指令并回退到 ACPI C 状态驱动程序。使用 cpupower 验证您的更改
      $ cpupower idle-info

参见