探测非 D0 状态下的设备

简介

在某些情况下,如果开启某些设备的电源除了开启设备本身之外还会产生不利的副作用,则可能需要在整个系统启动过程中保持这些设备断电。

工作原理

可以利用求值为整数的 _DSC(设备配置状态)对象来告诉 Linux 设备在探测期间允许的最高 D 状态。如果总线驱动程序通常将设备设置为 D0 状态以进行探测,则对 _DSC 的支持需要内核总线类型的支持。

使用 _DSC 的缺点是,由于设备没有通电,即使设备存在问题,驱动程序也可能探测正常,但第一个用户会发现设备无法工作,而不是在探测时发生故障。因此,应谨慎使用此功能。

I²C

如果 I²C 驱动程序通过在 struct i2c_driver.flags 字段中设置 I2C_DRV_ACPI_WAIVE_D0_PROBE 标志来表明其对此的支持,并且 _DSC 对象求值的整数高于设备的 D 状态,则在探测时不会开启设备电源(将其置于 D0 状态)。

D 状态

下面列出了 D 状态以及 _DSC 的允许值。有关设备电源状态的更多信息,请参阅 [1]。

Number  State   Description
0       D0      Device fully powered on
1       D1
2       D2
3       D3hot
4       D3cold  Off

参考文献

[1] https://uefi.org/specifications/ACPI/6.4/02_Definition_of_Terms/Definition_of_Terms.html#device-power-state-definitions

示例

以下是一个 ASL 示例,描述了使用 _DSC 对象来告知操作系统在探测期间应保持断电的 ACPI 设备。为了便于理解,已省略了一些不相关的对象。

Device (CAM0)
{
        Name (_HID, "SONY319A")
        Name (_UID, Zero)
        Name (_CRS, ResourceTemplate ()
        {
                I2cSerialBus(0x0020, ControllerInitiated, 0x00061A80,
                             AddressingMode7Bit, "\\_SB.PCI0.I2C0",
                             0x00, ResourceConsumer)
        })
        Method (_DSC, 0, NotSerialized)
        {
                Return (0x4)
        }
}