diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2005-10-30 17:59:41 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-30 20:37:13 -0500 |
commit | f2b36db692b7ff6972320ad9839ae656a3b0ee3e (patch) | |
tree | 110387d2557a156d6b9453ea0c45d392b47796c2 /arch/i386/kernel/time.c | |
parent | 29b70081f7cb094513d5189e82d3478b50777a28 (diff) |
[PATCH] i386: move apic init in init_IRQs
All kinds of ugliness exists because we don't initialize
the apics during init_IRQs.
- We calibrate jiffies in non apic mode even when we are using apics.
- We have to have special code to initialize the apics when non-smp.
- The legacy i8259 must exist and be setup correctly, even
when we won't use it past initialization.
- The kexec on panic code must restore the state of the io_apics.
- init/main.c needs a special case for !smp smp_init on x86
In addition to pure code movement I needed a couple
of non-obvious changes:
- Move setup_boot_APIC_clock into APIC_late_time_init for
simplicity.
- Use cpu_khz to generate a better approximation of loops_per_jiffies
so I can verify the timer interrupt is working.
- Call setup_apic_nmi_watchdog again after cpu_khz is initialized on
the boot cpu.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/i386/kernel/time.c')
-rw-r--r-- | arch/i386/kernel/time.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c index 2883a4d4f01f..46c35ec9137d 100644 --- a/arch/i386/kernel/time.c +++ b/arch/i386/kernel/time.c | |||
@@ -444,8 +444,8 @@ static int time_init_device(void) | |||
444 | 444 | ||
445 | device_initcall(time_init_device); | 445 | device_initcall(time_init_device); |
446 | 446 | ||
447 | #ifdef CONFIG_HPET_TIMER | ||
448 | extern void (*late_time_init)(void); | 447 | extern void (*late_time_init)(void); |
448 | #ifdef CONFIG_HPET_TIMER | ||
449 | /* Duplicate of time_init() below, with hpet_enable part added */ | 449 | /* Duplicate of time_init() below, with hpet_enable part added */ |
450 | static void __init hpet_time_init(void) | 450 | static void __init hpet_time_init(void) |
451 | { | 451 | { |
@@ -462,6 +462,11 @@ static void __init hpet_time_init(void) | |||
462 | printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name); | 462 | printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name); |
463 | 463 | ||
464 | time_init_hook(); | 464 | time_init_hook(); |
465 | |||
466 | #ifdef CONFIG_X86_LOCAL_APIC | ||
467 | if (enable_local_apic >= 0) | ||
468 | APIC_late_time_init(); | ||
469 | #endif | ||
465 | } | 470 | } |
466 | #endif | 471 | #endif |
467 | 472 | ||
@@ -486,4 +491,9 @@ void __init time_init(void) | |||
486 | printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name); | 491 | printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name); |
487 | 492 | ||
488 | time_init_hook(); | 493 | time_init_hook(); |
494 | |||
495 | #ifdef CONFIG_X86_LOCAL_APIC | ||
496 | if (enable_local_apic >= 0) | ||
497 | late_time_init = APIC_late_time_init; | ||
498 | #endif | ||
489 | } | 499 | } |