To support IMP DEF events per PMCG, retrieve the parent SMMUv3 IIDR. This
will be used as a lookup for the IMP DEF events supported, under the
assumption that a PMCG implementation has the same uniqueness as the
parent SMMUv3. In this, we assume that any PMCG associated with the same
SMMUv3 will have the same IMP DEF events - otherwise, some other
secondary matching would need to be done.

Signed-off-by: John Garry <[email protected]>
---
 drivers/perf/arm_smmuv3_pmu.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/perf/arm_smmuv3_pmu.c b/drivers/perf/arm_smmuv3_pmu.c
index da71c741cb46..f702898c695d 100644
--- a/drivers/perf/arm_smmuv3_pmu.c
+++ b/drivers/perf/arm_smmuv3_pmu.c
@@ -115,6 +115,7 @@ struct smmu_pmu {
        bool global_filter;
        u32 global_filter_span;
        u32 global_filter_sid;
+       u32 parent_iidr;
 };
 
 #define to_smmu_pmu(p) (container_of(p, struct smmu_pmu, pmu))
@@ -551,6 +552,11 @@ static const struct attribute_group *smmu_pmu_attr_grps[] 
= {
        NULL
 };
 
+static const struct attribute_group **smmu_pmu_lookup_attr_groups(u32 
parent_smmu_iidr)
+{
+       return smmu_pmu_attr_grps;
+}
+
 /*
  * Generic device handlers
  */
@@ -706,11 +712,21 @@ static int smmu_pmu_probe(struct platform_device *pdev)
        int irq, err;
        char *name;
        struct device *dev = &pdev->dev;
+       struct device *parent = dev->parent;
 
        smmu_pmu = devm_kzalloc(dev, sizeof(*smmu_pmu), GFP_KERNEL);
        if (!smmu_pmu)
                return -ENOMEM;
 
+       if (parent) {
+               void *parent_drvdata;
+
+               parent_drvdata = 
platform_get_drvdata(to_platform_device(parent));
+               if (!parent_drvdata)
+                       return -EPROBE_DEFER;
+               smmu_pmu->parent_iidr = *(u32 *)parent_drvdata;
+       }
+
        smmu_pmu->dev = dev;
        platform_set_drvdata(pdev, smmu_pmu);
 
@@ -724,7 +740,7 @@ static int smmu_pmu_probe(struct platform_device *pdev)
                .start          = smmu_pmu_event_start,
                .stop           = smmu_pmu_event_stop,
                .read           = smmu_pmu_event_read,
-               .attr_groups    = smmu_pmu_attr_grps,
+               .attr_groups    = 
smmu_pmu_lookup_attr_groups(smmu_pmu->parent_iidr),
                .capabilities   = PERF_PMU_CAP_NO_EXCLUDE,
        };
 
-- 
2.17.1

_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to