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 --- |