以下の内容はhttps://msyksphinz.hatenablog.com/entry/2025/10/26/040000より取得しました。


Zero-day-lab の IOMMU 実装調査 (1. インタフェース調査)

Zero-Day LabのRISC-V IOMMUは RISC-V仕様のIOMMUのRTL実装だ。IOMMUの仕様を理解するためにも、実装を一度概観してみよう。

github.com

RISC-V IOMMUのインタフェース仕様

パラメータ

キャッシュ・エントリ数の設定

parameter int unsigned  IOTLB_ENTRIES       = 4,    // IOTLBエントリ数
parameter int unsigned  DDTC_ENTRIES        = 4,    // DDTCエントリ数
parameter int unsigned  PDTC_ENTRIES        = 4,    // PDTCエントリ数
parameter int unsigned  MRIFC_ENTRIES       = 4,    // MRIFキャッシュエントリ数

機能の有効化オプション

parameter bit                   InclPC      = 0,    // プロセスIDサポート
parameter bit                   InclBC      = 0,    // AXI4境界チェック
parameter bit                   InclDBG     = 0,    // デバッグレジスタIF

MSIと割り込み設定

parameter rv_iommu::msi_trans_t MSITrans    = rv_iommu::MSI_DISABLED, // MSI変換のサポートレベル(DISABLED/FLAT_MRIF)
parameter rv_iommu::igs_t       IGS         = rv_iommu::WSI_ONLY, // 割り込み生成方式(WSI_ONLY/MSI_ONLY/BOTH)
parameter int unsigned          N_INT_VEC   = 16,   // 割り込みベクタ数 1, 2, 4, 8, 16のいずれか(2のべき乗)

パフォーマンスモニタリング

parameter int unsigned          N_IOHPMCTR  = 0,    // ハードウェアパフォーマンスカウンタの数。最大31

AXIバス設定

parameter int   ADDR_WIDTH      = -1,       /// AXI Bus Addr width
parameter int   DATA_WIDTH      = -1,       /// AXI Bus data width
parameter int   ID_WIDTH        = -1,       /// AXI ID width
parameter int   ID_SLV_WIDTH    = -1,       /// AXI ID width
parameter int   USER_WIDTH      = 1,        /// AXI user width
parameter type aw_chan_t        = logic,    /// AXI AW Channel struct type
parameter type w_chan_t         = logic,    /// AXI W Channel struct type
parameter type b_chan_t         = logic,    /// AXI B Channel struct type
parameter type ar_chan_t        = logic,    /// AXI AR Channel struct type
parameter type r_chan_t         = logic,    /// AXI R Channel struct type
parameter type  axi_req_t       = logic,    /// AXI Full request struct type
parameter type  axi_rsp_t       = logic,    /// AXI Full response struct type
parameter type  axi_req_slv_t   = logic,    /// AXI Full Slave request struct type
parameter type  axi_rsp_slv_t   = logic,    /// AXI Full Slave response struct type
parameter type  axi_req_iommu_t = logic,    /// AXI Full request struct type w/ DVM extension for SMMU
parameter type  reg_req_t       = logic,    /// Regbus request struct type.
parameter type  reg_rsp_t       = logic     /// Regbus response struct type.

入出力インタフェース

1. Translation Request Interface(変換リクエストIF)

input  axi_req_iommu_t  dev_tr_req_i,
output axi_rsp_t        dev_tr_resp_o,

デバイスからのメモリアクセス要求を受け付けるインタフェースである。変換されていないIOVAを含んだリクエストを受信し、変換したうえでメモリアクセスが実行され、そのメモリアクセスの結果をデバイスに返す。

AXI DVMエクステンションに対応し、stream_id(デバイスID)やsubstream_id(プロセスID)などの情報を含める必要がある:

            READ: begin
                
                // Tags
                trans_iova      =  dev_tr_req_i.ar.addr;
                // AXI DVM extension for SMMU
                trans_did       =  dev_tr_req_i.ar.stream_id;
                trans_pv        =  dev_tr_req_i.ar.ss_id_valid;
                trans_pid       =  dev_tr_req_i.ar.substream_id;
                // ARPROT[2] indicates data access (r) when LOW, instruction access (rx) when HIGH
                trans_type      = (dev_tr_req_i.ar.prot[2]) ? (rv_iommu::UNTRANSLATED_RX) : (rv_iommu::UNTRANSLATED_R);
                trans_priv      =  dev_tr_req_i.ar.prot[0]; // AxPROT[0] indicates privileged transaction (supervisor lvl) when set

                burst_type      =  dev_tr_req_i.ar.burst;
                burst_length    =  dev_tr_req_i.ar.len;
                n_bytes         =  dev_tr_req_i.ar.size;

主な役割:

  • 未変換のIOVA(IO Virtual Address)を受信
  • アドレス変換を実行
  • 変換結果を後続のインタフェースに転送

2. Data Structures Interface(データ構造IF)

output axi_req_t        ds_req_o,
input  axi_rsp_t        ds_resp_i,

IOMMU内部のハードウェアが管理データ構造にアクセスするためのインタフェースである。実際にIOVAからIOPAへの変換を行うのがこのインタフェースに相当する。

アクセス対象:

  • DDT(Device Directory Table)
  • PDT(Process Directory Table)
  • ページテーブル(Page Tables)
  • コマンドキュー(Command Queue)
  • フォルトキュー(Fault Queue)
  • MSI関連データ構造

2. Translation Completion Interface(変換完了IF)

output axi_req_t        dev_comp_req_o,
input  axi_rsp_t        dev_comp_resp_i,

IOPAへの変換が成功したトランザクションを実際のメモリシステムに送信するためのインタフェースである。ここで使用するのは変換済みのIOPAである。

4. Programming Interface(プログラミングIF)

input  axi_req_slv_t    prog_req_i,
output axi_rsp_slv_t    prog_resp_o,

ソフトウェア(ドライバ)がIOMMUの設定レジスタにアクセスするためのインタフェースである。

5. Interrupt Output(割り込み出力)

output logic [(N_INT_VEC-1):0] wsi_wires_o

WSI(Wired Signaled Interrupt)方式の割り込み出力である。

インタフェース構成図

image.png





以上の内容はhttps://msyksphinz.hatenablog.com/entry/2025/10/26/040000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14