diff options
author | Mark Rutland <mark.rutland@arm.com> | 2011-06-06 05:37:50 -0400 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2011-08-31 05:50:08 -0400 |
commit | 7ae18a5717cbbf1879bdd5b66d7009a9958e5aef (patch) | |
tree | 877bd254703c985de0db15df76a2bf3ead1ea06f /arch/arm | |
parent | 0f78d2d5ccf72ec834da6901886a40fd8e3b7615 (diff) |
ARM: perf: add type field to struct arm_pmu
Currently, the ARM perf code assumes all PMUs it will handle are
CPU PMUs, having ARM_PMU_DEVICE_CPU hardcoded when reserving or
releasing hardware. This means that currently, the ARM perf code can't
support system PMUs.
This patch adds a 'type' field to struct arm_pmu, which allows the code
to reserve & release the hardware regardless of the PMU type.
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Reviewed-by: Jamie Iles <jamie@jamieiles.com>
Reviewed-by: Ashwin Chaugule <ashwinc@codeaurora.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/kernel/perf_event.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 9331d5731445..1a2ebbf07fb7 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -60,6 +60,7 @@ static DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events); | |||
60 | 60 | ||
61 | struct arm_pmu { | 61 | struct arm_pmu { |
62 | enum arm_perf_pmu_ids id; | 62 | enum arm_perf_pmu_ids id; |
63 | enum arm_pmu_type type; | ||
63 | cpumask_t active_irqs; | 64 | cpumask_t active_irqs; |
64 | const char *name; | 65 | const char *name; |
65 | irqreturn_t (*handle_irq)(int irq_num, void *dev); | 66 | irqreturn_t (*handle_irq)(int irq_num, void *dev); |
@@ -396,7 +397,7 @@ armpmu_release_hardware(void) | |||
396 | free_irq(irq, NULL); | 397 | free_irq(irq, NULL); |
397 | } | 398 | } |
398 | 399 | ||
399 | release_pmu(ARM_PMU_DEVICE_CPU); | 400 | release_pmu(armpmu->type); |
400 | } | 401 | } |
401 | 402 | ||
402 | static int | 403 | static int |
@@ -407,7 +408,7 @@ armpmu_reserve_hardware(void) | |||
407 | int i, err, irq, irqs; | 408 | int i, err, irq, irqs; |
408 | struct platform_device *pmu_device = armpmu->plat_device; | 409 | struct platform_device *pmu_device = armpmu->plat_device; |
409 | 410 | ||
410 | err = reserve_pmu(ARM_PMU_DEVICE_CPU); | 411 | err = reserve_pmu(armpmu->type); |
411 | if (err) { | 412 | if (err) { |
412 | pr_warning("unable to reserve pmu\n"); | 413 | pr_warning("unable to reserve pmu\n"); |
413 | return err; | 414 | return err; |
@@ -691,6 +692,7 @@ static void __init cpu_pmu_init(struct arm_pmu *armpmu) | |||
691 | raw_spin_lock_init(&events->pmu_lock); | 692 | raw_spin_lock_init(&events->pmu_lock); |
692 | } | 693 | } |
693 | armpmu->get_hw_events = armpmu_get_cpu_events; | 694 | armpmu->get_hw_events = armpmu_get_cpu_events; |
695 | armpmu->type = ARM_PMU_DEVICE_CPU; | ||
694 | } | 696 | } |
695 | 697 | ||
696 | /* | 698 | /* |