aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2007-10-12 17:04:06 -0400
committerThomas Gleixner <tglx@inhelltoy.tec.linutronix.de>2007-10-12 17:04:06 -0400
commit801740971af7c6256b7ad2472706d43ed008fd3d (patch)
treee91a18308be517c889139796a360ab87ad9b5ad0 /arch/x86
parent7ffeeb1e03c4fc1c7e8434c5496018dd035f8924 (diff)
x86_64: prepare apic code for clock events
Change __setup_APIC_LVTT so it takes the arguments which are necessary for the later clock events switch. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Chris Wright <chrisw@sous-sol.org> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kernel/apic_64.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c
index 48206bb8de1f..ce2f8015d5ce 100644
--- a/arch/x86/kernel/apic_64.c
+++ b/arch/x86/kernel/apic_64.c
@@ -759,14 +759,14 @@ void __init init_apic_mappings(void)
759 759
760#define APIC_DIVISOR 16 760#define APIC_DIVISOR 16
761 761
762static void __setup_APIC_LVTT(unsigned int clocks) 762static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen)
763{ 763{
764 unsigned int lvtt_value, tmp_value; 764 unsigned int lvtt_value, tmp_value;
765 int cpu = smp_processor_id();
766
767 lvtt_value = APIC_LVT_TIMER_PERIODIC | LOCAL_TIMER_VECTOR;
768 765
769 if (cpu_isset(cpu, timer_interrupt_broadcast_ipi_mask)) 766 lvtt_value = LOCAL_TIMER_VECTOR;
767 if (!oneshot)
768 lvtt_value |= APIC_LVT_TIMER_PERIODIC;
769 if (!irqen)
770 lvtt_value |= APIC_LVT_MASKED; 770 lvtt_value |= APIC_LVT_MASKED;
771 771
772 apic_write(APIC_LVTT, lvtt_value); 772 apic_write(APIC_LVTT, lvtt_value);
@@ -779,12 +779,14 @@ static void __setup_APIC_LVTT(unsigned int clocks)
779 & ~(APIC_TDR_DIV_1 | APIC_TDR_DIV_TMBASE)) 779 & ~(APIC_TDR_DIV_1 | APIC_TDR_DIV_TMBASE))
780 | APIC_TDR_DIV_16); 780 | APIC_TDR_DIV_16);
781 781
782 apic_write(APIC_TMICT, clocks/APIC_DIVISOR); 782 if (!oneshot)
783 apic_write(APIC_TMICT, clocks/APIC_DIVISOR);
783} 784}
784 785
785static void setup_APIC_timer(unsigned int clocks) 786static void setup_APIC_timer(unsigned int clocks)
786{ 787{
787 unsigned long flags; 788 unsigned long flags;
789 int irqen;
788 790
789 local_irq_save(flags); 791 local_irq_save(flags);
790 792
@@ -805,7 +807,10 @@ static void setup_APIC_timer(unsigned int clocks)
805 c2 |= inb_p(0x40) << 8; 807 c2 |= inb_p(0x40) << 8;
806 } while (c2 - c1 < 300); 808 } while (c2 - c1 < 300);
807 } 809 }
808 __setup_APIC_LVTT(clocks); 810
811 irqen = ! cpu_isset(smp_processor_id(),
812 timer_interrupt_broadcast_ipi_mask);
813 __setup_APIC_LVTT(clocks, 0, irqen);
809 /* Turn off PIT interrupt if we use APIC timer as main timer. 814 /* Turn off PIT interrupt if we use APIC timer as main timer.
810 Only works with the PM timer right now 815 Only works with the PM timer right now
811 TBD fix it for HPET too. */ 816 TBD fix it for HPET too. */
@@ -843,8 +848,10 @@ static int __init calibrate_APIC_clock(void)
843 * Put whatever arbitrary (but long enough) timeout 848 * Put whatever arbitrary (but long enough) timeout
844 * value into the APIC clock, we just want to get the 849 * value into the APIC clock, we just want to get the
845 * counter running for calibration. 850 * counter running for calibration.
851 *
852 * No interrupt enable !
846 */ 853 */
847 __setup_APIC_LVTT(4000000000); 854 __setup_APIC_LVTT(4000000000, 0, 0);
848 855
849 apic_start = apic_read(APIC_TMCCT); 856 apic_start = apic_read(APIC_TMCCT);
850#ifdef CONFIG_X86_PM_TIMER 857#ifdef CONFIG_X86_PM_TIMER