diff options
author | Jamie Iles <jamie.iles@picochip.com> | 2010-02-02 14:23:15 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-02-12 12:23:43 -0500 |
commit | 0f4f0672ac950c96cffaf84a666d35e817d7c3ca (patch) | |
tree | cb4c1ec72f7842622c636a76f5ca519f3f3e8ea8 /arch/arm/include | |
parent | 74d2e4f8d79ae0c4b6ec027958d5b18058662eea (diff) |
ARM: 5899/2: arm: provide a mechanism to reserve performance counters
To add support for perf events and to allow the hardware counters to be
shared with oprofile, we need a way to reserve access to the pmu
(performance monitor unit). Platforms with PMU interrupts should
register the interrupts in arch/arm/kernel/pmu.c
Signed-off-by: Jamie Iles <jamie.iles@picochip.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/include')
-rw-r--r-- | arch/arm/include/asm/pmu.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h new file mode 100644 index 000000000000..2829b9f981a1 --- /dev/null +++ b/arch/arm/include/asm/pmu.h | |||
@@ -0,0 +1,75 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/include/asm/pmu.h | ||
3 | * | ||
4 | * Copyright (C) 2009 picoChip Designs Ltd, Jamie Iles | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #ifndef __ARM_PMU_H__ | ||
13 | #define __ARM_PMU_H__ | ||
14 | |||
15 | #ifdef CONFIG_CPU_HAS_PMU | ||
16 | |||
17 | struct pmu_irqs { | ||
18 | const int *irqs; | ||
19 | int num_irqs; | ||
20 | }; | ||
21 | |||
22 | /** | ||
23 | * reserve_pmu() - reserve the hardware performance counters | ||
24 | * | ||
25 | * Reserve the hardware performance counters in the system for exclusive use. | ||
26 | * The 'struct pmu_irqs' for the system is returned on success, ERR_PTR() | ||
27 | * encoded error on failure. | ||
28 | */ | ||
29 | extern const struct pmu_irqs * | ||
30 | reserve_pmu(void); | ||
31 | |||
32 | /** | ||
33 | * release_pmu() - Relinquish control of the performance counters | ||
34 | * | ||
35 | * Release the performance counters and allow someone else to use them. | ||
36 | * Callers must have disabled the counters and released IRQs before calling | ||
37 | * this. The 'struct pmu_irqs' returned from reserve_pmu() must be passed as | ||
38 | * a cookie. | ||
39 | */ | ||
40 | extern int | ||
41 | release_pmu(const struct pmu_irqs *irqs); | ||
42 | |||
43 | /** | ||
44 | * init_pmu() - Initialise the PMU. | ||
45 | * | ||
46 | * Initialise the system ready for PMU enabling. This should typically set the | ||
47 | * IRQ affinity and nothing else. The users (oprofile/perf events etc) will do | ||
48 | * the actual hardware initialisation. | ||
49 | */ | ||
50 | extern int | ||
51 | init_pmu(void); | ||
52 | |||
53 | #else /* CONFIG_CPU_HAS_PMU */ | ||
54 | |||
55 | static inline const struct pmu_irqs * | ||
56 | reserve_pmu(void) | ||
57 | { | ||
58 | return ERR_PTR(-ENODEV); | ||
59 | } | ||
60 | |||
61 | static inline int | ||
62 | release_pmu(const struct pmu_irqs *irqs) | ||
63 | { | ||
64 | return -ENODEV; | ||
65 | } | ||
66 | |||
67 | static inline int | ||
68 | init_pmu(void) | ||
69 | { | ||
70 | return -ENODEV; | ||
71 | } | ||
72 | |||
73 | #endif /* CONFIG_CPU_HAS_PMU */ | ||
74 | |||
75 | #endif /* __ARM_PMU_H__ */ | ||