私はFreescale MPC8308(ルートコンプレックス)でPCIeバスを使用していますが、エンドポイントデバイスは256MBのメモリ領域とBARレジスタを1つしか持たないASICです。デバイスコンフィギュレーションスペースレジスタは、 "pciutils"パッケージを介して簡単にアクセスできます。最初はmmap()
を使ってメモリ領域にアクセスしようとしましたが、動作しませんでした。だから次のレベルでは、私は、Linux起動後にカーネルにロードするカーネルモジュールであるPCIeエンドポイントデバイス用のデバイスドライバを用意しました。デバイスを有効にしてメモリを割り当てるためのPCIeドライバエラー
driver-pci 0000:00:00.0: device not available because of BAR 0 [0x000000-0xfffffff] collisions
また、私はPCIeデバイス用のメモリ領域を割り当てたいとき:エンドポイントデバイスがデバイスIDテーブルから識別が、私はpci_enable_device()
により、デバイスを有効にするとき、私はこのエラーが表示され、私のドライバでは
pci_request_region()
を使用することはできません。
pci_enable_result = pci_enable_device (pdev);
if (pci_enable_result)
{
printk(KERN_INFO "PCI enable encountered a problem \n");
return pci_enable_result;
}
else
{
printk(KERN_INFO "PCI enable was succesfull \n");
}
そしてここで「dmesgの」の結果である:ここで
が動作していないドライバのコードの一部である
driver-pci 0000:00:00.0: device not available because of BAR 0 [0x000000-0xfffffff] collisions
PCI enable encountered a problem
driver-pci: probe of 0000:00:00.0 failed with error -22
それはドライバーに私ができることは注目に値しますpci_read_config_dword()
およびpci_write_config_dword()
のような機能を使用して、コンフィギュレーションレジスタを正しく読み書きします。
あなたはどう思いますか?カーネルがカーネルモジュールの前にデバイスを初期化するため、問題が発生する可能性はありますか?これが起こらないように私は何をすべきですか?
ハードウェアが壊れています。通常の作業システムでは、バスアドレス空間に衝突がないことを確認する必要があります。それ以外の場合は、それを再割り当てする必要があります。 – 0andriy
@AndyShevchenko、ありがとうAndy、バスのアドレスとメモリ領域全体を再割り当てしたい場合は、 PCIデバイス用に現在割り当てられているアドレス空間を削除できる方法はありますか?おかげさまで –