核心驅動程式 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_smm 的 X)。許多其他屬性可以被讀取或寫入
名稱 |
許可權 |
描述 |
|---|---|---|
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 處理程式會檢視 eax、ebx、ecx、edx、esi 和 edi 暫存器的內容。每個暫存器都有特殊用途
暫存器 |
用途 |
|---|---|
eax |
在 SMM 前儲存命令程式碼,在 SMM 後儲存第一個結果。 |
ebx |
儲存引數。 |
ecx |
未知,設定為 0。 |
edx |
在 SMM 後儲存第二個結果。 |
esi |
未知,設定為 0。 |
edi |
未知,設定為 0。 |
SMM 處理程式可以透過以下方式之一指示失敗:
將
eax的低十六位設定為0xffff完全不修改
eax設定進位標誌(僅限傳統 SMM 介面)
傳統 SMM 介面¶
當使用傳統 SMM 介面時,透過將命令程式碼的最低有效位元組寫入特殊 IO 埠 0xb2 和 0x84 來觸發 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 命令程式碼¶
命令程式碼 |
命令名稱 |
描述 |
|---|---|---|
|
獲取 Fn 鍵狀態 |
SMM 後返回按下的 Fn 鍵
|
|
獲取電源狀態 |
SMM 後返回當前電源狀態
|
|
獲取風扇狀態 |
SMM 後返回當前風扇狀態
|
|
設定風扇狀態 |
設定風扇速度
|
|
獲取風扇轉速 |
返回當前風扇轉速(RPM)
|
|
獲取風扇型別 |
返回風扇型別
|
|
獲取標稱風扇轉速 |
返回每個風扇狀態下的標稱轉速 (RPM)
|
|
獲取風扇轉速容差 |
返回每個風扇狀態的轉速容差
|
|
獲取感測器溫度 |
返回測量的溫度
|
|
獲取感測器型別 |
返回感測器型別
|
|
獲取 SMM 簽名 |
如果介面受支援,則返回戴爾簽名(SMM 後)
|
|
獲取 SMM 簽名 |
與 |
還有其他命令用於啟用(0x31a3 或 0x35a3)和停用(0x30a3 或 0x34a3)自動風扇速度控制。然而,這些命令在許多機器上會導致嚴重的副作用,因此預設情況下不使用。
在某些機器(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 讀取錯誤或感測器已停用。