aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/include/asm/dbell.h1
-rw-r--r--arch/powerpc/kernel/dbell.c10
-rw-r--r--arch/powerpc/kernel/irq.c4
3 files changed, 13 insertions, 2 deletions
diff --git a/arch/powerpc/include/asm/dbell.h b/arch/powerpc/include/asm/dbell.h
index ced7e487ca27..0893ab9343a6 100644
--- a/arch/powerpc/include/asm/dbell.h
+++ b/arch/powerpc/include/asm/dbell.h
@@ -29,6 +29,7 @@ enum ppc_dbell {
29 29
30extern void doorbell_message_pass(int target, int msg); 30extern void doorbell_message_pass(int target, int msg);
31extern void doorbell_exception(struct pt_regs *regs); 31extern void doorbell_exception(struct pt_regs *regs);
32extern void doorbell_check_self(void);
32extern void doorbell_setup_this_cpu(void); 33extern void doorbell_setup_this_cpu(void);
33 34
34static inline void ppc_msgsnd(enum ppc_dbell type, u32 flags, u32 tag) 35static inline void ppc_msgsnd(enum ppc_dbell type, u32 flags, u32 tag)
diff --git a/arch/powerpc/kernel/dbell.c b/arch/powerpc/kernel/dbell.c
index f7b518894c80..3307a52d797f 100644
--- a/arch/powerpc/kernel/dbell.c
+++ b/arch/powerpc/kernel/dbell.c
@@ -81,6 +81,16 @@ out:
81 set_irq_regs(old_regs); 81 set_irq_regs(old_regs);
82} 82}
83 83
84void doorbell_check_self(void)
85{
86 struct doorbell_cpu_info *info = &__get_cpu_var(doorbell_cpu_info);
87
88 if (!info->messages)
89 return;
90
91 ppc_msgsnd(PPC_DBELL, 0, info->tag);
92}
93
84#else /* CONFIG_SMP */ 94#else /* CONFIG_SMP */
85void doorbell_exception(struct pt_regs *regs) 95void doorbell_exception(struct pt_regs *regs)
86{ 96{
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 2f6dc7faf6de..8f96d3198905 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -156,8 +156,8 @@ notrace void raw_local_irq_restore(unsigned long en)
156 return; 156 return;
157 157
158#if defined(CONFIG_BOOKE) && defined(CONFIG_SMP) 158#if defined(CONFIG_BOOKE) && defined(CONFIG_SMP)
159 /* Check for pending doorbell interrupts on SMP */ 159 /* Check for pending doorbell interrupts and resend to ourself */
160 doorbell_exception(NULL); 160 doorbell_check_self();
161#endif 161#endif
162 162
163 /* 163 /*