Re: [PATCH v6 2/2] iommu/riscv: create a auxiliary device for HPM
"Yicong Yang" <[email protected]>
| Newsgroups | org.infradead.lists.linux-riscv,dev.linux.lists.iommu,org.kernel.vger.linux-kernel,org.kernel.vger.linux-perf-users |
|---|---|
| Message-ID | <[email protected]> |
On 8/24/26 10:20 AM, Zong Li wrote: > Create an auxiliary device for HPM when the IOMMU supports a > hardware performance monitor. > > Tested-by: Chen Pei <[email protected]> > Tested-by: Fangyu Yu <[email protected]> > Reviewed-by: Guo Ren <[email protected]> > Suggested-by: Samuel Holland <[email protected]> > Signed-off-by: Zong Li <[email protected]> Reviewed-by: Yicong Yang <[email protected]> > --- > drivers/iommu/riscv/Kconfig | 1 + > drivers/iommu/riscv/iommu.c | 37 +++++++++++++++++++++++++++++++++++++ > 2 files changed, 38 insertions(+) > > diff --git a/drivers/iommu/riscv/Kconfig b/drivers/iommu/riscv/Kconfig > index b86e5ab94183..8025bf0fb67f 100644 > --- a/drivers/iommu/riscv/Kconfig > +++ b/drivers/iommu/riscv/Kconfig > @@ -10,6 +10,7 @@ config RISCV_IOMMU > select GENERIC_PT > select IOMMU_PT > select IOMMU_PT_RISCV64 > + select AUXILIARY_BUS > help > Support for implementations of the RISC-V IOMMU architecture that > complements the RISC-V MMU capabilities, providing similar address > diff --git a/drivers/iommu/riscv/iommu.c b/drivers/iommu/riscv/iommu.c > index cec3ddd7ab10..7f619971bb70 100644 > --- a/drivers/iommu/riscv/iommu.c > +++ b/drivers/iommu/riscv/iommu.c > @@ -14,6 +14,7 @@ > > #include <linux/acpi.h> > #include <linux/acpi_rimt.h> > +#include <linux/auxiliary_bus.h> > #include <linux/compiler.h> > #include <linux/crash_dump.h> > #include <linux/init.h> > @@ -48,6 +49,9 @@ > static DEFINE_IDA(riscv_iommu_pscids); > #define RISCV_IOMMU_MAX_PSCID (BIT(20) - 1) > > +/* IOMMU PMU auxiliary device id allocation namespace. */ > +static DEFINE_IDA(riscv_iommu_pmu_ida); > + > /* Device resource-managed allocations */ > struct riscv_iommu_devres { > void *addr; > @@ -565,6 +569,36 @@ static irqreturn_t riscv_iommu_fltq_process(int irq, void *data) > return IRQ_HANDLED; > } > > +/* > + * IOMMU Hardware performance monitor > + */ > +static void riscv_iommu_pmu_id_free(void *data) > +{ > + ida_free(&riscv_iommu_pmu_ida, (unsigned long)data); > +} > + > +static int riscv_iommu_hpm_enable(struct riscv_iommu_device *iommu) > +{ > + struct auxiliary_device *auxdev; > + int id, ret; > + > + id = ida_alloc(&riscv_iommu_pmu_ida, GFP_KERNEL); > + if (id < 0) > + return id; > + > + ret = devm_add_action_or_reset(iommu->dev, riscv_iommu_pmu_id_free, > + (void *)(unsigned long)id); > + if (ret) > + return ret; > + > + auxdev = __devm_auxiliary_device_create(iommu->dev, "riscv-iommu", > + "pmu", iommu, id); > + if (!auxdev) > + return -ENODEV; > + > + return 0; > +} > + > /* Lookup and initialize device context info structure. */ > static struct riscv_iommu_dc *riscv_iommu_get_dc(struct riscv_iommu_device *iommu, > unsigned int devid) > @@ -1613,6 +1647,9 @@ int riscv_iommu_init(struct riscv_iommu_device *iommu) > goto err_remove_sysfs; > } > > + if (iommu->caps & RISCV_IOMMU_CAPABILITIES_HPM) > + riscv_iommu_hpm_enable(iommu); > + > return 0; > > err_remove_sysfs: _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv