私のLinuxカーネルが最初のPCIeバススキャンと列挙を行った後に構成されたFPGA(この質問をしているほとんどの人と同様)があります。ご想像のとおり、FPGAはPCIeエンドポイントを実装しています。
PCIeコアでENTIRE PCIeバスを再列挙して、FPGAが表示され、ドライバーモジュールをロードできるようにします。また、FPGAの負荷を別の構成にスワップする機能も必要です。これにより、次のことができるようになります。
Linuxを再起動せずにすべて
他の場所で提案されているが、問題を解決しない解決策を以下に示します。
echo 1 > /sys/bus/pci/rescan
これは動作するように見えますが(時々のみ)、最初に列挙された後にFPGAロードをホットスワップしたい場合は動作しません。
誰かが他の場所でも提案したかなり侵襲的な方法です(私はテストしていません)。 https://community.freescale.com/thread/305355
PCIeのホットプラグ/電源管理機能を使用してこの機能を実現できますか?その場合、PCIeでホットプラグシステムを使用するための優れたリソースはありますか? (LDDは完全に十分にカバーしていません)
echo 1 > /sys/bus/pci/rescan
を介してPCIeバス/ツリーを再列挙するのが正しいソリューションです。説明と同じ方法で使用しています。
echo 1 > $pcidevice/remove
を使用して、ドライバーをデバイスから切断し、デバイスをツリーから切り離します。ドライバー(xillybus)はアンロードされず、単に切断されます。
より良い解決策は、FPGAが接続されているノードのみを再スキャンすることです。これにより、システムに対する全体的な影響が軽減されます。
この手法は、 RC3E FPGAクラウドシステムで使用されます。
医者から
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"