将 PCI 设备切换到 D3 冷(D3cold)状态

Switch PCI device to D3 cold (D3cold) state

我需要在 linux 物理关闭我的 PCI 设备。我找到了我需要的功能,但似乎要编写一个内核模式应用程序来使用该库,因为我在内核头文件中找到了它。

我在 drivers/pci/pci.c 中找到了这个函数 int pci_set_power_state(struct pci_dev *dev, pci_power_t state),但我不知道如何使用它。

此外,我在文档中读到,设备驱动程序通常不用于将设备切换到 d3cold,因为设备只是关闭并且根本不工作(是的,有一些设备,可以不完全关闭,并且可以发送唤醒呼叫,但这是另一个故事...)我认为,我需要与 PCI 总线通信。

我不知道去哪里寻找答案,请指导我的任务。

潜在方法#1 我想你可以用这些命令来完成:

禁用

echo 0 > /sys/bus/pci/slots/$NUMBER/power

启用

echo 1 > /sys/bus/pci/slots/$NUMBER/power

其中 $NUMBER 是 PCI 插槽的编号。

lspci -vv 可能有助于识别设备。这没有很好的记录...

另一种方法是向pci设备发送关机通知。我以nvm设备为例

  1. 通过lspci读取bar0的值,偏移量为10h。

    lspci -s 01:00.0 -xxxx。例如你得到值:0xfc1f4004

  2. 读取地址为0xfc1f4000的内存

  3. 在0xfc1f4014的第14位写入1

偏移量 14h:CC – 控制器配置。 Bit 15:14 = 01b 正常关机通知