ACPI 控制方法合盖设备特殊使用模型

版权:

© 2016, Intel Corporation

作者:

Lv Zheng <lv.zheng@intel.com>

摘要

包含合盖的平台使用控制方法合盖设备向 OSPM 传递合盖状态(打开/关闭)。为此,AML 表发出 Notify(lid_device, 0x80) 以在合盖状态更改时通知 OSPM。合盖设备的 _LID 控制方法必须实现,以将合盖的“当前”状态报告为“打开”或“关闭”。

对于大多数平台,_LID 方法和合盖通知都是可靠的。然而,也存在例外情况。为了与这些存在缺陷的平台兼容,需要考虑特殊的限制和例外。本文档描述了 Linux ACPI 合盖设备驱动程序的限制和例外。

_LID 控制方法返回值限制

_LID 控制方法被描述为返回“当前”合盖状态。然而,“当前”这个词存在歧义,一些有缺陷的 AML 表返回的是上次合盖通知时的状态,而不是上次 _LID 评估时的状态。在运行时评估 _LID 控制方法时,这不会有区别,问题在于它的初始返回值。当 AML 表使用缓存值实现此控制方法时,初始返回值可能不可靠。有些平台总是将“关闭”作为初始合盖状态返回。

合盖状态更改通知限制

有些有缺陷的 AML 表在合盖设备状态变为“打开”时从不通知。因此,“打开”通知不能保证。但保证的是,当合盖状态变为“关闭”时,AML 表总是通知“关闭”。“关闭”通知通常用于在 Windows 上触发一些系统省电操作。由于它经过了充分测试,因此所有 AML 表都认为它是可靠的。

ACPI 合盖设备驱动程序用户空间用户的例外

ACPI 按钮驱动程序通过以下文件将合盖状态导出到用户空间

/proc/acpi/button/lid/LID0/state

此文件实际上调用了上述的 _LID 控制方法。鉴于之前的解释,它在某些平台上不够可靠。因此,建议用户空间程序不要单独依赖此文件来确定实际的合盖状态。

ACPI 按钮驱动程序向用户空间发出以下输入事件
  • SW_LID

ACPI 合盖设备驱动程序旨在将平台触发的事件传递给用户空间。然而,考虑到有缺陷的固件无法确保“打开”/“关闭”事件成对出现,ACPI 按钮驱动程序使用以下 3 种模式以避免触发问题。

如果用户空间尚未准备好忽略不可靠的“打开”事件和不可靠的初始状态通知,Linux 用户可以使用以下内核参数来处理可能的问题

  1. button.lid_init_state=method: 当指定此选项时,ACPI 按钮驱动程序使用 _LID 控制方法的返回值报告初始合盖状态,并且“打开”/“关闭”事件是否成对完全取决于固件实现。

    此选项可用于修复一些 _LID 控制方法返回值可靠但初始合盖状态通知缺失的平台。

    在用户空间尚未准备好处理有缺陷的 AML 表期间,此选项是默认行为。

  2. button.lid_init_state=open: 当指定此选项时,ACPI 按钮驱动程序始终将初始合盖状态报告为“打开”,并且“打开”/“关闭”事件是否成对完全取决于固件实现。

    这可以修复一些 _LID 控制方法返回值不可靠且初始合盖状态通知缺失的平台。

如果用户空间已准备好忽略不可靠的“打开”事件和不可靠的初始状态通知,Linux 用户应始终使用以下内核参数

  1. button.lid_init_state=ignore: 当指定此选项时,ACPI 按钮驱动程序从不报告初始合盖状态,并且实现了一种补偿机制,通过始终将可靠的“关闭”输入事件与互补的“打开”输入事件配对,确保可靠的“关闭”通知始终可以传递到用户空间。但仍然无法保证在合盖实际打开时“打开”通知能够传递到用户空间,因为某些 AML 表不能可靠地发送“打开”通知。

    在此模式下,如果平台固件一切正确实现,旧的用户空间程序仍应能工作。否则,需要新的用户空间程序与 ACPI 按钮驱动程序配合工作。在用户空间准备好处理有缺陷的 AML 表后,此选项将成为默认行为。