Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Copyright 2004 James Cleverdon, IBM. | |
3 | * Subject to the GNU Public License, v.2 | |
4 | * | |
5 | * Generic APIC sub-arch probe layer. | |
6 | * | |
7 | * Hacked for x86-64 by James Cleverdon from i386 architecture code by | |
8 | * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and | |
9 | * James Cleverdon. | |
10 | */ | |
1da177e4 LT |
11 | #include <linux/threads.h> |
12 | #include <linux/cpumask.h> | |
13 | #include <linux/string.h> | |
07c7c474 | 14 | #include <linux/module.h> |
1da177e4 LT |
15 | #include <linux/kernel.h> |
16 | #include <linux/ctype.h> | |
17 | #include <linux/init.h> | |
1da177e4 LT |
18 | |
19 | #include <asm/smp.h> | |
20 | #include <asm/ipi.h> | |
00f1ea69 | 21 | #include <asm/genapic.h> |
1da177e4 | 22 | |
07c7c474 | 23 | #ifdef CONFIG_ACPI |
90660ec3 JD |
24 | #include <acpi/acpi_bus.h> |
25 | #endif | |
26 | ||
3b419089 | 27 | /* which logical CPU number maps to which CPU (physical APIC ID) */ |
ef97001f | 28 | u16 x86_cpu_to_apicid_init[NR_CPUS] __initdata |
07c7c474 | 29 | = { [0 ... NR_CPUS-1] = BAD_APICID }; |
3b419089 | 30 | void *x86_cpu_to_apicid_early_ptr; |
ef97001f | 31 | DEFINE_PER_CPU(u16, x86_cpu_to_apicid) = BAD_APICID; |
71fff5e6 | 32 | EXPORT_PER_CPU_SYMBOL(x86_cpu_to_apicid); |
1da177e4 | 33 | |
f18d397e | 34 | struct genapic __read_mostly *genapic = &apic_flat; |
1da177e4 LT |
35 | |
36 | /* | |
37 | * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode. | |
38 | */ | |
3c43f039 | 39 | void __init setup_apic_routing(void) |
1da177e4 | 40 | { |
f18d397e | 41 | #ifdef CONFIG_ACPI |
90660ec3 | 42 | /* |
07c7c474 IM |
43 | * Quirk: some x86_64 machines can only use physical APIC mode |
44 | * regardless of how many processors are present (x86_64 ES7000 | |
45 | * is an example). | |
90660ec3 | 46 | */ |
07c7c474 IM |
47 | if (acpi_gbl_FADT.header.revision > FADT2_REVISION_ID && |
48 | (acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) | |
49 | genapic = &apic_physflat; | |
3c43f039 | 50 | else |
90660ec3 JD |
51 | #endif |
52 | ||
3c43f039 | 53 | if (cpus_weight(cpu_possible_map) <= 8) |
1da177e4 | 54 | genapic = &apic_flat; |
f18d397e | 55 | else |
07c7c474 | 56 | genapic = &apic_physflat; |
1da177e4 | 57 | |
1da177e4 LT |
58 | printk(KERN_INFO "Setting APIC routing to %s\n", genapic->name); |
59 | } | |
60 | ||
07c7c474 | 61 | /* Same for both flat and physical. */ |
1da177e4 LT |
62 | |
63 | void send_IPI_self(int vector) | |
64 | { | |
65 | __send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL); | |
66 | } |