time.c (8b5621f183f7e56958b0a0aae689af5af2efeda7) time.c (6e6b44e8223a01d35fceec3631be356fbdbcf004)
1/*
2 * Common time routines among all ppc machines.
3 *
4 * Written by Cort Dougan (cort@cs.nmt.edu) to merge
5 * Paul Mackerras' version and mine for PReP and Pmac.
6 * MPC8xx/MBX changes by Dan Malek (dmalek@jlc.net).
7 * Converted for 64-bit by Mike Corrigan (mikejc@us.ibm.com)
8 *

--- 102 unchanged lines hidden (view full) ---

111 .shift = 16,
112 .mult = 0, /* To be filled in */
113 .irq = 0,
114 .set_next_event = decrementer_set_next_event,
115 .set_mode = decrementer_set_mode,
116 .features = CLOCK_EVT_FEAT_ONESHOT,
117};
118
1/*
2 * Common time routines among all ppc machines.
3 *
4 * Written by Cort Dougan (cort@cs.nmt.edu) to merge
5 * Paul Mackerras' version and mine for PReP and Pmac.
6 * MPC8xx/MBX changes by Dan Malek (dmalek@jlc.net).
7 * Converted for 64-bit by Mike Corrigan (mikejc@us.ibm.com)
8 *

--- 102 unchanged lines hidden (view full) ---

111 .shift = 16,
112 .mult = 0, /* To be filled in */
113 .irq = 0,
114 .set_next_event = decrementer_set_next_event,
115 .set_mode = decrementer_set_mode,
116 .features = CLOCK_EVT_FEAT_ONESHOT,
117};
118
119static DEFINE_PER_CPU(struct clock_event_device, decrementers);
120static DEFINE_PER_CPU(u64, decrementer_next_tb);
119struct decrementer_clock {
120 struct clock_event_device event;
121 u64 next_tb;
122};
121
123
124static DEFINE_PER_CPU(struct decrementer_clock, decrementers);
125
122#ifdef CONFIG_PPC_ISERIES
123static unsigned long __initdata iSeries_recal_titan;
124static signed long __initdata iSeries_recal_tb;
125
126/* Forward declaration is only needed for iSereis compiles */
127void __init clocksource_init(void);
128#endif
129

--- 420 unchanged lines hidden (view full) ---

550
551/*
552 * timer_interrupt - gets called when the decrementer overflows,
553 * with interrupts disabled.
554 */
555void timer_interrupt(struct pt_regs * regs)
556{
557 struct pt_regs *old_regs;
126#ifdef CONFIG_PPC_ISERIES
127static unsigned long __initdata iSeries_recal_titan;
128static signed long __initdata iSeries_recal_tb;
129
130/* Forward declaration is only needed for iSereis compiles */
131void __init clocksource_init(void);
132#endif
133

--- 420 unchanged lines hidden (view full) ---

554
555/*
556 * timer_interrupt - gets called when the decrementer overflows,
557 * with interrupts disabled.
558 */
559void timer_interrupt(struct pt_regs * regs)
560{
561 struct pt_regs *old_regs;
558 int cpu = smp_processor_id();
559 struct clock_event_device *evt = &per_cpu(decrementers, cpu);
562 struct decrementer_clock *decrementer = &__get_cpu_var(decrementers);
563 struct clock_event_device *evt = &decrementer->event;
560 u64 now;
561
562 /* Ensure a positive value is written to the decrementer, or else
563 * some CPUs will continuue to take decrementer exceptions */
564 set_dec(DECREMENTER_MAX);
565
566#ifdef CONFIG_PPC32
567 if (atomic_read(&ppc_n_lost_interrupts) != 0)
568 do_IRQ(regs);
569#endif
570
571 now = get_tb_or_rtc();
564 u64 now;
565
566 /* Ensure a positive value is written to the decrementer, or else
567 * some CPUs will continuue to take decrementer exceptions */
568 set_dec(DECREMENTER_MAX);
569
570#ifdef CONFIG_PPC32
571 if (atomic_read(&ppc_n_lost_interrupts) != 0)
572 do_IRQ(regs);
573#endif
574
575 now = get_tb_or_rtc();
572 if (now < per_cpu(decrementer_next_tb, cpu)) {
576 if (now < decrementer->next_tb) {
573 /* not time for this event yet */
577 /* not time for this event yet */
574 now = per_cpu(decrementer_next_tb, cpu) - now;
578 now = decrementer->next_tb - now;
575 if (now <= DECREMENTER_MAX)
576 set_dec((int)now);
577 return;
578 }
579 old_regs = set_irq_regs(regs);
580 irq_enter();
581
582 calculate_steal_time();

--- 222 unchanged lines hidden (view full) ---

805
806 printk(KERN_INFO "clocksource: %s mult[%x] shift[%d] registered\n",
807 clock->name, clock->mult, clock->shift);
808}
809
810static int decrementer_set_next_event(unsigned long evt,
811 struct clock_event_device *dev)
812{
579 if (now <= DECREMENTER_MAX)
580 set_dec((int)now);
581 return;
582 }
583 old_regs = set_irq_regs(regs);
584 irq_enter();
585
586 calculate_steal_time();

--- 222 unchanged lines hidden (view full) ---

809
810 printk(KERN_INFO "clocksource: %s mult[%x] shift[%d] registered\n",
811 clock->name, clock->mult, clock->shift);
812}
813
814static int decrementer_set_next_event(unsigned long evt,
815 struct clock_event_device *dev)
816{
813 __get_cpu_var(decrementer_next_tb) = get_tb_or_rtc() + evt;
817 __get_cpu_var(decrementers).next_tb = get_tb_or_rtc() + evt;
814 set_dec(evt);
815 return 0;
816}
817
818static void decrementer_set_mode(enum clock_event_mode mode,
819 struct clock_event_device *dev)
820{
821 if (mode != CLOCK_EVT_MODE_ONESHOT)
822 decrementer_set_next_event(DECREMENTER_MAX, dev);
823}
824
825static void register_decrementer_clockevent(int cpu)
826{
818 set_dec(evt);
819 return 0;
820}
821
822static void decrementer_set_mode(enum clock_event_mode mode,
823 struct clock_event_device *dev)
824{
825 if (mode != CLOCK_EVT_MODE_ONESHOT)
826 decrementer_set_next_event(DECREMENTER_MAX, dev);
827}
828
829static void register_decrementer_clockevent(int cpu)
830{
827 struct clock_event_device *dec = &per_cpu(decrementers, cpu);
831 struct clock_event_device *dec = &per_cpu(decrementers, cpu).event;
828
829 *dec = decrementer_clockevent;
830 dec->cpumask = cpumask_of_cpu(cpu);
831
832 printk(KERN_DEBUG "clockevent: %s mult[%lx] shift[%d] cpu[%d]\n",
833 dec->name, dec->mult, dec->shift, cpu);
834
835 clockevents_register_device(dec);

--- 284 unchanged lines hidden ---
832
833 *dec = decrementer_clockevent;
834 dec->cpumask = cpumask_of_cpu(cpu);
835
836 printk(KERN_DEBUG "clockevent: %s mult[%lx] shift[%d] cpu[%d]\n",
837 dec->name, dec->mult, dec->shift, cpu);
838
839 clockevents_register_device(dec);

--- 284 unchanged lines hidden ---