ホスト メモリから FPGA への DMA ページに PCIe ドライバを書き込もうとしています。私のホスト セットアップは Cavium ThunderX2 で、FPGA は Xilinx Alveo U50 です。
ホストとの間の DMA により、ARM SMMU v3.4 はイベント 0x10 Translation faultをスローします。dma_map_single(..) および dma_alloc_coherent(..) Linux API を使用して、ページの仮想アドレスを DMA 対応アドレスにマップしています。
イベント レコード、コンテキスト記述子、およびストリーム テーブル エントリをさらに調べると、次の情報が得られます。
Type of Fault - F_TRANSLATION (Translation Fault)
S2 == 0 (Stage 1 Fault - Virtual Address -> Intermediate Physical Address stage)
Class of Fault = TT/TTD (Translation Table Descriptor Fetch)
PnU == Underprivileged Access
T0SZ == 5'b01000 (16); T1SZ == 5'b00000 (IGNORED because EPD1 == 1)
VAS == 49 bits (Virtual Address Size)
TG0 == 00 (4 kB page granule size)
EPD0 == 0 (Stage 1 page table walk enabled)
EPD1 == 1 (Stage 2 is bypassed)
TB0/1 == 0 (Top byte ignore disabled)
IPS == 44 bits (Input Address size)
SMMU Config = 3'b101 (Stage 1 translation enabled, Stage 2 bypassed)
取得したページのサンプル仮想および DMA アドレス -
Virtual Address - 0xFFFF--- (64-bit value)
DMA Address - 0x9F733CA000 (looks within the range defined by T0SZ and compliant with the IPS)
すべて問題ないように見えるのに、なぜステージ 1 変換エラーが発生するのか理解できません。技術的には、バイパスされ、入力アドレスが TTB0 を介して変換されるため、ステージ 2 フォルトが発生するはずです。
PS私はARM v8の初心者です。コメントで追加情報が必要な場合はお知らせください。
添付されているのは、障害F_TRANSLATIONの写真です。