将 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设备为例
通过lspci读取bar0的值,偏移量为10h。
lspci -s 01:00.0 -xxxx。例如你得到值:0xfc1f4004
读取地址为0xfc1f4000的内存
在0xfc1f4014的第14位写入1
偏移量 14h:CC – 控制器配置。 Bit 15:14 = 01b 正常关机通知
我需要在 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设备为例
通过lspci读取bar0的值,偏移量为10h。
lspci -s 01:00.0 -xxxx。例如你得到值:0xfc1f4004
读取地址为0xfc1f4000的内存
在0xfc1f4014的第14位写入1
偏移量 14h:CC – 控制器配置。 Bit 15:14 = 01b 正常关机通知