]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
x86: Move percpu clockevents setup to x86_init_ops
authorThomas Gleixner <tglx@linutronix.de>
Wed, 19 Aug 2009 10:35:53 +0000 (12:35 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 31 Aug 2009 07:35:46 +0000 (09:35 +0200)
paravirt overrides the setup of the default apic timers as per cpu
timers. Moorestown needs to override that as well.

Move it to x86_init_ops setup and create a separate x86_cpuinit struct
which holds the function for the secondary evtl. hotplugabble CPUs.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/include/asm/apic.h
arch/x86/include/asm/paravirt.h
arch/x86/include/asm/paravirt_types.h
arch/x86/include/asm/x86_init.h
arch/x86/kernel/apic/apic.c
arch/x86/kernel/kvmclock.c
arch/x86/kernel/paravirt.c
arch/x86/kernel/smpboot.c
arch/x86/kernel/vmi_32.c
arch/x86/kernel/x86_init.c
arch/x86/xen/enlighten.c

index bb7d47925847c585ee7e9e66f6f2e8652b5ab753..6f15b29005a13e05f81fc1637462b0ed6b00b284 100644 (file)
@@ -70,9 +70,6 @@ static inline void default_inquire_remote_apic(int apicid)
  */
 #ifdef CONFIG_PARAVIRT
 #include <asm/paravirt.h>
-#else
-#define setup_boot_clock setup_boot_APIC_clock
-#define setup_secondary_clock setup_secondary_APIC_clock
 #endif
 
 #ifdef CONFIG_X86_64
@@ -245,6 +242,8 @@ static inline void lapic_shutdown(void) { }
 static inline void init_apic_mappings(void) { }
 static inline void disable_local_APIC(void) { }
 static inline void apic_disable(void) { }
+# define setup_boot_APIC_clock x86_init_noop
+# define setup_secondary_APIC_clock x86_init_noop
 #endif /* !CONFIG_X86_LOCAL_APIC */
 
 #ifdef CONFIG_X86_64
index 7ce415e844b6f0760065f7ff26189ef08428d091..825674a968d11ddaf21220c729aba27ea657f5c7 100644 (file)
@@ -333,18 +333,6 @@ static inline void slow_down_io(void)
 #endif
 }
 
-#ifdef CONFIG_X86_LOCAL_APIC
-static inline void setup_boot_clock(void)
-{
-       PVOP_VCALL0(pv_apic_ops.setup_boot_clock);
-}
-
-static inline void setup_secondary_clock(void)
-{
-       PVOP_VCALL0(pv_apic_ops.setup_secondary_clock);
-}
-#endif
-
 #ifdef CONFIG_SMP
 static inline void startup_ipi_hook(int phys_apicid, unsigned long start_eip,
                                    unsigned long start_esp)
index ecc74e5ad407d12711004679e7514a8580880c8c..1da89276d14202eea2d1915b81a7759deed681de 100644 (file)
@@ -218,9 +218,6 @@ struct pv_irq_ops {
 
 struct pv_apic_ops {
 #ifdef CONFIG_X86_LOCAL_APIC
-       void (*setup_boot_clock)(void);
-       void (*setup_secondary_clock)(void);
-
        void (*startup_ipi_hook)(int phys_apicid,
                                 unsigned long start_eip,
                                 unsigned long start_esp);
index b9bb4faefc488d4da294de0233ee9d1bd7e7355b..b7d258f4c40148bf47680dc8a9f3a197717fda71 100644 (file)
@@ -78,6 +78,15 @@ struct x86_init_paging {
        void (*pagetable_setup_done)(pgd_t *base);
 };
 
+/**
+ * struct x86_init_timers - platform specific timer setup
+ * @setup_perpcu_clockev:      set up the per cpu clock event device for the
+ *                             boot cpu
+ */
+struct x86_init_timers {
+       void (*setup_percpu_clockev)(void);
+};
+
 /**
  * struct x86_init_ops - functions for platform specific setup
  *
@@ -88,9 +97,19 @@ struct x86_init_ops {
        struct x86_init_irqs            irqs;
        struct x86_init_oem             oem;
        struct x86_init_paging          paging;
+       struct x86_init_timers          timers;
+};
+
+/**
+ * struct x86_cpuinit_ops - platform specific cpu hotplug setups
+ * @setup_percpu_clockev:      set up the per cpu clock event device
+ */
+struct x86_cpuinit_ops {
+       void (*setup_percpu_clockev)(void);
 };
 
 extern struct x86_init_ops x86_init;
+extern struct x86_cpuinit_ops x86_cpuinit;
 
 extern void x86_init_noop(void);
 extern void x86_init_uint_noop(unsigned int unused);
index 0a1c2830ec662168a72c1e6780b4f4c8c10075ed..ce0098066e913479f43eb74de30a85db09321aa6 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/mm.h>
 
 #include <asm/perf_counter.h>
+#include <asm/x86_init.h>
 #include <asm/pgalloc.h>
 #include <asm/atomic.h>
 #include <asm/mpspec.h>
@@ -1701,7 +1702,7 @@ int __init APIC_init_uniprocessor(void)
        localise_nmi_watchdog();
 #endif
 
-       setup_boot_clock();
+       x86_init.timers.setup_percpu_clockev();
 #ifdef CONFIG_X86_64
        check_nmi_watchdog();
 #endif
index 223af43f15260a33b0b479ad1d47df8bf74e8500..64e9b5f59d2d3e41284ff3baf073e28569c77362 100644 (file)
@@ -22,6 +22,8 @@
 #include <asm/msr.h>
 #include <asm/apic.h>
 #include <linux/percpu.h>
+
+#include <asm/x86_init.h>
 #include <asm/reboot.h>
 
 #define KVM_SCALE 22
@@ -187,7 +189,8 @@ void __init kvmclock_init(void)
                pv_time_ops.sched_clock = kvm_clock_read;
                pv_time_ops.get_tsc_khz = kvm_get_tsc_khz;
 #ifdef CONFIG_X86_LOCAL_APIC
-               pv_apic_ops.setup_secondary_clock = kvm_setup_secondary_clock;
+               x86_cpuinit.setup_percpu_clockev =
+                       kvm_setup_secondary_clock;
 #endif
 #ifdef CONFIG_SMP
                smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu;
index 8167be0b68ca536d3c787c7ae2a74e9a703db4ab..1ed32c79679de10b0c6ab600d5bc922afc246928 100644 (file)
@@ -387,8 +387,6 @@ struct pv_cpu_ops pv_cpu_ops = {
 
 struct pv_apic_ops pv_apic_ops = {
 #ifdef CONFIG_X86_LOCAL_APIC
-       .setup_boot_clock = setup_boot_APIC_clock,
-       .setup_secondary_clock = setup_secondary_APIC_clock,
        .startup_ipi_hook = paravirt_nop,
 #endif
 };
index 2fecda69ee646a78402cc6a1d9e3d86a29ca06d6..6eb81a87b4b721ab3aab328377dd8322e9b136d1 100644 (file)
@@ -323,7 +323,7 @@ notrace static void __cpuinit start_secondary(void *unused)
        /* enable local interrupts */
        local_irq_enable();
 
-       setup_secondary_clock();
+       x86_cpuinit.setup_percpu_clockev();
 
        wmb();
        cpu_idle();
@@ -1112,7 +1112,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
 
        printk(KERN_INFO "CPU%d: ", 0);
        print_cpu_info(&cpu_data(0));
-       setup_boot_clock();
+       x86_init.timers.setup_percpu_clockev();
 
        if (is_uv_system())
                uv_system_init();
index 95a7289e4b0cdd8cc7b88f0504a93b205f2a6934..b43b6685cae1e8b205573152838c1bec7908edf8 100644 (file)
@@ -821,8 +821,8 @@ static inline int __init activate_vmi(void)
                pv_time_ops.get_wallclock = vmi_get_wallclock;
                pv_time_ops.set_wallclock = vmi_set_wallclock;
 #ifdef CONFIG_X86_LOCAL_APIC
-               pv_apic_ops.setup_boot_clock = vmi_time_bsp_init;
-               pv_apic_ops.setup_secondary_clock = vmi_time_ap_init;
+               x86_init.timers.setup_percpu_clockev = vmi_time_bsp_init;
+               x86_cpuinit.setup_percpu_clockev = vmi_time_ap_init;
 #endif
                pv_time_ops.sched_clock = vmi_sched_clock;
                pv_time_ops.get_tsc_khz = vmi_tsc_khz;
index 7df020e6740df8c331fdc971b088fddb81cbe6bc..e666a98db7cd21ce888c307d734c475fe72a17f7 100644 (file)
@@ -9,6 +9,7 @@
 #include <asm/paravirt.h>
 #include <asm/mpspec.h>
 #include <asm/setup.h>
+#include <asm/apic.h>
 #include <asm/e820.h>
 #include <asm/irq.h>
 
@@ -54,4 +55,12 @@ struct __initdata x86_init_ops x86_init = {
                .pagetable_setup_start  = native_pagetable_setup_start,
                .pagetable_setup_done   = native_pagetable_setup_done,
        },
+
+       .timers = {
+               .setup_percpu_clockev   = setup_boot_APIC_clock,
+       },
+};
+
+__cpuinitdata struct x86_cpuinit_ops x86_cpuinit = {
+       .setup_percpu_clockev           = setup_secondary_APIC_clock,
 };
index a924caa168ddeee1d1405b151da8fc10ff1e34c0..14e597e0c160e6d36fe9e331cf678e940f9b9b1b 100644 (file)
@@ -912,8 +912,6 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = {
 
 static const struct pv_apic_ops xen_apic_ops __initdata = {
 #ifdef CONFIG_X86_LOCAL_APIC
-       .setup_boot_clock = paravirt_nop,
-       .setup_secondary_clock = paravirt_nop,
        .startup_ipi_hook = paravirt_nop,
 #endif
 };
@@ -979,6 +977,8 @@ asmlinkage void __init xen_start_kernel(void)
        x86_init.resources.memory_setup = xen_memory_setup;
        x86_init.oem.arch_setup = xen_arch_setup;
        x86_init.oem.banner = xen_banner;
+       x86_init.timers.setup_percpu_clockev = x86_init_noop;
+       x86_cpuinit.setup_percpu_clockev = x86_init_noop;
 
 #ifdef CONFIG_X86_64
        /*