RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。
2.1. デバイス・ディレクトリ・テーブル(DDT)
DDTは、デバイス・ディレクトリ・インデックス(DDI)のビットを使ってインデックスを付けた1, 2, または3レベルの基数木である。 device_id でDCを探す。 以下の図はDDT基幹ツリーを示している。 ルート・デバイス・ディレクトリ・テーブルのPPNは、デバイス・ディレクトリ・テーブル・ポインタ(ddtp)と呼ばれるメモリ・マップド・レジスタに保持される。 各有効な非リーフ(NL)エントリは8バイトサイズで、次のデバイス・ディレクトリ・テーブルの PPN を保持する。 有効なリーフ・デバイス・ディレクトリ・テーブル・エントリはデバイス・コンテキスト(DC)を保持する。
2.1.1. 非リーフDDTエントリ
有効な(V==1) 非リーフDDTエントリは、次のレベルのDDTのPPNを提供する。
2.1.2. リーフのDDTエントリ
リーフDDTページはDDI[0]でインデックスされ、デバイスコンテキスト(DC)を保持する。ベース・フォーマットでは DC は 32 バイトである。拡張フォーマットでは DC は 64 バイトである。
DCは、ベースフォーマットでは4つの64ビット・ダブルワードとして、拡張フォーマットでは8つの64ビット・ダブルワードとして解釈される。 メモリ上の各ダブルワードのバイト順序は、リトルエンディアンまたはビッグエンディアンで、 fctl.BE (セクション5.4)で決定されるエンディアンとなる。 IOMMU は DCフィールドをどのような順序で読んでもよい。