FPGA開発日記

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

RISC-V IOMMU の構成についてマニュアルを読んでまとめる (10. IOVA の変換プロセス)

前回:msyksphinz.hatenablog.com

github.com

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

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


IOVAを変換するプロセスは、ハードウェアID(device_idprocess_id)を使って、デバイス・コンテキストとプロセス・コンテキストを特定する。Device-contextとProcess-contextは、ページテーブルのルートPPN、 PSCIDGSCID、アドレス変換と保護プロセスに影響する他の制御パラメータを提供する。アドレス変換キャッシュ(???)が実装されている場合、変換プロセスは、GSCIDPSCIDを使用して、キャッシュされた変換をそのアドレス空間に関連付けることができる。

IOVA を変換するプロセスは以下の通りである:

  1. ddtp.iommu_mode == Off の場合、停止し、"All inbound transactions disallowed" (cause = 256)と報告する。
  2. ddtp.iommu_mode == Bare で、以下の条件のいずれかが成立する場合、停止し、"Transaction type disallowed" (cause = 260)と報告します。
    1. トランザクションタイプは、Translatedリクエスト(read, write/AMO, read-for-execute)、またはPCIe ATS Translationリクエストである。
  3. capabilities.MSI_FLAT が0の場合、IOMMUはベースフォーマットのデバイスコンテキストを使用する。 DDI[0]device_id[6:0] とし、 DDI[1]device_id[15:7] であり、 DDI[2]device_id[23:16] である。
  4. capabilities.MSI_FLAT が1の場合、IOMMUは拡張フォーマットデバイスコンテキストを使用する。 DDI[0]device_id[5:0] とし、 DDI[1]device_id[14:6]であり、 DDI[2]device_id[23:15] である。
  5. もし device_id が IOMMU モードでサポートされているものより広い場合、以下のチェックによって決定され、停止して "Transaction type disallowed" (cause = 260) を報告する。
    1. ddtp.iommu_mode2LVL で、かつ DDI[2] が 0 ではない。
    2. ddtp.iommu_mode is 1LVL and either DDI[2] is not 0 or DDI[1] is not 0
  6. device_id を使用して、 ??? で指定されたデバイスコンテキスト(DC)を見つける。
  7. 以下の条件のいずれかが成立する場合、停止して "Transaction type disallowed"(原因=260)を報告する。
    1. トランザクションタイプがTranslatedリクエスト(読み取り、書き込み/AMO、実行用読み取り)であるか、PCIe ATS Translationリクエストであり、 DC.tc.EN_ATS が0である。
    2. トランザクションは有効な process_id を持ち、DC.tc.PDTV は0です。
    3. トランザクションは有効な process_id を持ち、DC.tc.PDTV は1であり、 process_idpdtp.MODE がサポートするものより広い。
    4. トランザクションタイプはIOMMUによってサポートされていない。
  8. リクエストが変換済みリクエストであり、 DC.tc.T2GPA が0の場合、変換処理は完了する。 ステップ20に進む。
  9. 要求が変換済み要求で、 DC.tc.T2GPA が1の場合、IOVAはGPAである。 次のページ表情報でステップ17に進みます:
    1. A をIOVA とする(IOVA はGPA)。
    2. iosatp.MODEBare とする。
      1. PSCID の値は、ファーストステージが Bare の場合は使用されない。
    3. iohgatpDC.iohgatp フィールドの値とする。
  10. もしDC.tc.PDTVが0に設定されているなら、次のページテーブルの情報を使ってステップ17に進む:
    1. iosatp.MODEDC.fsc.MODE フィールドの値とする。
    2. iosatp.PPNDC.fsc.PPN フィールドの値とする。
    3. PSCIDDC.ta.PSCID フィールドの値とする。
    4. iohgatpDC.iohgatp フィールドの値とする。
  11. DPEが1で、トランザクションに関連する process_id がない場合、 process_id をデフォルト値の0とする。
    1. もしDPEが0で、トランザクションに関連する process_id がなければ、次のページテーブル情報でステップ17に進む:
    2. iosatp.MODEBare とする。
      1. PSCID の値は、ファーストステージが Bare の場合は使用されない。
    3. iohgatpDC.iohgatp フィールドの値とする。
  12. もし DC.fsc.pdtp.MODE = Bare ならば、次のページテーブル情報でステップ17に進む:
    1. iosatp.MODEBare とします。
      1. PSCID の値は、ファーストステージが Bare の場合は使用されない。
    2. iohgatpDC.iohgatp フィールドの値とする。
  13. ??? で指定されたプロセスコンテキスト(PC)を見つける。
  14. 以下の条件のいずれかが成立する場合、停止して "Transaction type disallowed" (cause = 260) を報告する。
    1. トランザクションはスーパーバイザ権限を要求しているが、 PC.ta.ENS が設定されていない。
  15. 次のページテーブル情報でステップ17に進みます:
    1. iosatp.MODEPC.fsc.MODE フィールドの値とする。
    2. iosatp.PPNPC.fsc.PPN フィールドの値とする。
    3. PSCIDPC.ta.PSCID フィールドの値とする。
    4. iohgatpDC.iohgatp フィールドの値とする。
  16. トランザクションによってアクセスされる GPA を決定するために、RISC-V Privileged 仕様書 [4] のセクション「2段階アドレス変換」で指定されたプロセスを使用する。第一段階のアドレス変換処理で障害が検出された場合、その障害を停止して報告する。変換処理が正常に完了した場合、A を変換されたGPAとする。
  17. MSIページテーブルを使用するMSIアドレス変換が有効である場合(すなわち、 DC.msiptp.MODE != Off )、 ??? で指定されたMSIアドレス変換プロセスが起動される。 もしGPA A が仮想割込みファイルのアドレスであると決定されなければ、プロセスはステップ19で継続する。 もしMSIアドレス変換プロセスによって障害が検出されれば、停止して障害を報告し、そうでなければプロセスはステップ20で継続する。
  18. トランザクションによってアクセスされるSPAを決定するために、GPAA を変換するために、RISC-V特権仕様[4 のセクション「2段階アドレス変換」で指定された第2段階アドレス変換プロセスを使用する。 アドレス変換プロセスによって障害が検出された場合、その障害を停止して報告する。
  19. 変換処理完了

セカンドステージのPTEで U ビットをチェックする場合、トランザクションはスーパーバイザ特権を要求していないものとして扱われる。Zicfiss [5] 拡張で指定されている pte.xwr=010 エンコーディングは、シングル ステージおよび VS ステージ ページテーブルのシャドウ スタック ページ タイプのために、IO トランザクションのために予約されたエンコーディングのままです。

変換プロセスがフォールトを報告し、リクエストが未変換リクエストまたは変換リクエストである場合、IOMMUはIOブリッジにトランザクションを中止するよう要求する。IOブリッジでフォールトトランザクションを処理するためのガイドラインは、??? に記載されている。 フォルトは、??? で指定されたフォルト/イベント報告メカニズムおよびフォルト記録形式を使用して報告される。

フォルトが PCIe ATS Translation Request によって検出された場合、IOMMU はソフトウェアにフォルトを報告したり、アボートを引き起こしたりする代わりに、PCIe プロトコルで定義された応答を提供することができる。 フォールトが発生した PCIe ATS Translation Requests の処理は、 ???に規定されている。