核心驅動程式 dell-smm-hwmon

版權:

© 2002-2005 Massimo Dal Zotto <dz@debian.org>

版權:

© 2019 Giovanni Mascellani <gio@debian.org>

描述

在許多戴爾筆記型電腦上,系統管理模式 (SMM) BIOS 可以查詢風扇和溫度感測器的狀態。像 sensors 這樣的使用者空間工具可以用於返回讀數。使用者空間套件 i8kutils 也可以用於讀取感測器並自動調節風扇速度(請注意,它目前使用已廢棄的 /proc/i8k 介面)。

sysfs 介面

溫度感測器和風扇可以透過 sysfs 上的標準 hwmon 介面進行查詢和設定,路徑在目錄 /sys/class/hwmon/hwmonX 下(其中 X 為某個值;請查詢使得 /sys/class/hwmon/hwmonX/name 的內容為 dell_smmX)。許多其他屬性可以被讀取或寫入

名稱

許可權

描述

fan[1-4]_input

只讀

風扇轉速 (RPM)。

fan[1-4]_label

只讀

風扇標籤。

fan[1-4]_min

只讀

最小風扇轉速 (RPM)

fan[1-4]_max

只讀

最大風扇轉速 (RPM)

fan[1-4]_target

只讀

預期風扇轉速 (RPM)

pwm[1-4]

讀寫

控制風扇 PWM 佔空比。

pwm1_enable

只寫

啟用或停用自動 BIOS 風扇控制(並非所有筆記型電腦都支援,詳情請參見下文)。

temp[1-10]_input

只讀

溫度讀數(毫攝氏度)。

temp[1-10]_label

只讀

溫度感測器標籤。

由於 SMM 介面的特性,每個 pwmX 屬性控制著編號為 X 的風扇。

停用自動 BIOS 風扇控制

在某些筆記型電腦上,BIOS 每隔幾秒鐘就會自動設定風扇速度。因此,透過此驅動程式設定的風扇速度會很快被覆蓋。

透過在 pwm1_enable 屬性中寫入值 1,可以實驗性地支援停用自動 BIOS 風扇控制,至少在已知對應 SMM 命令的筆記型電腦上是如此(寫入 2 會再次啟用自動 BIOS 控制)。即使您有多個風扇,它們也會同時被設定為啟用或停用自動風扇控制,並且儘管名稱如此,pwm1_enable 會為所有風扇設定自動控制。

如果 pwm1_enable 不可用,則表示用於啟用和停用自動 BIOS 風扇控制的 SMM 程式碼未列入您硬體的白名單中。即使適用於其他筆記型電腦的程式碼也可能適用於您的筆記型電腦,或者您可能需要發現新的程式碼。

在核心樹中的檔案 drivers/hwmon/dell-smm-hwmon.c 中檢查列表 i8k_whitelist_fan_control:首次嘗試,您可以嘗試新增您的機器並使用已知的程式碼對。如果在重新編譯核心後,您發現 pwm1_enable 存在且有效(即您可以手動控制風扇速度),那麼請將您的發現作為核心補丁提交,以便其他使用者也能從中受益。有關提交補丁的資訊,請參閱 Documentation/process/submitting-patches.rst

如果沒有已知程式碼適用於您的機器,您需要進行一些探測,因為不幸的是戴爾沒有釋出其 SMM 的資料表。您可以使用 此倉庫 中的程式碼來探測您機器上的 BIOS 並發現相應的程式碼。

再次提醒,當您發現新程式碼時,我們非常樂意接收您的補丁!

thermal 介面

該驅動程式還將風扇作為熱冷卻裝置匯出,其 type 設定為 dell-smm-fan[1-4]。這使得使用其中一個熱管理控制器可以輕鬆控制風扇。

模組引數

  • force:bool

    強制載入,不檢查支援的型號。(預設值: 0)

  • ignore_dmi:bool

    即使 DMI 資料不匹配也繼續探測硬體。(預設值: 0)

  • restricted:bool

    僅允許具有 CAP_SYS_ADMIN 能力集的程序或在使用傳統 /proc/i8k 介面時以 root 身份執行的程序控制風扇。在這種情況下,普通使用者將能夠讀取溫度和風扇狀態,但無法控制風扇。如果您的筆記型電腦與其他使用者共享且您不信任他們,您可能需要使用此選項。(預設值: 1,僅在 CONFIG_I8K 啟用時可用)

  • power_status:bool

    /proc/i8k 中報告交流電 (AC) 狀態。(預設值: 0,僅在 CONFIG_I8K 啟用時可用)

  • fan_mult:uint

    風扇轉速的乘數。(預設值: 自動檢測)

  • fan_max:uint

    最大可配置風扇轉速。(預設值: 自動檢測)

傳統 /proc 介面

警告

此介面已過時並已廢棄,不應在新應用程式中使用。僅當核心使用 CONFIG_I8K 選項編譯時,此接口才可用。

核心驅動程式提供的資訊可以透過簡單地讀取 /proc/i8k 檔案來訪問。例如

$ cat /proc/i8k
1.0 A17 2J59L02 52 2 1 8040 6420 1 2

/proc/i8k 讀取的欄位包括

1.0 A17 2J59L02 52 2 1 8040 6420 1 2
|   |   |       |  | | |    |    | |
|   |   |       |  | | |    |    | +------- 10. buttons status
|   |   |       |  | | |    |    +--------- 9.  AC status
|   |   |       |  | | |    +-------------- 8.  fan0 RPM
|   |   |       |  | | +------------------- 7.  fan1 RPM
|   |   |       |  | +--------------------- 6.  fan0 status
|   |   |       |  +----------------------- 5.  fan1 status
|   |   |       +-------------------------- 4.  temp0 reading (Celsius)
|   |   +---------------------------------- 3.  Dell service tag (later known as 'serial number')
|   +-------------------------------------- 2.  BIOS version
+------------------------------------------ 1.  /proc/i8k format version

負值(例如 -22)表示 BIOS 沒有返回相應的資訊。這在某些型號/BIOS 上是正常的。

出於效能原因,/proc/i8k 預設不報告交流電 (AC) 狀態,因為此 SMM 呼叫執行時間較長且並非必需。如果您想在 /proc/i8k 中看到交流電狀態,必須透過將 power_status=1 引數傳遞給 insmod 來顯式啟用此選項。如果交流電狀態不可用,則會列印 -1。

該驅動程式還提供了一個 ioctl 介面,可用於獲取相同資訊和控制風扇狀態。ioctl 介面可以透過 C 程式或使用 i8kctl 工具從 shell 訪問。有關如何使用 ioctl 介面的更多資訊,請參閱 i8kutils 的原始檔。

SMM 介面

警告

SMM 介面是透過試錯逆向工程得出的,因為戴爾沒有提供任何文件,請記住這一點。

該驅動程式使用 SMM 介面向系統 BIOS 傳送命令。此介面通常由戴爾的 32 位診斷程式使用,或在新筆記型電腦型號上由內建 BIOS 診斷程式使用。當 BIOS 程式碼執行時間過長時,SMM 可能會導致短暫的掛起。

系統 BIOS 中的 SMM 處理程式會檢視 eaxebxecxedxesiedi 暫存器的內容。每個暫存器都有特殊用途

暫存器

用途

eax

在 SMM 前儲存命令程式碼,在 SMM 後儲存第一個結果。

ebx

儲存引數。

ecx

未知,設定為 0。

edx

在 SMM 後儲存第二個結果。

esi

未知,設定為 0。

edi

未知,設定為 0。

SMM 處理程式可以透過以下方式之一指示失敗:

  • eax 的低十六位設定為 0xffff

  • 完全不修改 eax

  • 設定進位標誌(僅限傳統 SMM 介面)

傳統 SMM 介面

當使用傳統 SMM 介面時,透過將命令程式碼的最低有效位元組寫入特殊 IO 埠 0xb20x84 來觸發 SMM。此介面未在 ACPI 表中描述,因此只能透過發出測試 SMM 呼叫來檢測。

WMI SMM 介面

在現代戴爾機器上,SMM 呼叫透過 ACPI WMI 完成

#pragma namespace("\\\\.\\root\\dcim\\sysman\\diagnostics")
[WMI, Provider("Provider_DiagnosticsServices"), Dynamic, Locale("MS\\0x409"),
 Description("RunDellDiag"), guid("{F1DDEE52-063C-4784-A11E-8A06684B9B01}")]
class LegacyDiags {
 [key, read] string InstanceName;
 [read] boolean Active;

 [WmiMethodId(1), Implemented, read, write, Description("Legacy Method ")]
 void Execute([in, out] uint32 EaxLen, [in, out, WmiSizeIs("EaxLen") : ToInstance] uint8 EaxVal[],
              [in, out] uint32 EbxLen, [in, out, WmiSizeIs("EbxLen") : ToInstance] uint8 EbxVal[],
              [in, out] uint32 EcxLen, [in, out, WmiSizeIs("EcxLen") : ToInstance] uint8 EcxVal[],
              [in, out] uint32 EdxLen, [in, out, WmiSizeIs("EdxLen") : ToInstance] uint8 EdxVal[]);
};

某些機器僅支援 WMI SMM 介面,而另一些機器則同時支援兩種介面。如果傳統 SMM 介面不存在,驅動程式會自動檢測存在的介面並使用 WMI SMM 介面。WMI SMM 介面通常比傳統 SMM 介面慢,因為需要呼叫 ACPI 方法才能觸發 SMM。

SMM 命令程式碼

命令程式碼

命令名稱

描述

0x0025

獲取 Fn 鍵狀態

SMM 後返回按下的 Fn 鍵

  • eax 的第 9 位指示音量增大

  • eax 的第 10 位指示音量減小

  • 兩位同時指示音量靜音

0xa069

獲取電源狀態

SMM 後返回當前電源狀態

  • eax 的第 1 位指示電池已連線

  • eax 的第 3 位指示交流電已連線

0x00a3

獲取風扇狀態

SMM 後返回當前風扇狀態

  • eax 的第 1 位元組儲存當前風扇狀態(0 - 2 或 3)

0x01a3

設定風扇狀態

設定風扇速度

  • ebx 的第 1 位元組儲存風扇編號

  • ebx 的第 2 位元組儲存期望的風扇狀態(0 - 2 或 3)

0x02a3

獲取風扇轉速

返回當前風扇轉速(RPM)

  • ebx 的第 1 位元組儲存風扇編號

  • eax 的第 1 字儲存當前風扇轉速(RPM,SMM 後)

0x03a3

獲取風扇型別

返回風扇型別

  • ebx 的第 1 位元組儲存風扇編號

  • eax 的第 1 位元組儲存風扇型別(SMM 後)

    • 第 5 位指示塢站風扇

    • 1 表示處理器風扇

    • 2 表示主機板風扇

    • 3 表示顯示卡風扇

    • 4 表示電源風扇

    • 5 表示晶片組風扇

    • 6 表示其他風扇型別

0x04a3

獲取標稱風扇轉速

返回每個風扇狀態下的標稱轉速 (RPM)

  • ebx 的第 1 位元組儲存風扇編號

  • ebx 的第 2 位元組儲存所查詢的風扇狀態(0 - 2 或 3)

  • eax 的第 1 字儲存標稱風扇轉速(RPM,SMM 後)

0x05a3

獲取風扇轉速容差

返回每個風扇狀態的轉速容差

  • ebx 的第 1 位元組儲存風扇編號

  • ebx 的第 2 位元組儲存所查詢的風扇狀態(0 - 2 或 3)

  • eax 的第 1 位元組返回轉速容差

0x10a3

獲取感測器溫度

返回測量的溫度

  • ebx 的第 1 位元組儲存感測器編號

  • eax 的第 1 位元組儲存測量的溫度(SMM 後)

0x11a3

獲取感測器型別

返回感測器型別

  • ebx 的第 1 位元組儲存感測器編號

  • eax 的第 1 位元組儲存溫度型別(SMM 後)

    • 1 表示 CPU 感測器

    • 2 表示 GPU 感測器

    • 3 表示 SODIMM 感測器

    • 4 表示其他感測器型別

    • 5 表示環境感測器

    • 6 表示其他感測器型別

0xfea3

獲取 SMM 簽名

如果介面受支援,則返回戴爾簽名(SMM 後)

  • eax 儲存 1145651527 (0x44494147 或 “DIAG”)

  • edx 儲存 1145392204 (0x44454c4c 或 “DELL”)

0xffa3

獲取 SMM 簽名

0xfea3 相同,請同時檢查。

還有其他命令用於啟用(0x31a30x35a3)和停用(0x30a30x34a3)自動風扇速度控制。然而,這些命令在許多機器上會導致嚴重的副作用,因此預設情況下不使用。

在某些機器(Inspiron 3505、Precision 490、Vostro 1720 等)上,風扇支援第 4 種“魔術”狀態,該狀態向 BIOS 發出訊號,表示應為特定風扇啟用自動風扇控制。然而,也有一些機器確實支援第 4 種常規風扇狀態,但在“魔術”狀態下,為此狀態報告的標稱 RPM 是一個佔位符值,但該值並非總是可檢測的。

韌體錯誤

SMM 呼叫在某些機器上可能會表現異常

韌體錯誤

受影響的機器

讀取風扇狀態會返回虛假錯誤。

Precision 490

OptiPlex 7060

讀取風扇型別會導致風扇行為不穩定。

Studio XPS 8000

Studio XPS 8100

Inspiron 580

Inspiron 3505

風扇相關的 SMM 呼叫耗時過長(約 500 毫秒)。

Inspiron 7720

Vostro 3360

XPS 13 9333

XPS 15 L502X

如果您在戴爾機器上遇到類似問題,請在 bugzilla 上提交錯誤報告,以便我們應用解決方案。

限制

SMM 呼叫在某些機器上執行時間過長,導致短暫的掛起和/或音訊故障。此外,在掛起後需要恢復風扇狀態以及自動模式設定。當讀取溫度感測器時,超過 127 度表示 BIOS 讀取錯誤或感測器已停用。