# RISC-V IOMMU Nested HPM **Repository Path**: polypopopo/riscv-iommu-nested-hpm ## Basic Information - **Project Name**: RISC-V IOMMU Nested HPM - **Description**: 本项目旨在为 `OpenEuler/OLK-6.6` 移植RISC-V IOMMU 硬件性能监控(hardware performance monitor)和嵌套 IOMMU支持,并提供完整的测试方案。 - **Primary Language**: Shell - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2025-05-07 - **Last Updated**: 2025-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RISC-V IOMMU HPM/Nested 移植、测试 ## 1. 项目介绍 本项目旨在为 `openEuler/OLK-6.6` 移植RISC-V IOMMU 硬件性能监控(hardware performance monitor)和嵌套 IOMMU支持。同时,还引入了更多操作,这些操作是嵌套IOMMU 所需的,例如 `g-stage flush` 和 `iotlb_sync_map`。该项目基于的 RISC-V IOMMU 规范已经通过批准,并可在 [GitHub/riscv-non-isa](https://github.com/riscv-non-isa/riscv-iommu) 获取。在高层次上,RISC-V IOMMU 规范定义了以下内容: **1. 数据结构** * **设备上下文(Device-context):**将设备与地址空间关联,并保存用于地址转换的每设备参数。 * **进程上下文(Process-contexts):**基于设备提供的进程标识号(process identification numbers)关联不同的虚拟地址空间。 * **MSI 页表配置 :**用于将 MSI(Message Signaled Interrupts)定向到 IMSIC(Incoming Message Signaled Interrupt Controller)中的客户中断文件。 **2.** **内存中的队列接口** : * **命令队列(Command-queue):**用于向 IOMMU 发送命令。 * **故障/事件队列(Fault/event queue):**用于报告故障和事件。 * **页面请求队列(Page-request queue):**用于报告从 PCIe 设备接收的“页面请求”消息。 * **消息中断和线中断机制(Message-signaled and wire-signaled interrupt mechanisms) 。** **3.** **内存映射编程接口** : * 强制和可选的寄存器布局及描述。 * 设备初始化和功能发现。 ## 2. 任务规划 ### 2.1 特性移植 #### 项目1 **基于 `OpenEuler/OLK6.6` 移植适配 RISC-V IOMMU核心特性** 由于 [openEuler/OLK-6.6](https://gitee.com/openeuler/kernel/tree/OLK-6.6/) 对 RISC-V IOMMU 架构的支持较为落后,我们考虑从主线/社区移植完善相应的功能,除了基础的 RISC-V IOMMU 适配,还需要支持 `nested-iommu` (两阶段嵌套地址翻译),和 `riscv-iommu-hpm` (硬件性能监控) 的适配。我们可以参考以下仓库和补丁,backport 到 `openEuler/OLK-6.6` 上: * [tjeznach/linux at riscv_iommu_v7](https://github.com/tjeznach/linux/tree/riscv_iommu_v7) [1] * [[RFC PATCH v2 00/10\] RISC-V IOMMU HPM and nested IOMMU support - Zong Li](https://lore.kernel.org/all/20240614142156.29420-1-zong.li@sifive.com/) [2] 在 [1] 基础上可以直接应用 [2] 系列补丁,不会产生冲突。 ```markdown **产出物**(代码) 1. 参考 `[1][2]` 将上游RISC-V IOMMU核心功能移植到 `OpenEuler/OLK-6.6` ``` ### 2.2 测试验证 #### 项目2 **基于RISC-V架构的 `iommu-selftests` 构建、测试、验证** ```markdown 分析并区分 `iommu-selftests[1]` 所涉及的全部功能点,基于qemu构建完整的测试环境并验证,分析解决Bug,筛选出目前RISC-V架构所支持的功能,对于RISC-V所不支持的测试项(arm/x86支持),尽可能探索其不支持的原因(软硬件支持),作为我们后续进一步贡献内核社区的方向. [1] https://github.com/torvalds/linux/tree/master/tools/testing/selftests/iommu **产出物**(文档) 1. iommu-selftests功能分析文档 2. 基于qemu-riscv的完整构建、测试脚本 ``` --- #### 项目3 **设计 `RISC-V IOMMU HPM/Nested` 测试方案** * RISC-V IOMMU 硬件性能监控 * 嵌套 IOMMU ```markdown `iommu-selftests` 对于 RISC-V Nested/HPM 的测试较为有限,我们需要另外一套测试方案去验证这两项功能,可自定义测试项,也可参照其它架构(arm/x86)的测试方法。 **产出物**(文档) 1. `Nested/HPM` 各一套测试代码、文档 2. 基于qemu-riscv的完整构建、测试脚本 ``` ## 3. 其它说明 各位同学先整体了解一下项目要求,后续相关的测试环境脚本,将陆续在此仓库发布