MIPS: make oprofile use cp0_perfcount_irq if it is set
authorFelix Fietkau <nbd@openwrt.org>
Wed, 2 May 2012 15:33:04 +0000 (17:33 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 15 May 2012 15:49:19 +0000 (17:49 +0200)
Make the oprofile code use the performance counters irq.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John Crispin <blogic@openwrt.org>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/3723/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/kernel/perf_event_mipsxx.c
arch/mips/oprofile/op_model_mipsxx.c

index 811084f4e4220910d83314c843af969ef5425b72..574b4e9df50fc708e76a31b748a74d85a2eba228 100644 (file)
@@ -1532,7 +1532,8 @@ init_hw_perf_events(void)
                irq = MSC01E_INT_BASE + MSC01E_INT_PERFCTR;
        } else {
 #endif
-               if (cp0_perfcount_irq >= 0)
+               if ((cp0_perfcount_irq >= 0) &&
+                               (cp0_compare_irq != cp0_perfcount_irq))
                        irq = MIPS_CPU_IRQ_BASE + cp0_perfcount_irq;
                else
                        irq = -1;
index 54759f1669d3a00aca9e07fb213842b397b4b800..baba3bcaa3c28100067a39d9e1a1132a5a8d02b4 100644 (file)
@@ -298,6 +298,11 @@ static void reset_counters(void *arg)
        }
 }
 
+static irqreturn_t mipsxx_perfcount_int(int irq, void *dev_id)
+{
+       return mipsxx_perfcount_handler();
+}
+
 static int __init mipsxx_init(void)
 {
        int counters;
@@ -374,6 +379,10 @@ static int __init mipsxx_init(void)
        save_perf_irq = perf_irq;
        perf_irq = mipsxx_perfcount_handler;
 
+       if ((cp0_perfcount_irq >= 0) && (cp0_compare_irq != cp0_perfcount_irq))
+               return request_irq(cp0_perfcount_irq, mipsxx_perfcount_int,
+                       0, "Perfcounter", save_perf_irq);
+
        return 0;
 }
 
@@ -381,6 +390,9 @@ static void mipsxx_exit(void)
 {
        int counters = op_model_mipsxx_ops.num_counters;
 
+       if ((cp0_perfcount_irq >= 0) && (cp0_compare_irq != cp0_perfcount_irq))
+               free_irq(cp0_perfcount_irq, save_perf_irq);
+
        counters = counters_per_cpu_to_total(counters);
        on_each_cpu(reset_counters, (void *)(long)counters, 1);