powerpc: Consolidate ipi message mux and demux
[pandora-kernel.git] / arch / powerpc / kernel / dbell.c
index e49b24c..2cc451a 100644 (file)
 #include <linux/kernel.h>
 #include <linux/smp.h>
 #include <linux/threads.h>
-#include <linux/percpu.h>
+#include <linux/hardirq.h>
 
 #include <asm/dbell.h>
 #include <asm/irq_regs.h>
 
 #ifdef CONFIG_SMP
-struct doorbell_cpu_info {
-       unsigned long   messages;       /* current messages bits */
-       unsigned int    tag;            /* tag value */
-};
-
-static DEFINE_PER_CPU(struct doorbell_cpu_info, doorbell_cpu_info);
-
 void doorbell_setup_this_cpu(void)
 {
-       struct doorbell_cpu_info *info = &__get_cpu_var(doorbell_cpu_info);
+       unsigned long tag = mfspr(SPRN_PIR) & 0x3fff;
 
-       info->messages = 0;
-       info->tag = mfspr(SPRN_PIR) & 0x3fff;
+       smp_muxed_ipi_set_data(smp_processor_id(), tag);
 }
 
-void doorbell_message_pass(int cpu, int msg)
+void doorbell_cause_ipi(int cpu, unsigned long data)
 {
-       struct doorbell_cpu_info *info;
-
-       info = &per_cpu(doorbell_cpu_info, cpu);
-       set_bit(msg, &info->messages);
-       ppc_msgsnd(PPC_DBELL, 0, info->tag);
+       ppc_msgsnd(PPC_DBELL, 0, data);
 }
 
 void doorbell_exception(struct pt_regs *regs)
 {
        struct pt_regs *old_regs = set_irq_regs(regs);
-       struct doorbell_cpu_info *info = &__get_cpu_var(doorbell_cpu_info);
-       int msg;
 
-       /* Warning: regs can be NULL when called from irq enable */
+       irq_enter();
 
-       if (!info->messages || (num_online_cpus() < 2))
-               goto out;
+       smp_ipi_demux();
 
-       for (msg = 0; msg < 4; msg++)
-               if (test_and_clear_bit(msg, &info->messages))
-                       smp_message_recv(msg);
-
-out:
+       irq_exit();
        set_irq_regs(old_regs);
 }
-
-void doorbell_check_self(void)
-{
-       struct doorbell_cpu_info *info = &__get_cpu_var(doorbell_cpu_info);
-
-       if (!info->messages)
-               return;
-
-       ppc_msgsnd(PPC_DBELL, 0, info->tag);
-}
-
 #else /* CONFIG_SMP */
 void doorbell_exception(struct pt_regs *regs)
 {