インテル® Stratix® 10 SoC FPGAまたは® インテル Agilex 7 SoC FPGAで DMAC 向け dmatest を実行すると、 test_buf_size を大きな値に変更するときに次のエラーが表示される場合があります ( test_buf_size のデフォルト値は 16 KB):
root@agilex:~# エコー 1 > /sys/module/dmatest/parameters/run
[ 149.931113] dmatest: チャネル構成なし、任意に続行
[ 149.937236] dmatest: dma0chan0 を使用して 1 スレッドを追加
[ 149.942349] dmatest: dma0chan0 を使用して開始 1 スレッド
root@agilex:~# [ 149.963288] dma-pl330 ffda0000.pdma: swiotlb バッファーがいっぱい (sz: 2097152 バイト)、合計 32768 (スロット)、1024 (スロット) を使用
[ 149.974096] dma-pl330 ffda0000.pdma: DMA マスク ffffffff バスマスク 0 のオーバーフロー 0x00000003ebc00000+2097152
[ 149.983622] ------------[ ここでカット ]------------
根本的な原因は、DMAC 330 のアドレス幅は 32 ビットのみです。SWIOTLB のデフォルトのバッファーサイズでは、DMAC 330 が DDR の全範囲にアクセスするには十分ではありません。
この問題を回避するには、次のいずれかの解決方法を使用できます。
- 構成 Linux は、最初の 2GB の DDR のみを使用します。DMAC は 32 ビット幅アドレスで 2 GB メモリー範囲にアクセスできるため、SWIOTLB バッファーを増やす必要はありません。
- カーネルソースと U-boot コマンドラインを変更して、SWIOTLB バッファーを大きくします。
/include/linux/swiotlb.h で 、IO_TLB_SEGSIZE を大きな数字に変更します (power of2 にする必要があります)。例えば、 #define IO_TLB_SEGSIZE 1024
U-boot 環境を変更して、カスタマイズされた swiotlb の値を追加します。例えば、 setenv bootargs earlycon console=ttyPS0,115200 swiotlb=32768