@@ -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,
};
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 <john.garry@huawei.com> --- drivers/perf/arm_smmuv3_pmu.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)