ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / include / asm-i386 / mach-pc9800 / smpboot_hooks.h
1 /* two abstractions specific to kernel/smpboot.c, mainly to cater to visws
2  * which needs to alter them. */
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)
10 {
11         /* reset code is stored in 8255 on PC-9800. */
12         outb(0x0e, 0x37);       /* SHUT0 = 0 */
13         local_flush_tlb();
14         Dprintk("1.\n");
15         *((volatile unsigned short *) TRAMPOLINE_HIGH) = start_eip >> 4;
16         Dprintk("2.\n");
17         *((volatile unsigned short *) TRAMPOLINE_LOW) = start_eip & 0xf;
18         Dprintk("3.\n");
19         /*
20          * On PC-9800, continuation on warm reset is done by loading
21          * %ss:%sp from 0x0000:0404 and executing 'lret', so:
22          */
23         /* 0x3f0 is on unused interrupt vector and should be safe... */
24         *((volatile unsigned long *) phys_to_virt(0x404)) = 0x000003f0;
25         Dprintk("4.\n");
26 }
27
28 static inline void smpboot_restore_warm_reset_vector(void)
29 {
30         /*
31          * Install writable page 0 entry to set BIOS data area.
32          */
33         local_flush_tlb();
34
35         /*
36          * Paranoid:  Set warm reset code and vector here back
37          * to default values.
38          */
39         outb(0x0f, 0x37);       /* SHUT0 = 1 */
40
41         *((volatile long *) phys_to_virt(0x404)) = 0;
42 }
43
44 static inline void smpboot_setup_io_apic(void)
45 {
46         /*
47          * Here we can be sure that there is an IO-APIC in the system. Let's
48          * go and set it up:
49          */
50         if (!skip_ioapic_setup && nr_ioapics)
51                 setup_IO_APIC();
52 }