如何重置/重新启动PCIe设备的电源?


20

我有一个PCIe设备,仅在计算机完全关闭电源然后再打开时才能正常工作。发出简单命令rebootreboot -p命令似乎都无法重新启动PCIe卡的电源,这会导致它在重新引导后无法正常工作。

有没有办法从操作系统重新启动PCIe插槽中的设备电源?我可以在找到它/sys/bus/pci/devices/0000*/,但是我不知道如何正确重置板子。切换能力似乎是唯一的方法。

除非这样做,我是否可以在某个地方更改设置,这将导致reboot命令重新启动整个电源?

顺便说一下,我正在运行Ubuntu 12.10。


你尝试了reboot -f吗?这类似于按下CPU的电源按钮。
ktan 2015年

1
两年前,OP指出软功能reboot不起作用。您reboot -f仍然是软重启。
roaima 2015年

Answers:


16

潜在方法1

我认为您可以使用以下命令来做到这一点:

禁用

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

使能

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

$NUMBERPCI插槽的编号在哪里。

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

潜在方法2

我在类似的问题U&L上遇到了这个线程:该问题有一些答案,您可以使用以下命令重置:

echo "1" > /sys/bus/pci/devices/$NUMBER/reset

但是,我会在那里阅读答案!这样做有条件!具体来说,我会读这个答案

潜在方法3

有一个Unix命令,setpci它可以为您提供一种重置PCI总线中设备的方法。

我没有看到使用此命令的任何特定示例,因此您将不得不Google搜索示例并浏览手册页。在您对它的使用充满信心之前,我将不加理会。从我所读到的内容来看,它是直接操作硬件,因此与使用暴露这种功能的工具相比,亲自进行操作总是存在风险!


1
即使插入了多张卡,插槽中也没有显示任何内容。我确实在中有电源目录/sys/bus/pci/devices/$NUMBER/。但是似乎没有必要设置0或1
zachd1_618 13-4-27

1
我在类似的问题U&L上遇到了这个线程:对Q的回答是,您可以使用此命令进行重置:echo“ 1”> / sys / bus / pci / devices / $ NUMBER / reset。请阅读Q,但是这样做有条件!
slm

感谢您的链接。我已经尝试过了,但是似乎什么也没做。具体来说,设备不会重启,系统仍然知道它存在。(插入并插入卡后,/ dev中有一些我可以观看的设备)。当我时他们不会消失echo "1" > ...
zachd1_618

1
您是否在重新启动电源之前为该卡卸载内核模块?我认为您也必须这样做。
slm

1
我想我将检查内核源代码,看看是否将切换power实际放入了D3中。
森林

7

removerescan允许内核以循环方式为PCI设备供电,而无需执行以下操作reboot

echo "1" > /sys/bus/pci/devices/DDDD\:BB\:DD.F//remove
sleep 1
echo "1" > /sys/bus/pci/rescan

其中DDDD.BB.DD.F = Domain:Bus:Device.Function


echo“ 1”> / sys / bus / pci / rescan在lenovo g560 mini pci插槽中为我工作。我插入了USB 3.0 minipci卡。系统是Ubuntu 16.04 x64
kodmanyagha,

并非适用于所有设备。我有一个Cavium网络适配器,该适配器无法通过该方法关闭电源,因为使用串行线路时我仍然可以访问其u-boot。
埃里克

7

PCI Express中的复位有点复杂。重置主要有两种类型-常规重置和功能级别重置。还有两种类型的常规重置,基本重置和非基本重置。有关所有详细信息,请参见PCI Express规范。

“冷复位”是在对PCIe设备通电后发生的基本复位。似乎没有触发冷复位的标准方法,除了关闭系统然后重新打开之外。在我的机器上,/sys/bus/pci/slots目录为空。

“热复位”是在不断开设备电源的情况下触发的基本复位。似乎没有触发热复位的标准方法。

“热重置”是通过PCI Express链路触发的常规重置。当链路被迫进入电气空闲状态或通过发送带有热复位位的TS1和TS2有序集来触发热复位。软件可以通过设置然后清除设备上游桥接端口的PCI配置空间中桥接控制寄存器中的辅助总线复位位来启动热复位。

“功能级别重置”(FLR)是仅影响PCI Express设备的单个功能的重置。它不得重置整个PCIe设备。PCIe规范不需要实现功能级别的重置。通过在PCI配置空间中的PCI Express功能结构中的功能的设备控制寄存器中设置启动功能级别重置位,可以启动功能级别重置。

Linux以形式公开功能级别的重置功能/sys/bus/pci/devices/$dev/reset。向该文件写入1将启动相应功能的功能级复位。请注意,这仅影响设备的特定功能,而不影响整个设备,并且不要求设备按照PCIe规范实施功能级别的重置。

我不知道触发热重置的任何“不错”方法(没有sysfs条目)。但是,可以使用setpci这样做:

#!/bin/bash

dev=$1

if [ -z "$dev" ]; then
    echo "Error: no device specified"
    exit 1
fi

if [ ! -e "/sys/bus/pci/devices/$dev" ]; then
    dev="0000:$dev"
fi

if [ ! -e "/sys/bus/pci/devices/$dev" ]; then
    echo "Error: device $dev not found"
    exit 1
fi

port=$(basename $(dirname $(readlink "/sys/bus/pci/devices/$dev")))

if [ ! -e "/sys/bus/pci/devices/$port" ]; then
    echo "Error: device $port not found"
    exit 1
fi

echo "Removing $dev..."

echo 1 > "/sys/bus/pci/devices/$dev/remove"

echo "Performing hot reset of port $port..."

bc=$(setpci -s $port BRIDGE_CONTROL)

echo "Bridge control:" $bc

setpci -s $port BRIDGE_CONTROL=$(printf "%04x" $(("0x$bc" | 0x40)))
sleep 0.01
setpci -s $port BRIDGE_CONTROL=$bc
sleep 0.5

echo "Rescanning bus..."

echo 1 > "/sys/bus/pci/devices/$port/rescan"

运行此脚本之前,请确保卸载所有附加的驱动程序。该脚本将尝试删除PCIe设备,然后命令上游交换机端口发出热重置,然后尝试重新扫描PCIe总线。此脚本也仅在具有单个功能的设备上进行了测试,因此可能需要对具有多个功能的设备进行一些重新设计。


该脚本适用于我的AMD RX480。上下文:PCI直通Win10来宾,然后关闭或重新启动来宾。如果仍连接GPU,则重新启动guest虚拟机(不使用此脚本)将挂起。在两者之间运行此脚本
可解决
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.