FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-V IOMMU の構成についてマニュアルを読んでまとめる (5. デバイス・ディレクトリ・テーブル)

前回:msyksphinz.hatenablog.com

github.com

RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。

何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。


2.1. デバイス・ディレクトリ・テーブル(DDT)

DDTは、デバイス・ディレクトリ・インデックス(DDI)のビットを使ってインデックスを付けた1, 2, または3レベルの基数木である。 device_id でDCを探す。 以下の図はDDT基幹ツリーを示している。 ルート・デバイス・ディレクトリ・テーブルのPPNは、デバイス・ディレクトリ・テーブル・ポインタ(ddtp)と呼ばれるメモリ・マップド・レジスタに保持される。 各有効な非リーフ(NL)エントリは8バイトサイズで、次のデバイス・ディレクトリ・テーブルの PPN を保持する。 有効なリーフ・デバイス・ディレクトリ・テーブル・エントリはデバイス・コンテキスト(DC)を保持する。

拡張フォーマット DC による3レベル、2レベル、1レベルのデバイス・ディレクトリ
基本フォーマット DC による3レベル、2レベル、1レベルのデバイス・ディレクトリ

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フィールドをどのような順序で読んでもよい。