Zynq AXI DMA 用のデバイス固有の DMA ドライバーを作成しています。ドライバーは実際にはラッパー ドライバーであり、次のように DMA エンジン ドライバー フレームワークの下でザイリンクス DMA ドライバーを使用します。
+------------------+ | | ラッパードライバー | +------------------+ | | DMA フレームワーク | +------------------+ | | ザイリンクス DMA ドライバー| +------------------+ + カーネル + +------------------+
転送完了には割り込み 61 を使用し、受信完了には 62 を使用します。ザイリンクス DMA ドライバーの割り込みハンドラーが正しくインストールされています (/proc/interrupts を確認しました)。ただし、次のように表示することで、ドライバーが割り込みを適切に処理していないようです。
/proc/interrupts を確認しました。IRQ62 は扱いません。割り込みが登録されているコードは次のとおりです。
0986 /* find the IRQ line, if it exists in the device tree */
0987 chan->irq = irq_of_parse_and_map(node, 0);
0988 err = devm_request_irq(xdev->dev, chan->irq, dma_intr_handler,
0989 IRQF_SHARED,
0990 "xilinx-dma-controller", chan);
cat /proc/interrupt の出力は次のとおりです。
2 つの質問があります。
1) ザイリンクス DMA ドライバーの割り込みハンドラーのみをインストールし、ラッパー ドライバーはインストールしない場合、ラッパー ドライバーを char デバイスとして使用すると、ザイリンクス DMA ドライバーで割り込みが処理されません。
2) その場合、ザイリンクス DMA ドライバーで割り込みを処理するにはどうすればよいですか。「irqpoll」が唯一の解決策ですか? ポーリングではなく直接割り込み処理と比較して、パフォーマンスの問題はありますか?