diff options
| -rw-r--r-- | arch/x86/include/asm/apic.h | 5 | ||||
| -rw-r--r-- | arch/x86/include/asm/paravirt.h | 12 | ||||
| -rw-r--r-- | arch/x86/include/asm/paravirt_types.h | 3 | ||||
| -rw-r--r-- | arch/x86/include/asm/x86_init.h | 19 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/apic.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/kvmclock.c | 5 | ||||
| -rw-r--r-- | arch/x86/kernel/paravirt.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/smpboot.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/vmi_32.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/x86_init.c | 9 | ||||
| -rw-r--r-- | arch/x86/xen/enlighten.c | 4 |
11 files changed, 42 insertions, 28 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index bb7d47925847..6f15b29005a1 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
| @@ -70,9 +70,6 @@ static inline void default_inquire_remote_apic(int apicid) | |||
| 70 | */ | 70 | */ |
| 71 | #ifdef CONFIG_PARAVIRT | 71 | #ifdef CONFIG_PARAVIRT |
| 72 | #include <asm/paravirt.h> | 72 | #include <asm/paravirt.h> |
| 73 | #else | ||
| 74 | #define setup_boot_clock setup_boot_APIC_clock | ||
| 75 | #define setup_secondary_clock setup_secondary_APIC_clock | ||
| 76 | #endif | 73 | #endif |
| 77 | 74 | ||
| 78 | #ifdef CONFIG_X86_64 | 75 | #ifdef CONFIG_X86_64 |
| @@ -245,6 +242,8 @@ static inline void lapic_shutdown(void) { } | |||
| 245 | static inline void init_apic_mappings(void) { } | 242 | static inline void init_apic_mappings(void) { } |
| 246 | static inline void disable_local_APIC(void) { } | 243 | static inline void disable_local_APIC(void) { } |
| 247 | static inline void apic_disable(void) { } | 244 | static inline void apic_disable(void) { } |
| 245 | # define setup_boot_APIC_clock x86_init_noop | ||
| 246 | # define setup_secondary_APIC_clock x86_init_noop | ||
| 248 | #endif /* !CONFIG_X86_LOCAL_APIC */ | 247 | #endif /* !CONFIG_X86_LOCAL_APIC */ |
| 249 | 248 | ||
| 250 | #ifdef CONFIG_X86_64 | 249 | #ifdef CONFIG_X86_64 |
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index 7ce415e844b6..825674a968d1 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h | |||
| @@ -333,18 +333,6 @@ static inline void slow_down_io(void) | |||
| 333 | #endif | 333 | #endif |
| 334 | } | 334 | } |
| 335 | 335 | ||
| 336 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 337 | static inline void setup_boot_clock(void) | ||
| 338 | { | ||
| 339 | PVOP_VCALL0(pv_apic_ops.setup_boot_clock); | ||
| 340 | } | ||
| 341 | |||
| 342 | static inline void setup_secondary_clock(void) | ||
| 343 | { | ||
| 344 | PVOP_VCALL0(pv_apic_ops.setup_secondary_clock); | ||
| 345 | } | ||
| 346 | #endif | ||
| 347 | |||
| 348 | #ifdef CONFIG_SMP | 336 | #ifdef CONFIG_SMP |
| 349 | static inline void startup_ipi_hook(int phys_apicid, unsigned long start_eip, | 337 | static inline void startup_ipi_hook(int phys_apicid, unsigned long start_eip, |
| 350 | unsigned long start_esp) | 338 | unsigned long start_esp) |
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index ecc74e5ad407..1da89276d142 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h | |||
| @@ -218,9 +218,6 @@ struct pv_irq_ops { | |||
| 218 | 218 | ||
| 219 | struct pv_apic_ops { | 219 | struct pv_apic_ops { |
| 220 | #ifdef CONFIG_X86_LOCAL_APIC | 220 | #ifdef CONFIG_X86_LOCAL_APIC |
| 221 | void (*setup_boot_clock)(void); | ||
| 222 | void (*setup_secondary_clock)(void); | ||
| 223 | |||
| 224 | void (*startup_ipi_hook)(int phys_apicid, | 221 | void (*startup_ipi_hook)(int phys_apicid, |
| 225 | unsigned long start_eip, | 222 | unsigned long start_eip, |
| 226 | unsigned long start_esp); | 223 | unsigned long start_esp); |
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index b9bb4faefc48..b7d258f4c401 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h | |||
| @@ -79,6 +79,15 @@ struct x86_init_paging { | |||
| 79 | }; | 79 | }; |
| 80 | 80 | ||
| 81 | /** | 81 | /** |
| 82 | * struct x86_init_timers - platform specific timer setup | ||
| 83 | * @setup_perpcu_clockev: set up the per cpu clock event device for the | ||
| 84 | * boot cpu | ||
| 85 | */ | ||
| 86 | struct x86_init_timers { | ||
| 87 | void (*setup_percpu_clockev)(void); | ||
| 88 | }; | ||
| 89 | |||
| 90 | /** | ||
| 82 | * struct x86_init_ops - functions for platform specific setup | 91 | * struct x86_init_ops - functions for platform specific setup |
| 83 | * | 92 | * |
| 84 | */ | 93 | */ |
| @@ -88,9 +97,19 @@ struct x86_init_ops { | |||
| 88 | struct x86_init_irqs irqs; | 97 | struct x86_init_irqs irqs; |
| 89 | struct x86_init_oem oem; | 98 | struct x86_init_oem oem; |
| 90 | struct x86_init_paging paging; | 99 | struct x86_init_paging paging; |
| 100 | struct x86_init_timers timers; | ||
| 101 | }; | ||
| 102 | |||
| 103 | /** | ||
| 104 | * struct x86_cpuinit_ops - platform specific cpu hotplug setups | ||
| 105 | * @setup_percpu_clockev: set up the per cpu clock event device | ||
| 106 | */ | ||
| 107 | struct x86_cpuinit_ops { | ||
| 108 | void (*setup_percpu_clockev)(void); | ||
| 91 | }; | 109 | }; |
| 92 | 110 | ||
| 93 | extern struct x86_init_ops x86_init; | 111 | extern struct x86_init_ops x86_init; |
| 112 | extern struct x86_cpuinit_ops x86_cpuinit; | ||
| 94 | 113 | ||
| 95 | extern void x86_init_noop(void); | 114 | extern void x86_init_noop(void); |
| 96 | extern void x86_init_uint_noop(unsigned int unused); | 115 | extern void x86_init_uint_noop(unsigned int unused); |
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 0a1c2830ec66..ce0098066e91 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/mm.h> | 36 | #include <linux/mm.h> |
| 37 | 37 | ||
| 38 | #include <asm/perf_counter.h> | 38 | #include <asm/perf_counter.h> |
| 39 | #include <asm/x86_init.h> | ||
| 39 | #include <asm/pgalloc.h> | 40 | #include <asm/pgalloc.h> |
| 40 | #include <asm/atomic.h> | 41 | #include <asm/atomic.h> |
| 41 | #include <asm/mpspec.h> | 42 | #include <asm/mpspec.h> |
| @@ -1701,7 +1702,7 @@ int __init APIC_init_uniprocessor(void) | |||
| 1701 | localise_nmi_watchdog(); | 1702 | localise_nmi_watchdog(); |
| 1702 | #endif | 1703 | #endif |
| 1703 | 1704 | ||
| 1704 | setup_boot_clock(); | 1705 | x86_init.timers.setup_percpu_clockev(); |
| 1705 | #ifdef CONFIG_X86_64 | 1706 | #ifdef CONFIG_X86_64 |
| 1706 | check_nmi_watchdog(); | 1707 | check_nmi_watchdog(); |
| 1707 | #endif | 1708 | #endif |
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 223af43f1526..64e9b5f59d2d 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c | |||
| @@ -22,6 +22,8 @@ | |||
| 22 | #include <asm/msr.h> | 22 | #include <asm/msr.h> |
| 23 | #include <asm/apic.h> | 23 | #include <asm/apic.h> |
| 24 | #include <linux/percpu.h> | 24 | #include <linux/percpu.h> |
| 25 | |||
| 26 | #include <asm/x86_init.h> | ||
| 25 | #include <asm/reboot.h> | 27 | #include <asm/reboot.h> |
| 26 | 28 | ||
| 27 | #define KVM_SCALE 22 | 29 | #define KVM_SCALE 22 |
| @@ -187,7 +189,8 @@ void __init kvmclock_init(void) | |||
| 187 | pv_time_ops.sched_clock = kvm_clock_read; | 189 | pv_time_ops.sched_clock = kvm_clock_read; |
| 188 | pv_time_ops.get_tsc_khz = kvm_get_tsc_khz; | 190 | pv_time_ops.get_tsc_khz = kvm_get_tsc_khz; |
| 189 | #ifdef CONFIG_X86_LOCAL_APIC | 191 | #ifdef CONFIG_X86_LOCAL_APIC |
| 190 | pv_apic_ops.setup_secondary_clock = kvm_setup_secondary_clock; | 192 | x86_cpuinit.setup_percpu_clockev = |
| 193 | kvm_setup_secondary_clock; | ||
| 191 | #endif | 194 | #endif |
| 192 | #ifdef CONFIG_SMP | 195 | #ifdef CONFIG_SMP |
| 193 | smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu; | 196 | smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu; |
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 8167be0b68ca..1ed32c79679d 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
| @@ -387,8 +387,6 @@ struct pv_cpu_ops pv_cpu_ops = { | |||
| 387 | 387 | ||
| 388 | struct pv_apic_ops pv_apic_ops = { | 388 | struct pv_apic_ops pv_apic_ops = { |
| 389 | #ifdef CONFIG_X86_LOCAL_APIC | 389 | #ifdef CONFIG_X86_LOCAL_APIC |
| 390 | .setup_boot_clock = setup_boot_APIC_clock, | ||
| 391 | .setup_secondary_clock = setup_secondary_APIC_clock, | ||
| 392 | .startup_ipi_hook = paravirt_nop, | 390 | .startup_ipi_hook = paravirt_nop, |
| 393 | #endif | 391 | #endif |
| 394 | }; | 392 | }; |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 2fecda69ee64..6eb81a87b4b7 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -323,7 +323,7 @@ notrace static void __cpuinit start_secondary(void *unused) | |||
| 323 | /* enable local interrupts */ | 323 | /* enable local interrupts */ |
| 324 | local_irq_enable(); | 324 | local_irq_enable(); |
| 325 | 325 | ||
| 326 | setup_secondary_clock(); | 326 | x86_cpuinit.setup_percpu_clockev(); |
| 327 | 327 | ||
| 328 | wmb(); | 328 | wmb(); |
| 329 | cpu_idle(); | 329 | cpu_idle(); |
| @@ -1112,7 +1112,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus) | |||
| 1112 | 1112 | ||
| 1113 | printk(KERN_INFO "CPU%d: ", 0); | 1113 | printk(KERN_INFO "CPU%d: ", 0); |
| 1114 | print_cpu_info(&cpu_data(0)); | 1114 | print_cpu_info(&cpu_data(0)); |
| 1115 | setup_boot_clock(); | 1115 | x86_init.timers.setup_percpu_clockev(); |
| 1116 | 1116 | ||
| 1117 | if (is_uv_system()) | 1117 | if (is_uv_system()) |
| 1118 | uv_system_init(); | 1118 | uv_system_init(); |
diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c index 95a7289e4b0c..b43b6685cae1 100644 --- a/arch/x86/kernel/vmi_32.c +++ b/arch/x86/kernel/vmi_32.c | |||
| @@ -821,8 +821,8 @@ static inline int __init activate_vmi(void) | |||
| 821 | pv_time_ops.get_wallclock = vmi_get_wallclock; | 821 | pv_time_ops.get_wallclock = vmi_get_wallclock; |
| 822 | pv_time_ops.set_wallclock = vmi_set_wallclock; | 822 | pv_time_ops.set_wallclock = vmi_set_wallclock; |
| 823 | #ifdef CONFIG_X86_LOCAL_APIC | 823 | #ifdef CONFIG_X86_LOCAL_APIC |
| 824 | pv_apic_ops.setup_boot_clock = vmi_time_bsp_init; | 824 | x86_init.timers.setup_percpu_clockev = vmi_time_bsp_init; |
| 825 | pv_apic_ops.setup_secondary_clock = vmi_time_ap_init; | 825 | x86_cpuinit.setup_percpu_clockev = vmi_time_ap_init; |
| 826 | #endif | 826 | #endif |
| 827 | pv_time_ops.sched_clock = vmi_sched_clock; | 827 | pv_time_ops.sched_clock = vmi_sched_clock; |
| 828 | pv_time_ops.get_tsc_khz = vmi_tsc_khz; | 828 | pv_time_ops.get_tsc_khz = vmi_tsc_khz; |
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index 7df020e6740d..e666a98db7cd 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <asm/paravirt.h> | 9 | #include <asm/paravirt.h> |
| 10 | #include <asm/mpspec.h> | 10 | #include <asm/mpspec.h> |
| 11 | #include <asm/setup.h> | 11 | #include <asm/setup.h> |
| 12 | #include <asm/apic.h> | ||
| 12 | #include <asm/e820.h> | 13 | #include <asm/e820.h> |
| 13 | #include <asm/irq.h> | 14 | #include <asm/irq.h> |
| 14 | 15 | ||
| @@ -54,4 +55,12 @@ struct __initdata x86_init_ops x86_init = { | |||
| 54 | .pagetable_setup_start = native_pagetable_setup_start, | 55 | .pagetable_setup_start = native_pagetable_setup_start, |
| 55 | .pagetable_setup_done = native_pagetable_setup_done, | 56 | .pagetable_setup_done = native_pagetable_setup_done, |
| 56 | }, | 57 | }, |
| 58 | |||
| 59 | .timers = { | ||
| 60 | .setup_percpu_clockev = setup_boot_APIC_clock, | ||
| 61 | }, | ||
| 62 | }; | ||
| 63 | |||
| 64 | __cpuinitdata struct x86_cpuinit_ops x86_cpuinit = { | ||
| 65 | .setup_percpu_clockev = setup_secondary_APIC_clock, | ||
| 57 | }; | 66 | }; |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index a924caa168dd..14e597e0c160 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -912,8 +912,6 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = { | |||
| 912 | 912 | ||
| 913 | static const struct pv_apic_ops xen_apic_ops __initdata = { | 913 | static const struct pv_apic_ops xen_apic_ops __initdata = { |
| 914 | #ifdef CONFIG_X86_LOCAL_APIC | 914 | #ifdef CONFIG_X86_LOCAL_APIC |
| 915 | .setup_boot_clock = paravirt_nop, | ||
| 916 | .setup_secondary_clock = paravirt_nop, | ||
| 917 | .startup_ipi_hook = paravirt_nop, | 915 | .startup_ipi_hook = paravirt_nop, |
| 918 | #endif | 916 | #endif |
| 919 | }; | 917 | }; |
| @@ -979,6 +977,8 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 979 | x86_init.resources.memory_setup = xen_memory_setup; | 977 | x86_init.resources.memory_setup = xen_memory_setup; |
| 980 | x86_init.oem.arch_setup = xen_arch_setup; | 978 | x86_init.oem.arch_setup = xen_arch_setup; |
| 981 | x86_init.oem.banner = xen_banner; | 979 | x86_init.oem.banner = xen_banner; |
| 980 | x86_init.timers.setup_percpu_clockev = x86_init_noop; | ||
| 981 | x86_cpuinit.setup_percpu_clockev = x86_init_noop; | ||
| 982 | 982 | ||
| 983 | #ifdef CONFIG_X86_64 | 983 | #ifdef CONFIG_X86_64 |
| 984 | /* | 984 | /* |
