x86: Move percpu clockevents setup to x86_init_ops
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>
This commit is contained in:
@@ -70,9 +70,6 @@ static inline void default_inquire_remote_apic(int apicid)
|
|||||||
*/
|
*/
|
||||||
#ifdef CONFIG_PARAVIRT
|
#ifdef CONFIG_PARAVIRT
|
||||||
#include <asm/paravirt.h>
|
#include <asm/paravirt.h>
|
||||||
#else
|
|
||||||
#define setup_boot_clock setup_boot_APIC_clock
|
|
||||||
#define setup_secondary_clock setup_secondary_APIC_clock
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
@@ -245,6 +242,8 @@ static inline void lapic_shutdown(void) { }
|
|||||||
static inline void init_apic_mappings(void) { }
|
static inline void init_apic_mappings(void) { }
|
||||||
static inline void disable_local_APIC(void) { }
|
static inline void disable_local_APIC(void) { }
|
||||||
static inline void apic_disable(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 */
|
#endif /* !CONFIG_X86_LOCAL_APIC */
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
|
@@ -333,18 +333,6 @@ static inline void slow_down_io(void)
|
|||||||
#endif
|
#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
|
#ifdef CONFIG_SMP
|
||||||
static inline void startup_ipi_hook(int phys_apicid, unsigned long start_eip,
|
static inline void startup_ipi_hook(int phys_apicid, unsigned long start_eip,
|
||||||
unsigned long start_esp)
|
unsigned long start_esp)
|
||||||
|
@@ -218,9 +218,6 @@ struct pv_irq_ops {
|
|||||||
|
|
||||||
struct pv_apic_ops {
|
struct pv_apic_ops {
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
void (*setup_boot_clock)(void);
|
|
||||||
void (*setup_secondary_clock)(void);
|
|
||||||
|
|
||||||
void (*startup_ipi_hook)(int phys_apicid,
|
void (*startup_ipi_hook)(int phys_apicid,
|
||||||
unsigned long start_eip,
|
unsigned long start_eip,
|
||||||
unsigned long start_esp);
|
unsigned long start_esp);
|
||||||
|
@@ -78,6 +78,15 @@ struct x86_init_paging {
|
|||||||
void (*pagetable_setup_done)(pgd_t *base);
|
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
|
* 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_irqs irqs;
|
||||||
struct x86_init_oem oem;
|
struct x86_init_oem oem;
|
||||||
struct x86_init_paging paging;
|
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_init_ops x86_init;
|
||||||
|
extern struct x86_cpuinit_ops x86_cpuinit;
|
||||||
|
|
||||||
extern void x86_init_noop(void);
|
extern void x86_init_noop(void);
|
||||||
extern void x86_init_uint_noop(unsigned int unused);
|
extern void x86_init_uint_noop(unsigned int unused);
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
|
||||||
#include <asm/perf_counter.h>
|
#include <asm/perf_counter.h>
|
||||||
|
#include <asm/x86_init.h>
|
||||||
#include <asm/pgalloc.h>
|
#include <asm/pgalloc.h>
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
#include <asm/mpspec.h>
|
#include <asm/mpspec.h>
|
||||||
@@ -1701,7 +1702,7 @@ int __init APIC_init_uniprocessor(void)
|
|||||||
localise_nmi_watchdog();
|
localise_nmi_watchdog();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
setup_boot_clock();
|
x86_init.timers.setup_percpu_clockev();
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
check_nmi_watchdog();
|
check_nmi_watchdog();
|
||||||
#endif
|
#endif
|
||||||
|
@@ -22,6 +22,8 @@
|
|||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/apic.h>
|
||||||
#include <linux/percpu.h>
|
#include <linux/percpu.h>
|
||||||
|
|
||||||
|
#include <asm/x86_init.h>
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
|
|
||||||
#define KVM_SCALE 22
|
#define KVM_SCALE 22
|
||||||
@@ -187,7 +189,8 @@ void __init kvmclock_init(void)
|
|||||||
pv_time_ops.sched_clock = kvm_clock_read;
|
pv_time_ops.sched_clock = kvm_clock_read;
|
||||||
pv_time_ops.get_tsc_khz = kvm_get_tsc_khz;
|
pv_time_ops.get_tsc_khz = kvm_get_tsc_khz;
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#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
|
#endif
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu;
|
smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu;
|
||||||
|
@@ -387,8 +387,6 @@ struct pv_cpu_ops pv_cpu_ops = {
|
|||||||
|
|
||||||
struct pv_apic_ops pv_apic_ops = {
|
struct pv_apic_ops pv_apic_ops = {
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
.setup_boot_clock = setup_boot_APIC_clock,
|
|
||||||
.setup_secondary_clock = setup_secondary_APIC_clock,
|
|
||||||
.startup_ipi_hook = paravirt_nop,
|
.startup_ipi_hook = paravirt_nop,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
@@ -323,7 +323,7 @@ notrace static void __cpuinit start_secondary(void *unused)
|
|||||||
/* enable local interrupts */
|
/* enable local interrupts */
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
setup_secondary_clock();
|
x86_cpuinit.setup_percpu_clockev();
|
||||||
|
|
||||||
wmb();
|
wmb();
|
||||||
cpu_idle();
|
cpu_idle();
|
||||||
@@ -1112,7 +1112,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
|
|||||||
|
|
||||||
printk(KERN_INFO "CPU%d: ", 0);
|
printk(KERN_INFO "CPU%d: ", 0);
|
||||||
print_cpu_info(&cpu_data(0));
|
print_cpu_info(&cpu_data(0));
|
||||||
setup_boot_clock();
|
x86_init.timers.setup_percpu_clockev();
|
||||||
|
|
||||||
if (is_uv_system())
|
if (is_uv_system())
|
||||||
uv_system_init();
|
uv_system_init();
|
||||||
|
@@ -821,8 +821,8 @@ static inline int __init activate_vmi(void)
|
|||||||
pv_time_ops.get_wallclock = vmi_get_wallclock;
|
pv_time_ops.get_wallclock = vmi_get_wallclock;
|
||||||
pv_time_ops.set_wallclock = vmi_set_wallclock;
|
pv_time_ops.set_wallclock = vmi_set_wallclock;
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
pv_apic_ops.setup_boot_clock = vmi_time_bsp_init;
|
x86_init.timers.setup_percpu_clockev = vmi_time_bsp_init;
|
||||||
pv_apic_ops.setup_secondary_clock = vmi_time_ap_init;
|
x86_cpuinit.setup_percpu_clockev = vmi_time_ap_init;
|
||||||
#endif
|
#endif
|
||||||
pv_time_ops.sched_clock = vmi_sched_clock;
|
pv_time_ops.sched_clock = vmi_sched_clock;
|
||||||
pv_time_ops.get_tsc_khz = vmi_tsc_khz;
|
pv_time_ops.get_tsc_khz = vmi_tsc_khz;
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
#include <asm/paravirt.h>
|
#include <asm/paravirt.h>
|
||||||
#include <asm/mpspec.h>
|
#include <asm/mpspec.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
#include <asm/apic.h>
|
||||||
#include <asm/e820.h>
|
#include <asm/e820.h>
|
||||||
#include <asm/irq.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_start = native_pagetable_setup_start,
|
||||||
.pagetable_setup_done = native_pagetable_setup_done,
|
.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,
|
||||||
};
|
};
|
||||||
|
@@ -912,8 +912,6 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = {
|
|||||||
|
|
||||||
static const struct pv_apic_ops xen_apic_ops __initdata = {
|
static const struct pv_apic_ops xen_apic_ops __initdata = {
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
.setup_boot_clock = paravirt_nop,
|
|
||||||
.setup_secondary_clock = paravirt_nop,
|
|
||||||
.startup_ipi_hook = paravirt_nop,
|
.startup_ipi_hook = paravirt_nop,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
@@ -979,6 +977,8 @@ asmlinkage void __init xen_start_kernel(void)
|
|||||||
x86_init.resources.memory_setup = xen_memory_setup;
|
x86_init.resources.memory_setup = xen_memory_setup;
|
||||||
x86_init.oem.arch_setup = xen_arch_setup;
|
x86_init.oem.arch_setup = xen_arch_setup;
|
||||||
x86_init.oem.banner = xen_banner;
|
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
|
#ifdef CONFIG_X86_64
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user