RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。
1.3 配置とデータの流れ
図5に示されるように、典型的なRISC-V HARTを搭載したSoCは、メモリコントローラ、複数のIOデバイス、そして2つのIOMMUインスタンスを備えている。 このSoCでは、各デバイスがシステムファブリックやインターコネクトに接続され、ルートポートを通じてIOプロトコルトランザクションとシステムインターコネクトトランザクションの変換が行われる。 PCIeの場合、ルートポートは、PCIeトランザクションをシステムインターコネクトトランザクションに変換し、デバイスはPCIeプロトコルでIOMMUにアクセスする。
最初のIOMMUインスタンス(IOMMU 0、図5におけるIO Bridge 0に関連)は、ルートポートをシステムファブリックに接続する。 これにより、複数のエンドポイントデバイスがSoCに接続される。 PCIeの場合、IOMMUはPCIe ATSプロトコルをサポートしており、デバイス側ATC(DevATC)を持つデバイスがIOMMU 0から取得した変換を保持できる。これにより、デバイスのパフォーマンスが最適化される。
二つ目のIOMMUインスタンス(IOMMU 1、図5のIO Bridge 1に接続)は、ルートポートを介さずに、デバイスAおよびデバイスBを直接システムファブリックに接続する構成である。 このような場合、デバイスはシステムの他の部分と直接インターフェースするため、効率的な通信が可能となる。
IOデバイスはIO仮想アドレス(VA、GVA、GPA)を使用してDMAトランザクションを実行する。 IO Bridgeは、関連するIOMMUを呼び出して、これらのIOVAをスーパーバイザ物理アドレス(SPA)に変換する。 このアドレス変換は主にインバウンドトランザクションに対して実行され、IOMMUはIOブリッジに対するルックアサイドIPの役割を果たす。
図6に示すように、IOMMUは以下のインターフェイスを持つ:
- ホストインターフェイス:IOMMUのメモリマップされたレジスタにアクセスし、グローバルな設定やメンテナンスを行うためのインターフェイス。
- デバイス変換リクエストインターフェイス:IO Bridgeから変換リクエストを受け取り、必要なデータ(デバイスID、プロセスID、IOVAなど)を基にアドレス変換を実行する。
- データ構造インターフェイス:IOMMUがメモリにアクセスして必要なデータ構造(コンテキスト情報やページテーブルエントリ)を取得するためのインターフェイス。
- データ変換完了インターフェイス:アドレス変換の結果をIOブリッジに返し、変換が成功したか、またはフォルトが発生したかを伝える。
- ATSインターフェイス:PCIe ATS機能をサポートし、エンドポイントデバイスとの通信を行うためのインターフェイス。
IOMMUは、RISC-V HART同様に、物理メモリアトリビュート(PMA)と物理メモリ保護(PMP)チェックを行う必要がある。 IOMMUの暗黙のメモリアクセスもPMAチェックを受け、PMPチェッカはデバイスのハードウェアIDを基に適切なアクセス制御を行う。 IOブリッジやルートポートはハードウェアIDの認証を行い、例えばPCIeでは、アクセス制御サービス(ACS)のソース検証機能が用いられることがある。