web-dev-qa-db-ja.com

LinuxカーネルにPCI-eバスの列挙を強制するにはどうすればよいですか?

Linuxカーネル2.6

Linuxを実行している開発ボードに接続されたGPIOを介してロードされるfpgaがあります。 fpgaは、pci-expressバスを介してデータを送受信します。ただし、これはブート時に列挙されるため、リンクは検出されません(ブート時にfpgaがロードされないため)。

Linuxでpci-eバスの再列挙を強制するにはどうすればよいですか?簡単なコマンドはありますか、それともカーネルを変更する必要がありますか? pcieデバイスをホットプラグする機能が必要です。

23
reign_man

あなたがどのプラットフォームにいるのだろうか:x86システムで動作するこの問題の回避策(ハック)は、バス、デバイス、FPGAの通常の機能が何であれ、BIOSが基本的にPCIデバイスを静的に構成することです、そしてOSはデバイスを列挙し、PCIスペースを予約します(デバイスが実際に存在しない場合でも)。次に、デバイスドライバーで、fpgaがプログラムされた後、BARおよびint行を手動でセットアップするなどの追加の操作を行う必要があります。もちろん、これにはBIOSを変更する必要があります。BIOSベンダーと作業している場合、契約を結んでこの変更を行うことができます。BIOSベンダーと作業していない場合は、はるかに困難になります。 x86でVxWorksに取り組んでおり、AMIにボード用のカスタムBIOSを作成してもらいました...

BIOSがない場合は、ブートローダーでプログラミングすることを検討してください。ディスクからの読み取り機能は既にあり、GPIO機能を追加するのはそれほど難しいことではありません(jtagとGPIOを使用している場合)。実際、使用するブートローダーによっては、既にGPIOを実行できる可能性がありますか?

これを行うためにカーネルを変更する際の問題は、PCI列挙の前に、ビットファイルを読み取ることができるスイートスポットを見つける必要があることです。たとえば、ディスクデバイスドライバーがPCIの後に初期化される場合、明らかにPCI列挙の前にビットファイルを読み込むためだけにカーネルに根本的な変更を加えると、他の迷惑な問題が発生する可能性があります...

あなたがすでに発見したかもしれない、そして開発時間にのみ本当に良いもう一つのオプション:システムの電源を入れ、fpgaボードをプログラムし、そしてリセットを実行します(例えば、電源を入れ直さずに:Sudo reboot now)、FPGAはその構成を保持し、Linuxが列挙する必要があります...

10

ルートとして、次のコマンドを試してください。

echo "1" > /sys/bus/pci/rescan

詳細については、次のリンクを参照してください。 http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci

25
user1202136

コンピューターの電源を入れた後、BIOSはPCIバスを列挙し、すべてのIOスペースとメモリマップIO(MMIO)要求を満たそうとします。 BARは最初に、オペレーティングシステムがこれらのBARをロードするときに、PCIバスドライバーがバスを再度列挙している間に、OSによって適切に変更できます。システムのスーパーユーザーがsetpci BIOSが既にそれらを設定しようとし、OSがロードされた後にこれらのBARを変更します(不適切に行われた場合、ドライバーが失敗し、他のいくつかの悪いことを引き起こす可能性があります)。

リージョンが64ビットのアドレスを要求するため、問題のカードにBIOSによってanyリソースが割り当てられていない場合、これを行う必要がありました。 BIOSは32ビットのアドレス割り当てでのみ動作しました。事後的に行って、これらのアドレス(BIOSによって最初に割り当てられた)を適切と思われるアドレスに変更し、カーネルモジュールを挿入すると、ドライバーはこれらの新しく割り当てられたアドレスをマッピングせずにカードに使用できました違いを知る。

PCI-Expressカードのホットプラグに関する問題は、マザーボード/バックプレーンに存在する必要のある特定のホットプラグコントローラがないと、スロット自体の電源をオン/オフできないことです。これらのホットプラグコントローラを使用してスロットの電源をオフにしないと、電源がまだ存在する場合にカードを物理的に挿入および/または取り外したときに、小さなピンがショートする可能性があります。ただし、ホットプラグイベントは、どちらの側からでも開始できます(ホストまたはエンドポイントデバイス)。これはそうではないようですが、FPGAにルートコンプレックスとのリンクが既に確立されている場合、問題の解決策はホットプラグ割り込みを生成してOSでバスの再スキャンを行うことです。

ただし、大きな問題があります。カードが実際にルートコンプレックスへのリンクを取得しない場合、ホットプラグイベントを生成できません。それが事実のようです。起動後、FPGAはPCIeバスの[〜#〜] present [〜#〜]行を切り替えて、列挙する準備ができているカードがあることをOSに通知する必要があります。検出されると、OSはカードへのリンクを確立し、デバイスにメモリ領域を割り当てようとします。 OSがカードを列挙した後、それに対してドライバーをロードし、lspciで見ることができます。ホットプラグと動的リソース割り当てをサポートするカーネル2.6を使用しているため、FPGAがPRESENT PCIeラインを切り替える機能をサポートしている限り、この方法は機能するはずです。

6
datboi