RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。
メモリ内データ構造のキャッシュ
ダイレクトメモリアクセス(DMA)変換を高速化するため、IOMMUは、デバイス・ディレクトリ・テーブル、プロセス・ディレクトリ・テーブル、第1段および第2段変換テーブル、MSIページ・テーブルからのエントリを保持する変換キャッシュを使用することができる。これらのキャッシュはIOMMU アドレス変換キャッシュ(IOATC)と総称される。
本仕様では、 V
(有効)ビットがクリアされた第1段/第2段PTE、 V
(有効)ビットがクリアされた非リーフDDTエントリ、V
(有効)ビットがクリアされたデバイスコンテキスト、V
(有効)ビットがクリアされた非リーフPDTエントリ、V
(有効)ビットがクリアされたプロセスコンテキスト、またはVビットがクリアされたMSI PTEのキャッシュを許可しない。
これらの IOATC は、RISC-V HARTまたはデバイス DMA による明示的なロードとストアを使用したメモリ内データ構造の変更を監視しない。 ソフトウェアは、IOMMU コマンドを使用してキャッシュされたデータ構造エントリを無効にし、メモリ内データ構造の更新を監視するために IOMMU 動作を同期させる必要がある。 より単純な実装では、メモリ内データ構造の一部またはすべてに IOATC を実装しないかもしれない。 IOMMU コマンドは、特定のエントリまたはエントリのグループを識別するために、1 つ以上の ID を使用してキャッシュされたエントリにタグを付けることができる。
キャッシュされたデータ構造 | エントリーのタグ付けに使われるID | 無効化コマンド |
---|---|---|
デバイス・ディレクトリ・テーブル | device_id | IODIR.INVAL_DDT |
プロセス・ディレクトリ・テーブル | device_id, process_id | IODIR.INVAL_PDT |
ファーストステージのページ表(セカンドステージが Bare でない場合) | GSCID, PSCID, and IOVA | IOTINVAL.VMA |
ファーストステージページテーブル(セカンドステージが Bare の場合) | PSCID, and IOVA | IOTINVAL.VMA |
第2ステージのページテーブル | GSCID, GPA | IOTINVAL.GVMA |
MSIページテーブル | GSCID, GPA | IOTINVAL.GVMA |