1 // SPDX-License-Identifier: GPL-2.0
3 * platform_device probing code for ARM performance counters.
5 * Copyright (C) 2009 picoChip Designs, Ltd., Jamie Iles
6 * Copyright (C) 2010 ARM Ltd., Will Deacon <will.deacon@arm.com>
8 #define pr_fmt(fmt) "hw perfevents: " fmt
11 #include <linux/bug.h>
12 #include <linux/cpumask.h>
13 #include <linux/device.h>
14 #include <linux/errno.h>
15 #include <linux/irq.h>
16 #include <linux/irqdesc.h>
17 #include <linux/kconfig.h>
19 #include <linux/percpu.h>
20 #include <linux/perf/arm_pmu.h>
21 #include <linux/platform_device.h>
22 #include <linux/printk.h>
23 #include <linux/smp.h>
25 static int probe_current_pmu(struct arm_pmu
*pmu
,
26 const struct pmu_probe_info
*info
)
29 unsigned int cpuid
= read_cpuid_id();
32 pr_info("probing PMU on CPU %d\n", cpu
);
34 for (; info
->init
!= NULL
; info
++) {
35 if ((cpuid
& info
->mask
) != info
->cpuid
)
37 ret
= info
->init(pmu
);
45 static int pmu_parse_percpu_irq(struct arm_pmu
*pmu
, int irq
)
48 struct pmu_hw_events __percpu
*hw_events
= pmu
->hw_events
;
50 ret
= irq_get_percpu_devid_partition(irq
, &pmu
->supported_cpus
);
54 for_each_cpu(cpu
, &pmu
->supported_cpus
)
55 per_cpu(hw_events
->irq
, cpu
) = irq
;
60 static bool pmu_has_irq_affinity(struct device_node
*node
)
62 return of_property_present(node
, "interrupt-affinity");
65 static int pmu_parse_irq_affinity(struct device
*dev
, int i
)
67 struct device_node
*dn
;
71 * If we don't have an interrupt-affinity property, we guess irq
72 * affinity matches our logical CPU order, as we used to assume.
73 * This is fragile, so we'll warn in pmu_parse_irqs().
75 if (!pmu_has_irq_affinity(dev
->of_node
))
78 dn
= of_parse_phandle(dev
->of_node
, "interrupt-affinity", i
);
80 dev_warn(dev
, "failed to parse interrupt-affinity[%d]\n", i
);
84 cpu
= of_cpu_node_to_id(dn
);
86 dev_warn(dev
, "failed to find logical CPU for %pOFn\n", dn
);
95 static int pmu_parse_irqs(struct arm_pmu
*pmu
)
98 struct platform_device
*pdev
= pmu
->plat_device
;
99 struct pmu_hw_events __percpu
*hw_events
= pmu
->hw_events
;
100 struct device
*dev
= &pdev
->dev
;
102 num_irqs
= platform_irq_count(pdev
);
104 return dev_err_probe(dev
, num_irqs
, "unable to count PMU IRQs\n");
107 * In this case we have no idea which CPUs are covered by the PMU.
108 * To match our prior behaviour, we assume all CPUs in this case.
111 dev_warn(dev
, "no irqs for PMU, sampling events not supported\n");
112 pmu
->pmu
.capabilities
|= PERF_PMU_CAP_NO_INTERRUPT
;
113 cpumask_setall(&pmu
->supported_cpus
);
118 int irq
= platform_get_irq(pdev
, 0);
119 if ((irq
> 0) && irq_is_percpu_devid(irq
))
120 return pmu_parse_percpu_irq(pmu
, irq
);
123 if (nr_cpu_ids
!= 1 && !pmu_has_irq_affinity(dev
->of_node
))
124 dev_warn(dev
, "no interrupt-affinity property, guessing.\n");
126 for (i
= 0; i
< num_irqs
; i
++) {
129 irq
= platform_get_irq(pdev
, i
);
130 if (WARN_ON(irq
<= 0))
133 if (irq_is_percpu_devid(irq
)) {
134 dev_warn(dev
, "multiple PPIs or mismatched SPI/PPI detected\n");
138 cpu
= pmu_parse_irq_affinity(dev
, i
);
141 if (cpu
>= nr_cpu_ids
)
144 if (per_cpu(hw_events
->irq
, cpu
)) {
145 dev_warn(dev
, "multiple PMU IRQs for the same CPU detected\n");
149 per_cpu(hw_events
->irq
, cpu
) = irq
;
150 cpumask_set_cpu(cpu
, &pmu
->supported_cpus
);
156 static int armpmu_request_irqs(struct arm_pmu
*armpmu
)
158 struct pmu_hw_events __percpu
*hw_events
= armpmu
->hw_events
;
161 for_each_cpu(cpu
, &armpmu
->supported_cpus
) {
162 int irq
= per_cpu(hw_events
->irq
, cpu
);
166 err
= armpmu_request_irq(irq
, cpu
);
174 static void armpmu_free_irqs(struct arm_pmu
*armpmu
)
177 struct pmu_hw_events __percpu
*hw_events
= armpmu
->hw_events
;
179 for_each_cpu(cpu
, &armpmu
->supported_cpus
) {
180 int irq
= per_cpu(hw_events
->irq
, cpu
);
182 armpmu_free_irq(irq
, cpu
);
186 int arm_pmu_device_probe(struct platform_device
*pdev
,
187 const struct of_device_id
*of_table
,
188 const struct pmu_probe_info
*probe_table
)
190 armpmu_init_fn init_fn
;
191 struct device
*dev
= &pdev
->dev
;
195 pmu
= armpmu_alloc();
199 pmu
->pmu
.parent
= &pdev
->dev
;
200 pmu
->plat_device
= pdev
;
202 ret
= pmu_parse_irqs(pmu
);
206 init_fn
= of_device_get_match_data(dev
);
208 pmu
->secure_access
= of_property_read_bool(dev
->of_node
,
209 "secure-reg-access");
211 /* arm64 systems boot only as non-secure */
212 if (IS_ENABLED(CONFIG_ARM64
) && pmu
->secure_access
) {
213 dev_warn(dev
, "ignoring \"secure-reg-access\" property for arm64\n");
214 pmu
->secure_access
= false;
218 } else if (probe_table
) {
219 cpumask_setall(&pmu
->supported_cpus
);
220 ret
= probe_current_pmu(pmu
, probe_table
);
224 dev_err(dev
, "failed to probe PMU!\n");
228 ret
= armpmu_request_irqs(pmu
);
232 ret
= armpmu_register(pmu
);
234 dev_err(dev
, "failed to register PMU devices!\n");
241 armpmu_free_irqs(pmu
);