探测非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)
        }
}