Commit | Line | Data |
---|---|---|
9844ab11 CG |
1 | /* |
2 | * NOOP APIC driver. | |
3 | * | |
4 | * Does almost nothing and should be substituted by a real apic driver via | |
5 | * probe routine. | |
6 | * | |
7 | * Though in case if apic is disabled (for some reason) we try | |
8 | * to not uglify the caller's code and allow to call (some) apic routines | |
f88f2b4f | 9 | * like self-ipi, etc... |
9844ab11 CG |
10 | */ |
11 | ||
12 | #include <linux/threads.h> | |
13 | #include <linux/cpumask.h> | |
14 | #include <linux/module.h> | |
15 | #include <linux/string.h> | |
16 | #include <linux/kernel.h> | |
17 | #include <linux/ctype.h> | |
9844ab11 CG |
18 | #include <linux/errno.h> |
19 | #include <asm/fixmap.h> | |
20 | #include <asm/mpspec.h> | |
21 | #include <asm/apicdef.h> | |
22 | #include <asm/apic.h> | |
23 | #include <asm/setup.h> | |
24 | ||
25 | #include <linux/smp.h> | |
26 | #include <asm/ipi.h> | |
27 | ||
28 | #include <linux/interrupt.h> | |
29 | #include <asm/acpi.h> | |
30 | #include <asm/e820.h> | |
31 | ||
f88f2b4f | 32 | static void noop_init_apic_ldr(void) { } |
4727da2e | 33 | static void noop_send_IPI(int cpu, int vector) { } |
f88f2b4f CG |
34 | static void noop_send_IPI_mask(const struct cpumask *cpumask, int vector) { } |
35 | static void noop_send_IPI_mask_allbutself(const struct cpumask *cpumask, int vector) { } | |
36 | static void noop_send_IPI_allbutself(int vector) { } | |
37 | static void noop_send_IPI_all(int vector) { } | |
38 | static void noop_send_IPI_self(int vector) { } | |
39 | static void noop_apic_wait_icr_idle(void) { } | |
40 | static void noop_apic_icr_write(u32 low, u32 id) { } | |
41 | ||
42 | static int noop_wakeup_secondary_cpu(int apicid, unsigned long start_eip) | |
9844ab11 | 43 | { |
f88f2b4f | 44 | return -1; |
9844ab11 CG |
45 | } |
46 | ||
f88f2b4f CG |
47 | static u32 noop_safe_apic_wait_icr_idle(void) |
48 | { | |
49 | return 0; | |
50 | } | |
51 | ||
52 | static u64 noop_apic_icr_read(void) | |
53 | { | |
54 | return 0; | |
55 | } | |
56 | ||
f88f2b4f CG |
57 | static int noop_phys_pkg_id(int cpuid_apic, int index_msb) |
58 | { | |
59 | return 0; | |
60 | } | |
61 | ||
62 | static unsigned int noop_get_apic_id(unsigned long x) | |
63 | { | |
64 | return 0; | |
65 | } | |
9844ab11 CG |
66 | |
67 | static int noop_probe(void) | |
68 | { | |
f88f2b4f CG |
69 | /* |
70 | * NOOP apic should not ever be | |
71 | * enabled via probe routine | |
72 | */ | |
9844ab11 CG |
73 | return 0; |
74 | } | |
75 | ||
76 | static int noop_apic_id_registered(void) | |
77 | { | |
f88f2b4f CG |
78 | /* |
79 | * if we would be really "pedantic" | |
80 | * we should pass read_apic_id() here | |
81 | * but since NOOP suppose APIC ID = 0 | |
82 | * lets save a few cycles | |
83 | */ | |
84 | return physid_isset(0, phys_cpu_present_map); | |
9844ab11 CG |
85 | } |
86 | ||
87 | static const struct cpumask *noop_target_cpus(void) | |
88 | { | |
9844ab11 CG |
89 | /* only BSP here */ |
90 | return cpumask_of(0); | |
91 | } | |
92 | ||
1ac322d0 SS |
93 | static void noop_vector_allocation_domain(int cpu, struct cpumask *retmask, |
94 | const struct cpumask *mask) | |
9844ab11 | 95 | { |
9844ab11 CG |
96 | if (cpu != 0) |
97 | pr_warning("APIC: Vector allocated for non-BSP cpu\n"); | |
9d8e1066 | 98 | cpumask_copy(retmask, cpumask_of(cpu)); |
9844ab11 CG |
99 | } |
100 | ||
9844ab11 CG |
101 | static u32 noop_apic_read(u32 reg) |
102 | { | |
9844ab11 CG |
103 | WARN_ON_ONCE((cpu_has_apic && !disable_apic)); |
104 | return 0; | |
105 | } | |
106 | ||
f88f2b4f CG |
107 | static void noop_apic_write(u32 reg, u32 v) |
108 | { | |
a946d8f1 | 109 | WARN_ON_ONCE(cpu_has_apic && !disable_apic); |
f88f2b4f CG |
110 | } |
111 | ||
9844ab11 CG |
112 | struct apic apic_noop = { |
113 | .name = "noop", | |
114 | .probe = noop_probe, | |
115 | .acpi_madt_oem_check = NULL, | |
116 | ||
fa63030e | 117 | .apic_id_valid = default_apic_id_valid, |
9844ab11 CG |
118 | .apic_id_registered = noop_apic_id_registered, |
119 | ||
120 | .irq_delivery_mode = dest_LowestPrio, | |
121 | /* logical delivery broadcast to all CPUs: */ | |
122 | .irq_dest_mode = 1, | |
123 | ||
124 | .target_cpus = noop_target_cpus, | |
125 | .disable_esr = 0, | |
126 | .dest_logical = APIC_DEST_LOGICAL, | |
4c59f3e6 | 127 | .check_apicid_used = default_check_apicid_used, |
9844ab11 CG |
128 | |
129 | .vector_allocation_domain = noop_vector_allocation_domain, | |
130 | .init_apic_ldr = noop_init_apic_ldr, | |
131 | ||
7abc0753 | 132 | .ioapic_phys_id_map = default_ioapic_phys_id_map, |
9844ab11 | 133 | .setup_apic_routing = NULL, |
9844ab11 | 134 | |
9844ab11 | 135 | .cpu_present_to_apicid = default_cpu_present_to_apicid, |
7abc0753 | 136 | .apicid_to_cpu_present = physid_set_mask_of_physid, |
9844ab11 | 137 | |
9844ab11 | 138 | .check_phys_apicid_present = default_check_phys_apicid_present, |
9844ab11 | 139 | |
f88f2b4f | 140 | .phys_pkg_id = noop_phys_pkg_id, |
9844ab11 | 141 | |
9844ab11 CG |
142 | .get_apic_id = noop_get_apic_id, |
143 | .set_apic_id = NULL, | |
144 | .apic_id_mask = 0x0F << 24, | |
145 | ||
6398268d | 146 | .cpu_mask_to_apicid_and = flat_cpu_mask_to_apicid_and, |
9844ab11 | 147 | |
4727da2e | 148 | .send_IPI = noop_send_IPI, |
9844ab11 CG |
149 | .send_IPI_mask = noop_send_IPI_mask, |
150 | .send_IPI_mask_allbutself = noop_send_IPI_mask_allbutself, | |
151 | .send_IPI_allbutself = noop_send_IPI_allbutself, | |
152 | .send_IPI_all = noop_send_IPI_all, | |
153 | .send_IPI_self = noop_send_IPI_self, | |
154 | ||
155 | .wakeup_secondary_cpu = noop_wakeup_secondary_cpu, | |
156 | ||
9844ab11 CG |
157 | .inquire_remote_apic = NULL, |
158 | ||
159 | .read = noop_apic_read, | |
160 | .write = noop_apic_write, | |
2a43195d | 161 | .eoi_write = noop_apic_write, |
9844ab11 CG |
162 | .icr_read = noop_apic_icr_read, |
163 | .icr_write = noop_apic_icr_write, | |
164 | .wait_icr_idle = noop_apic_wait_icr_idle, | |
165 | .safe_wait_icr_idle = noop_safe_apic_wait_icr_idle, | |
acb8bc09 TH |
166 | |
167 | #ifdef CONFIG_X86_32 | |
168 | .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, | |
169 | #endif | |
9844ab11 | 170 | }; |