19 #define pr_fmt(fmt) "CPU PMU: " fmt
21 #include <linux/bitmap.h>
22 #include <linux/export.h>
23 #include <linux/kernel.h>
28 #include <asm/cputype.h>
29 #include <asm/irq_regs.h>
33 static struct arm_pmu *cpu_pmu;
48 return cpu_pmu->pmu.name;
57 max_events = cpu_pmu->num_events;
68 static struct pmu_hw_events *cpu_pmu_get_cpu_events(
void)
73 static void cpu_pmu_free_irq(
void)
80 for (i = 0; i < irqs; ++
i) {
81 if (!cpumask_test_and_clear_cpu(i, &cpu_pmu->active_irqs))
91 int i,
err, irq, irqs;
99 pr_err(
"no irqs for PMUs defined\n");
103 for (i = 0; i < irqs; ++
i) {
114 if (irq_set_affinity(irq,
cpumask_of(i)) && irqs > 1) {
115 pr_warning(
"unable to set irq affinity (irq=%d, cpu=%u)\n",
123 pr_err(
"unable to request IRQ%d for ARM PMU counters\n",
128 cpumask_set_cpu(i, &cpu_pmu->active_irqs);
134 static void __devinit cpu_pmu_init(
struct arm_pmu *cpu_pmu)
139 events->events =
per_cpu(hw_events, cpu);
140 events->used_mask =
per_cpu(used_mask, cpu);
144 cpu_pmu->get_hw_events = cpu_pmu_get_cpu_events;
145 cpu_pmu->request_irq = cpu_pmu_request_irq;
146 cpu_pmu->free_irq = cpu_pmu_free_irq;
149 if (cpu_pmu && cpu_pmu->reset)
160 unsigned long action,
void *hcpu)
165 if (cpu_pmu && cpu_pmu->reset)
166 cpu_pmu->reset(
NULL);
172 .notifier_call = cpu_pmu_notify,
179 {.compatible =
"arm,cortex-a15-pmu", .data = armv7_a15_pmu_init},
180 {.compatible =
"arm,cortex-a9-pmu", .data = armv7_a9_pmu_init},
181 {.compatible =
"arm,cortex-a8-pmu", .data = armv7_a8_pmu_init},
182 {.compatible =
"arm,cortex-a7-pmu", .data = armv7_a7_pmu_init},
183 {.compatible =
"arm,cortex-a5-pmu", .data = armv7_a5_pmu_init},
184 {.compatible =
"arm,arm11mpcore-pmu", .data = armv6mpcore_pmu_init},
185 {.compatible =
"arm,arm1176-pmu", .data = armv6pmu_init},
186 {.compatible =
"arm,arm1136-pmu", .data = armv6pmu_init},
198 static struct arm_pmu *
__devinit probe_current_pmu(
void)
202 unsigned long cpuid = read_cpuid_id();
203 unsigned long implementor = (cpuid & 0xFF000000) >> 24;
206 pr_info(
"probing PMU on CPU %d\n", cpu);
209 if (0x41 == implementor) {
210 switch (part_number) {
214 pmu = armv6pmu_init();
217 pmu = armv6mpcore_pmu_init();
220 pmu = armv7_a8_pmu_init();
223 pmu = armv7_a9_pmu_init();
226 pmu = armv7_a5_pmu_init();
229 pmu = armv7_a15_pmu_init();
232 pmu = armv7_a7_pmu_init();
236 }
else if (0x69 == implementor) {
237 part_number = (cpuid >> 13) & 0x7;
238 switch (part_number) {
240 pmu = xscale1pmu_init();
243 pmu = xscale2pmu_init();
255 struct arm_pmu *(*init_fn)(
void);
259 pr_info(
"attempt to register multiple PMU devices!");
263 if (node && (of_id =
of_match_node(cpu_pmu_of_device_ids, pdev->
dev.of_node))) {
264 init_fn = of_id->
data;
267 cpu_pmu = probe_current_pmu();
273 cpu_pmu->plat_device = pdev;
274 cpu_pmu_init(cpu_pmu);
275 register_cpu_notifier(&cpu_pmu_hotplug_notifier);
285 .of_match_table = cpu_pmu_of_device_ids,
287 .probe = cpu_pmu_device_probe,
288 .id_table = cpu_pmu_plat_device_ids,
291 static int __init register_pmu_driver(
void)