aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/include/asm/time.h2
-rw-r--r--arch/powerpc/kernel/irq.c15
-rw-r--r--arch/powerpc/kernel/time.c9
3 files changed, 17 insertions, 9 deletions
diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
index fe6f7c2c9c6..bc3c745cb90 100644
--- a/arch/powerpc/include/asm/time.h
+++ b/arch/powerpc/include/asm/time.h
@@ -219,5 +219,7 @@ DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array);
219extern void secondary_cpu_time_init(void); 219extern void secondary_cpu_time_init(void);
220extern void iSeries_time_init_early(void); 220extern void iSeries_time_init_early(void);
221 221
222extern void decrementer_check_overflow(void);
223
222#endif /* __KERNEL__ */ 224#endif /* __KERNEL__ */
223#endif /* __POWERPC_TIME_H */ 225#endif /* __POWERPC_TIME_H */
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 5c3c46948d9..745c1e7c10f 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -164,16 +164,13 @@ notrace void arch_local_irq_restore(unsigned long en)
164 */ 164 */
165 local_paca->hard_enabled = en; 165 local_paca->hard_enabled = en;
166 166
167#ifndef CONFIG_BOOKE 167 /*
168 /* On server, re-trigger the decrementer if it went negative since 168 * Trigger the decrementer if we have a pending event. Some processors
169 * some processors only trigger on edge transitions of the sign bit. 169 * only trigger on edge transitions of the sign bit. We might also
170 * 170 * have disabled interrupts long enough that the decrementer wrapped
171 * BookE has a level sensitive decrementer (latches in TSR) so we 171 * to positive.
172 * don't need that
173 */ 172 */
174 if ((int)mfspr(SPRN_DEC) < 0) 173 decrementer_check_overflow();
175 mtspr(SPRN_DEC, 1);
176#endif /* CONFIG_BOOKE */
177 174
178 /* 175 /*
179 * Force the delivery of pending soft-disabled interrupts on PS3. 176 * Force the delivery of pending soft-disabled interrupts on PS3.
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 522bb1dfc35..5db163c9675 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -889,6 +889,15 @@ static void __init clocksource_init(void)
889 clock->name, clock->mult, clock->shift); 889 clock->name, clock->mult, clock->shift);
890} 890}
891 891
892void decrementer_check_overflow(void)
893{
894 u64 now = get_tb_or_rtc();
895 struct decrementer_clock *decrementer = &__get_cpu_var(decrementers);
896
897 if (now >= decrementer->next_tb)
898 set_dec(1);
899}
900
892static int decrementer_set_next_event(unsigned long evt, 901static int decrementer_set_next_event(unsigned long evt,
893 struct clock_event_device *dev) 902 struct clock_event_device *dev)
894{ 903{