[RFC PATCH 3/6] perf/smmuv3: Retrieve parent SMMUv3 IIDR

From: John Garry
Date: Mon Sep 30 2019 - 10:37:11 EST


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@xxxxxxxxxx>
---
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