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 /include/asm-i386 | |
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 'include/asm-i386')
-rw-r--r-- | include/asm-i386/apic.h | 3 | ||||
-rw-r--r-- | include/asm-i386/hw_irq.h | 1 | ||||
-rw-r--r-- | include/asm-i386/mach-default/smpboot_hooks.h | 15 | ||||
-rw-r--r-- | include/asm-i386/mach-visws/smpboot_hooks.h | 7 |
4 files changed, 3 insertions, 23 deletions
diff --git a/include/asm-i386/apic.h b/include/asm-i386/apic.h index 8c454aa58ac6..a515e2aed829 100644 --- a/include/asm-i386/apic.h +++ b/include/asm-i386/apic.h | |||
@@ -118,7 +118,8 @@ extern void release_lapic_nmi(void); | |||
118 | extern void disable_timer_nmi_watchdog(void); | 118 | extern void disable_timer_nmi_watchdog(void); |
119 | extern void enable_timer_nmi_watchdog(void); | 119 | extern void enable_timer_nmi_watchdog(void); |
120 | extern void nmi_watchdog_tick (struct pt_regs * regs); | 120 | extern void nmi_watchdog_tick (struct pt_regs * regs); |
121 | extern int APIC_init_uniprocessor (void); | 121 | extern int APIC_init(void); |
122 | extern void APIC_late_time_init(void); | ||
122 | extern void disable_APIC_timer(void); | 123 | extern void disable_APIC_timer(void); |
123 | extern void enable_APIC_timer(void); | 124 | extern void enable_APIC_timer(void); |
124 | 125 | ||
diff --git a/include/asm-i386/hw_irq.h b/include/asm-i386/hw_irq.h index 622815bf3243..9139b89497a1 100644 --- a/include/asm-i386/hw_irq.h +++ b/include/asm-i386/hw_irq.h | |||
@@ -55,6 +55,7 @@ void init_8259A(int aeoi); | |||
55 | void FASTCALL(send_IPI_self(int vector)); | 55 | void FASTCALL(send_IPI_self(int vector)); |
56 | void init_VISWS_APIC_irqs(void); | 56 | void init_VISWS_APIC_irqs(void); |
57 | void setup_IO_APIC(void); | 57 | void setup_IO_APIC(void); |
58 | void IO_APIC_late_time_init(void); | ||
58 | void disable_IO_APIC(void); | 59 | void disable_IO_APIC(void); |
59 | void print_IO_APIC(void); | 60 | void print_IO_APIC(void); |
60 | int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn); | 61 | int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn); |
diff --git a/include/asm-i386/mach-default/smpboot_hooks.h b/include/asm-i386/mach-default/smpboot_hooks.h index 7f45f6311059..d7c70c144f9f 100644 --- a/include/asm-i386/mach-default/smpboot_hooks.h +++ b/include/asm-i386/mach-default/smpboot_hooks.h | |||
@@ -1,11 +1,6 @@ | |||
1 | /* two abstractions specific to kernel/smpboot.c, mainly to cater to visws | 1 | /* two abstractions specific to kernel/smpboot.c, mainly to cater to visws |
2 | * which needs to alter them. */ | 2 | * which needs to alter them. */ |
3 | 3 | ||
4 | static inline void smpboot_clear_io_apic_irqs(void) | ||
5 | { | ||
6 | io_apic_irqs = 0; | ||
7 | } | ||
8 | |||
9 | static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip) | 4 | static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip) |
10 | { | 5 | { |
11 | CMOS_WRITE(0xa, 0xf); | 6 | CMOS_WRITE(0xa, 0xf); |
@@ -32,13 +27,3 @@ static inline void smpboot_restore_warm_reset_vector(void) | |||
32 | 27 | ||
33 | *((volatile long *) phys_to_virt(0x467)) = 0; | 28 | *((volatile long *) phys_to_virt(0x467)) = 0; |
34 | } | 29 | } |
35 | |||
36 | static inline void smpboot_setup_io_apic(void) | ||
37 | { | ||
38 | /* | ||
39 | * Here we can be sure that there is an IO-APIC in the system. Let's | ||
40 | * go and set it up: | ||
41 | */ | ||
42 | if (!skip_ioapic_setup && nr_ioapics) | ||
43 | setup_IO_APIC(); | ||
44 | } | ||
diff --git a/include/asm-i386/mach-visws/smpboot_hooks.h b/include/asm-i386/mach-visws/smpboot_hooks.h index d926471fa359..14d8e0375f7a 100644 --- a/include/asm-i386/mach-visws/smpboot_hooks.h +++ b/include/asm-i386/mach-visws/smpboot_hooks.h | |||
@@ -11,14 +11,7 @@ static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip) | |||
11 | 11 | ||
12 | /* for visws do nothing for any of these */ | 12 | /* for visws do nothing for any of these */ |
13 | 13 | ||
14 | static inline void smpboot_clear_io_apic_irqs(void) | ||
15 | { | ||
16 | } | ||
17 | |||
18 | static inline void smpboot_restore_warm_reset_vector(void) | 14 | static inline void smpboot_restore_warm_reset_vector(void) |
19 | { | 15 | { |
20 | } | 16 | } |
21 | 17 | ||
22 | static inline void smpboot_setup_io_apic(void) | ||
23 | { | ||
24 | } | ||