web-dev-qa-db-ja.com

LinuxユーザースペースPCIドライバーオプション? (uio_pci_generic)

PCIバス上にザイリンクスFPGAPCIeエンドポイントがあります。 Linuxはデバイスを問題なく検出し、lspciのすべてが完璧に見えます。

私の質問は、ユーザースペースからのPCIアクセスオプションと、何が良いか悪いかについてです。

オプション1:/ sys /.../ resource0を介した直接アクセス

(私がこれまでに何とか仕事をすることができたのは1つだけです)

/sys/bus/pci/devices/XXXX:XX:XX.X/resource0を開いてmmapし、それをmmapして読み取り/書き込みを行うことができます。最初に権限を修正する必要があります。私の質問は、これは良いアプローチですか、それとも悪いアプローチですか?これはPCIアドレス空間にアクセスするための好ましいアプローチではないように感じますか?

オプション2:uio_pci_genericを使用する

このドライバーが実際に接続するようにFPGAを構成することができましたが、割り込みが必要であるという事実は本当に迷惑です。そして、これは何にもアクセスを許可しないようです割り込みと構成メモリスペースを受け入れますか?これは私にはあまり役に立たないようですか?私は何かが足りないのですか?

オプション3:独自のuioドライバーを作成する

これはおそらく合理的なオプションかもしれませんか?これがどれほど難しいかはよくわかりません。これの考えられる利点の1つは、DMAにアクセスできるため、処理速度が大幅に向上する可能性があることです。

オプション4:完全にカスタムのLinuxPCIドライバーを作成する

可能であればこのオプションは避けたい

私の質問は、オプション1の最善のアプローチと、特に欠点は何かについてです。または、他に検討すべきアプローチはありますか?

(私はカーネル3.14.15 rtにパッチを当ててdebianを実行しています)

2

オプション1(/ sys /.../ resource0経由の直接アクセス)

テストには適していますが、機能的には何も問題はありませんが、高度なことはできず、ドライバーレイヤーの抽象化もできません。ユーザープログラムがsysfsと対話する方法では、この方法は厄介だと思いますが、それは私の個人的な意見かもしれません。

オプション2(uio_pci_genericを使用)

Uio_pci_genericが何をするのかわかりませんが、ユーザープログラムがpciレガシー割り込みにアクセスできるようにする以外に、ほとんど機能が追加されていないようです。とにかくMSIが好まれるのは悪い原因です。

オプション(カスタムuioドライバー)

私はこれを試しませんでしたが、オプション4と比較して少し時間の無駄だと思います

オプション4(カスタムカーネルドライバー)

これは本当に最良の解決策であり、物事を適切に行う唯一の方法です。 DMAやMSIなどを適切に処理し、文字デバイスを介して任意の量の抽象化を提供できるようにするには、ドライバーが必要です。ただし、PCI用のドライバーを作成する方法については十分なドキュメントがあります。カードをオンラインにし、カーネルは物事を管理するための多くのサポートを提供します。

2