Zero-Day LabのRISC-V IOMMUは RISC-V仕様のIOMMUのRTL実装だ。IOMMUの仕様を理解するためにも、実装を一度概観してみよう。
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)方式の割り込み出力である。
インタフェース構成図
