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 버스를 다시 스캔합니다. 이 스크립트는 단일 기능을 가진 장치에서만 테스트되었으므로 여러 기능을 가진 장치의 경우 일부 재 작업이 필요할 수 있습니다.
reboot -f
? 이것은 CPU의 전원 버튼을 누르는 것과 유사합니다.