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>
This commit is contained in:

committed by
Ralf Baechle

parent
079a460176
commit
a669efc4a3
@@ -1613,22 +1613,13 @@ init_hw_perf_events(void)
|
||||
counters = counters_total_to_per_cpu(counters);
|
||||
#endif
|
||||
|
||||
#ifdef MSC01E_INT_BASE
|
||||
if (cpu_has_veic) {
|
||||
/*
|
||||
* Using platform specific interrupt controller defines.
|
||||
*/
|
||||
irq = MSC01E_INT_BASE + MSC01E_INT_PERFCTR;
|
||||
} else {
|
||||
#endif
|
||||
if ((cp0_perfcount_irq >= 0) &&
|
||||
(cp0_compare_irq != cp0_perfcount_irq))
|
||||
irq = MIPS_CPU_IRQ_BASE + cp0_perfcount_irq;
|
||||
else
|
||||
irq = -1;
|
||||
#ifdef MSC01E_INT_BASE
|
||||
}
|
||||
#endif
|
||||
if (get_c0_perfcount_int)
|
||||
irq = get_c0_perfcount_int();
|
||||
else if ((cp0_perfcount_irq >= 0) &&
|
||||
(cp0_compare_irq != cp0_perfcount_irq))
|
||||
irq = MIPS_CPU_IRQ_BASE + cp0_perfcount_irq;
|
||||
else
|
||||
irq = -1;
|
||||
|
||||
mipspmu.map_raw_event = mipsxx_pmu_map_raw_event;
|
||||
|
||||
|
Reference in New Issue
Block a user