diff options
-rw-r--r-- | arch/x86/include/asm/paravirt.h | 5 | ||||
-rw-r--r-- | arch/x86/include/asm/paravirt_types.h | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/setup.h | 21 | ||||
-rw-r--r-- | arch/x86/include/asm/time.h | 1 | ||||
-rw-r--r-- | arch/x86/include/asm/timer.h | 3 | ||||
-rw-r--r-- | arch/x86/include/asm/x86_init.h | 4 | ||||
-rw-r--r-- | arch/x86/kernel/apic/numaq_32.c | 10 | ||||
-rw-r--r-- | arch/x86/kernel/paravirt.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 43 | ||||
-rw-r--r-- | arch/x86/kernel/time_32.c | 34 | ||||
-rw-r--r-- | arch/x86/kernel/time_64.c | 9 | ||||
-rw-r--r-- | arch/x86/kernel/tsc.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/visws_quirks.c | 20 | ||||
-rw-r--r-- | arch/x86/kernel/vmi_32.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/x86_init.c | 3 | ||||
-rw-r--r-- | arch/x86/lguest/boot.c | 2 | ||||
-rw-r--r-- | arch/x86/xen/enlighten.c | 4 |
17 files changed, 53 insertions, 113 deletions
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index 825674a968d..11a4ba7b209 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h | |||
@@ -34,11 +34,6 @@ static inline int set_wallclock(unsigned long nowtime) | |||
34 | return PVOP_CALL1(int, pv_time_ops.set_wallclock, nowtime); | 34 | return PVOP_CALL1(int, pv_time_ops.set_wallclock, nowtime); |
35 | } | 35 | } |
36 | 36 | ||
37 | static inline void (*choose_time_init(void))(void) | ||
38 | { | ||
39 | return pv_time_ops.time_init; | ||
40 | } | ||
41 | |||
42 | /* The paravirtualized CPUID instruction. */ | 37 | /* The paravirtualized CPUID instruction. */ |
43 | static inline void __cpuid(unsigned int *eax, unsigned int *ebx, | 38 | static inline void __cpuid(unsigned int *eax, unsigned int *ebx, |
44 | unsigned int *ecx, unsigned int *edx) | 39 | unsigned int *ecx, unsigned int *edx) |
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index 1da89276d14..0d812e592e3 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h | |||
@@ -88,8 +88,6 @@ struct pv_lazy_ops { | |||
88 | }; | 88 | }; |
89 | 89 | ||
90 | struct pv_time_ops { | 90 | struct pv_time_ops { |
91 | void (*time_init)(void); | ||
92 | |||
93 | /* Set and set time of day */ | 91 | /* Set and set time of day */ |
94 | unsigned long (*get_wallclock)(void); | 92 | unsigned long (*get_wallclock)(void); |
95 | int (*set_wallclock)(unsigned long); | 93 | int (*set_wallclock)(unsigned long); |
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index 58b58952b80..861e1fe2303 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h | |||
@@ -5,24 +5,6 @@ | |||
5 | 5 | ||
6 | #define COMMAND_LINE_SIZE 2048 | 6 | #define COMMAND_LINE_SIZE 2048 |
7 | 7 | ||
8 | #ifndef __ASSEMBLY__ | ||
9 | |||
10 | #include <asm/x86_init.h> | ||
11 | |||
12 | /* | ||
13 | * Any setup quirks to be performed? | ||
14 | */ | ||
15 | |||
16 | struct x86_quirks { | ||
17 | int (*arch_pre_time_init)(void); | ||
18 | int (*arch_time_init)(void); | ||
19 | }; | ||
20 | |||
21 | extern void x86_quirk_pre_time_init(void); | ||
22 | extern void x86_quirk_time_init(void); | ||
23 | |||
24 | #endif /* __ASSEMBLY__ */ | ||
25 | |||
26 | #ifdef __i386__ | 8 | #ifdef __i386__ |
27 | 9 | ||
28 | #include <linux/pfn.h> | 10 | #include <linux/pfn.h> |
@@ -42,6 +24,7 @@ extern void x86_quirk_time_init(void); | |||
42 | 24 | ||
43 | #ifndef __ASSEMBLY__ | 25 | #ifndef __ASSEMBLY__ |
44 | #include <asm/bootparam.h> | 26 | #include <asm/bootparam.h> |
27 | #include <asm/x86_init.h> | ||
45 | 28 | ||
46 | /* Interrupt control for vSMPowered x86_64 systems */ | 29 | /* Interrupt control for vSMPowered x86_64 systems */ |
47 | #ifdef CONFIG_X86_64 | 30 | #ifdef CONFIG_X86_64 |
@@ -60,11 +43,11 @@ static inline void visws_early_detect(void) { } | |||
60 | static inline int is_visws_box(void) { return 0; } | 43 | static inline int is_visws_box(void) { return 0; } |
61 | #endif | 44 | #endif |
62 | 45 | ||
63 | extern struct x86_quirks *x86_quirks; | ||
64 | extern unsigned long saved_video_mode; | 46 | extern unsigned long saved_video_mode; |
65 | 47 | ||
66 | extern void reserve_standard_io_resources(void); | 48 | extern void reserve_standard_io_resources(void); |
67 | extern void i386_reserve_resources(void); | 49 | extern void i386_reserve_resources(void); |
50 | extern void setup_default_timer_irq(void); | ||
68 | 51 | ||
69 | #ifndef _SETUP | 52 | #ifndef _SETUP |
70 | 53 | ||
diff --git a/arch/x86/include/asm/time.h b/arch/x86/include/asm/time.h index 50c733aac42..91bb162b5a3 100644 --- a/arch/x86/include/asm/time.h +++ b/arch/x86/include/asm/time.h | |||
@@ -54,7 +54,6 @@ extern void time_init(void); | |||
54 | 54 | ||
55 | #define get_wallclock() native_get_wallclock() | 55 | #define get_wallclock() native_get_wallclock() |
56 | #define set_wallclock(x) native_set_wallclock(x) | 56 | #define set_wallclock(x) native_set_wallclock(x) |
57 | #define choose_time_init() hpet_time_init | ||
58 | 57 | ||
59 | #endif /* CONFIG_PARAVIRT */ | 58 | #endif /* CONFIG_PARAVIRT */ |
60 | 59 | ||
diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index 20ca9c4d468..e854c7ab416 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h | |||
@@ -12,8 +12,7 @@ unsigned long native_calibrate_tsc(void); | |||
12 | 12 | ||
13 | #ifdef CONFIG_X86_32 | 13 | #ifdef CONFIG_X86_32 |
14 | extern int timer_ack; | 14 | extern int timer_ack; |
15 | extern irqreturn_t timer_interrupt(int irq, void *dev_id); | 15 | #endif |
16 | #endif /* CONFIG_X86_32 */ | ||
17 | extern int recalibrate_cpu_khz(void); | 16 | extern int recalibrate_cpu_khz(void); |
18 | 17 | ||
19 | extern int no_timer_check; | 18 | extern int no_timer_check; |
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index b7d258f4c40..f8bdd2271a0 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h | |||
@@ -82,9 +82,13 @@ struct x86_init_paging { | |||
82 | * struct x86_init_timers - platform specific timer setup | 82 | * struct x86_init_timers - platform specific timer setup |
83 | * @setup_perpcu_clockev: set up the per cpu clock event device for the | 83 | * @setup_perpcu_clockev: set up the per cpu clock event device for the |
84 | * boot cpu | 84 | * boot cpu |
85 | * @tsc_pre_init: platform function called before TSC init | ||
86 | * @timer_init: initialize the platform timer (default PIT/HPET) | ||
85 | */ | 87 | */ |
86 | struct x86_init_timers { | 88 | struct x86_init_timers { |
87 | void (*setup_percpu_clockev)(void); | 89 | void (*setup_percpu_clockev)(void); |
90 | void (*tsc_pre_init)(void); | ||
91 | void (*timer_init)(void); | ||
88 | }; | 92 | }; |
89 | 93 | ||
90 | /** | 94 | /** |
diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c index 71c5ea64586..f1ebed6bd15 100644 --- a/arch/x86/kernel/apic/numaq_32.c +++ b/arch/x86/kernel/apic/numaq_32.c | |||
@@ -129,10 +129,9 @@ void __cpuinit numaq_tsc_disable(void) | |||
129 | } | 129 | } |
130 | } | 130 | } |
131 | 131 | ||
132 | static int __init numaq_pre_time_init(void) | 132 | static void __init numaq_tsc_init(void) |
133 | { | 133 | { |
134 | numaq_tsc_disable(); | 134 | numaq_tsc_disable(); |
135 | return 0; | ||
136 | } | 135 | } |
137 | 136 | ||
138 | static inline int generate_logical_apicid(int quad, int phys_apicid) | 137 | static inline int generate_logical_apicid(int quad, int phys_apicid) |
@@ -262,11 +261,6 @@ static void __init smp_read_mpc_oem(struct mpc_table *mpc) | |||
262 | } | 261 | } |
263 | } | 262 | } |
264 | 263 | ||
265 | static struct x86_quirks numaq_x86_quirks __initdata = { | ||
266 | .arch_pre_time_init = numaq_pre_time_init, | ||
267 | .arch_time_init = NULL, | ||
268 | }; | ||
269 | |||
270 | static __init void early_check_numaq(void) | 264 | static __init void early_check_numaq(void) |
271 | { | 265 | { |
272 | /* | 266 | /* |
@@ -281,13 +275,13 @@ static __init void early_check_numaq(void) | |||
281 | early_get_smp_config(); | 275 | early_get_smp_config(); |
282 | 276 | ||
283 | if (found_numaq) { | 277 | if (found_numaq) { |
284 | x86_quirks = &numaq_x86_quirks; | ||
285 | x86_init.mpparse.mpc_record = numaq_mpc_record; | 278 | x86_init.mpparse.mpc_record = numaq_mpc_record; |
286 | x86_init.mpparse.setup_ioapic_ids = x86_init_noop; | 279 | x86_init.mpparse.setup_ioapic_ids = x86_init_noop; |
287 | x86_init.mpparse.mpc_apic_id = mpc_apic_id; | 280 | x86_init.mpparse.mpc_apic_id = mpc_apic_id; |
288 | x86_init.mpparse.smp_read_mpc_oem = smp_read_mpc_oem; | 281 | x86_init.mpparse.smp_read_mpc_oem = smp_read_mpc_oem; |
289 | x86_init.mpparse.mpc_oem_pci_bus = mpc_oem_pci_bus; | 282 | x86_init.mpparse.mpc_oem_pci_bus = mpc_oem_pci_bus; |
290 | x86_init.mpparse.mpc_oem_bus_info = mpc_oem_bus_info; | 283 | x86_init.mpparse.mpc_oem_bus_info = mpc_oem_bus_info; |
284 | x86_init.timers.tsc_pre_init = numaq_tsc_init; | ||
291 | } | 285 | } |
292 | } | 286 | } |
293 | 287 | ||
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 1ed32c79679..9c0e644a76d 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
@@ -306,7 +306,6 @@ struct pv_init_ops pv_init_ops = { | |||
306 | }; | 306 | }; |
307 | 307 | ||
308 | struct pv_time_ops pv_time_ops = { | 308 | struct pv_time_ops pv_time_ops = { |
309 | .time_init = hpet_time_init, | ||
310 | .get_wallclock = native_get_wallclock, | 309 | .get_wallclock = native_get_wallclock, |
311 | .set_wallclock = native_set_wallclock, | 310 | .set_wallclock = native_set_wallclock, |
312 | .sched_clock = native_sched_clock, | 311 | .sched_clock = native_sched_clock, |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 43ec6aa175b..bb207a47c63 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -626,10 +626,6 @@ static int __init setup_elfcorehdr(char *arg) | |||
626 | early_param("elfcorehdr", setup_elfcorehdr); | 626 | early_param("elfcorehdr", setup_elfcorehdr); |
627 | #endif | 627 | #endif |
628 | 628 | ||
629 | static struct x86_quirks default_x86_quirks __initdata; | ||
630 | |||
631 | struct x86_quirks *x86_quirks __initdata = &default_x86_quirks; | ||
632 | |||
633 | #ifdef CONFIG_X86_RESERVE_LOW_64K | 629 | #ifdef CONFIG_X86_RESERVE_LOW_64K |
634 | static int __init dmi_low_memory_corruption(const struct dmi_system_id *d) | 630 | static int __init dmi_low_memory_corruption(const struct dmi_system_id *d) |
635 | { | 631 | { |
@@ -1016,45 +1012,6 @@ void __init setup_arch(char **cmdline_p) | |||
1016 | 1012 | ||
1017 | #ifdef CONFIG_X86_32 | 1013 | #ifdef CONFIG_X86_32 |
1018 | 1014 | ||
1019 | static struct irqaction irq0 = { | ||
1020 | .handler = timer_interrupt, | ||
1021 | .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER, | ||
1022 | .name = "timer" | ||
1023 | }; | ||
1024 | |||
1025 | /** | ||
1026 | * x86_quirk_pre_time_init - do any specific initialisations before. | ||
1027 | * | ||
1028 | **/ | ||
1029 | void __init x86_quirk_pre_time_init(void) | ||
1030 | { | ||
1031 | if (x86_quirks->arch_pre_time_init) | ||
1032 | x86_quirks->arch_pre_time_init(); | ||
1033 | } | ||
1034 | |||
1035 | /** | ||
1036 | * x86_quirk_time_init - do any specific initialisations for the system timer. | ||
1037 | * | ||
1038 | * Description: | ||
1039 | * Must plug the system timer interrupt source at HZ into the IRQ listed | ||
1040 | * in irq_vectors.h:TIMER_IRQ | ||
1041 | **/ | ||
1042 | void __init x86_quirk_time_init(void) | ||
1043 | { | ||
1044 | if (x86_quirks->arch_time_init) { | ||
1045 | /* | ||
1046 | * A nonzero return code does not mean failure, it means | ||
1047 | * that the architecture quirk does not want any | ||
1048 | * generic (timer) setup to be performed after this: | ||
1049 | */ | ||
1050 | if (x86_quirks->arch_time_init()) | ||
1051 | return; | ||
1052 | } | ||
1053 | |||
1054 | irq0.mask = cpumask_of_cpu(0); | ||
1055 | setup_irq(0, &irq0); | ||
1056 | } | ||
1057 | |||
1058 | static struct resource video_ram_resource = { | 1015 | static struct resource video_ram_resource = { |
1059 | .name = "Video RAM area", | 1016 | .name = "Video RAM area", |
1060 | .start = 0xa0000, | 1017 | .start = 0xa0000, |
diff --git a/arch/x86/kernel/time_32.c b/arch/x86/kernel/time_32.c index 5c5d87f0b2e..89bbb52218b 100644 --- a/arch/x86/kernel/time_32.c +++ b/arch/x86/kernel/time_32.c | |||
@@ -72,7 +72,7 @@ EXPORT_SYMBOL(profile_pc); | |||
72 | * Time Stamp Counter value at the time of the timer interrupt, so that | 72 | * Time Stamp Counter value at the time of the timer interrupt, so that |
73 | * we later on can estimate the time of day more exactly. | 73 | * we later on can estimate the time of day more exactly. |
74 | */ | 74 | */ |
75 | irqreturn_t timer_interrupt(int irq, void *dev_id) | 75 | static irqreturn_t timer_interrupt(int irq, void *dev_id) |
76 | { | 76 | { |
77 | /* Keep nmi watchdog up to date */ | 77 | /* Keep nmi watchdog up to date */ |
78 | inc_irq_stat(irq0_irqs); | 78 | inc_irq_stat(irq0_irqs); |
@@ -113,25 +113,37 @@ irqreturn_t timer_interrupt(int irq, void *dev_id) | |||
113 | return IRQ_HANDLED; | 113 | return IRQ_HANDLED; |
114 | } | 114 | } |
115 | 115 | ||
116 | /* Duplicate of time_init() below, with hpet_enable part added */ | 116 | static struct irqaction irq0 = { |
117 | .handler = timer_interrupt, | ||
118 | .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER, | ||
119 | .name = "timer" | ||
120 | }; | ||
121 | |||
122 | void __init setup_default_timer_irq(void) | ||
123 | { | ||
124 | irq0.mask = cpumask_of_cpu(0); | ||
125 | setup_irq(0, &irq0); | ||
126 | } | ||
127 | |||
128 | /* Default timer init function */ | ||
117 | void __init hpet_time_init(void) | 129 | void __init hpet_time_init(void) |
118 | { | 130 | { |
119 | if (!hpet_enable()) | 131 | if (!hpet_enable()) |
120 | setup_pit_timer(); | 132 | setup_pit_timer(); |
121 | x86_quirk_time_init(); | 133 | setup_default_timer_irq(); |
134 | } | ||
135 | |||
136 | static void x86_late_time_init(void) | ||
137 | { | ||
138 | x86_init.timers.timer_init(); | ||
122 | } | 139 | } |
123 | 140 | ||
124 | /* | 141 | /* |
125 | * This is called directly from init code; we must delay timer setup in the | 142 | * Initialize TSC and delay the periodic timer init to |
126 | * HPET case as we can't make the decision to turn on HPET this early in the | 143 | * late x86_late_time_init() so ioremap works. |
127 | * boot process. | ||
128 | * | ||
129 | * The chosen time_init function will usually be hpet_time_init, above, but | ||
130 | * in the case of virtual hardware, an alternative function may be substituted. | ||
131 | */ | 144 | */ |
132 | void __init time_init(void) | 145 | void __init time_init(void) |
133 | { | 146 | { |
134 | x86_quirk_pre_time_init(); | ||
135 | tsc_init(); | 147 | tsc_init(); |
136 | late_time_init = choose_time_init(); | 148 | late_time_init = x86_late_time_init; |
137 | } | 149 | } |
diff --git a/arch/x86/kernel/time_64.c b/arch/x86/kernel/time_64.c index 5ba343e6184..38a7df94c10 100644 --- a/arch/x86/kernel/time_64.c +++ b/arch/x86/kernel/time_64.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/mca.h> | 19 | #include <linux/mca.h> |
20 | #include <linux/nmi.h> | 20 | #include <linux/nmi.h> |
21 | 21 | ||
22 | #include <asm/x86_init.h> | ||
22 | #include <asm/i8253.h> | 23 | #include <asm/i8253.h> |
23 | #include <asm/hpet.h> | 24 | #include <asm/hpet.h> |
24 | #include <asm/vgtod.h> | 25 | #include <asm/vgtod.h> |
@@ -127,9 +128,13 @@ void __init hpet_time_init(void) | |||
127 | setup_irq(0, &irq0); | 128 | setup_irq(0, &irq0); |
128 | } | 129 | } |
129 | 130 | ||
131 | static void x86_late_time_init(void) | ||
132 | { | ||
133 | x86_init.timers.timer_init(); | ||
134 | } | ||
135 | |||
130 | void __init time_init(void) | 136 | void __init time_init(void) |
131 | { | 137 | { |
132 | tsc_init(); | 138 | tsc_init(); |
133 | 139 | late_time_init = x86_late_time_init; | |
134 | late_time_init = choose_time_init(); | ||
135 | } | 140 | } |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 71f4368b357..652bc214eeb 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -857,6 +857,8 @@ void __init tsc_init(void) | |||
857 | u64 lpj; | 857 | u64 lpj; |
858 | int cpu; | 858 | int cpu; |
859 | 859 | ||
860 | x86_init.timers.tsc_pre_init(); | ||
861 | |||
860 | if (!cpu_has_tsc) | 862 | if (!cpu_has_tsc) |
861 | return; | 863 | return; |
862 | 864 | ||
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c index 2719091b335..f068553a1b1 100644 --- a/arch/x86/kernel/visws_quirks.c +++ b/arch/x86/kernel/visws_quirks.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <asm/setup.h> | 30 | #include <asm/setup.h> |
31 | #include <asm/apic.h> | 31 | #include <asm/apic.h> |
32 | #include <asm/e820.h> | 32 | #include <asm/e820.h> |
33 | #include <asm/time.h> | ||
33 | #include <asm/io.h> | 34 | #include <asm/io.h> |
34 | 35 | ||
35 | #include <linux/kernel_stat.h> | 36 | #include <linux/kernel_stat.h> |
@@ -53,7 +54,7 @@ int is_visws_box(void) | |||
53 | return visws_board_type >= 0; | 54 | return visws_board_type >= 0; |
54 | } | 55 | } |
55 | 56 | ||
56 | static int __init visws_time_init(void) | 57 | static void __init visws_time_init(void) |
57 | { | 58 | { |
58 | printk(KERN_INFO "Starting Cobalt Timer system clock\n"); | 59 | printk(KERN_INFO "Starting Cobalt Timer system clock\n"); |
59 | 60 | ||
@@ -66,11 +67,7 @@ static int __init visws_time_init(void) | |||
66 | /* Enable (unmask) the timer interrupt */ | 67 | /* Enable (unmask) the timer interrupt */ |
67 | co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) & ~CO_CTRL_TIMEMASK); | 68 | co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) & ~CO_CTRL_TIMEMASK); |
68 | 69 | ||
69 | /* | 70 | setup_default_timer_irq(); |
70 | * Zero return means the generic timer setup code will set up | ||
71 | * the standard vector: | ||
72 | */ | ||
73 | return 0; | ||
74 | } | 71 | } |
75 | 72 | ||
76 | /* Replaces the default init_ISA_irqs in the generic setup */ | 73 | /* Replaces the default init_ISA_irqs in the generic setup */ |
@@ -226,10 +223,6 @@ static void __init visws_find_smp_config(unsigned int reserve) | |||
226 | 223 | ||
227 | static void visws_trap_init(void); | 224 | static void visws_trap_init(void); |
228 | 225 | ||
229 | static struct x86_quirks visws_x86_quirks __initdata = { | ||
230 | .arch_time_init = visws_time_init, | ||
231 | }; | ||
232 | |||
233 | void __init visws_early_detect(void) | 226 | void __init visws_early_detect(void) |
234 | { | 227 | { |
235 | int raw; | 228 | int raw; |
@@ -241,17 +234,14 @@ void __init visws_early_detect(void) | |||
241 | return; | 234 | return; |
242 | 235 | ||
243 | /* | 236 | /* |
244 | * Install special quirks for timer, interrupt and memory setup: | 237 | * Override the default platform setup functions |
245 | * Fall back to generic behavior for traps: | ||
246 | * Override generic MP-table parsing: | ||
247 | */ | 238 | */ |
248 | x86_quirks = &visws_x86_quirks; | ||
249 | |||
250 | x86_init.resources.memory_setup = visws_memory_setup; | 239 | x86_init.resources.memory_setup = visws_memory_setup; |
251 | x86_init.mpparse.get_smp_config = visws_get_smp_config; | 240 | x86_init.mpparse.get_smp_config = visws_get_smp_config; |
252 | x86_init.mpparse.find_smp_config = visws_find_smp_config; | 241 | x86_init.mpparse.find_smp_config = visws_find_smp_config; |
253 | x86_init.irqs.pre_vector_init = visws_pre_intr_init; | 242 | x86_init.irqs.pre_vector_init = visws_pre_intr_init; |
254 | x86_init.irqs.trap_init = visws_trap_init; | 243 | x86_init.irqs.trap_init = visws_trap_init; |
244 | x86_init.timers.timer_init = visws_time_init; | ||
255 | 245 | ||
256 | /* | 246 | /* |
257 | * Install reboot quirks: | 247 | * Install reboot quirks: |
diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c index b43b6685cae..cd7d0fbbf66 100644 --- a/arch/x86/kernel/vmi_32.c +++ b/arch/x86/kernel/vmi_32.c | |||
@@ -817,7 +817,7 @@ static inline int __init activate_vmi(void) | |||
817 | vmi_timer_ops.set_alarm = vmi_get_function(VMI_CALL_SetAlarm); | 817 | vmi_timer_ops.set_alarm = vmi_get_function(VMI_CALL_SetAlarm); |
818 | vmi_timer_ops.cancel_alarm = | 818 | vmi_timer_ops.cancel_alarm = |
819 | vmi_get_function(VMI_CALL_CancelAlarm); | 819 | vmi_get_function(VMI_CALL_CancelAlarm); |
820 | pv_time_ops.time_init = vmi_time_init; | 820 | x86_init.timers.timer_init = vmi_time_init; |
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 |
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index e666a98db7c..4790b92714a 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <asm/setup.h> | 11 | #include <asm/setup.h> |
12 | #include <asm/apic.h> | 12 | #include <asm/apic.h> |
13 | #include <asm/e820.h> | 13 | #include <asm/e820.h> |
14 | #include <asm/time.h> | ||
14 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
15 | 16 | ||
16 | void __cpuinit x86_init_noop(void) { } | 17 | void __cpuinit x86_init_noop(void) { } |
@@ -58,6 +59,8 @@ struct __initdata x86_init_ops x86_init = { | |||
58 | 59 | ||
59 | .timers = { | 60 | .timers = { |
60 | .setup_percpu_clockev = setup_boot_APIC_clock, | 61 | .setup_percpu_clockev = setup_boot_APIC_clock, |
62 | .tsc_pre_init = x86_init_noop, | ||
63 | .timer_init = hpet_time_init, | ||
61 | }, | 64 | }, |
62 | }; | 65 | }; |
63 | 66 | ||
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index 1ff986511f1..6caa8c0c793 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
@@ -1320,11 +1320,11 @@ __init void lguest_init(void) | |||
1320 | 1320 | ||
1321 | /* Time operations */ | 1321 | /* Time operations */ |
1322 | pv_time_ops.get_wallclock = lguest_get_wallclock; | 1322 | pv_time_ops.get_wallclock = lguest_get_wallclock; |
1323 | pv_time_ops.time_init = lguest_time_init; | ||
1324 | pv_time_ops.get_tsc_khz = lguest_tsc_khz; | 1323 | pv_time_ops.get_tsc_khz = lguest_tsc_khz; |
1325 | 1324 | ||
1326 | x86_init.resources.memory_setup = lguest_memory_setup; | 1325 | x86_init.resources.memory_setup = lguest_memory_setup; |
1327 | x86_init.irqs.intr_init = lguest_init_IRQ; | 1326 | x86_init.irqs.intr_init = lguest_init_IRQ; |
1327 | x86_init.timers.timer_init = lguest_time_init; | ||
1328 | 1328 | ||
1329 | /* | 1329 | /* |
1330 | * Now is a good time to look at the implementations of these functions | 1330 | * Now is a good time to look at the implementations of these functions |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 14e597e0c16..84826b842b5 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -842,8 +842,6 @@ static const struct pv_init_ops xen_init_ops __initdata = { | |||
842 | }; | 842 | }; |
843 | 843 | ||
844 | static const struct pv_time_ops xen_time_ops __initdata = { | 844 | static const struct pv_time_ops xen_time_ops __initdata = { |
845 | .time_init = xen_time_init, | ||
846 | |||
847 | .set_wallclock = xen_set_wallclock, | 845 | .set_wallclock = xen_set_wallclock, |
848 | .get_wallclock = xen_get_wallclock, | 846 | .get_wallclock = xen_get_wallclock, |
849 | .get_tsc_khz = xen_tsc_khz, | 847 | .get_tsc_khz = xen_tsc_khz, |
@@ -977,6 +975,8 @@ asmlinkage void __init xen_start_kernel(void) | |||
977 | x86_init.resources.memory_setup = xen_memory_setup; | 975 | x86_init.resources.memory_setup = xen_memory_setup; |
978 | x86_init.oem.arch_setup = xen_arch_setup; | 976 | x86_init.oem.arch_setup = xen_arch_setup; |
979 | x86_init.oem.banner = xen_banner; | 977 | x86_init.oem.banner = xen_banner; |
978 | |||
979 | x86_init.timers.timer_init = xen_time_init; | ||
980 | x86_init.timers.setup_percpu_clockev = x86_init_noop; | 980 | x86_init.timers.setup_percpu_clockev = x86_init_noop; |
981 | x86_cpuinit.setup_percpu_clockev = x86_init_noop; | 981 | x86_cpuinit.setup_percpu_clockev = x86_init_noop; |
982 | 982 | ||