PCIeデバイスの電源をリセット/再投入する方法は?


20

コンピューターの電源が完全にオフになってから再びオンになったときにのみ正常に動作するPCIeデバイスがあります。シンプルrebootまたはreboot -pコマンドを発行しても、PCIeカードの電源が入れ直されないため、リブート後に機能しなくなります。

OSからPCIeスロットのデバイスの電源を入れ直す方法はありますか?で見つけることができます/sys/bus/pci/devices/0000*/が、ボードを適切にリセットする方法がわかりません。パワーの切り替えが唯一の方法のようです。

それを除いて、rebootコマンドのフルパワーサイクルを引き起こす設定をどこかで変更できますか?

ところで、Ubuntu 12.10を実行しています。


試しましたreboot -fか?これは、CPUの電源ボタンを押すのに似ています。
ktan

1
2年前、OPはソフトrebootが機能しなかったことを指摘しました。あなたreboot -fはまだソフトリブートです。
ロアイマ

回答:


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バス内のデバイスをリセットする方法を提供します。

このコマンドには特定の例はありませんでしたので、例のためにグーグルで検索し、manページを確認する必要があります。このコマンドの使用に自信が持てるようになるまで、このコマンドを軽く実行します。私がそれについて読んだことから、それはハードウェアを直接操作しているので、このタイプの機能を公開するツールを使用するのではなく、自分でそれを行うことには常にリスクがあります!


1
複数のカードが接続されていても、スロットには何も表示されません。には電源ディレクトリがあり/sys/bus/pci/devices/$NUMBER/ます。しかし、0または1の設定を保証するものはないようです
-zachd1_618

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

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は、レノボg560ミニpciスロットで動作します。USB 3.0 minipciカードを接続しました。システムはUbuntu 16.04 x64
kodmanyagha

すべてのデバイスで機能するわけではありません。シリアル回線を使用している場合でもu-bootにアクセスできるため、その方法では電源がオフにならないCaviumネットワークアダプターがあります。
エリック

7

PCI Expressのリセットは少し複雑です。リセットには主に2つのタイプがあります-従来のリセットと機能レベルのリセットです。従来のリセットには、基本リセットと非基本リセットの2種類があります。詳細については、PCI Express仕様を参照してください。

「コールドリセット」は、PCIeデバイスに電源が投入された後に行われる基本的なリセットです。コールドリセットをトリガーする標準的な方法はないようです。システムをオフにしてから再びオンにすることを除きます。私のマシンでは、/sys/bus/pci/slotsディレクトリは空です。

「ウォームリセット」は、デバイスの電源を切断せずにトリガーされる基本的なリセットです。ウォームリセットをトリガーする標準的な方法はないようです。

「ホットリセット」は、PCIエクスプレスリンクを介してトリガーされる従来のリセットです。ホットリセットは、リンクが強制的に電気的アイドル状態になったとき、またはホットリセットビットが設定されたTS1およびTS2順序セットを送信したときにトリガーされます。ソフトウェアは、デバイスの上流のブリッジポートのPCI構成スペースにあるブリッジ制御レジスタのセカンダリバスリセットビットを設定してクリアすることにより、ホットリセットを開始できます。

「機能レベルリセット」(FLR)は、PCI Expressデバイスの単一の機能にのみ影響するリセットです。PCIeデバイス全体をリセットしないでください。PCIe仕様では、機能レベルのリセットを実装する必要はありません。機能レベルリセットは、PCI構成スペースのPCIエクスプレス機能構造内の機能のデバイス制御レジスタに機能レ​​ベルリセット開始ビットを設定することにより開始されます。

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で機能しました。コンテキスト:Win10ゲストへのPCIパススルー、その後のシャットダウンまたはゲストの再起動。GPUがまだ接続されていると、このスクリプトを使用せずにゲストを再起動するとハングします。固定の問題の間でこのスクリプトを実行する
小太郎
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.