内核驱动 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 控制器。

在某些计算机上(最值得注意的是某些戴尔计算机),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 桥:ServerWorks OSB4 南桥 (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 系统(使用 DMI 数据检测)上的 SMBus。

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" } },
        }
    })
}