diff options
-rw-r--r-- | arch/powerpc/include/asm/time.h | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/irq.c | 15 | ||||
-rw-r--r-- | arch/powerpc/kernel/time.c | 9 |
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); | |||
219 | extern void secondary_cpu_time_init(void); | 219 | extern void secondary_cpu_time_init(void); |
220 | extern void iSeries_time_init_early(void); | 220 | extern void iSeries_time_init_early(void); |
221 | 221 | ||
222 | extern 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 | ||
892 | void 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 | |||
892 | static int decrementer_set_next_event(unsigned long evt, | 901 | static int decrementer_set_next_event(unsigned long evt, |
893 | struct clock_event_device *dev) | 902 | struct clock_event_device *dev) |
894 | { | 903 | { |