aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/include/asm/time.h2
-rw-r--r--arch/powerpc/kernel/irq.c9
-rw-r--r--arch/powerpc/kernel/time.c27
3 files changed, 17 insertions, 21 deletions
diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
index bc3c745cb90..7eb10fb96cd 100644
--- a/arch/powerpc/include/asm/time.h
+++ b/arch/powerpc/include/asm/time.h
@@ -219,7 +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); 222DECLARE_PER_CPU(u64, decrementers_next_tb);
223 223
224#endif /* __KERNEL__ */ 224#endif /* __KERNEL__ */
225#endif /* __POWERPC_TIME_H */ 225#endif /* __POWERPC_TIME_H */
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 745c1e7c10f..2ff4f5e5962 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -115,6 +115,15 @@ static inline notrace void set_soft_enabled(unsigned long enable)
115 : : "r" (enable), "i" (offsetof(struct paca_struct, soft_enabled))); 115 : : "r" (enable), "i" (offsetof(struct paca_struct, soft_enabled)));
116} 116}
117 117
118static inline notrace void decrementer_check_overflow(void)
119{
120 u64 now = get_tb_or_rtc();
121 u64 *next_tb = &__get_cpu_var(decrementers_next_tb);
122
123 if (now >= *next_tb)
124 set_dec(1);
125}
126
118notrace void arch_local_irq_restore(unsigned long en) 127notrace void arch_local_irq_restore(unsigned long en)
119{ 128{
120 /* 129 /*
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index b1990b987e2..9754743db8b 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -114,12 +114,8 @@ static struct clock_event_device decrementer_clockevent = {
114 .features = CLOCK_EVT_FEAT_ONESHOT, 114 .features = CLOCK_EVT_FEAT_ONESHOT,
115}; 115};
116 116
117struct decrementer_clock { 117DEFINE_PER_CPU(u64, decrementers_next_tb);
118 struct clock_event_device event; 118static DEFINE_PER_CPU(struct clock_event_device, decrementers);
119 u64 next_tb;
120};
121
122static DEFINE_PER_CPU(struct decrementer_clock, decrementers);
123 119
124#ifdef CONFIG_PPC_ISERIES 120#ifdef CONFIG_PPC_ISERIES
125static unsigned long __initdata iSeries_recal_titan; 121static unsigned long __initdata iSeries_recal_titan;
@@ -570,8 +566,8 @@ void arch_irq_work_raise(void)
570void timer_interrupt(struct pt_regs * regs) 566void timer_interrupt(struct pt_regs * regs)
571{ 567{
572 struct pt_regs *old_regs; 568 struct pt_regs *old_regs;
573 struct decrementer_clock *decrementer = &__get_cpu_var(decrementers); 569 u64 *next_tb = &__get_cpu_var(decrementers_next_tb);
574 struct clock_event_device *evt = &decrementer->event; 570 struct clock_event_device *evt = &__get_cpu_var(decrementers);
575 571
576 /* Ensure a positive value is written to the decrementer, or else 572 /* Ensure a positive value is written to the decrementer, or else
577 * some CPUs will continue to take decrementer exceptions. 573 * some CPUs will continue to take decrementer exceptions.
@@ -606,7 +602,7 @@ void timer_interrupt(struct pt_regs * regs)
606 get_lppaca()->int_dword.fields.decr_int = 0; 602 get_lppaca()->int_dword.fields.decr_int = 0;
607#endif 603#endif
608 604
609 decrementer->next_tb = ~(u64)0; 605 *next_tb = ~(u64)0;
610 if (evt->event_handler) 606 if (evt->event_handler)
611 evt->event_handler(evt); 607 evt->event_handler(evt);
612 608
@@ -872,19 +868,10 @@ static void __init clocksource_init(void)
872 clock->name, clock->mult, clock->shift); 868 clock->name, clock->mult, clock->shift);
873} 869}
874 870
875void decrementer_check_overflow(void)
876{
877 u64 now = get_tb_or_rtc();
878 struct decrementer_clock *decrementer = &__get_cpu_var(decrementers);
879
880 if (now >= decrementer->next_tb)
881 set_dec(1);
882}
883
884static int decrementer_set_next_event(unsigned long evt, 871static int decrementer_set_next_event(unsigned long evt,
885 struct clock_event_device *dev) 872 struct clock_event_device *dev)
886{ 873{
887 __get_cpu_var(decrementers).next_tb = get_tb_or_rtc() + evt; 874 __get_cpu_var(decrementers_next_tb) = get_tb_or_rtc() + evt;
888 set_dec(evt); 875 set_dec(evt);
889 return 0; 876 return 0;
890} 877}
@@ -898,7 +885,7 @@ static void decrementer_set_mode(enum clock_event_mode mode,
898 885
899static void register_decrementer_clockevent(int cpu) 886static void register_decrementer_clockevent(int cpu)
900{ 887{
901 struct clock_event_device *dec = &per_cpu(decrementers, cpu).event; 888 struct clock_event_device *dec = &per_cpu(decrementers, cpu);
902 889
903 *dec = decrementer_clockevent; 890 *dec = decrementer_clockevent;
904 dec->cpumask = cpumask_of(cpu); 891 dec->cpumask = cpumask_of(cpu);