aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/ralink/irq.c
diff options
context:
space:
mode:
authorAndrew Bresticker <abrestic@chromium.org>2014-09-18 17:47:12 -0400
committerRalf Baechle <ralf@linux-mips.org>2014-11-24 01:44:53 -0500
commita669efc4a3b49de9226b280bb683f5b1d5a5d143 (patch)
treeb4466902e1496aee220fbaf4dbf0be1f0247cf7e /arch/mips/ralink/irq.c
parent079a4601768e248ba89dd08d4953e6dae607d7bd (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.c8
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
47static void __iomem *rt_intc_membase; 47static void __iomem *rt_intc_membase;
48static int rt_perfcount_irq;
48 49
49static inline void rt_intc_w32(u32 val, unsigned reg) 50static 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
77int get_c0_perfcount_int(void)
78{
79 return rt_perfcount_irq;
80}
81
76unsigned int get_c0_compare_int(void) 82unsigned 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}