核心驅動 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

作者

模組引數

  • 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 模式。

  1. 使用 lspci 命令並找到帶有 SMBus 控制器的 PCI 裝置:00:0f.0 ISA bridge: ServerWorks OSB4 South Bridge (rev 4f) 對於不同的晶片組,該行可能會有所不同。 請查閱驅動程式原始碼以獲取所有可能的 PCI ID(和 lspci -n 以匹配它們)。 假設裝置位於 00:0f.0。

  2. 現在您只需要更改 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" } },
        }
    })
}