diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2010-07-09 15:29:53 +1000 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2010-07-09 15:29:53 +1000 |
commit | b9f1cd71dbf21a91fb7e2336a1d1ff18b97771e5 (patch) | |
tree | 3c99af81977a06bce82f13ab1f3c748a444c5362 /arch/powerpc/include/asm/dbell.h | |
parent | e3145b387a02d4bf8b8033b1354d413fc0864494 (diff) | |
download | blackbird-op-linux-b9f1cd71dbf21a91fb7e2336a1d1ff18b97771e5.tar.gz blackbird-op-linux-b9f1cd71dbf21a91fb7e2336a1d1ff18b97771e5.zip |
powerpc/book3e: More doorbell cleanups. Sample the PIR register
The doorbells use the content of the PIR register to match messages
from other CPUs. This may or may not be the same as our linux CPU
number, so using that as the "target" is no right.
Instead, we sample the PIR register at boot on every processor
and use that value subsequently when sending IPIs.
We also use a per-cpu message mask rather than a global array which
should limit cache line contention.
Note: We could use the CPU number in the device-tree instead of
the PIR register, as they are supposed to be equivalent. This
might prove useful if doorbells are to be used to kick CPUs out
of FW at boot time, thus before we can sample the PIR. This is
however not the case now and using the PIR just works.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/include/asm/dbell.h')
-rw-r--r-- | arch/powerpc/include/asm/dbell.h | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/arch/powerpc/include/asm/dbell.h b/arch/powerpc/include/asm/dbell.h index 501189a543d1..ced7e487ca27 100644 --- a/arch/powerpc/include/asm/dbell.h +++ b/arch/powerpc/include/asm/dbell.h @@ -27,10 +27,9 @@ enum ppc_dbell { PPC_G_DBELL_MC = 4, /* guest mcheck doorbell */ }; -#ifdef CONFIG_SMP -extern unsigned long dbell_smp_message[NR_CPUS]; -extern void smp_dbell_message_pass(int target, int msg); -#endif +extern void doorbell_message_pass(int target, int msg); +extern void doorbell_exception(struct pt_regs *regs); +extern void doorbell_setup_this_cpu(void); static inline void ppc_msgsnd(enum ppc_dbell type, u32 flags, u32 tag) { |