【问题标题】:Switch PCI device to D3 cold (D3cold) state将 PCI 设备切换到 D3 冷 (D3cold) 状态
【发布时间】:2015-01-21 23:19:21
【问题描述】:

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

我在drivers/pci/pci.c找到了这个函数int pci_set_power_state(struct pci_dev *dev, pci_power_t state),不知道怎么用。

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

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

【问题讨论】:

  • 我几乎不明白上下文。您是否对某些设备有问题?您想通过用户空间管理设备吗?该设备是否在内核中有驱动程序?更加详尽。
  • 我想关闭任何 PCI 设备的电源。在我的情况下它有驱动程序,但我不知道它是否在内核中编译。内核或用户空间并不重要,但用户空间应用程序对我来说更舒服。

标签: c unix linux-kernel power-management pci


【解决方案1】:

潜在方法#1 我认为您可以使用以下命令来做到这一点:

禁用

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

启用

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

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

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

【讨论】:

  • 谢谢。我已经找到了这个,但忘了发布答案。我终于用这个命令关闭设备:echo 1 > /sys/bus/pci/devices/0000\:03\:00.0/remove 和这个命令打开它:echo 1 blur > /sys/bus/pci/rescan。我真的不确定它将设备切换到 D3cold 状态,但它对我有用。查看 d3cold 是否允许读取 /sys/bus/pci/devices/0000\:03\:00.0/d3cold_allowed.
  • 你使用什么发行版?我的 sysfs (4.15.0-55-generic #60-Ubuntu SMP Tue Jul 2 18:22:20 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux) 中只有 power 作为目录。
【解决方案2】:

另一种方法是向 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 正常关机通知

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多