[PATCH v1 3/3] iommu/riscv: Register RISC-V IOMMU PMU at init time

Yaxing Guo
2025-09-15T02:10:13Z

Register the RISC-V IOMMU driver during IOMMU driver
initialization.

Signed-off-by: Yaxing Guo <guoyaxing@bosc.ac.cn>
---
drivers/iommu/riscv/iommu.c | 10 ++++++++++
1 file changed, 10 insertions(+)

diff --git a/drivers/iommu/riscv/iommu.c b/drivers/iommu/riscv/iommu.c
index 0eae2f4bdc5e..453d04b03c6c 100644
--- a/drivers/iommu/riscv/iommu.c
+++ b/drivers/iommu/riscv/iommu.c
@@ -23,6 +23,7 @@
#include "../iommu-pages.h"
#include "iommu-bits.h"
#include "iommu.h"
+#include "iommu-perf.h"

/* Timeouts in [us] */
#define RISCV_IOMMU_QCSR_TIMEOUT 150000
@@ -1604,6 +1605,7 @@ void riscv_iommu_remove(struct riscv_iommu_device *iommu)
riscv_iommu_iodir_set_mode(iommu, RISCV_IOMMU_DDTP_IOMMU_MODE_OFF);
riscv_iommu_queue_disable(&iommu->cmdq);
riscv_iommu_queue_disable(&iommu->fltq);
+ riscv_iommu_pmu_unregister(iommu);
}

int riscv_iommu_init(struct riscv_iommu_device *iommu)
@@ -1656,6 +1658,14 @@ int riscv_iommu_init(struct riscv_iommu_device *iommu)
goto err_remove_sysfs;
}

+ rc = riscv_iommu_pmu_alloc(iommu);
+ if (rc) {
+ dev_err(iommu->dev, "cannot alloc iommu pmu (%d)\n", rc);
+ iommu_device_sysfs_remove(&iommu->iommu);
+ goto err_remove_sysfs;
+ }
+ riscv_iommu_pmu_register(iommu);
+
return 0;

err_remove_sysfs:
--
2.34.1