diff options
author | Andrew Bresticker <abrestic@chromium.org> | 2014-09-18 17:47:12 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2014-11-24 01:44:53 -0500 |
commit | a669efc4a3b49de9226b280bb683f5b1d5a5d143 (patch) | |
tree | b4466902e1496aee220fbaf4dbf0be1f0247cf7e /arch/mips/ralink/irq.c | |
parent | 079a4601768e248ba89dd08d4953e6dae607d7bd (diff) |
MIPS: Add hook to get C0 performance counter interrupt
The hardware perf event driver and oprofile interpret the global
cp0_perfcount_irq differently: in the hardware perf event driver
it is an offset from MIPS_CPU_IRQ_BASE and in oprofile it is the
actual IRQ number. This still works most of the time since
MIPS_CPU_IRQ_BASE is usually 0, but is clearly wrong. Since the
performance counter interrupt may vary from platform to platform
like the C0 timer interrupt, add the optional get_c0_perfcount_int
hook which returns the IRQ number of the performance counter.
The hook should return < 0 if the performance counter interrupt is
shared with the timer. If the hook is not present, the CPU vector
reported in C0_IntCtl (cp0_perfcount_irq) is used.
Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
Reviewed-by: Qais Yousef <qais.yousef@imgtec.com>
Tested-by: Qais Yousef <qais.yousef@imgtec.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Andrew Bresticker <abrestic@chromium.org>
Cc: Jeffrey Deans <jeffrey.deans@imgtec.com>
Cc: Markos Chandras <markos.chandras@imgtec.com>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: Qais Yousef <qais.yousef@imgtec.com>
Cc: Jonas Gorski <jogo@openwrt.org>
Cc: John Crispin <blogic@openwrt.org>
Cc: David Daney <ddaney.cavm@gmail.com>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/7805/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/ralink/irq.c')
-rw-r--r-- | arch/mips/ralink/irq.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/mips/ralink/irq.c b/arch/mips/ralink/irq.c index 0495011a19df..7634dcd88766 100644 --- a/arch/mips/ralink/irq.c +++ b/arch/mips/ralink/irq.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #define RALINK_INTC_IRQ_PERFC (RALINK_INTC_IRQ_BASE + 9) | 45 | #define RALINK_INTC_IRQ_PERFC (RALINK_INTC_IRQ_BASE + 9) |
46 | 46 | ||
47 | static void __iomem *rt_intc_membase; | 47 | static void __iomem *rt_intc_membase; |
48 | static int rt_perfcount_irq; | ||
48 | 49 | ||
49 | static inline void rt_intc_w32(u32 val, unsigned reg) | 50 | static inline void rt_intc_w32(u32 val, unsigned reg) |
50 | { | 51 | { |
@@ -73,6 +74,11 @@ static struct irq_chip ralink_intc_irq_chip = { | |||
73 | .irq_mask_ack = ralink_intc_irq_mask, | 74 | .irq_mask_ack = ralink_intc_irq_mask, |
74 | }; | 75 | }; |
75 | 76 | ||
77 | int get_c0_perfcount_int(void) | ||
78 | { | ||
79 | return rt_perfcount_irq; | ||
80 | } | ||
81 | |||
76 | unsigned int get_c0_compare_int(void) | 82 | unsigned int get_c0_compare_int(void) |
77 | { | 83 | { |
78 | return CP0_LEGACY_COMPARE_IRQ; | 84 | return CP0_LEGACY_COMPARE_IRQ; |
@@ -167,7 +173,7 @@ static int __init intc_of_init(struct device_node *node, | |||
167 | irq_set_handler_data(irq, domain); | 173 | irq_set_handler_data(irq, domain); |
168 | 174 | ||
169 | /* tell the kernel which irq is used for performance monitoring */ | 175 | /* tell the kernel which irq is used for performance monitoring */ |
170 | cp0_perfcount_irq = irq_create_mapping(domain, 9); | 176 | rt_perfcount_irq = irq_create_mapping(domain, 9); |
171 | 177 | ||
172 | return 0; | 178 | return 0; |
173 | } | 179 | } |