diff options
Diffstat (limited to 'arch/powerpc/kernel/irq.c')
-rw-r--r-- | arch/powerpc/kernel/irq.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 77be3d058a65..8f96d3198905 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -64,6 +64,8 @@ | |||
64 | #include <asm/ptrace.h> | 64 | #include <asm/ptrace.h> |
65 | #include <asm/machdep.h> | 65 | #include <asm/machdep.h> |
66 | #include <asm/udbg.h> | 66 | #include <asm/udbg.h> |
67 | #include <asm/dbell.h> | ||
68 | |||
67 | #ifdef CONFIG_PPC64 | 69 | #ifdef CONFIG_PPC64 |
68 | #include <asm/paca.h> | 70 | #include <asm/paca.h> |
69 | #include <asm/firmware.h> | 71 | #include <asm/firmware.h> |
@@ -153,14 +155,28 @@ notrace void raw_local_irq_restore(unsigned long en) | |||
153 | if (get_hard_enabled()) | 155 | if (get_hard_enabled()) |
154 | return; | 156 | return; |
155 | 157 | ||
158 | #if defined(CONFIG_BOOKE) && defined(CONFIG_SMP) | ||
159 | /* Check for pending doorbell interrupts and resend to ourself */ | ||
160 | doorbell_check_self(); | ||
161 | #endif | ||
162 | |||
156 | /* | 163 | /* |
157 | * Need to hard-enable interrupts here. Since currently disabled, | 164 | * Need to hard-enable interrupts here. Since currently disabled, |
158 | * no need to take further asm precautions against preemption; but | 165 | * no need to take further asm precautions against preemption; but |
159 | * use local_paca instead of get_paca() to avoid preemption checking. | 166 | * use local_paca instead of get_paca() to avoid preemption checking. |
160 | */ | 167 | */ |
161 | local_paca->hard_enabled = en; | 168 | local_paca->hard_enabled = en; |
169 | |||
170 | #ifndef CONFIG_BOOKE | ||
171 | /* On server, re-trigger the decrementer if it went negative since | ||
172 | * some processors only trigger on edge transitions of the sign bit. | ||
173 | * | ||
174 | * BookE has a level sensitive decrementer (latches in TSR) so we | ||
175 | * don't need that | ||
176 | */ | ||
162 | if ((int)mfspr(SPRN_DEC) < 0) | 177 | if ((int)mfspr(SPRN_DEC) < 0) |
163 | mtspr(SPRN_DEC, 1); | 178 | mtspr(SPRN_DEC, 1); |
179 | #endif /* CONFIG_BOOKE */ | ||
164 | 180 | ||
165 | /* | 181 | /* |
166 | * Force the delivery of pending soft-disabled interrupts on PS3. | 182 | * Force the delivery of pending soft-disabled interrupts on PS3. |