核心驅動 i2c-piix4¶
- 支援的介面卡
Intel 82371AB PIIX4 和 PIIX4E
Intel 82443MX (440MX) 資料手冊:可在 Intel 網站公開獲取
ServerWorks OSB4、CSB5、CSB6、HT-1000 和 HT-1100 南橋 資料手冊:只能透過 ServerWorks 的 NDA 獲取
ATI IXP200、IXP300、IXP400、SB600、SB700 和 SB800 南橋 資料手冊:不公開提供 SB700 暫存器參考可在以下網址獲取:http://support.amd.com/us/Embedded_TechDocs/43009_sb7xx_rrg_pub_1.00.pdf
AMD SP5100(在某些伺服器主機板上發現的 SB700 衍生產品)資料手冊:可在 AMD 網站公開獲取 http://support.amd.com/us/Embedded_TechDocs/44413.pdf
AMD Hudson-2、ML、CZ 資料手冊:不公開提供
Hygon CZ 資料手冊:不公開提供
Standard Microsystems (SMSC) SLC90E66 (Victory66) 南橋 資料手冊:可在 SMSC 網站公開獲取 http://www.smsc.com
- 作者
Frodo Looijaard <frodol@dds.nl>
Philip Edelbrock <phil@netroedge.com>
模組引數¶
force: int 強制啟用 PIIX4。危險!
force_addr: int 在給定地址強制啟用 PIIX4。極其危險!
描述¶
PIIX4(正確稱為 82371AB)是 Intel 晶片,具有許多功能。 除此之外,它還實現了 PCI 匯流排。 它的一個次要功能是實現系統管理匯流排。 這是一個真正的 SMBus - 您無法在 I2C 級別上訪問它。 好訊息是它本身就理解 SMBus 命令,您不必擔心時序問題。 壞訊息是連線到它的非 SMBus 裝置可能會使它非常困惑。 是的,眾所周知會發生這種情況...
執行 lspci -v 並檢視它是否包含如下條目
0000:00:02.3 Bridge: Intel Corp. 82371AB/EB/MB PIIX4 ACPI (rev 02)
Flags: medium devsel, IRQ 9
匯流排和裝置編號可能不同,但功能編號必須相同(像許多 PCI 裝置一樣,PIIX4 包含許多不同的“功能”,這些功能可以被視為單獨的裝置)。 如果您找到這樣的條目,則您擁有 PIIX4 SMBus 控制器。
在某些計算機上(最值得注意的是,某些 Dell),SMBus 預設情況下已停用。 如果您使用 insmod 引數 ‘force=1’,則核心模組將嘗試啟用它。 這非常危險! 如果 BIOS 沒有為此模組設定正確的地址,您可能會遇到大麻煩(閱讀:崩潰、資料損壞等)。 僅在萬不得已的情況下嘗試此操作(例如,首先嚐試 BIOS 更新),並首先進行備份! 更危險的選項是 ‘force_addr=<IOPORT>’。 這不僅會像 ‘force’ 那樣啟用 PIIX4,而且還會設定一個新的基本 I/O 埠地址。 PIIX4 的 SMBus 部分需要 8 個此類地址範圍才能正常執行。 如果這些地址已被某些其他裝置保留,您將遇到大麻煩! 如果您不是很確定自己在做什麼,請不要使用此功能!
PIIX4E 只是 PIIX4 的新版本; 它也受到支援。 PIIX/PIIX3 沒有實現 SMBus 或 I2C 匯流排,因此您無法在這些主機板上使用此驅動程式。
ServerWorks 南橋、Intel 440MX 和 Victory66 在 I2C/SMBus 支援方面與 PIIX4 相同。
AMD SB700、SB800、SP5100 和 Hudson-2 晶片組實現了兩個與 PIIX4 相容的 SMBus 控制器。 如果您的 BIOS 初始化輔助控制器,它將被此驅動程式檢測為“輔助 SMBus 主機控制器”。
如果您擁有 Force CPCI735 主機板或其他基於 OSB4 的系統,您可能需要更改 SMBus 中斷選擇暫存器,以便 SMBus 控制器使用 SMI 模式。
使用
lspci命令並找到帶有 SMBus 控制器的 PCI 裝置:00:0f.0 ISA bridge: ServerWorks OSB4 South Bridge (rev 4f) 對於不同的晶片組,該行可能會有所不同。 請查閱驅動程式原始碼以獲取所有可能的 PCI ID(和lspci -n以匹配它們)。 假設裝置位於 00:0f.0。現在您只需要更改 0xD2 暫存器中的值。 首先使用以下命令獲取它:
lspci -xxx -s 00:0f.0如果該值為 0x3,則您需要將其更改為 0x1:setpci -s 00:0f.0 d2.b=1
請注意,您不需要在所有情況下都這樣做,僅當 SMBus 工作不正常時才這樣做。
硬體特定問題¶
此驅動程式將拒絕在帶有 Intel PIIX4 SMBus 的 IBM 系統上載入。 其中一些機器有一個連線到 SMBus 的 RFID EEPROM (24RF08),由於狀態機錯誤,它很容易損壞。 這些主要是 Thinkpad 筆記型電腦,但也可能影響桌上型電腦系統。 我們沒有所有受影響系統的列表,因此唯一的安全解決方案是阻止訪問所有 IBM 系統上的 SMBus(使用 DMI 資料檢測到)。
ACPI 程式碼中的描述¶
PIIX4 晶片的裝置驅動程式為其每個埠建立一個單獨的 I2C 匯流排
$ i2cdetect -l
...
i2c-7 unknown SMBus PIIX4 adapter port 0 at 0b00 N/A
i2c-8 unknown SMBus PIIX4 adapter port 2 at 0b00 N/A
i2c-9 unknown SMBus PIIX4 adapter port 1 at 0b20 N/A
...
因此,如果您想在 ACPI 程式碼中訪問這些匯流排之一,則需要在 PIIX 裝置內宣告埠子裝置
Scope (\_SB_.PCI0.SMBS)
{
Name (_ADR, 0x00140000)
Device (SMB0) {
Name (_ADR, 0)
}
Device (SMB1) {
Name (_ADR, 1)
}
Device (SMB2) {
Name (_ADR, 2)
}
}
如果您的 UEFI 韌體不是這種情況,並且您無法訪問原始碼,則可以使用 ACPI SSDT 覆蓋來提供缺少的部件。 請記住,在這種情況下,您需要在 piix4 驅動程式啟動之前載入額外的 SSDT 表,即您應該透過 initrd 或 EFI 變數方法而不是透過 configfs 提供 SSDT。
作為用法示例,這是 ACPI 程式碼片段,它會將 jc42 驅動程式分配給 PIIX 埠 0 建立的 I2C 總線上的 0x1C 裝置
Device (JC42) {
Name (_HID, "PRP0001")
Name (_DDN, "JC42 Temperature sensor")
Name (_CRS, ResourceTemplate () {
I2cSerialBusV2 (
0x001c,
ControllerInitiated,
100000,
AddressingMode7Bit,
"\\_SB.PCI0.SMBS.SMB0",
0
)
})
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () { "compatible", Package() { "jedec,jc-42.4-temp" } },
}
})
}