PCIe 장치의 전원을 재설정 / 사이클하는 방법은 무엇입니까?


20

컴퓨터의 전원을 껐다가 다시 켤 때만 올바르게 작동하는 PCIe 장치가 있습니다. 단순 reboot또는 reboot -p명령을 실행해도 PCIe 카드의 전원을 껐다 켜는 것으로 나타나지 않아 재부팅 후 작동하지 않습니다.

OS에서 PCIe 슬롯의 장치로 전원을 껐다 켜는 방법이 있습니까? 에서 찾을 수 /sys/bus/pci/devices/0000*/있지만 보드를 올바르게 재설정하는 방법을 알 수 없습니다. 힘을 토글하는 것이 유일한 방법 인 것 같습니다.

이를 막기 위해 reboot명령 에서 전체 전원을 껐다 켜는 설정을 변경할 수 있습니까?

그건 그렇고 우분투 12.10을 실행 중입니다.


시도 했습니까 reboot -f? 이것은 CPU의 전원 버튼을 누르는 것과 유사합니다.
ktan

1
2 년 전 OP는 소프트 reboot가 작동하지 않는다고 지적했다 . 당신은 reboot -f여전히 부드러운 재부팅합니다.
roaima

답변:


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

setpciPCI 버스에서 장치를 재설정하는 방법을 제공 할 수 있는 Unix 명령 이 있습니다.

이 명령으로 특정 예제를 보지 못했기 때문에 Google에서 예제를 확인하고 매뉴얼 페이지를 살펴 봐야 합니다 . 나는 당신이 그것을 확신 할 때까지이 명령으로 가볍게 밟을 것이다. 내가 읽은 바에 따르면 하드웨어를 직접 조작하고 있기 때문에 항상 이러한 유형의 기능을 노출시키는 도구를 사용하는 것보다 직접 위험을 감수해야합니다!


1
여러 개의 카드가 연결되어 있어도 슬롯에 아무 것도 나타나지 않습니다.에 전원 디렉토리가 /sys/bus/pci/devices/$NUMBER/있습니다. 그러나 아무것도 영장 설정 0 또는 1로 보인다
zachd1_618

1
나는 U & L 에서이 스레드를 보았습니다 . 유사한 문제입니다 : echo "1"> / sys / bus / pci / devices / $ NUMBER / reset. Q를 읽으십시오. 그렇게하는 데는 조건이 있습니다!
slm

링크 주셔서 감사합니다. 그러나 그것을 시도했지만 아무것도하지 않는 것 같습니다. 특히, 장치의 전원을 껐다가 켜지지 않고 시스템이 여전히 장치를 알고 있습니다. (카드가 켜져 있고 꽂혀 있으면 / dev에 볼 수있는 장치가 있습니다). 그들은 내가 사라지지 않습니다 echo "1" > ....
zachd1_618

1
전원을 껐다 켜기 전에 해당 카드의 커널 모듈을 언로드하고 있습니까? 당신도 그렇게해야한다고 생각합니다.
slm

1
토글 링이 power실제로 D3에 넣었 는지 확인하기 위해 커널 소스 코드를 검사 할 것 입니다.

7

remove그리고 rescan자전거 타는 전력 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 slot에서 작동합니다. USB 3.0 minipci 카드를 연결했습니다. 시스템은 우분투입니다. 16.04 x64
kodmanyagha

모든 장치에서 작동하지는 않습니다. 직렬 회선을 사용할 때 여전히 u-boot에 액세스 할 수 있으므로 해당 방법으로 전원이 꺼지지 않는 Cavium 네트워크 어댑터가 있습니다.
에릭

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가 여전히 연결되어 있으면이 스크립트를 사용하지 않고 게스트를 다시 시작하면 중단됩니다. 이 스크립트를 사이에 실행하면 문제가 해결되었습니다
小 太郎
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.