/* * Author: Kumar Gala * * Copyright 2009 Freescale Semiconductor Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ #include #include #include #include #include #ifdef CONFIG_SMP unsigned long dbell_smp_message[NR_CPUS]; void smp_dbell_message_pass(int target, int msg) { int i; if(target < NR_CPUS) { set_bit(msg, &dbell_smp_message[target]); ppc_msgsnd(PPC_DBELL, 0, target); } else if(target == MSG_ALL_BUT_SELF) { for_each_online_cpu(i) { if (i == smp_processor_id()) continue; set_bit(msg, &dbell_smp_message[i]); ppc_msgsnd(PPC_DBELL, 0, i); } } else { /* target == MSG_ALL */ for_each_online_cpu(i) set_bit(msg, &dbell_smp_message[i]); ppc_msgsnd(PPC_DBELL, PPC_DBELL_MSG_BRDCAST, 0); } } void doorbell_exception(struct pt_regs *regs) { int cpu = smp_processor_id(); int msg; if (num_online_cpus() < 2) return; for (msg = 0; msg < 4; msg++) if (test_and_clear_bit(msg, &dbell_smp_message[cpu])) smp_message_recv(msg); } #else /* CONFIG_SMP */ void doorbell_exception(struct pt_regs *regs) { printk(KERN_WARNING "Received doorbell on non-smp system\n"); } #endif /* CONFIG_SMP */