web-dev-qa-db-ja.com

PCIeバスの真の再スキャンを行う方法

私のLinuxカーネルが最初のPCIeバススキャンと列挙を行った後に構成されたFPGA(この質問をしているほとんどの人と同様)があります。ご想像のとおり、FPGAはPCIeエンドポイントを実装しています。

PCIeコアでENTIRE PCIeバスを再列挙して、FPGAが表示され、ドライバーモジュールをロードできるようにします。また、FPGAの負荷を別の構成にスワップする機能も必要です。これにより、次のことができるようになります。

  1. ブートLinux
  2. FPGAを構成する
  3. PCIeエンドポイントとロードモジュールを列挙する
  4. PCIeエンドポイントを削除する
  5. FPGAを再構成する
  6. PCIeエンドポイントを再列挙する

Linuxを再起動せずにすべて

他の場所で提案されているが、問題を解決しない解決策を以下に示します。

echo 1 > /sys/bus/pci/rescanこれは動作するように見えますが(時々のみ)、最初に列挙された後にFPGAロードをホットスワップしたい場合は動作しません。

誰かが他の場所でも提案したかなり侵襲的な方法です(私はテストしていません)。 https://community.freescale.com/thread/305355

PCIeのホットプラグ/電源管理機能を使用してこの機能を実現できますか?その場合、PCIeでホットプラグシステムを使用するための優れたリソースはありますか? (LDDは完全に十分にカバーしていません)

16
whh4000

echo 1 > /sys/bus/pci/rescanを介してPCIeバス/ツリーを再列挙するのが正しいソリューションです。説明と同じ方法で使用しています。

echo 1 > $pcidevice/removeを使用して、ドライバーをデバイスから切断し、デバイスをツリーから切り離します。ドライバー(xillybus)はアンロードされず、単に切断されます。

より良い解決策は、FPGAが接続されているノードのみを再スキャンすることです。これにより、システムに対する全体的な影響が軽減されます。

この手法は、 RC3E FPGAクラウドシステムで使用されます。

14
Paebbels

医者から

Windowsでのリセットと同じ前に、Vegasをリセットする方法を次に示します。これはベンダーIDに基づいています。

lspci -n | grep 1002: | egrep -v ".1"| awk '{print "find /sys | grep ""$1"/rescan" -| tac -;"}' | sh - | sed s/^/echo\ 1\ >\ "&/g | sed s/$/"/g

その出力は/etc/rc.local devcon再起動スクリプトと同様に、起動後にVegasをリセットします。

echo 1 > "/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/rescan"
echo 1 > "/sys/devices/pci0000:00/0000:00:1c.5/0000:03:00.0/rescan"
echo 1 > "/sys/devices/pci0000:00/0000:00:1d.0/0000:06:00.0/rescan"
echo 1 > "/sys/devices/pci0000:00/0000:00:1d.1/0000:07:00.0/rescan"
0
The Doctor