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 表後,此選項將成為預設行為。