FPGA開発日記

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

RISC-V IOMMU の構成についてマニュアルを読んでまとめる (14. PCIe ATS変換リクエスト)

前回:msyksphinz.hatenablog.com

github.com

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

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


PCIe ATS変換リクエスト処理

ATS[2]変換要求で構成エラーが発生した場合、要求元に対してCompleterAbort(CA)応答が返される。以下の要因コードは、このカテゴリに属する:

  • 命令アクセスエラー(cause=1)
  • リード・アクセス・フォールト(cause=5)
  • ライト/AMOアクセス・フォールト(cause=7)
  • MSIPTEロード・アクセス・フォールト(cause=261)
  • MSIPTE誤設定(cause=263)
  • PDTエントリーのロードアクセスフォールト(cause=265)
  • PDTエントリーの設定ミス(cause=267)

恒久的なエラーがあるか、ATSトランザクションが無効になっている場合、サポートされていない要求(UR)応答が生成される。 以下の原因コードはこのカテゴリーに属する:

  • すべてのインバウンドトランザクションが許可されない(cause=256)
  • DDTエントリのロード・アクセス・フォールト(cause=257)
  • DDTエントリが有効でない(cause=258)
  • DDTエントリの設定ミス(cause=259) トランザクションタイプが許可されていない(cause=260)

以下の原因によって変換が完了できなかった場合、RビットとWビットが0に設定された成功応答が生成される。 これらのエラーでは、フォールトキューにフォールトは記録されない。このような完了で返される変換アドレスは UNSPECIFIED である。

  • 命令ページフォルト(cause=12)
  • 読み出しページフォルト(cause=13)
  • 書き込み/AMOページフォルト(cause=15)
  • 命令ゲストページフォルト(cause=20)
  • 読み出しゲストページフォルト(cause=21)
  • 書き込み/AMOゲスト・ページ・フォールト(cause=23)
  • PDTエントリーが有効でない(cause=266)
  • MSIPTEが有効でない(cause=262)

変換要求が「Privilege Mode Requested」フィールドが0に設定されたPASIDを持つか、または要求がPASIDを持たない場合、要求は特権メモリを対象としていない。 メモリがユーザ・モードでアクセス可能かどうかを示すUビットが0の場合、RビットとWビットが0に設定されたSuccess応答が生成される。

変換要求が「Privilege Mode Requested」フィールドが1に設定されたPASIDを持つ場合、要求は特権メモリをターゲットにしている。 ページがユーザ・モードにアクセス可能かどうかを示すUビットが1であり、プロセスコンテキストのtaフィールドのSUMビットが0である場合、RビットとWビットが0に設定されたSuccessレスポンスが生成される。

変換が成功裏に完了できたが、要求されたパーミッションがいずれのステージにも存在しない場合(実行は要求されたが実行パーミッションはない;書き込みは要求されず書き込みパーミッションはない;読み込みパーミッションはない)、拒否されたパーミッション(R、WまたはX)に0が設定され、他のパーミッションビットにページテーブルから決定された値が設定されたSuccess応答が返される。 Xパーミッションは、Rパーミッションも許可され、実行パーミッションが要求された場合にのみ許可される。 PCIeでは、実行パーミッションが付与されている場合、読み取りパーミッションが付与されている必要があるため、実行のみのトランスレーションはPCIeATSと互換性がない。

ATS変換要求に対してSuccess応答が生成された場合、その応答がアクセスが許可されなかった、または一部のパーミッションが拒否されたことを示す場合でも、フォールト/イベント報告メカニズムを通じてフォールトレコードがソフトウェアに報告されることはない。 逆に、ATS変換リクエストに対してURまたはCA応答が生成されると、対応するフォルトが、フォールト/イベント報告メカニズムを通してソフトウェアに報告される。

セクション3.1.3.6で定義された規則を使用して、変換要求がMSIアドレスであると決定されたアドレスを持つが、MSIPTEがMRIFモードで構成されている場合、R、W、およびUビットが1に設定されたSuccess応答が生成される。

MSIPTEがMRIFモードで構成されている場合、データ値Dを持つMSI書き込みは、IOMMUがMRIF内の割り込みIDDの割り込みペンディング・ビットを設定する必要がある。 デバイスからMRIFモードMSIPTEを介してマップされるGPAへの変換要求は、変換されたアドレスを受信する資格がない。 これは、返される応答の「Untranslated Access Only」(U)フィールドを1に設定することで達成される。

ATS変換要求に対してSuccess応答が生成された場合、Priv、N、CXL.io、Global、およびAMAフィールドの設定は以下のようになる:

  • リクエストにPASIDがない場合、ATS変換完了のPrivフィールドは常に0に設定される。PASIDが存在する場合、Privフィールドは、提供されるパーミッションがリクエストで示される特権モードに対応するため、「PrivilegeModeRequested」フィールドの値に設定される。
  • ATSの変換完了のNフィールドは常に0に設定される。デバイスは、変換されたリクエストにNo-snoopフラグが設定されるべきかどうかを決定するために、他の手段を使用してもよい。
  • Globalフィールドは、変換が正常に完了でき、リクエストにPASIDが存在した場合、第一段階のページテーブルから決定された値に設定される。MSIアドレス変換を含む他のすべての場合、このフィールドは0に設定される。
  • 要求デバイスがCXLデバイスでない場合、CXL.ioは0に設定される。
  • 要求デバイスがCXLタイプ1またはタイプ2デバイスの場合
    • アドレスがMSIであると判断された場合、CXL.ioビットが1に設定される。
    • もしデバイスコンテキストでT2GPAが1であれば、CXL.ioビットは1に設定される。
    • もしメモリタイプがPMAであれば、このビットの設定はUNSPECIFIEDである。Svpbmt拡張がサポートされていない場合、このビットの設定はUNSPECIFIEDとなる。
    • 他のすべての場合、このビットの設定はUNSPECIFIEDである。
  • AMAフィールドはデフォルトで000bに設定されている。IOMMUは、他のエンコーディングを提供する実装固有の方法をサポートしてもよい。

IOブリッジは、変換されたアドレスのPMAに基づいて、ATS変換完了のCXL.ioビットを上書きしてもよい。 他の実装は、CXL.ioビットを設定するために、変換されたアドレスのPMAを決定する実装定義の方法を提供してもよい。 1に設定されたT2GPAの使用は、CXLタイプ1またはタイプ2デバイスと互換性がない場合がある。 CXL.cacheプロトコルを使用して、PCIeATS変換要求に応答して返される変換済みアドレスによってタグ付けされたキャッシュを実装するためである。 IOMMUは、CXL.cacheトランザクションのアドレス変換のために呼び出されることはない。