PCIe 장치의 전원을 재설정 / 사이클하는 방법은 무엇입니까? 슬롯의 장치로 전원을 껐다 켜는 방법이 있습니까?

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

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

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

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



답변

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


답변

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


답변

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 버스를 다시 스캔합니다. 이 스크립트는 단일 기능을 가진 장치에서만 테스트되었으므로 여러 기능을 가진 장치의 경우 일부 재 작업이 필요할 수 있습니다.


답변