diff options
Diffstat (limited to 'arch/x86/kernel/apic/io_apic.c')
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 1639 |
1 files changed, 653 insertions, 986 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 5c5b8f3dddb5..e5293394b548 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <linux/compiler.h> | 30 | #include <linux/compiler.h> |
31 | #include <linux/acpi.h> | 31 | #include <linux/acpi.h> |
32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
33 | #include <linux/sysdev.h> | 33 | #include <linux/syscore_ops.h> |
34 | #include <linux/msi.h> | 34 | #include <linux/msi.h> |
35 | #include <linux/htirq.h> | 35 | #include <linux/htirq.h> |
36 | #include <linux/freezer.h> | 36 | #include <linux/freezer.h> |
@@ -54,7 +54,6 @@ | |||
54 | #include <asm/dma.h> | 54 | #include <asm/dma.h> |
55 | #include <asm/timer.h> | 55 | #include <asm/timer.h> |
56 | #include <asm/i8259.h> | 56 | #include <asm/i8259.h> |
57 | #include <asm/nmi.h> | ||
58 | #include <asm/msidef.h> | 57 | #include <asm/msidef.h> |
59 | #include <asm/hypertransport.h> | 58 | #include <asm/hypertransport.h> |
60 | #include <asm/setup.h> | 59 | #include <asm/setup.h> |
@@ -77,17 +76,40 @@ int sis_apic_bug = -1; | |||
77 | static DEFINE_RAW_SPINLOCK(ioapic_lock); | 76 | static DEFINE_RAW_SPINLOCK(ioapic_lock); |
78 | static DEFINE_RAW_SPINLOCK(vector_lock); | 77 | static DEFINE_RAW_SPINLOCK(vector_lock); |
79 | 78 | ||
80 | /* | 79 | static struct ioapic { |
81 | * # of IRQ routing registers | 80 | /* |
82 | */ | 81 | * # of IRQ routing registers |
83 | int nr_ioapic_registers[MAX_IO_APICS]; | 82 | */ |
83 | int nr_registers; | ||
84 | /* | ||
85 | * Saved state during suspend/resume, or while enabling intr-remap. | ||
86 | */ | ||
87 | struct IO_APIC_route_entry *saved_registers; | ||
88 | /* I/O APIC config */ | ||
89 | struct mpc_ioapic mp_config; | ||
90 | /* IO APIC gsi routing info */ | ||
91 | struct mp_ioapic_gsi gsi_config; | ||
92 | DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); | ||
93 | } ioapics[MAX_IO_APICS]; | ||
84 | 94 | ||
85 | /* I/O APIC entries */ | 95 | #define mpc_ioapic_ver(id) ioapics[id].mp_config.apicver |
86 | struct mpc_ioapic mp_ioapics[MAX_IO_APICS]; | ||
87 | int nr_ioapics; | ||
88 | 96 | ||
89 | /* IO APIC gsi routing info */ | 97 | int mpc_ioapic_id(int id) |
90 | struct mp_ioapic_gsi mp_gsi_routing[MAX_IO_APICS]; | 98 | { |
99 | return ioapics[id].mp_config.apicid; | ||
100 | } | ||
101 | |||
102 | unsigned int mpc_ioapic_addr(int id) | ||
103 | { | ||
104 | return ioapics[id].mp_config.apicaddr; | ||
105 | } | ||
106 | |||
107 | struct mp_ioapic_gsi *mp_ioapic_gsi_routing(int id) | ||
108 | { | ||
109 | return &ioapics[id].gsi_config; | ||
110 | } | ||
111 | |||
112 | int nr_ioapics; | ||
91 | 113 | ||
92 | /* The one past the highest gsi number used */ | 114 | /* The one past the highest gsi number used */ |
93 | u32 gsi_top; | 115 | u32 gsi_top; |
@@ -109,7 +131,10 @@ DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES); | |||
109 | 131 | ||
110 | int skip_ioapic_setup; | 132 | int skip_ioapic_setup; |
111 | 133 | ||
112 | void arch_disable_smp_support(void) | 134 | /** |
135 | * disable_ioapic_support() - disables ioapic support at runtime | ||
136 | */ | ||
137 | void disable_ioapic_support(void) | ||
113 | { | 138 | { |
114 | #ifdef CONFIG_PCI | 139 | #ifdef CONFIG_PCI |
115 | noioapicquirk = 1; | 140 | noioapicquirk = 1; |
@@ -121,25 +146,45 @@ void arch_disable_smp_support(void) | |||
121 | static int __init parse_noapic(char *str) | 146 | static int __init parse_noapic(char *str) |
122 | { | 147 | { |
123 | /* disable IO-APIC */ | 148 | /* disable IO-APIC */ |
124 | arch_disable_smp_support(); | 149 | disable_ioapic_support(); |
125 | return 0; | 150 | return 0; |
126 | } | 151 | } |
127 | early_param("noapic", parse_noapic); | 152 | early_param("noapic", parse_noapic); |
128 | 153 | ||
154 | static int io_apic_setup_irq_pin(unsigned int irq, int node, | ||
155 | struct io_apic_irq_attr *attr); | ||
156 | |||
157 | /* Will be called in mpparse/acpi/sfi codes for saving IRQ info */ | ||
158 | void mp_save_irq(struct mpc_intsrc *m) | ||
159 | { | ||
160 | int i; | ||
161 | |||
162 | apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x," | ||
163 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", | ||
164 | m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus, | ||
165 | m->srcbusirq, m->dstapic, m->dstirq); | ||
166 | |||
167 | for (i = 0; i < mp_irq_entries; i++) { | ||
168 | if (!memcmp(&mp_irqs[i], m, sizeof(*m))) | ||
169 | return; | ||
170 | } | ||
171 | |||
172 | memcpy(&mp_irqs[mp_irq_entries], m, sizeof(*m)); | ||
173 | if (++mp_irq_entries == MAX_IRQ_SOURCES) | ||
174 | panic("Max # of irq sources exceeded!!\n"); | ||
175 | } | ||
176 | |||
129 | struct irq_pin_list { | 177 | struct irq_pin_list { |
130 | int apic, pin; | 178 | int apic, pin; |
131 | struct irq_pin_list *next; | 179 | struct irq_pin_list *next; |
132 | }; | 180 | }; |
133 | 181 | ||
134 | static struct irq_pin_list *get_one_free_irq_2_pin(int node) | 182 | static struct irq_pin_list *alloc_irq_pin_list(int node) |
135 | { | 183 | { |
136 | struct irq_pin_list *pin; | 184 | return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node); |
137 | |||
138 | pin = kzalloc_node(sizeof(*pin), GFP_ATOMIC, node); | ||
139 | |||
140 | return pin; | ||
141 | } | 185 | } |
142 | 186 | ||
187 | |||
143 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ | 188 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ |
144 | #ifdef CONFIG_SPARSE_IRQ | 189 | #ifdef CONFIG_SPARSE_IRQ |
145 | static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY]; | 190 | static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY]; |
@@ -150,25 +195,32 @@ static struct irq_cfg irq_cfgx[NR_IRQS]; | |||
150 | int __init arch_early_irq_init(void) | 195 | int __init arch_early_irq_init(void) |
151 | { | 196 | { |
152 | struct irq_cfg *cfg; | 197 | struct irq_cfg *cfg; |
153 | struct irq_desc *desc; | 198 | int count, node, i; |
154 | int count; | ||
155 | int node; | ||
156 | int i; | ||
157 | 199 | ||
158 | if (!legacy_pic->nr_legacy_irqs) { | 200 | if (!legacy_pic->nr_legacy_irqs) { |
159 | nr_irqs_gsi = 0; | 201 | nr_irqs_gsi = 0; |
160 | io_apic_irqs = ~0UL; | 202 | io_apic_irqs = ~0UL; |
161 | } | 203 | } |
162 | 204 | ||
205 | for (i = 0; i < nr_ioapics; i++) { | ||
206 | ioapics[i].saved_registers = | ||
207 | kzalloc(sizeof(struct IO_APIC_route_entry) * | ||
208 | ioapics[i].nr_registers, GFP_KERNEL); | ||
209 | if (!ioapics[i].saved_registers) | ||
210 | pr_err("IOAPIC %d: suspend/resume impossible!\n", i); | ||
211 | } | ||
212 | |||
163 | cfg = irq_cfgx; | 213 | cfg = irq_cfgx; |
164 | count = ARRAY_SIZE(irq_cfgx); | 214 | count = ARRAY_SIZE(irq_cfgx); |
165 | node= cpu_to_node(boot_cpu_id); | 215 | node = cpu_to_node(0); |
216 | |||
217 | /* Make sure the legacy interrupts are marked in the bitmap */ | ||
218 | irq_reserve_irqs(0, legacy_pic->nr_legacy_irqs); | ||
166 | 219 | ||
167 | for (i = 0; i < count; i++) { | 220 | for (i = 0; i < count; i++) { |
168 | desc = irq_to_desc(i); | 221 | irq_set_chip_data(i, &cfg[i]); |
169 | desc->chip_data = &cfg[i]; | 222 | zalloc_cpumask_var_node(&cfg[i].domain, GFP_KERNEL, node); |
170 | zalloc_cpumask_var_node(&cfg[i].domain, GFP_NOWAIT, node); | 223 | zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_KERNEL, node); |
171 | zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_NOWAIT, node); | ||
172 | /* | 224 | /* |
173 | * For legacy IRQ's, start with assigning irq0 to irq15 to | 225 | * For legacy IRQ's, start with assigning irq0 to irq15 to |
174 | * IRQ0_VECTOR to IRQ15_VECTOR on cpu 0. | 226 | * IRQ0_VECTOR to IRQ15_VECTOR on cpu 0. |
@@ -183,170 +235,88 @@ int __init arch_early_irq_init(void) | |||
183 | } | 235 | } |
184 | 236 | ||
185 | #ifdef CONFIG_SPARSE_IRQ | 237 | #ifdef CONFIG_SPARSE_IRQ |
186 | struct irq_cfg *irq_cfg(unsigned int irq) | 238 | static struct irq_cfg *irq_cfg(unsigned int irq) |
187 | { | 239 | { |
188 | struct irq_cfg *cfg = NULL; | 240 | return irq_get_chip_data(irq); |
189 | struct irq_desc *desc; | ||
190 | |||
191 | desc = irq_to_desc(irq); | ||
192 | if (desc) | ||
193 | cfg = desc->chip_data; | ||
194 | |||
195 | return cfg; | ||
196 | } | 241 | } |
197 | 242 | ||
198 | static struct irq_cfg *get_one_free_irq_cfg(int node) | 243 | static struct irq_cfg *alloc_irq_cfg(unsigned int irq, int node) |
199 | { | 244 | { |
200 | struct irq_cfg *cfg; | 245 | struct irq_cfg *cfg; |
201 | 246 | ||
202 | cfg = kzalloc_node(sizeof(*cfg), GFP_ATOMIC, node); | 247 | cfg = kzalloc_node(sizeof(*cfg), GFP_KERNEL, node); |
203 | if (cfg) { | 248 | if (!cfg) |
204 | if (!zalloc_cpumask_var_node(&cfg->domain, GFP_ATOMIC, node)) { | 249 | return NULL; |
205 | kfree(cfg); | 250 | if (!zalloc_cpumask_var_node(&cfg->domain, GFP_KERNEL, node)) |
206 | cfg = NULL; | 251 | goto out_cfg; |
207 | } else if (!zalloc_cpumask_var_node(&cfg->old_domain, | 252 | if (!zalloc_cpumask_var_node(&cfg->old_domain, GFP_KERNEL, node)) |
208 | GFP_ATOMIC, node)) { | 253 | goto out_domain; |
209 | free_cpumask_var(cfg->domain); | ||
210 | kfree(cfg); | ||
211 | cfg = NULL; | ||
212 | } | ||
213 | } | ||
214 | |||
215 | return cfg; | 254 | return cfg; |
255 | out_domain: | ||
256 | free_cpumask_var(cfg->domain); | ||
257 | out_cfg: | ||
258 | kfree(cfg); | ||
259 | return NULL; | ||
216 | } | 260 | } |
217 | 261 | ||
218 | int arch_init_chip_data(struct irq_desc *desc, int node) | 262 | static void free_irq_cfg(unsigned int at, struct irq_cfg *cfg) |
219 | { | ||
220 | struct irq_cfg *cfg; | ||
221 | |||
222 | cfg = desc->chip_data; | ||
223 | if (!cfg) { | ||
224 | desc->chip_data = get_one_free_irq_cfg(node); | ||
225 | if (!desc->chip_data) { | ||
226 | printk(KERN_ERR "can not alloc irq_cfg\n"); | ||
227 | BUG_ON(1); | ||
228 | } | ||
229 | } | ||
230 | |||
231 | return 0; | ||
232 | } | ||
233 | |||
234 | /* for move_irq_desc */ | ||
235 | static void | ||
236 | init_copy_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg, int node) | ||
237 | { | 263 | { |
238 | struct irq_pin_list *old_entry, *head, *tail, *entry; | 264 | if (!cfg) |
239 | |||
240 | cfg->irq_2_pin = NULL; | ||
241 | old_entry = old_cfg->irq_2_pin; | ||
242 | if (!old_entry) | ||
243 | return; | ||
244 | |||
245 | entry = get_one_free_irq_2_pin(node); | ||
246 | if (!entry) | ||
247 | return; | 265 | return; |
266 | irq_set_chip_data(at, NULL); | ||
267 | free_cpumask_var(cfg->domain); | ||
268 | free_cpumask_var(cfg->old_domain); | ||
269 | kfree(cfg); | ||
270 | } | ||
248 | 271 | ||
249 | entry->apic = old_entry->apic; | 272 | #else |
250 | entry->pin = old_entry->pin; | ||
251 | head = entry; | ||
252 | tail = entry; | ||
253 | old_entry = old_entry->next; | ||
254 | while (old_entry) { | ||
255 | entry = get_one_free_irq_2_pin(node); | ||
256 | if (!entry) { | ||
257 | entry = head; | ||
258 | while (entry) { | ||
259 | head = entry->next; | ||
260 | kfree(entry); | ||
261 | entry = head; | ||
262 | } | ||
263 | /* still use the old one */ | ||
264 | return; | ||
265 | } | ||
266 | entry->apic = old_entry->apic; | ||
267 | entry->pin = old_entry->pin; | ||
268 | tail->next = entry; | ||
269 | tail = entry; | ||
270 | old_entry = old_entry->next; | ||
271 | } | ||
272 | 273 | ||
273 | tail->next = NULL; | 274 | struct irq_cfg *irq_cfg(unsigned int irq) |
274 | cfg->irq_2_pin = head; | 275 | { |
276 | return irq < nr_irqs ? irq_cfgx + irq : NULL; | ||
275 | } | 277 | } |
276 | 278 | ||
277 | static void free_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg) | 279 | static struct irq_cfg *alloc_irq_cfg(unsigned int irq, int node) |
278 | { | 280 | { |
279 | struct irq_pin_list *entry, *next; | 281 | return irq_cfgx + irq; |
280 | 282 | } | |
281 | if (old_cfg->irq_2_pin == cfg->irq_2_pin) | ||
282 | return; | ||
283 | 283 | ||
284 | entry = old_cfg->irq_2_pin; | 284 | static inline void free_irq_cfg(unsigned int at, struct irq_cfg *cfg) { } |
285 | 285 | ||
286 | while (entry) { | 286 | #endif |
287 | next = entry->next; | ||
288 | kfree(entry); | ||
289 | entry = next; | ||
290 | } | ||
291 | old_cfg->irq_2_pin = NULL; | ||
292 | } | ||
293 | 287 | ||
294 | void arch_init_copy_chip_data(struct irq_desc *old_desc, | 288 | static struct irq_cfg *alloc_irq_and_cfg_at(unsigned int at, int node) |
295 | struct irq_desc *desc, int node) | ||
296 | { | 289 | { |
290 | int res = irq_alloc_desc_at(at, node); | ||
297 | struct irq_cfg *cfg; | 291 | struct irq_cfg *cfg; |
298 | struct irq_cfg *old_cfg; | ||
299 | 292 | ||
300 | cfg = get_one_free_irq_cfg(node); | 293 | if (res < 0) { |
301 | 294 | if (res != -EEXIST) | |
302 | if (!cfg) | 295 | return NULL; |
303 | return; | 296 | cfg = irq_get_chip_data(at); |
304 | 297 | if (cfg) | |
305 | desc->chip_data = cfg; | 298 | return cfg; |
306 | 299 | } | |
307 | old_cfg = old_desc->chip_data; | ||
308 | |||
309 | cfg->vector = old_cfg->vector; | ||
310 | cfg->move_in_progress = old_cfg->move_in_progress; | ||
311 | cpumask_copy(cfg->domain, old_cfg->domain); | ||
312 | cpumask_copy(cfg->old_domain, old_cfg->old_domain); | ||
313 | |||
314 | init_copy_irq_2_pin(old_cfg, cfg, node); | ||
315 | } | ||
316 | 300 | ||
317 | static void free_irq_cfg(struct irq_cfg *cfg) | 301 | cfg = alloc_irq_cfg(at, node); |
318 | { | 302 | if (cfg) |
319 | free_cpumask_var(cfg->domain); | 303 | irq_set_chip_data(at, cfg); |
320 | free_cpumask_var(cfg->old_domain); | 304 | else |
321 | kfree(cfg); | 305 | irq_free_desc(at); |
306 | return cfg; | ||
322 | } | 307 | } |
323 | 308 | ||
324 | void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc) | 309 | static int alloc_irq_from(unsigned int from, int node) |
325 | { | 310 | { |
326 | struct irq_cfg *old_cfg, *cfg; | 311 | return irq_alloc_desc_from(from, node); |
327 | |||
328 | old_cfg = old_desc->chip_data; | ||
329 | cfg = desc->chip_data; | ||
330 | |||
331 | if (old_cfg == cfg) | ||
332 | return; | ||
333 | |||
334 | if (old_cfg) { | ||
335 | free_irq_2_pin(old_cfg, cfg); | ||
336 | free_irq_cfg(old_cfg); | ||
337 | old_desc->chip_data = NULL; | ||
338 | } | ||
339 | } | 312 | } |
340 | /* end for move_irq_desc */ | ||
341 | 313 | ||
342 | #else | 314 | static void free_irq_at(unsigned int at, struct irq_cfg *cfg) |
343 | struct irq_cfg *irq_cfg(unsigned int irq) | ||
344 | { | 315 | { |
345 | return irq < nr_irqs ? irq_cfgx + irq : NULL; | 316 | free_irq_cfg(at, cfg); |
317 | irq_free_desc(at); | ||
346 | } | 318 | } |
347 | 319 | ||
348 | #endif | ||
349 | |||
350 | struct io_apic { | 320 | struct io_apic { |
351 | unsigned int index; | 321 | unsigned int index; |
352 | unsigned int unused[3]; | 322 | unsigned int unused[3]; |
@@ -358,7 +328,7 @@ struct io_apic { | |||
358 | static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) | 328 | static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) |
359 | { | 329 | { |
360 | return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) | 330 | return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) |
361 | + (mp_ioapics[idx].apicaddr & ~PAGE_MASK); | 331 | + (mpc_ioapic_addr(idx) & ~PAGE_MASK); |
362 | } | 332 | } |
363 | 333 | ||
364 | static inline void io_apic_eoi(unsigned int apic, unsigned int vector) | 334 | static inline void io_apic_eoi(unsigned int apic, unsigned int vector) |
@@ -451,7 +421,7 @@ __ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) | |||
451 | io_apic_write(apic, 0x10 + 2*pin, eu.w1); | 421 | io_apic_write(apic, 0x10 + 2*pin, eu.w1); |
452 | } | 422 | } |
453 | 423 | ||
454 | void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) | 424 | static void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) |
455 | { | 425 | { |
456 | unsigned long flags; | 426 | unsigned long flags; |
457 | raw_spin_lock_irqsave(&ioapic_lock, flags); | 427 | raw_spin_lock_irqsave(&ioapic_lock, flags); |
@@ -481,7 +451,7 @@ static void ioapic_mask_entry(int apic, int pin) | |||
481 | * fast in the common case, and fast for shared ISA-space IRQs. | 451 | * fast in the common case, and fast for shared ISA-space IRQs. |
482 | */ | 452 | */ |
483 | static int | 453 | static int |
484 | add_pin_to_irq_node_nopanic(struct irq_cfg *cfg, int node, int apic, int pin) | 454 | __add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin) |
485 | { | 455 | { |
486 | struct irq_pin_list **last, *entry; | 456 | struct irq_pin_list **last, *entry; |
487 | 457 | ||
@@ -493,7 +463,7 @@ add_pin_to_irq_node_nopanic(struct irq_cfg *cfg, int node, int apic, int pin) | |||
493 | last = &entry->next; | 463 | last = &entry->next; |
494 | } | 464 | } |
495 | 465 | ||
496 | entry = get_one_free_irq_2_pin(node); | 466 | entry = alloc_irq_pin_list(node); |
497 | if (!entry) { | 467 | if (!entry) { |
498 | printk(KERN_ERR "can not alloc irq_pin_list (%d,%d,%d)\n", | 468 | printk(KERN_ERR "can not alloc irq_pin_list (%d,%d,%d)\n", |
499 | node, apic, pin); | 469 | node, apic, pin); |
@@ -508,7 +478,7 @@ add_pin_to_irq_node_nopanic(struct irq_cfg *cfg, int node, int apic, int pin) | |||
508 | 478 | ||
509 | static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin) | 479 | static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin) |
510 | { | 480 | { |
511 | if (add_pin_to_irq_node_nopanic(cfg, node, apic, pin)) | 481 | if (__add_pin_to_irq_node(cfg, node, apic, pin)) |
512 | panic("IO-APIC: failed to add irq-pin. Can not proceed\n"); | 482 | panic("IO-APIC: failed to add irq-pin. Can not proceed\n"); |
513 | } | 483 | } |
514 | 484 | ||
@@ -571,11 +541,6 @@ static void __unmask_and_level_IO_APIC_irq(struct irq_pin_list *entry) | |||
571 | IO_APIC_REDIR_LEVEL_TRIGGER, NULL); | 541 | IO_APIC_REDIR_LEVEL_TRIGGER, NULL); |
572 | } | 542 | } |
573 | 543 | ||
574 | static void __unmask_IO_APIC_irq(struct irq_cfg *cfg) | ||
575 | { | ||
576 | io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED, 0, NULL); | ||
577 | } | ||
578 | |||
579 | static void io_apic_sync(struct irq_pin_list *entry) | 544 | static void io_apic_sync(struct irq_pin_list *entry) |
580 | { | 545 | { |
581 | /* | 546 | /* |
@@ -587,44 +552,37 @@ static void io_apic_sync(struct irq_pin_list *entry) | |||
587 | readl(&io_apic->data); | 552 | readl(&io_apic->data); |
588 | } | 553 | } |
589 | 554 | ||
590 | static void __mask_IO_APIC_irq(struct irq_cfg *cfg) | 555 | static void mask_ioapic(struct irq_cfg *cfg) |
591 | { | 556 | { |
557 | unsigned long flags; | ||
558 | |||
559 | raw_spin_lock_irqsave(&ioapic_lock, flags); | ||
592 | io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync); | 560 | io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync); |
561 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | ||
593 | } | 562 | } |
594 | 563 | ||
595 | static void mask_IO_APIC_irq_desc(struct irq_desc *desc) | 564 | static void mask_ioapic_irq(struct irq_data *data) |
596 | { | 565 | { |
597 | struct irq_cfg *cfg = desc->chip_data; | 566 | mask_ioapic(data->chip_data); |
598 | unsigned long flags; | 567 | } |
599 | |||
600 | BUG_ON(!cfg); | ||
601 | 568 | ||
602 | raw_spin_lock_irqsave(&ioapic_lock, flags); | 569 | static void __unmask_ioapic(struct irq_cfg *cfg) |
603 | __mask_IO_APIC_irq(cfg); | 570 | { |
604 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | 571 | io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED, 0, NULL); |
605 | } | 572 | } |
606 | 573 | ||
607 | static void unmask_IO_APIC_irq_desc(struct irq_desc *desc) | 574 | static void unmask_ioapic(struct irq_cfg *cfg) |
608 | { | 575 | { |
609 | struct irq_cfg *cfg = desc->chip_data; | ||
610 | unsigned long flags; | 576 | unsigned long flags; |
611 | 577 | ||
612 | raw_spin_lock_irqsave(&ioapic_lock, flags); | 578 | raw_spin_lock_irqsave(&ioapic_lock, flags); |
613 | __unmask_IO_APIC_irq(cfg); | 579 | __unmask_ioapic(cfg); |
614 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | 580 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); |
615 | } | 581 | } |
616 | 582 | ||
617 | static void mask_IO_APIC_irq(unsigned int irq) | 583 | static void unmask_ioapic_irq(struct irq_data *data) |
618 | { | 584 | { |
619 | struct irq_desc *desc = irq_to_desc(irq); | 585 | unmask_ioapic(data->chip_data); |
620 | |||
621 | mask_IO_APIC_irq_desc(desc); | ||
622 | } | ||
623 | static void unmask_IO_APIC_irq(unsigned int irq) | ||
624 | { | ||
625 | struct irq_desc *desc = irq_to_desc(irq); | ||
626 | |||
627 | unmask_IO_APIC_irq_desc(desc); | ||
628 | } | 586 | } |
629 | 587 | ||
630 | static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin) | 588 | static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin) |
@@ -646,7 +604,7 @@ static void clear_IO_APIC (void) | |||
646 | int apic, pin; | 604 | int apic, pin; |
647 | 605 | ||
648 | for (apic = 0; apic < nr_ioapics; apic++) | 606 | for (apic = 0; apic < nr_ioapics; apic++) |
649 | for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) | 607 | for (pin = 0; pin < ioapics[apic].nr_registers; pin++) |
650 | clear_IO_APIC_pin(apic, pin); | 608 | clear_IO_APIC_pin(apic, pin); |
651 | } | 609 | } |
652 | 610 | ||
@@ -688,74 +646,43 @@ static int __init ioapic_pirq_setup(char *str) | |||
688 | __setup("pirq=", ioapic_pirq_setup); | 646 | __setup("pirq=", ioapic_pirq_setup); |
689 | #endif /* CONFIG_X86_32 */ | 647 | #endif /* CONFIG_X86_32 */ |
690 | 648 | ||
691 | struct IO_APIC_route_entry **alloc_ioapic_entries(void) | ||
692 | { | ||
693 | int apic; | ||
694 | struct IO_APIC_route_entry **ioapic_entries; | ||
695 | |||
696 | ioapic_entries = kzalloc(sizeof(*ioapic_entries) * nr_ioapics, | ||
697 | GFP_ATOMIC); | ||
698 | if (!ioapic_entries) | ||
699 | return 0; | ||
700 | |||
701 | for (apic = 0; apic < nr_ioapics; apic++) { | ||
702 | ioapic_entries[apic] = | ||
703 | kzalloc(sizeof(struct IO_APIC_route_entry) * | ||
704 | nr_ioapic_registers[apic], GFP_ATOMIC); | ||
705 | if (!ioapic_entries[apic]) | ||
706 | goto nomem; | ||
707 | } | ||
708 | |||
709 | return ioapic_entries; | ||
710 | |||
711 | nomem: | ||
712 | while (--apic >= 0) | ||
713 | kfree(ioapic_entries[apic]); | ||
714 | kfree(ioapic_entries); | ||
715 | |||
716 | return 0; | ||
717 | } | ||
718 | |||
719 | /* | 649 | /* |
720 | * Saves all the IO-APIC RTE's | 650 | * Saves all the IO-APIC RTE's |
721 | */ | 651 | */ |
722 | int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries) | 652 | int save_ioapic_entries(void) |
723 | { | 653 | { |
724 | int apic, pin; | 654 | int apic, pin; |
725 | 655 | int err = 0; | |
726 | if (!ioapic_entries) | ||
727 | return -ENOMEM; | ||
728 | 656 | ||
729 | for (apic = 0; apic < nr_ioapics; apic++) { | 657 | for (apic = 0; apic < nr_ioapics; apic++) { |
730 | if (!ioapic_entries[apic]) | 658 | if (!ioapics[apic].saved_registers) { |
731 | return -ENOMEM; | 659 | err = -ENOMEM; |
660 | continue; | ||
661 | } | ||
732 | 662 | ||
733 | for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) | 663 | for (pin = 0; pin < ioapics[apic].nr_registers; pin++) |
734 | ioapic_entries[apic][pin] = | 664 | ioapics[apic].saved_registers[pin] = |
735 | ioapic_read_entry(apic, pin); | 665 | ioapic_read_entry(apic, pin); |
736 | } | 666 | } |
737 | 667 | ||
738 | return 0; | 668 | return err; |
739 | } | 669 | } |
740 | 670 | ||
741 | /* | 671 | /* |
742 | * Mask all IO APIC entries. | 672 | * Mask all IO APIC entries. |
743 | */ | 673 | */ |
744 | void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries) | 674 | void mask_ioapic_entries(void) |
745 | { | 675 | { |
746 | int apic, pin; | 676 | int apic, pin; |
747 | 677 | ||
748 | if (!ioapic_entries) | ||
749 | return; | ||
750 | |||
751 | for (apic = 0; apic < nr_ioapics; apic++) { | 678 | for (apic = 0; apic < nr_ioapics; apic++) { |
752 | if (!ioapic_entries[apic]) | 679 | if (!ioapics[apic].saved_registers) |
753 | break; | 680 | continue; |
754 | 681 | ||
755 | for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) { | 682 | for (pin = 0; pin < ioapics[apic].nr_registers; pin++) { |
756 | struct IO_APIC_route_entry entry; | 683 | struct IO_APIC_route_entry entry; |
757 | 684 | ||
758 | entry = ioapic_entries[apic][pin]; | 685 | entry = ioapics[apic].saved_registers[pin]; |
759 | if (!entry.mask) { | 686 | if (!entry.mask) { |
760 | entry.mask = 1; | 687 | entry.mask = 1; |
761 | ioapic_write_entry(apic, pin, entry); | 688 | ioapic_write_entry(apic, pin, entry); |
@@ -765,36 +692,23 @@ void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries) | |||
765 | } | 692 | } |
766 | 693 | ||
767 | /* | 694 | /* |
768 | * Restore IO APIC entries which was saved in ioapic_entries. | 695 | * Restore IO APIC entries which was saved in the ioapic structure. |
769 | */ | 696 | */ |
770 | int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries) | 697 | int restore_ioapic_entries(void) |
771 | { | 698 | { |
772 | int apic, pin; | 699 | int apic, pin; |
773 | 700 | ||
774 | if (!ioapic_entries) | ||
775 | return -ENOMEM; | ||
776 | |||
777 | for (apic = 0; apic < nr_ioapics; apic++) { | 701 | for (apic = 0; apic < nr_ioapics; apic++) { |
778 | if (!ioapic_entries[apic]) | 702 | if (!ioapics[apic].saved_registers) |
779 | return -ENOMEM; | 703 | continue; |
780 | 704 | ||
781 | for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) | 705 | for (pin = 0; pin < ioapics[apic].nr_registers; pin++) |
782 | ioapic_write_entry(apic, pin, | 706 | ioapic_write_entry(apic, pin, |
783 | ioapic_entries[apic][pin]); | 707 | ioapics[apic].saved_registers[pin]); |
784 | } | 708 | } |
785 | return 0; | 709 | return 0; |
786 | } | 710 | } |
787 | 711 | ||
788 | void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries) | ||
789 | { | ||
790 | int apic; | ||
791 | |||
792 | for (apic = 0; apic < nr_ioapics; apic++) | ||
793 | kfree(ioapic_entries[apic]); | ||
794 | |||
795 | kfree(ioapic_entries); | ||
796 | } | ||
797 | |||
798 | /* | 712 | /* |
799 | * Find the IRQ entry number of a certain pin. | 713 | * Find the IRQ entry number of a certain pin. |
800 | */ | 714 | */ |
@@ -804,7 +718,7 @@ static int find_irq_entry(int apic, int pin, int type) | |||
804 | 718 | ||
805 | for (i = 0; i < mp_irq_entries; i++) | 719 | for (i = 0; i < mp_irq_entries; i++) |
806 | if (mp_irqs[i].irqtype == type && | 720 | if (mp_irqs[i].irqtype == type && |
807 | (mp_irqs[i].dstapic == mp_ioapics[apic].apicid || | 721 | (mp_irqs[i].dstapic == mpc_ioapic_id(apic) || |
808 | mp_irqs[i].dstapic == MP_APIC_ALL) && | 722 | mp_irqs[i].dstapic == MP_APIC_ALL) && |
809 | mp_irqs[i].dstirq == pin) | 723 | mp_irqs[i].dstirq == pin) |
810 | return i; | 724 | return i; |
@@ -846,7 +760,7 @@ static int __init find_isa_irq_apic(int irq, int type) | |||
846 | if (i < mp_irq_entries) { | 760 | if (i < mp_irq_entries) { |
847 | int apic; | 761 | int apic; |
848 | for(apic = 0; apic < nr_ioapics; apic++) { | 762 | for(apic = 0; apic < nr_ioapics; apic++) { |
849 | if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic) | 763 | if (mpc_ioapic_id(apic) == mp_irqs[i].dstapic) |
850 | return apic; | 764 | return apic; |
851 | } | 765 | } |
852 | } | 766 | } |
@@ -897,7 +811,7 @@ static int EISA_ELCR(unsigned int irq) | |||
897 | #define default_MCA_trigger(idx) (1) | 811 | #define default_MCA_trigger(idx) (1) |
898 | #define default_MCA_polarity(idx) default_ISA_polarity(idx) | 812 | #define default_MCA_polarity(idx) default_ISA_polarity(idx) |
899 | 813 | ||
900 | static int MPBIOS_polarity(int idx) | 814 | static int irq_polarity(int idx) |
901 | { | 815 | { |
902 | int bus = mp_irqs[idx].srcbus; | 816 | int bus = mp_irqs[idx].srcbus; |
903 | int polarity; | 817 | int polarity; |
@@ -939,7 +853,7 @@ static int MPBIOS_polarity(int idx) | |||
939 | return polarity; | 853 | return polarity; |
940 | } | 854 | } |
941 | 855 | ||
942 | static int MPBIOS_trigger(int idx) | 856 | static int irq_trigger(int idx) |
943 | { | 857 | { |
944 | int bus = mp_irqs[idx].srcbus; | 858 | int bus = mp_irqs[idx].srcbus; |
945 | int trigger; | 859 | int trigger; |
@@ -1011,20 +925,11 @@ static int MPBIOS_trigger(int idx) | |||
1011 | return trigger; | 925 | return trigger; |
1012 | } | 926 | } |
1013 | 927 | ||
1014 | static inline int irq_polarity(int idx) | ||
1015 | { | ||
1016 | return MPBIOS_polarity(idx); | ||
1017 | } | ||
1018 | |||
1019 | static inline int irq_trigger(int idx) | ||
1020 | { | ||
1021 | return MPBIOS_trigger(idx); | ||
1022 | } | ||
1023 | |||
1024 | static int pin_2_irq(int idx, int apic, int pin) | 928 | static int pin_2_irq(int idx, int apic, int pin) |
1025 | { | 929 | { |
1026 | int irq; | 930 | int irq; |
1027 | int bus = mp_irqs[idx].srcbus; | 931 | int bus = mp_irqs[idx].srcbus; |
932 | struct mp_ioapic_gsi *gsi_cfg = mp_ioapic_gsi_routing(apic); | ||
1028 | 933 | ||
1029 | /* | 934 | /* |
1030 | * Debugging check, we are in big trouble if this message pops up! | 935 | * Debugging check, we are in big trouble if this message pops up! |
@@ -1035,7 +940,7 @@ static int pin_2_irq(int idx, int apic, int pin) | |||
1035 | if (test_bit(bus, mp_bus_not_pci)) { | 940 | if (test_bit(bus, mp_bus_not_pci)) { |
1036 | irq = mp_irqs[idx].srcbusirq; | 941 | irq = mp_irqs[idx].srcbusirq; |
1037 | } else { | 942 | } else { |
1038 | u32 gsi = mp_gsi_routing[apic].gsi_base + pin; | 943 | u32 gsi = gsi_cfg->gsi_base + pin; |
1039 | 944 | ||
1040 | if (gsi >= NR_IRQS_LEGACY) | 945 | if (gsi >= NR_IRQS_LEGACY) |
1041 | irq = gsi; | 946 | irq = gsi; |
@@ -1086,7 +991,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin, | |||
1086 | int lbus = mp_irqs[i].srcbus; | 991 | int lbus = mp_irqs[i].srcbus; |
1087 | 992 | ||
1088 | for (apic = 0; apic < nr_ioapics; apic++) | 993 | for (apic = 0; apic < nr_ioapics; apic++) |
1089 | if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic || | 994 | if (mpc_ioapic_id(apic) == mp_irqs[i].dstapic || |
1090 | mp_irqs[i].dstapic == MP_APIC_ALL) | 995 | mp_irqs[i].dstapic == MP_APIC_ALL) |
1091 | break; | 996 | break; |
1092 | 997 | ||
@@ -1259,7 +1164,6 @@ void __setup_vector_irq(int cpu) | |||
1259 | /* Initialize vector_irq on a new cpu */ | 1164 | /* Initialize vector_irq on a new cpu */ |
1260 | int irq, vector; | 1165 | int irq, vector; |
1261 | struct irq_cfg *cfg; | 1166 | struct irq_cfg *cfg; |
1262 | struct irq_desc *desc; | ||
1263 | 1167 | ||
1264 | /* | 1168 | /* |
1265 | * vector_lock will make sure that we don't run into irq vector | 1169 | * vector_lock will make sure that we don't run into irq vector |
@@ -1268,9 +1172,10 @@ void __setup_vector_irq(int cpu) | |||
1268 | */ | 1172 | */ |
1269 | raw_spin_lock(&vector_lock); | 1173 | raw_spin_lock(&vector_lock); |
1270 | /* Mark the inuse vectors */ | 1174 | /* Mark the inuse vectors */ |
1271 | for_each_irq_desc(irq, desc) { | 1175 | for_each_active_irq(irq) { |
1272 | cfg = desc->chip_data; | 1176 | cfg = irq_get_chip_data(irq); |
1273 | 1177 | if (!cfg) | |
1178 | continue; | ||
1274 | /* | 1179 | /* |
1275 | * If it is a legacy IRQ handled by the legacy PIC, this cpu | 1180 | * If it is a legacy IRQ handled by the legacy PIC, this cpu |
1276 | * will be part of the irq_cfg's domain. | 1181 | * will be part of the irq_cfg's domain. |
@@ -1299,17 +1204,13 @@ void __setup_vector_irq(int cpu) | |||
1299 | static struct irq_chip ioapic_chip; | 1204 | static struct irq_chip ioapic_chip; |
1300 | static struct irq_chip ir_ioapic_chip; | 1205 | static struct irq_chip ir_ioapic_chip; |
1301 | 1206 | ||
1302 | #define IOAPIC_AUTO -1 | ||
1303 | #define IOAPIC_EDGE 0 | ||
1304 | #define IOAPIC_LEVEL 1 | ||
1305 | |||
1306 | #ifdef CONFIG_X86_32 | 1207 | #ifdef CONFIG_X86_32 |
1307 | static inline int IO_APIC_irq_trigger(int irq) | 1208 | static inline int IO_APIC_irq_trigger(int irq) |
1308 | { | 1209 | { |
1309 | int apic, idx, pin; | 1210 | int apic, idx, pin; |
1310 | 1211 | ||
1311 | for (apic = 0; apic < nr_ioapics; apic++) { | 1212 | for (apic = 0; apic < nr_ioapics; apic++) { |
1312 | for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) { | 1213 | for (pin = 0; pin < ioapics[apic].nr_registers; pin++) { |
1313 | idx = find_irq_entry(apic, pin, mp_INT); | 1214 | idx = find_irq_entry(apic, pin, mp_INT); |
1314 | if ((idx != -1) && (irq == pin_2_irq(idx, apic, pin))) | 1215 | if ((idx != -1) && (irq == pin_2_irq(idx, apic, pin))) |
1315 | return irq_trigger(idx); | 1216 | return irq_trigger(idx); |
@@ -1327,41 +1228,37 @@ static inline int IO_APIC_irq_trigger(int irq) | |||
1327 | } | 1228 | } |
1328 | #endif | 1229 | #endif |
1329 | 1230 | ||
1330 | static void ioapic_register_intr(int irq, struct irq_desc *desc, unsigned long trigger) | 1231 | static void ioapic_register_intr(unsigned int irq, struct irq_cfg *cfg, |
1232 | unsigned long trigger) | ||
1331 | { | 1233 | { |
1234 | struct irq_chip *chip = &ioapic_chip; | ||
1235 | irq_flow_handler_t hdl; | ||
1236 | bool fasteoi; | ||
1332 | 1237 | ||
1333 | if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || | 1238 | if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || |
1334 | trigger == IOAPIC_LEVEL) | 1239 | trigger == IOAPIC_LEVEL) { |
1335 | desc->status |= IRQ_LEVEL; | 1240 | irq_set_status_flags(irq, IRQ_LEVEL); |
1336 | else | 1241 | fasteoi = true; |
1337 | desc->status &= ~IRQ_LEVEL; | 1242 | } else { |
1338 | 1243 | irq_clear_status_flags(irq, IRQ_LEVEL); | |
1339 | if (irq_remapped(irq)) { | 1244 | fasteoi = false; |
1340 | desc->status |= IRQ_MOVE_PCNTXT; | ||
1341 | if (trigger) | ||
1342 | set_irq_chip_and_handler_name(irq, &ir_ioapic_chip, | ||
1343 | handle_fasteoi_irq, | ||
1344 | "fasteoi"); | ||
1345 | else | ||
1346 | set_irq_chip_and_handler_name(irq, &ir_ioapic_chip, | ||
1347 | handle_edge_irq, "edge"); | ||
1348 | return; | ||
1349 | } | 1245 | } |
1350 | 1246 | ||
1351 | if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || | 1247 | if (irq_remapped(cfg)) { |
1352 | trigger == IOAPIC_LEVEL) | 1248 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); |
1353 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 1249 | chip = &ir_ioapic_chip; |
1354 | handle_fasteoi_irq, | 1250 | fasteoi = trigger != 0; |
1355 | "fasteoi"); | 1251 | } |
1356 | else | 1252 | |
1357 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 1253 | hdl = fasteoi ? handle_fasteoi_irq : handle_edge_irq; |
1358 | handle_edge_irq, "edge"); | 1254 | irq_set_chip_and_handler_name(irq, chip, hdl, |
1255 | fasteoi ? "fasteoi" : "edge"); | ||
1359 | } | 1256 | } |
1360 | 1257 | ||
1361 | int setup_ioapic_entry(int apic_id, int irq, | 1258 | static int setup_ioapic_entry(int apic_id, int irq, |
1362 | struct IO_APIC_route_entry *entry, | 1259 | struct IO_APIC_route_entry *entry, |
1363 | unsigned int destination, int trigger, | 1260 | unsigned int destination, int trigger, |
1364 | int polarity, int vector, int pin) | 1261 | int polarity, int vector, int pin) |
1365 | { | 1262 | { |
1366 | /* | 1263 | /* |
1367 | * add it to the IO-APIC irq-routing table: | 1264 | * add it to the IO-APIC irq-routing table: |
@@ -1382,21 +1279,7 @@ int setup_ioapic_entry(int apic_id, int irq, | |||
1382 | if (index < 0) | 1279 | if (index < 0) |
1383 | panic("Failed to allocate IRTE for ioapic %d\n", apic_id); | 1280 | panic("Failed to allocate IRTE for ioapic %d\n", apic_id); |
1384 | 1281 | ||
1385 | memset(&irte, 0, sizeof(irte)); | 1282 | prepare_irte(&irte, vector, destination); |
1386 | |||
1387 | irte.present = 1; | ||
1388 | irte.dst_mode = apic->irq_dest_mode; | ||
1389 | /* | ||
1390 | * Trigger mode in the IRTE will always be edge, and the | ||
1391 | * actual level or edge trigger will be setup in the IO-APIC | ||
1392 | * RTE. This will help simplify level triggered irq migration. | ||
1393 | * For more details, see the comments above explainig IO-APIC | ||
1394 | * irq migration in the presence of interrupt-remapping. | ||
1395 | */ | ||
1396 | irte.trigger_mode = 0; | ||
1397 | irte.dlvry_mode = apic->irq_delivery_mode; | ||
1398 | irte.vector = vector; | ||
1399 | irte.dest_id = IRTE_DEST(destination); | ||
1400 | 1283 | ||
1401 | /* Set source-id of interrupt request */ | 1284 | /* Set source-id of interrupt request */ |
1402 | set_ioapic_sid(&irte, apic_id); | 1285 | set_ioapic_sid(&irte, apic_id); |
@@ -1431,18 +1314,14 @@ int setup_ioapic_entry(int apic_id, int irq, | |||
1431 | return 0; | 1314 | return 0; |
1432 | } | 1315 | } |
1433 | 1316 | ||
1434 | static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq_desc *desc, | 1317 | static void setup_ioapic_irq(int apic_id, int pin, unsigned int irq, |
1435 | int trigger, int polarity) | 1318 | struct irq_cfg *cfg, int trigger, int polarity) |
1436 | { | 1319 | { |
1437 | struct irq_cfg *cfg; | ||
1438 | struct IO_APIC_route_entry entry; | 1320 | struct IO_APIC_route_entry entry; |
1439 | unsigned int dest; | 1321 | unsigned int dest; |
1440 | 1322 | ||
1441 | if (!IO_APIC_IRQ(irq)) | 1323 | if (!IO_APIC_IRQ(irq)) |
1442 | return; | 1324 | return; |
1443 | |||
1444 | cfg = desc->chip_data; | ||
1445 | |||
1446 | /* | 1325 | /* |
1447 | * For legacy irqs, cfg->domain starts with cpu 0 for legacy | 1326 | * For legacy irqs, cfg->domain starts with cpu 0 for legacy |
1448 | * controllers like 8259. Now that IO-APIC can handle this irq, update | 1327 | * controllers like 8259. Now that IO-APIC can handle this irq, update |
@@ -1459,58 +1338,45 @@ static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq | |||
1459 | apic_printk(APIC_VERBOSE,KERN_DEBUG | 1338 | apic_printk(APIC_VERBOSE,KERN_DEBUG |
1460 | "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " | 1339 | "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " |
1461 | "IRQ %d Mode:%i Active:%i)\n", | 1340 | "IRQ %d Mode:%i Active:%i)\n", |
1462 | apic_id, mp_ioapics[apic_id].apicid, pin, cfg->vector, | 1341 | apic_id, mpc_ioapic_id(apic_id), pin, cfg->vector, |
1463 | irq, trigger, polarity); | 1342 | irq, trigger, polarity); |
1464 | 1343 | ||
1465 | 1344 | ||
1466 | if (setup_ioapic_entry(mp_ioapics[apic_id].apicid, irq, &entry, | 1345 | if (setup_ioapic_entry(mpc_ioapic_id(apic_id), irq, &entry, |
1467 | dest, trigger, polarity, cfg->vector, pin)) { | 1346 | dest, trigger, polarity, cfg->vector, pin)) { |
1468 | printk("Failed to setup ioapic entry for ioapic %d, pin %d\n", | 1347 | printk("Failed to setup ioapic entry for ioapic %d, pin %d\n", |
1469 | mp_ioapics[apic_id].apicid, pin); | 1348 | mpc_ioapic_id(apic_id), pin); |
1470 | __clear_irq_vector(irq, cfg); | 1349 | __clear_irq_vector(irq, cfg); |
1471 | return; | 1350 | return; |
1472 | } | 1351 | } |
1473 | 1352 | ||
1474 | ioapic_register_intr(irq, desc, trigger); | 1353 | ioapic_register_intr(irq, cfg, trigger); |
1475 | if (irq < legacy_pic->nr_legacy_irqs) | 1354 | if (irq < legacy_pic->nr_legacy_irqs) |
1476 | legacy_pic->chip->mask(irq); | 1355 | legacy_pic->mask(irq); |
1477 | 1356 | ||
1478 | ioapic_write_entry(apic_id, pin, entry); | 1357 | ioapic_write_entry(apic_id, pin, entry); |
1479 | } | 1358 | } |
1480 | 1359 | ||
1481 | static struct { | 1360 | static bool __init io_apic_pin_not_connected(int idx, int apic_id, int pin) |
1482 | DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); | ||
1483 | } mp_ioapic_routing[MAX_IO_APICS]; | ||
1484 | |||
1485 | static void __init setup_IO_APIC_irqs(void) | ||
1486 | { | 1361 | { |
1487 | int apic_id, pin, idx, irq; | 1362 | if (idx != -1) |
1488 | int notcon = 0; | 1363 | return false; |
1489 | struct irq_desc *desc; | ||
1490 | struct irq_cfg *cfg; | ||
1491 | int node = cpu_to_node(boot_cpu_id); | ||
1492 | 1364 | ||
1493 | apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n"); | 1365 | apic_printk(APIC_VERBOSE, KERN_DEBUG " apic %d pin %d not connected\n", |
1366 | mpc_ioapic_id(apic_id), pin); | ||
1367 | return true; | ||
1368 | } | ||
1494 | 1369 | ||
1495 | for (apic_id = 0; apic_id < nr_ioapics; apic_id++) | 1370 | static void __init __io_apic_setup_irqs(unsigned int apic_id) |
1496 | for (pin = 0; pin < nr_ioapic_registers[apic_id]; pin++) { | 1371 | { |
1372 | int idx, node = cpu_to_node(0); | ||
1373 | struct io_apic_irq_attr attr; | ||
1374 | unsigned int pin, irq; | ||
1375 | |||
1376 | for (pin = 0; pin < ioapics[apic_id].nr_registers; pin++) { | ||
1497 | idx = find_irq_entry(apic_id, pin, mp_INT); | 1377 | idx = find_irq_entry(apic_id, pin, mp_INT); |
1498 | if (idx == -1) { | 1378 | if (io_apic_pin_not_connected(idx, apic_id, pin)) |
1499 | if (!notcon) { | ||
1500 | notcon = 1; | ||
1501 | apic_printk(APIC_VERBOSE, | ||
1502 | KERN_DEBUG " %d-%d", | ||
1503 | mp_ioapics[apic_id].apicid, pin); | ||
1504 | } else | ||
1505 | apic_printk(APIC_VERBOSE, " %d-%d", | ||
1506 | mp_ioapics[apic_id].apicid, pin); | ||
1507 | continue; | 1379 | continue; |
1508 | } | ||
1509 | if (notcon) { | ||
1510 | apic_printk(APIC_VERBOSE, | ||
1511 | " (apicid-pin) not connected\n"); | ||
1512 | notcon = 0; | ||
1513 | } | ||
1514 | 1380 | ||
1515 | irq = pin_2_irq(idx, apic_id, pin); | 1381 | irq = pin_2_irq(idx, apic_id, pin); |
1516 | 1382 | ||
@@ -1522,27 +1388,24 @@ static void __init setup_IO_APIC_irqs(void) | |||
1522 | * installed and if it returns 1: | 1388 | * installed and if it returns 1: |
1523 | */ | 1389 | */ |
1524 | if (apic->multi_timer_check && | 1390 | if (apic->multi_timer_check && |
1525 | apic->multi_timer_check(apic_id, irq)) | 1391 | apic->multi_timer_check(apic_id, irq)) |
1526 | continue; | 1392 | continue; |
1527 | 1393 | ||
1528 | desc = irq_to_desc_alloc_node(irq, node); | 1394 | set_io_apic_irq_attr(&attr, apic_id, pin, irq_trigger(idx), |
1529 | if (!desc) { | 1395 | irq_polarity(idx)); |
1530 | printk(KERN_INFO "can not get irq_desc for %d\n", irq); | 1396 | |
1531 | continue; | 1397 | io_apic_setup_irq_pin(irq, node, &attr); |
1532 | } | ||
1533 | cfg = desc->chip_data; | ||
1534 | add_pin_to_irq_node(cfg, node, apic_id, pin); | ||
1535 | /* | ||
1536 | * don't mark it in pin_programmed, so later acpi could | ||
1537 | * set it correctly when irq < 16 | ||
1538 | */ | ||
1539 | setup_IO_APIC_irq(apic_id, pin, irq, desc, | ||
1540 | irq_trigger(idx), irq_polarity(idx)); | ||
1541 | } | 1398 | } |
1399 | } | ||
1542 | 1400 | ||
1543 | if (notcon) | 1401 | static void __init setup_IO_APIC_irqs(void) |
1544 | apic_printk(APIC_VERBOSE, | 1402 | { |
1545 | " (apicid-pin) not connected\n"); | 1403 | unsigned int apic_id; |
1404 | |||
1405 | apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n"); | ||
1406 | |||
1407 | for (apic_id = 0; apic_id < nr_ioapics; apic_id++) | ||
1408 | __io_apic_setup_irqs(apic_id); | ||
1546 | } | 1409 | } |
1547 | 1410 | ||
1548 | /* | 1411 | /* |
@@ -1552,10 +1415,8 @@ static void __init setup_IO_APIC_irqs(void) | |||
1552 | */ | 1415 | */ |
1553 | void setup_IO_APIC_irq_extra(u32 gsi) | 1416 | void setup_IO_APIC_irq_extra(u32 gsi) |
1554 | { | 1417 | { |
1555 | int apic_id = 0, pin, idx, irq; | 1418 | int apic_id = 0, pin, idx, irq, node = cpu_to_node(0); |
1556 | int node = cpu_to_node(boot_cpu_id); | 1419 | struct io_apic_irq_attr attr; |
1557 | struct irq_desc *desc; | ||
1558 | struct irq_cfg *cfg; | ||
1559 | 1420 | ||
1560 | /* | 1421 | /* |
1561 | * Convert 'gsi' to 'ioapic.pin'. | 1422 | * Convert 'gsi' to 'ioapic.pin'. |
@@ -1570,29 +1431,15 @@ void setup_IO_APIC_irq_extra(u32 gsi) | |||
1570 | return; | 1431 | return; |
1571 | 1432 | ||
1572 | irq = pin_2_irq(idx, apic_id, pin); | 1433 | irq = pin_2_irq(idx, apic_id, pin); |
1573 | #ifdef CONFIG_SPARSE_IRQ | ||
1574 | desc = irq_to_desc(irq); | ||
1575 | if (desc) | ||
1576 | return; | ||
1577 | #endif | ||
1578 | desc = irq_to_desc_alloc_node(irq, node); | ||
1579 | if (!desc) { | ||
1580 | printk(KERN_INFO "can not get irq_desc for %d\n", irq); | ||
1581 | return; | ||
1582 | } | ||
1583 | 1434 | ||
1584 | cfg = desc->chip_data; | 1435 | /* Only handle the non legacy irqs on secondary ioapics */ |
1585 | add_pin_to_irq_node(cfg, node, apic_id, pin); | 1436 | if (apic_id == 0 || irq < NR_IRQS_LEGACY) |
1586 | |||
1587 | if (test_bit(pin, mp_ioapic_routing[apic_id].pin_programmed)) { | ||
1588 | pr_debug("Pin %d-%d already programmed\n", | ||
1589 | mp_ioapics[apic_id].apicid, pin); | ||
1590 | return; | 1437 | return; |
1591 | } | ||
1592 | set_bit(pin, mp_ioapic_routing[apic_id].pin_programmed); | ||
1593 | 1438 | ||
1594 | setup_IO_APIC_irq(apic_id, pin, irq, desc, | 1439 | set_io_apic_irq_attr(&attr, apic_id, pin, irq_trigger(idx), |
1595 | irq_trigger(idx), irq_polarity(idx)); | 1440 | irq_polarity(idx)); |
1441 | |||
1442 | io_apic_setup_irq_pin_once(irq, node, &attr); | ||
1596 | } | 1443 | } |
1597 | 1444 | ||
1598 | /* | 1445 | /* |
@@ -1624,7 +1471,8 @@ static void __init setup_timer_IRQ0_pin(unsigned int apic_id, unsigned int pin, | |||
1624 | * The timer IRQ doesn't have to know that behind the | 1471 | * The timer IRQ doesn't have to know that behind the |
1625 | * scene we may have a 8259A-master in AEOI mode ... | 1472 | * scene we may have a 8259A-master in AEOI mode ... |
1626 | */ | 1473 | */ |
1627 | set_irq_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, "edge"); | 1474 | irq_set_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, |
1475 | "edge"); | ||
1628 | 1476 | ||
1629 | /* | 1477 | /* |
1630 | * Add it to the IO-APIC irq-routing table: | 1478 | * Add it to the IO-APIC irq-routing table: |
@@ -1642,13 +1490,12 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
1642 | union IO_APIC_reg_03 reg_03; | 1490 | union IO_APIC_reg_03 reg_03; |
1643 | unsigned long flags; | 1491 | unsigned long flags; |
1644 | struct irq_cfg *cfg; | 1492 | struct irq_cfg *cfg; |
1645 | struct irq_desc *desc; | ||
1646 | unsigned int irq; | 1493 | unsigned int irq; |
1647 | 1494 | ||
1648 | printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); | 1495 | printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); |
1649 | for (i = 0; i < nr_ioapics; i++) | 1496 | for (i = 0; i < nr_ioapics; i++) |
1650 | printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n", | 1497 | printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n", |
1651 | mp_ioapics[i].apicid, nr_ioapic_registers[i]); | 1498 | mpc_ioapic_id(i), ioapics[i].nr_registers); |
1652 | 1499 | ||
1653 | /* | 1500 | /* |
1654 | * We are a bit conservative about what we expect. We have to | 1501 | * We are a bit conservative about what we expect. We have to |
@@ -1668,7 +1515,7 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
1668 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | 1515 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); |
1669 | 1516 | ||
1670 | printk("\n"); | 1517 | printk("\n"); |
1671 | printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].apicid); | 1518 | printk(KERN_DEBUG "IO APIC #%d......\n", mpc_ioapic_id(apic)); |
1672 | printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw); | 1519 | printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw); |
1673 | printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID); | 1520 | printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID); |
1674 | printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type); | 1521 | printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type); |
@@ -1729,10 +1576,10 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
1729 | } | 1576 | } |
1730 | } | 1577 | } |
1731 | printk(KERN_DEBUG "IRQ to pin mappings:\n"); | 1578 | printk(KERN_DEBUG "IRQ to pin mappings:\n"); |
1732 | for_each_irq_desc(irq, desc) { | 1579 | for_each_active_irq(irq) { |
1733 | struct irq_pin_list *entry; | 1580 | struct irq_pin_list *entry; |
1734 | 1581 | ||
1735 | cfg = desc->chip_data; | 1582 | cfg = irq_get_chip_data(irq); |
1736 | if (!cfg) | 1583 | if (!cfg) |
1737 | continue; | 1584 | continue; |
1738 | entry = cfg->irq_2_pin; | 1585 | entry = cfg->irq_2_pin; |
@@ -1962,7 +1809,7 @@ void __init enable_IO_APIC(void) | |||
1962 | for(apic = 0; apic < nr_ioapics; apic++) { | 1809 | for(apic = 0; apic < nr_ioapics; apic++) { |
1963 | int pin; | 1810 | int pin; |
1964 | /* See if any of the pins is in ExtINT mode */ | 1811 | /* See if any of the pins is in ExtINT mode */ |
1965 | for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) { | 1812 | for (pin = 0; pin < ioapics[apic].nr_registers; pin++) { |
1966 | struct IO_APIC_route_entry entry; | 1813 | struct IO_APIC_route_entry entry; |
1967 | entry = ioapic_read_entry(apic, pin); | 1814 | entry = ioapic_read_entry(apic, pin); |
1968 | 1815 | ||
@@ -2023,7 +1870,7 @@ void disable_IO_APIC(void) | |||
2023 | * | 1870 | * |
2024 | * With interrupt-remapping, for now we will use virtual wire A mode, | 1871 | * With interrupt-remapping, for now we will use virtual wire A mode, |
2025 | * as virtual wire B is little complex (need to configure both | 1872 | * as virtual wire B is little complex (need to configure both |
2026 | * IOAPIC RTE aswell as interrupt-remapping table entry). | 1873 | * IOAPIC RTE as well as interrupt-remapping table entry). |
2027 | * As this gets called during crash dump, keep this simple for now. | 1874 | * As this gets called during crash dump, keep this simple for now. |
2028 | */ | 1875 | */ |
2029 | if (ioapic_i8259.pin != -1 && !intr_remapping_enabled) { | 1876 | if (ioapic_i8259.pin != -1 && !intr_remapping_enabled) { |
@@ -2061,8 +1908,7 @@ void disable_IO_APIC(void) | |||
2061 | * | 1908 | * |
2062 | * by Matt Domsch <Matt_Domsch@dell.com> Tue Dec 21 12:25:05 CST 1999 | 1909 | * by Matt Domsch <Matt_Domsch@dell.com> Tue Dec 21 12:25:05 CST 1999 |
2063 | */ | 1910 | */ |
2064 | 1911 | void __init setup_ioapic_ids_from_mpc_nocheck(void) | |
2065 | void __init setup_ioapic_ids_from_mpc(void) | ||
2066 | { | 1912 | { |
2067 | union IO_APIC_reg_00 reg_00; | 1913 | union IO_APIC_reg_00 reg_00; |
2068 | physid_mask_t phys_id_present_map; | 1914 | physid_mask_t phys_id_present_map; |
@@ -2071,15 +1917,6 @@ void __init setup_ioapic_ids_from_mpc(void) | |||
2071 | unsigned char old_id; | 1917 | unsigned char old_id; |
2072 | unsigned long flags; | 1918 | unsigned long flags; |
2073 | 1919 | ||
2074 | if (acpi_ioapic) | ||
2075 | return; | ||
2076 | /* | ||
2077 | * Don't check I/O APIC IDs for xAPIC systems. They have | ||
2078 | * no meaning without the serial APIC bus. | ||
2079 | */ | ||
2080 | if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) | ||
2081 | || APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) | ||
2082 | return; | ||
2083 | /* | 1920 | /* |
2084 | * This is broken; anything with a real cpu count has to | 1921 | * This is broken; anything with a real cpu count has to |
2085 | * circumvent this idiocy regardless. | 1922 | * circumvent this idiocy regardless. |
@@ -2096,14 +1933,14 @@ void __init setup_ioapic_ids_from_mpc(void) | |||
2096 | reg_00.raw = io_apic_read(apic_id, 0); | 1933 | reg_00.raw = io_apic_read(apic_id, 0); |
2097 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | 1934 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); |
2098 | 1935 | ||
2099 | old_id = mp_ioapics[apic_id].apicid; | 1936 | old_id = mpc_ioapic_id(apic_id); |
2100 | 1937 | ||
2101 | if (mp_ioapics[apic_id].apicid >= get_physical_broadcast()) { | 1938 | if (mpc_ioapic_id(apic_id) >= get_physical_broadcast()) { |
2102 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n", | 1939 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n", |
2103 | apic_id, mp_ioapics[apic_id].apicid); | 1940 | apic_id, mpc_ioapic_id(apic_id)); |
2104 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", | 1941 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", |
2105 | reg_00.bits.ID); | 1942 | reg_00.bits.ID); |
2106 | mp_ioapics[apic_id].apicid = reg_00.bits.ID; | 1943 | ioapics[apic_id].mp_config.apicid = reg_00.bits.ID; |
2107 | } | 1944 | } |
2108 | 1945 | ||
2109 | /* | 1946 | /* |
@@ -2112,9 +1949,9 @@ void __init setup_ioapic_ids_from_mpc(void) | |||
2112 | * 'stuck on smp_invalidate_needed IPI wait' messages. | 1949 | * 'stuck on smp_invalidate_needed IPI wait' messages. |
2113 | */ | 1950 | */ |
2114 | if (apic->check_apicid_used(&phys_id_present_map, | 1951 | if (apic->check_apicid_used(&phys_id_present_map, |
2115 | mp_ioapics[apic_id].apicid)) { | 1952 | mpc_ioapic_id(apic_id))) { |
2116 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n", | 1953 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n", |
2117 | apic_id, mp_ioapics[apic_id].apicid); | 1954 | apic_id, mpc_ioapic_id(apic_id)); |
2118 | for (i = 0; i < get_physical_broadcast(); i++) | 1955 | for (i = 0; i < get_physical_broadcast(); i++) |
2119 | if (!physid_isset(i, phys_id_present_map)) | 1956 | if (!physid_isset(i, phys_id_present_map)) |
2120 | break; | 1957 | break; |
@@ -2123,36 +1960,39 @@ void __init setup_ioapic_ids_from_mpc(void) | |||
2123 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", | 1960 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", |
2124 | i); | 1961 | i); |
2125 | physid_set(i, phys_id_present_map); | 1962 | physid_set(i, phys_id_present_map); |
2126 | mp_ioapics[apic_id].apicid = i; | 1963 | ioapics[apic_id].mp_config.apicid = i; |
2127 | } else { | 1964 | } else { |
2128 | physid_mask_t tmp; | 1965 | physid_mask_t tmp; |
2129 | apic->apicid_to_cpu_present(mp_ioapics[apic_id].apicid, &tmp); | 1966 | apic->apicid_to_cpu_present(mpc_ioapic_id(apic_id), |
1967 | &tmp); | ||
2130 | apic_printk(APIC_VERBOSE, "Setting %d in the " | 1968 | apic_printk(APIC_VERBOSE, "Setting %d in the " |
2131 | "phys_id_present_map\n", | 1969 | "phys_id_present_map\n", |
2132 | mp_ioapics[apic_id].apicid); | 1970 | mpc_ioapic_id(apic_id)); |
2133 | physids_or(phys_id_present_map, phys_id_present_map, tmp); | 1971 | physids_or(phys_id_present_map, phys_id_present_map, tmp); |
2134 | } | 1972 | } |
2135 | 1973 | ||
2136 | |||
2137 | /* | 1974 | /* |
2138 | * We need to adjust the IRQ routing table | 1975 | * We need to adjust the IRQ routing table |
2139 | * if the ID changed. | 1976 | * if the ID changed. |
2140 | */ | 1977 | */ |
2141 | if (old_id != mp_ioapics[apic_id].apicid) | 1978 | if (old_id != mpc_ioapic_id(apic_id)) |
2142 | for (i = 0; i < mp_irq_entries; i++) | 1979 | for (i = 0; i < mp_irq_entries; i++) |
2143 | if (mp_irqs[i].dstapic == old_id) | 1980 | if (mp_irqs[i].dstapic == old_id) |
2144 | mp_irqs[i].dstapic | 1981 | mp_irqs[i].dstapic |
2145 | = mp_ioapics[apic_id].apicid; | 1982 | = mpc_ioapic_id(apic_id); |
2146 | 1983 | ||
2147 | /* | 1984 | /* |
2148 | * Read the right value from the MPC table and | 1985 | * Update the ID register according to the right value |
2149 | * write it into the ID register. | 1986 | * from the MPC table if they are different. |
2150 | */ | 1987 | */ |
1988 | if (mpc_ioapic_id(apic_id) == reg_00.bits.ID) | ||
1989 | continue; | ||
1990 | |||
2151 | apic_printk(APIC_VERBOSE, KERN_INFO | 1991 | apic_printk(APIC_VERBOSE, KERN_INFO |
2152 | "...changing IO-APIC physical APIC ID to %d ...", | 1992 | "...changing IO-APIC physical APIC ID to %d ...", |
2153 | mp_ioapics[apic_id].apicid); | 1993 | mpc_ioapic_id(apic_id)); |
2154 | 1994 | ||
2155 | reg_00.bits.ID = mp_ioapics[apic_id].apicid; | 1995 | reg_00.bits.ID = mpc_ioapic_id(apic_id); |
2156 | raw_spin_lock_irqsave(&ioapic_lock, flags); | 1996 | raw_spin_lock_irqsave(&ioapic_lock, flags); |
2157 | io_apic_write(apic_id, 0, reg_00.raw); | 1997 | io_apic_write(apic_id, 0, reg_00.raw); |
2158 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | 1998 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); |
@@ -2163,12 +2003,27 @@ void __init setup_ioapic_ids_from_mpc(void) | |||
2163 | raw_spin_lock_irqsave(&ioapic_lock, flags); | 2003 | raw_spin_lock_irqsave(&ioapic_lock, flags); |
2164 | reg_00.raw = io_apic_read(apic_id, 0); | 2004 | reg_00.raw = io_apic_read(apic_id, 0); |
2165 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | 2005 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); |
2166 | if (reg_00.bits.ID != mp_ioapics[apic_id].apicid) | 2006 | if (reg_00.bits.ID != mpc_ioapic_id(apic_id)) |
2167 | printk("could not set ID!\n"); | 2007 | printk("could not set ID!\n"); |
2168 | else | 2008 | else |
2169 | apic_printk(APIC_VERBOSE, " ok.\n"); | 2009 | apic_printk(APIC_VERBOSE, " ok.\n"); |
2170 | } | 2010 | } |
2171 | } | 2011 | } |
2012 | |||
2013 | void __init setup_ioapic_ids_from_mpc(void) | ||
2014 | { | ||
2015 | |||
2016 | if (acpi_ioapic) | ||
2017 | return; | ||
2018 | /* | ||
2019 | * Don't check I/O APIC IDs for xAPIC systems. They have | ||
2020 | * no meaning without the serial APIC bus. | ||
2021 | */ | ||
2022 | if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) | ||
2023 | || APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) | ||
2024 | return; | ||
2025 | setup_ioapic_ids_from_mpc_nocheck(); | ||
2026 | } | ||
2172 | #endif | 2027 | #endif |
2173 | 2028 | ||
2174 | int no_timer_check __initdata; | 2029 | int no_timer_check __initdata; |
@@ -2239,29 +2094,26 @@ static int __init timer_irq_works(void) | |||
2239 | * an edge even if it isn't on the 8259A... | 2094 | * an edge even if it isn't on the 8259A... |
2240 | */ | 2095 | */ |
2241 | 2096 | ||
2242 | static unsigned int startup_ioapic_irq(unsigned int irq) | 2097 | static unsigned int startup_ioapic_irq(struct irq_data *data) |
2243 | { | 2098 | { |
2244 | int was_pending = 0; | 2099 | int was_pending = 0, irq = data->irq; |
2245 | unsigned long flags; | 2100 | unsigned long flags; |
2246 | struct irq_cfg *cfg; | ||
2247 | 2101 | ||
2248 | raw_spin_lock_irqsave(&ioapic_lock, flags); | 2102 | raw_spin_lock_irqsave(&ioapic_lock, flags); |
2249 | if (irq < legacy_pic->nr_legacy_irqs) { | 2103 | if (irq < legacy_pic->nr_legacy_irqs) { |
2250 | legacy_pic->chip->mask(irq); | 2104 | legacy_pic->mask(irq); |
2251 | if (legacy_pic->irq_pending(irq)) | 2105 | if (legacy_pic->irq_pending(irq)) |
2252 | was_pending = 1; | 2106 | was_pending = 1; |
2253 | } | 2107 | } |
2254 | cfg = irq_cfg(irq); | 2108 | __unmask_ioapic(data->chip_data); |
2255 | __unmask_IO_APIC_irq(cfg); | ||
2256 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | 2109 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); |
2257 | 2110 | ||
2258 | return was_pending; | 2111 | return was_pending; |
2259 | } | 2112 | } |
2260 | 2113 | ||
2261 | static int ioapic_retrigger_irq(unsigned int irq) | 2114 | static int ioapic_retrigger_irq(struct irq_data *data) |
2262 | { | 2115 | { |
2263 | 2116 | struct irq_cfg *cfg = data->chip_data; | |
2264 | struct irq_cfg *cfg = irq_cfg(irq); | ||
2265 | unsigned long flags; | 2117 | unsigned long flags; |
2266 | 2118 | ||
2267 | raw_spin_lock_irqsave(&vector_lock, flags); | 2119 | raw_spin_lock_irqsave(&vector_lock, flags); |
@@ -2312,7 +2164,7 @@ static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq | |||
2312 | * With interrupt-remapping, destination information comes | 2164 | * With interrupt-remapping, destination information comes |
2313 | * from interrupt-remapping table entry. | 2165 | * from interrupt-remapping table entry. |
2314 | */ | 2166 | */ |
2315 | if (!irq_remapped(irq)) | 2167 | if (!irq_remapped(cfg)) |
2316 | io_apic_write(apic, 0x11 + pin*2, dest); | 2168 | io_apic_write(apic, 0x11 + pin*2, dest); |
2317 | reg = io_apic_read(apic, 0x10 + pin*2); | 2169 | reg = io_apic_read(apic, 0x10 + pin*2); |
2318 | reg &= ~IO_APIC_REDIR_VECTOR_MASK; | 2170 | reg &= ~IO_APIC_REDIR_VECTOR_MASK; |
@@ -2322,65 +2174,46 @@ static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq | |||
2322 | } | 2174 | } |
2323 | 2175 | ||
2324 | /* | 2176 | /* |
2325 | * Either sets desc->affinity to a valid value, and returns | 2177 | * Either sets data->affinity to a valid value, and returns |
2326 | * ->cpu_mask_to_apicid of that in dest_id, or returns -1 and | 2178 | * ->cpu_mask_to_apicid of that in dest_id, or returns -1 and |
2327 | * leaves desc->affinity untouched. | 2179 | * leaves data->affinity untouched. |
2328 | */ | 2180 | */ |
2329 | unsigned int | 2181 | int __ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask, |
2330 | set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask, | 2182 | unsigned int *dest_id) |
2331 | unsigned int *dest_id) | ||
2332 | { | 2183 | { |
2333 | struct irq_cfg *cfg; | 2184 | struct irq_cfg *cfg = data->chip_data; |
2334 | unsigned int irq; | ||
2335 | 2185 | ||
2336 | if (!cpumask_intersects(mask, cpu_online_mask)) | 2186 | if (!cpumask_intersects(mask, cpu_online_mask)) |
2337 | return -1; | 2187 | return -1; |
2338 | 2188 | ||
2339 | irq = desc->irq; | 2189 | if (assign_irq_vector(data->irq, data->chip_data, mask)) |
2340 | cfg = desc->chip_data; | ||
2341 | if (assign_irq_vector(irq, cfg, mask)) | ||
2342 | return -1; | 2190 | return -1; |
2343 | 2191 | ||
2344 | cpumask_copy(desc->affinity, mask); | 2192 | cpumask_copy(data->affinity, mask); |
2345 | 2193 | ||
2346 | *dest_id = apic->cpu_mask_to_apicid_and(desc->affinity, cfg->domain); | 2194 | *dest_id = apic->cpu_mask_to_apicid_and(mask, cfg->domain); |
2347 | return 0; | 2195 | return 0; |
2348 | } | 2196 | } |
2349 | 2197 | ||
2350 | static int | 2198 | static int |
2351 | set_ioapic_affinity_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | 2199 | ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask, |
2200 | bool force) | ||
2352 | { | 2201 | { |
2353 | struct irq_cfg *cfg; | 2202 | unsigned int dest, irq = data->irq; |
2354 | unsigned long flags; | 2203 | unsigned long flags; |
2355 | unsigned int dest; | 2204 | int ret; |
2356 | unsigned int irq; | ||
2357 | int ret = -1; | ||
2358 | |||
2359 | irq = desc->irq; | ||
2360 | cfg = desc->chip_data; | ||
2361 | 2205 | ||
2362 | raw_spin_lock_irqsave(&ioapic_lock, flags); | 2206 | raw_spin_lock_irqsave(&ioapic_lock, flags); |
2363 | ret = set_desc_affinity(desc, mask, &dest); | 2207 | ret = __ioapic_set_affinity(data, mask, &dest); |
2364 | if (!ret) { | 2208 | if (!ret) { |
2365 | /* Only the high 8 bits are valid. */ | 2209 | /* Only the high 8 bits are valid. */ |
2366 | dest = SET_APIC_LOGICAL_ID(dest); | 2210 | dest = SET_APIC_LOGICAL_ID(dest); |
2367 | __target_IO_APIC_irq(irq, dest, cfg); | 2211 | __target_IO_APIC_irq(irq, dest, data->chip_data); |
2368 | } | 2212 | } |
2369 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | 2213 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); |
2370 | |||
2371 | return ret; | 2214 | return ret; |
2372 | } | 2215 | } |
2373 | 2216 | ||
2374 | static int | ||
2375 | set_ioapic_affinity_irq(unsigned int irq, const struct cpumask *mask) | ||
2376 | { | ||
2377 | struct irq_desc *desc; | ||
2378 | |||
2379 | desc = irq_to_desc(irq); | ||
2380 | |||
2381 | return set_ioapic_affinity_irq_desc(desc, mask); | ||
2382 | } | ||
2383 | |||
2384 | #ifdef CONFIG_INTR_REMAP | 2217 | #ifdef CONFIG_INTR_REMAP |
2385 | 2218 | ||
2386 | /* | 2219 | /* |
@@ -2395,24 +2228,21 @@ set_ioapic_affinity_irq(unsigned int irq, const struct cpumask *mask) | |||
2395 | * the interrupt-remapping table entry. | 2228 | * the interrupt-remapping table entry. |
2396 | */ | 2229 | */ |
2397 | static int | 2230 | static int |
2398 | migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | 2231 | ir_ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask, |
2232 | bool force) | ||
2399 | { | 2233 | { |
2400 | struct irq_cfg *cfg; | 2234 | struct irq_cfg *cfg = data->chip_data; |
2235 | unsigned int dest, irq = data->irq; | ||
2401 | struct irte irte; | 2236 | struct irte irte; |
2402 | unsigned int dest; | ||
2403 | unsigned int irq; | ||
2404 | int ret = -1; | ||
2405 | 2237 | ||
2406 | if (!cpumask_intersects(mask, cpu_online_mask)) | 2238 | if (!cpumask_intersects(mask, cpu_online_mask)) |
2407 | return ret; | 2239 | return -EINVAL; |
2408 | 2240 | ||
2409 | irq = desc->irq; | ||
2410 | if (get_irte(irq, &irte)) | 2241 | if (get_irte(irq, &irte)) |
2411 | return ret; | 2242 | return -EBUSY; |
2412 | 2243 | ||
2413 | cfg = desc->chip_data; | ||
2414 | if (assign_irq_vector(irq, cfg, mask)) | 2244 | if (assign_irq_vector(irq, cfg, mask)) |
2415 | return ret; | 2245 | return -EBUSY; |
2416 | 2246 | ||
2417 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, mask); | 2247 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, mask); |
2418 | 2248 | ||
@@ -2427,29 +2257,14 @@ migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | |||
2427 | if (cfg->move_in_progress) | 2257 | if (cfg->move_in_progress) |
2428 | send_cleanup_vector(cfg); | 2258 | send_cleanup_vector(cfg); |
2429 | 2259 | ||
2430 | cpumask_copy(desc->affinity, mask); | 2260 | cpumask_copy(data->affinity, mask); |
2431 | |||
2432 | return 0; | 2261 | return 0; |
2433 | } | 2262 | } |
2434 | 2263 | ||
2435 | /* | ||
2436 | * Migrates the IRQ destination in the process context. | ||
2437 | */ | ||
2438 | static int set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, | ||
2439 | const struct cpumask *mask) | ||
2440 | { | ||
2441 | return migrate_ioapic_irq_desc(desc, mask); | ||
2442 | } | ||
2443 | static int set_ir_ioapic_affinity_irq(unsigned int irq, | ||
2444 | const struct cpumask *mask) | ||
2445 | { | ||
2446 | struct irq_desc *desc = irq_to_desc(irq); | ||
2447 | |||
2448 | return set_ir_ioapic_affinity_irq_desc(desc, mask); | ||
2449 | } | ||
2450 | #else | 2264 | #else |
2451 | static inline int set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, | 2265 | static inline int |
2452 | const struct cpumask *mask) | 2266 | ir_ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask, |
2267 | bool force) | ||
2453 | { | 2268 | { |
2454 | return 0; | 2269 | return 0; |
2455 | } | 2270 | } |
@@ -2469,7 +2284,7 @@ asmlinkage void smp_irq_move_cleanup_interrupt(void) | |||
2469 | unsigned int irr; | 2284 | unsigned int irr; |
2470 | struct irq_desc *desc; | 2285 | struct irq_desc *desc; |
2471 | struct irq_cfg *cfg; | 2286 | struct irq_cfg *cfg; |
2472 | irq = __get_cpu_var(vector_irq)[vector]; | 2287 | irq = __this_cpu_read(vector_irq[vector]); |
2473 | 2288 | ||
2474 | if (irq == -1) | 2289 | if (irq == -1) |
2475 | continue; | 2290 | continue; |
@@ -2503,7 +2318,7 @@ asmlinkage void smp_irq_move_cleanup_interrupt(void) | |||
2503 | apic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR); | 2318 | apic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR); |
2504 | goto unlock; | 2319 | goto unlock; |
2505 | } | 2320 | } |
2506 | __get_cpu_var(vector_irq)[vector] = -1; | 2321 | __this_cpu_write(vector_irq[vector], -1); |
2507 | unlock: | 2322 | unlock: |
2508 | raw_spin_unlock(&desc->lock); | 2323 | raw_spin_unlock(&desc->lock); |
2509 | } | 2324 | } |
@@ -2511,10 +2326,8 @@ unlock: | |||
2511 | irq_exit(); | 2326 | irq_exit(); |
2512 | } | 2327 | } |
2513 | 2328 | ||
2514 | static void __irq_complete_move(struct irq_desc **descp, unsigned vector) | 2329 | static void __irq_complete_move(struct irq_cfg *cfg, unsigned vector) |
2515 | { | 2330 | { |
2516 | struct irq_desc *desc = *descp; | ||
2517 | struct irq_cfg *cfg = desc->chip_data; | ||
2518 | unsigned me; | 2331 | unsigned me; |
2519 | 2332 | ||
2520 | if (likely(!cfg->move_in_progress)) | 2333 | if (likely(!cfg->move_in_progress)) |
@@ -2526,31 +2339,28 @@ static void __irq_complete_move(struct irq_desc **descp, unsigned vector) | |||
2526 | send_cleanup_vector(cfg); | 2339 | send_cleanup_vector(cfg); |
2527 | } | 2340 | } |
2528 | 2341 | ||
2529 | static void irq_complete_move(struct irq_desc **descp) | 2342 | static void irq_complete_move(struct irq_cfg *cfg) |
2530 | { | 2343 | { |
2531 | __irq_complete_move(descp, ~get_irq_regs()->orig_ax); | 2344 | __irq_complete_move(cfg, ~get_irq_regs()->orig_ax); |
2532 | } | 2345 | } |
2533 | 2346 | ||
2534 | void irq_force_complete_move(int irq) | 2347 | void irq_force_complete_move(int irq) |
2535 | { | 2348 | { |
2536 | struct irq_desc *desc = irq_to_desc(irq); | 2349 | struct irq_cfg *cfg = irq_get_chip_data(irq); |
2537 | struct irq_cfg *cfg = desc->chip_data; | ||
2538 | 2350 | ||
2539 | if (!cfg) | 2351 | if (!cfg) |
2540 | return; | 2352 | return; |
2541 | 2353 | ||
2542 | __irq_complete_move(&desc, cfg->vector); | 2354 | __irq_complete_move(cfg, cfg->vector); |
2543 | } | 2355 | } |
2544 | #else | 2356 | #else |
2545 | static inline void irq_complete_move(struct irq_desc **descp) {} | 2357 | static inline void irq_complete_move(struct irq_cfg *cfg) { } |
2546 | #endif | 2358 | #endif |
2547 | 2359 | ||
2548 | static void ack_apic_edge(unsigned int irq) | 2360 | static void ack_apic_edge(struct irq_data *data) |
2549 | { | 2361 | { |
2550 | struct irq_desc *desc = irq_to_desc(irq); | 2362 | irq_complete_move(data->chip_data); |
2551 | 2363 | irq_move_irq(data); | |
2552 | irq_complete_move(&desc); | ||
2553 | move_native_irq(irq); | ||
2554 | ack_APIC_irq(); | 2364 | ack_APIC_irq(); |
2555 | } | 2365 | } |
2556 | 2366 | ||
@@ -2572,19 +2382,21 @@ atomic_t irq_mis_count; | |||
2572 | * Otherwise, we simulate the EOI message manually by changing the trigger | 2382 | * Otherwise, we simulate the EOI message manually by changing the trigger |
2573 | * mode to edge and then back to level, with RTE being masked during this. | 2383 | * mode to edge and then back to level, with RTE being masked during this. |
2574 | */ | 2384 | */ |
2575 | static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) | 2385 | static void eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) |
2576 | { | 2386 | { |
2577 | struct irq_pin_list *entry; | 2387 | struct irq_pin_list *entry; |
2388 | unsigned long flags; | ||
2578 | 2389 | ||
2390 | raw_spin_lock_irqsave(&ioapic_lock, flags); | ||
2579 | for_each_irq_pin(entry, cfg->irq_2_pin) { | 2391 | for_each_irq_pin(entry, cfg->irq_2_pin) { |
2580 | if (mp_ioapics[entry->apic].apicver >= 0x20) { | 2392 | if (mpc_ioapic_ver(entry->apic) >= 0x20) { |
2581 | /* | 2393 | /* |
2582 | * Intr-remapping uses pin number as the virtual vector | 2394 | * Intr-remapping uses pin number as the virtual vector |
2583 | * in the RTE. Actual vector is programmed in | 2395 | * in the RTE. Actual vector is programmed in |
2584 | * intr-remapping table entry. Hence for the io-apic | 2396 | * intr-remapping table entry. Hence for the io-apic |
2585 | * EOI we use the pin number. | 2397 | * EOI we use the pin number. |
2586 | */ | 2398 | */ |
2587 | if (irq_remapped(irq)) | 2399 | if (irq_remapped(cfg)) |
2588 | io_apic_eoi(entry->apic, entry->pin); | 2400 | io_apic_eoi(entry->apic, entry->pin); |
2589 | else | 2401 | else |
2590 | io_apic_eoi(entry->apic, cfg->vector); | 2402 | io_apic_eoi(entry->apic, cfg->vector); |
@@ -2593,36 +2405,21 @@ static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) | |||
2593 | __unmask_and_level_IO_APIC_irq(entry); | 2405 | __unmask_and_level_IO_APIC_irq(entry); |
2594 | } | 2406 | } |
2595 | } | 2407 | } |
2596 | } | ||
2597 | |||
2598 | static void eoi_ioapic_irq(struct irq_desc *desc) | ||
2599 | { | ||
2600 | struct irq_cfg *cfg; | ||
2601 | unsigned long flags; | ||
2602 | unsigned int irq; | ||
2603 | |||
2604 | irq = desc->irq; | ||
2605 | cfg = desc->chip_data; | ||
2606 | |||
2607 | raw_spin_lock_irqsave(&ioapic_lock, flags); | ||
2608 | __eoi_ioapic_irq(irq, cfg); | ||
2609 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | 2408 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); |
2610 | } | 2409 | } |
2611 | 2410 | ||
2612 | static void ack_apic_level(unsigned int irq) | 2411 | static void ack_apic_level(struct irq_data *data) |
2613 | { | 2412 | { |
2614 | struct irq_desc *desc = irq_to_desc(irq); | 2413 | struct irq_cfg *cfg = data->chip_data; |
2414 | int i, do_unmask_irq = 0, irq = data->irq; | ||
2615 | unsigned long v; | 2415 | unsigned long v; |
2616 | int i; | ||
2617 | struct irq_cfg *cfg; | ||
2618 | int do_unmask_irq = 0; | ||
2619 | 2416 | ||
2620 | irq_complete_move(&desc); | 2417 | irq_complete_move(cfg); |
2621 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 2418 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
2622 | /* If we are moving the irq we need to mask it */ | 2419 | /* If we are moving the irq we need to mask it */ |
2623 | if (unlikely(desc->status & IRQ_MOVE_PENDING)) { | 2420 | if (unlikely(irqd_is_setaffinity_pending(data))) { |
2624 | do_unmask_irq = 1; | 2421 | do_unmask_irq = 1; |
2625 | mask_IO_APIC_irq_desc(desc); | 2422 | mask_ioapic(cfg); |
2626 | } | 2423 | } |
2627 | #endif | 2424 | #endif |
2628 | 2425 | ||
@@ -2658,7 +2455,6 @@ static void ack_apic_level(unsigned int irq) | |||
2658 | * we use the above logic (mask+edge followed by unmask+level) from | 2455 | * we use the above logic (mask+edge followed by unmask+level) from |
2659 | * Manfred Spraul to clear the remote IRR. | 2456 | * Manfred Spraul to clear the remote IRR. |
2660 | */ | 2457 | */ |
2661 | cfg = desc->chip_data; | ||
2662 | i = cfg->vector; | 2458 | i = cfg->vector; |
2663 | v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1)); | 2459 | v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1)); |
2664 | 2460 | ||
@@ -2678,7 +2474,7 @@ static void ack_apic_level(unsigned int irq) | |||
2678 | if (!(v & (1 << (i & 0x1f)))) { | 2474 | if (!(v & (1 << (i & 0x1f)))) { |
2679 | atomic_inc(&irq_mis_count); | 2475 | atomic_inc(&irq_mis_count); |
2680 | 2476 | ||
2681 | eoi_ioapic_irq(desc); | 2477 | eoi_ioapic_irq(irq, cfg); |
2682 | } | 2478 | } |
2683 | 2479 | ||
2684 | /* Now we can move and renable the irq */ | 2480 | /* Now we can move and renable the irq */ |
@@ -2709,61 +2505,57 @@ static void ack_apic_level(unsigned int irq) | |||
2709 | * accurate and is causing problems then it is a hardware bug | 2505 | * accurate and is causing problems then it is a hardware bug |
2710 | * and you can go talk to the chipset vendor about it. | 2506 | * and you can go talk to the chipset vendor about it. |
2711 | */ | 2507 | */ |
2712 | cfg = desc->chip_data; | ||
2713 | if (!io_apic_level_ack_pending(cfg)) | 2508 | if (!io_apic_level_ack_pending(cfg)) |
2714 | move_masked_irq(irq); | 2509 | irq_move_masked_irq(data); |
2715 | unmask_IO_APIC_irq_desc(desc); | 2510 | unmask_ioapic(cfg); |
2716 | } | 2511 | } |
2717 | } | 2512 | } |
2718 | 2513 | ||
2719 | #ifdef CONFIG_INTR_REMAP | 2514 | #ifdef CONFIG_INTR_REMAP |
2720 | static void ir_ack_apic_edge(unsigned int irq) | 2515 | static void ir_ack_apic_edge(struct irq_data *data) |
2721 | { | 2516 | { |
2722 | ack_APIC_irq(); | 2517 | ack_APIC_irq(); |
2723 | } | 2518 | } |
2724 | 2519 | ||
2725 | static void ir_ack_apic_level(unsigned int irq) | 2520 | static void ir_ack_apic_level(struct irq_data *data) |
2726 | { | 2521 | { |
2727 | struct irq_desc *desc = irq_to_desc(irq); | ||
2728 | |||
2729 | ack_APIC_irq(); | 2522 | ack_APIC_irq(); |
2730 | eoi_ioapic_irq(desc); | 2523 | eoi_ioapic_irq(data->irq, data->chip_data); |
2731 | } | 2524 | } |
2732 | #endif /* CONFIG_INTR_REMAP */ | 2525 | #endif /* CONFIG_INTR_REMAP */ |
2733 | 2526 | ||
2734 | static struct irq_chip ioapic_chip __read_mostly = { | 2527 | static struct irq_chip ioapic_chip __read_mostly = { |
2735 | .name = "IO-APIC", | 2528 | .name = "IO-APIC", |
2736 | .startup = startup_ioapic_irq, | 2529 | .irq_startup = startup_ioapic_irq, |
2737 | .mask = mask_IO_APIC_irq, | 2530 | .irq_mask = mask_ioapic_irq, |
2738 | .unmask = unmask_IO_APIC_irq, | 2531 | .irq_unmask = unmask_ioapic_irq, |
2739 | .ack = ack_apic_edge, | 2532 | .irq_ack = ack_apic_edge, |
2740 | .eoi = ack_apic_level, | 2533 | .irq_eoi = ack_apic_level, |
2741 | #ifdef CONFIG_SMP | 2534 | #ifdef CONFIG_SMP |
2742 | .set_affinity = set_ioapic_affinity_irq, | 2535 | .irq_set_affinity = ioapic_set_affinity, |
2743 | #endif | 2536 | #endif |
2744 | .retrigger = ioapic_retrigger_irq, | 2537 | .irq_retrigger = ioapic_retrigger_irq, |
2745 | }; | 2538 | }; |
2746 | 2539 | ||
2747 | static struct irq_chip ir_ioapic_chip __read_mostly = { | 2540 | static struct irq_chip ir_ioapic_chip __read_mostly = { |
2748 | .name = "IR-IO-APIC", | 2541 | .name = "IR-IO-APIC", |
2749 | .startup = startup_ioapic_irq, | 2542 | .irq_startup = startup_ioapic_irq, |
2750 | .mask = mask_IO_APIC_irq, | 2543 | .irq_mask = mask_ioapic_irq, |
2751 | .unmask = unmask_IO_APIC_irq, | 2544 | .irq_unmask = unmask_ioapic_irq, |
2752 | #ifdef CONFIG_INTR_REMAP | 2545 | #ifdef CONFIG_INTR_REMAP |
2753 | .ack = ir_ack_apic_edge, | 2546 | .irq_ack = ir_ack_apic_edge, |
2754 | .eoi = ir_ack_apic_level, | 2547 | .irq_eoi = ir_ack_apic_level, |
2755 | #ifdef CONFIG_SMP | 2548 | #ifdef CONFIG_SMP |
2756 | .set_affinity = set_ir_ioapic_affinity_irq, | 2549 | .irq_set_affinity = ir_ioapic_set_affinity, |
2757 | #endif | 2550 | #endif |
2758 | #endif | 2551 | #endif |
2759 | .retrigger = ioapic_retrigger_irq, | 2552 | .irq_retrigger = ioapic_retrigger_irq, |
2760 | }; | 2553 | }; |
2761 | 2554 | ||
2762 | static inline void init_IO_APIC_traps(void) | 2555 | static inline void init_IO_APIC_traps(void) |
2763 | { | 2556 | { |
2764 | int irq; | ||
2765 | struct irq_desc *desc; | ||
2766 | struct irq_cfg *cfg; | 2557 | struct irq_cfg *cfg; |
2558 | unsigned int irq; | ||
2767 | 2559 | ||
2768 | /* | 2560 | /* |
2769 | * NOTE! The local APIC isn't very good at handling | 2561 | * NOTE! The local APIC isn't very good at handling |
@@ -2776,8 +2568,8 @@ static inline void init_IO_APIC_traps(void) | |||
2776 | * Also, we've got to be careful not to trash gate | 2568 | * Also, we've got to be careful not to trash gate |
2777 | * 0x80, because int 0x80 is hm, kind of importantish. ;) | 2569 | * 0x80, because int 0x80 is hm, kind of importantish. ;) |
2778 | */ | 2570 | */ |
2779 | for_each_irq_desc(irq, desc) { | 2571 | for_each_active_irq(irq) { |
2780 | cfg = desc->chip_data; | 2572 | cfg = irq_get_chip_data(irq); |
2781 | if (IO_APIC_IRQ(irq) && cfg && !cfg->vector) { | 2573 | if (IO_APIC_IRQ(irq) && cfg && !cfg->vector) { |
2782 | /* | 2574 | /* |
2783 | * Hmm.. We don't have an entry for this, | 2575 | * Hmm.. We don't have an entry for this, |
@@ -2788,7 +2580,7 @@ static inline void init_IO_APIC_traps(void) | |||
2788 | legacy_pic->make_irq(irq); | 2580 | legacy_pic->make_irq(irq); |
2789 | else | 2581 | else |
2790 | /* Strange. Oh, well.. */ | 2582 | /* Strange. Oh, well.. */ |
2791 | desc->chip = &no_irq_chip; | 2583 | irq_set_chip(irq, &no_irq_chip); |
2792 | } | 2584 | } |
2793 | } | 2585 | } |
2794 | } | 2586 | } |
@@ -2797,7 +2589,7 @@ static inline void init_IO_APIC_traps(void) | |||
2797 | * The local APIC irq-chip implementation: | 2589 | * The local APIC irq-chip implementation: |
2798 | */ | 2590 | */ |
2799 | 2591 | ||
2800 | static void mask_lapic_irq(unsigned int irq) | 2592 | static void mask_lapic_irq(struct irq_data *data) |
2801 | { | 2593 | { |
2802 | unsigned long v; | 2594 | unsigned long v; |
2803 | 2595 | ||
@@ -2805,7 +2597,7 @@ static void mask_lapic_irq(unsigned int irq) | |||
2805 | apic_write(APIC_LVT0, v | APIC_LVT_MASKED); | 2597 | apic_write(APIC_LVT0, v | APIC_LVT_MASKED); |
2806 | } | 2598 | } |
2807 | 2599 | ||
2808 | static void unmask_lapic_irq(unsigned int irq) | 2600 | static void unmask_lapic_irq(struct irq_data *data) |
2809 | { | 2601 | { |
2810 | unsigned long v; | 2602 | unsigned long v; |
2811 | 2603 | ||
@@ -2813,43 +2605,25 @@ static void unmask_lapic_irq(unsigned int irq) | |||
2813 | apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED); | 2605 | apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED); |
2814 | } | 2606 | } |
2815 | 2607 | ||
2816 | static void ack_lapic_irq(unsigned int irq) | 2608 | static void ack_lapic_irq(struct irq_data *data) |
2817 | { | 2609 | { |
2818 | ack_APIC_irq(); | 2610 | ack_APIC_irq(); |
2819 | } | 2611 | } |
2820 | 2612 | ||
2821 | static struct irq_chip lapic_chip __read_mostly = { | 2613 | static struct irq_chip lapic_chip __read_mostly = { |
2822 | .name = "local-APIC", | 2614 | .name = "local-APIC", |
2823 | .mask = mask_lapic_irq, | 2615 | .irq_mask = mask_lapic_irq, |
2824 | .unmask = unmask_lapic_irq, | 2616 | .irq_unmask = unmask_lapic_irq, |
2825 | .ack = ack_lapic_irq, | 2617 | .irq_ack = ack_lapic_irq, |
2826 | }; | 2618 | }; |
2827 | 2619 | ||
2828 | static void lapic_register_intr(int irq, struct irq_desc *desc) | 2620 | static void lapic_register_intr(int irq) |
2829 | { | 2621 | { |
2830 | desc->status &= ~IRQ_LEVEL; | 2622 | irq_clear_status_flags(irq, IRQ_LEVEL); |
2831 | set_irq_chip_and_handler_name(irq, &lapic_chip, handle_edge_irq, | 2623 | irq_set_chip_and_handler_name(irq, &lapic_chip, handle_edge_irq, |
2832 | "edge"); | 2624 | "edge"); |
2833 | } | 2625 | } |
2834 | 2626 | ||
2835 | static void __init setup_nmi(void) | ||
2836 | { | ||
2837 | /* | ||
2838 | * Dirty trick to enable the NMI watchdog ... | ||
2839 | * We put the 8259A master into AEOI mode and | ||
2840 | * unmask on all local APICs LVT0 as NMI. | ||
2841 | * | ||
2842 | * The idea to use the 8259A in AEOI mode ('8259A Virtual Wire') | ||
2843 | * is from Maciej W. Rozycki - so we do not have to EOI from | ||
2844 | * the NMI handler or the timer interrupt. | ||
2845 | */ | ||
2846 | apic_printk(APIC_VERBOSE, KERN_INFO "activating NMI Watchdog ..."); | ||
2847 | |||
2848 | enable_NMI_through_LVT0(); | ||
2849 | |||
2850 | apic_printk(APIC_VERBOSE, " done.\n"); | ||
2851 | } | ||
2852 | |||
2853 | /* | 2627 | /* |
2854 | * This looks a bit hackish but it's about the only one way of sending | 2628 | * This looks a bit hackish but it's about the only one way of sending |
2855 | * a few INTA cycles to 8259As and any associated glue logic. ICR does | 2629 | * a few INTA cycles to 8259As and any associated glue logic. ICR does |
@@ -2930,9 +2704,8 @@ int timer_through_8259 __initdata; | |||
2930 | */ | 2704 | */ |
2931 | static inline void __init check_timer(void) | 2705 | static inline void __init check_timer(void) |
2932 | { | 2706 | { |
2933 | struct irq_desc *desc = irq_to_desc(0); | 2707 | struct irq_cfg *cfg = irq_get_chip_data(0); |
2934 | struct irq_cfg *cfg = desc->chip_data; | 2708 | int node = cpu_to_node(0); |
2935 | int node = cpu_to_node(boot_cpu_id); | ||
2936 | int apic1, pin1, apic2, pin2; | 2709 | int apic1, pin1, apic2, pin2; |
2937 | unsigned long flags; | 2710 | unsigned long flags; |
2938 | int no_pin1 = 0; | 2711 | int no_pin1 = 0; |
@@ -2942,7 +2715,7 @@ static inline void __init check_timer(void) | |||
2942 | /* | 2715 | /* |
2943 | * get/set the timer IRQ vector: | 2716 | * get/set the timer IRQ vector: |
2944 | */ | 2717 | */ |
2945 | legacy_pic->chip->mask(0); | 2718 | legacy_pic->mask(0); |
2946 | assign_irq_vector(0, cfg, apic->target_cpus()); | 2719 | assign_irq_vector(0, cfg, apic->target_cpus()); |
2947 | 2720 | ||
2948 | /* | 2721 | /* |
@@ -2956,15 +2729,6 @@ static inline void __init check_timer(void) | |||
2956 | */ | 2729 | */ |
2957 | apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); | 2730 | apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); |
2958 | legacy_pic->init(1); | 2731 | legacy_pic->init(1); |
2959 | #ifdef CONFIG_X86_32 | ||
2960 | { | ||
2961 | unsigned int ver; | ||
2962 | |||
2963 | ver = apic_read(APIC_LVR); | ||
2964 | ver = GET_APIC_VERSION(ver); | ||
2965 | timer_ack = (nmi_watchdog == NMI_IO_APIC && !APIC_INTEGRATED(ver)); | ||
2966 | } | ||
2967 | #endif | ||
2968 | 2732 | ||
2969 | pin1 = find_isa_irq_pin(0, mp_INT); | 2733 | pin1 = find_isa_irq_pin(0, mp_INT); |
2970 | apic1 = find_isa_irq_apic(0, mp_INT); | 2734 | apic1 = find_isa_irq_apic(0, mp_INT); |
@@ -3001,7 +2765,7 @@ static inline void __init check_timer(void) | |||
3001 | add_pin_to_irq_node(cfg, node, apic1, pin1); | 2765 | add_pin_to_irq_node(cfg, node, apic1, pin1); |
3002 | setup_timer_IRQ0_pin(apic1, pin1, cfg->vector); | 2766 | setup_timer_IRQ0_pin(apic1, pin1, cfg->vector); |
3003 | } else { | 2767 | } else { |
3004 | /* for edge trigger, setup_IO_APIC_irq already | 2768 | /* for edge trigger, setup_ioapic_irq already |
3005 | * leave it unmasked. | 2769 | * leave it unmasked. |
3006 | * so only need to unmask if it is level-trigger | 2770 | * so only need to unmask if it is level-trigger |
3007 | * do we really have level trigger timer? | 2771 | * do we really have level trigger timer? |
@@ -3009,13 +2773,9 @@ static inline void __init check_timer(void) | |||
3009 | int idx; | 2773 | int idx; |
3010 | idx = find_irq_entry(apic1, pin1, mp_INT); | 2774 | idx = find_irq_entry(apic1, pin1, mp_INT); |
3011 | if (idx != -1 && irq_trigger(idx)) | 2775 | if (idx != -1 && irq_trigger(idx)) |
3012 | unmask_IO_APIC_irq_desc(desc); | 2776 | unmask_ioapic(cfg); |
3013 | } | 2777 | } |
3014 | if (timer_irq_works()) { | 2778 | if (timer_irq_works()) { |
3015 | if (nmi_watchdog == NMI_IO_APIC) { | ||
3016 | setup_nmi(); | ||
3017 | legacy_pic->chip->unmask(0); | ||
3018 | } | ||
3019 | if (disable_timer_pin_1 > 0) | 2779 | if (disable_timer_pin_1 > 0) |
3020 | clear_IO_APIC_pin(0, pin1); | 2780 | clear_IO_APIC_pin(0, pin1); |
3021 | goto out; | 2781 | goto out; |
@@ -3037,48 +2797,34 @@ static inline void __init check_timer(void) | |||
3037 | */ | 2797 | */ |
3038 | replace_pin_at_irq_node(cfg, node, apic1, pin1, apic2, pin2); | 2798 | replace_pin_at_irq_node(cfg, node, apic1, pin1, apic2, pin2); |
3039 | setup_timer_IRQ0_pin(apic2, pin2, cfg->vector); | 2799 | setup_timer_IRQ0_pin(apic2, pin2, cfg->vector); |
3040 | legacy_pic->chip->unmask(0); | 2800 | legacy_pic->unmask(0); |
3041 | if (timer_irq_works()) { | 2801 | if (timer_irq_works()) { |
3042 | apic_printk(APIC_QUIET, KERN_INFO "....... works.\n"); | 2802 | apic_printk(APIC_QUIET, KERN_INFO "....... works.\n"); |
3043 | timer_through_8259 = 1; | 2803 | timer_through_8259 = 1; |
3044 | if (nmi_watchdog == NMI_IO_APIC) { | ||
3045 | legacy_pic->chip->mask(0); | ||
3046 | setup_nmi(); | ||
3047 | legacy_pic->chip->unmask(0); | ||
3048 | } | ||
3049 | goto out; | 2804 | goto out; |
3050 | } | 2805 | } |
3051 | /* | 2806 | /* |
3052 | * Cleanup, just in case ... | 2807 | * Cleanup, just in case ... |
3053 | */ | 2808 | */ |
3054 | local_irq_disable(); | 2809 | local_irq_disable(); |
3055 | legacy_pic->chip->mask(0); | 2810 | legacy_pic->mask(0); |
3056 | clear_IO_APIC_pin(apic2, pin2); | 2811 | clear_IO_APIC_pin(apic2, pin2); |
3057 | apic_printk(APIC_QUIET, KERN_INFO "....... failed.\n"); | 2812 | apic_printk(APIC_QUIET, KERN_INFO "....... failed.\n"); |
3058 | } | 2813 | } |
3059 | 2814 | ||
3060 | if (nmi_watchdog == NMI_IO_APIC) { | ||
3061 | apic_printk(APIC_QUIET, KERN_WARNING "timer doesn't work " | ||
3062 | "through the IO-APIC - disabling NMI Watchdog!\n"); | ||
3063 | nmi_watchdog = NMI_NONE; | ||
3064 | } | ||
3065 | #ifdef CONFIG_X86_32 | ||
3066 | timer_ack = 0; | ||
3067 | #endif | ||
3068 | |||
3069 | apic_printk(APIC_QUIET, KERN_INFO | 2815 | apic_printk(APIC_QUIET, KERN_INFO |
3070 | "...trying to set up timer as Virtual Wire IRQ...\n"); | 2816 | "...trying to set up timer as Virtual Wire IRQ...\n"); |
3071 | 2817 | ||
3072 | lapic_register_intr(0, desc); | 2818 | lapic_register_intr(0); |
3073 | apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector); /* Fixed mode */ | 2819 | apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector); /* Fixed mode */ |
3074 | legacy_pic->chip->unmask(0); | 2820 | legacy_pic->unmask(0); |
3075 | 2821 | ||
3076 | if (timer_irq_works()) { | 2822 | if (timer_irq_works()) { |
3077 | apic_printk(APIC_QUIET, KERN_INFO "..... works.\n"); | 2823 | apic_printk(APIC_QUIET, KERN_INFO "..... works.\n"); |
3078 | goto out; | 2824 | goto out; |
3079 | } | 2825 | } |
3080 | local_irq_disable(); | 2826 | local_irq_disable(); |
3081 | legacy_pic->chip->mask(0); | 2827 | legacy_pic->mask(0); |
3082 | apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | cfg->vector); | 2828 | apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | cfg->vector); |
3083 | apic_printk(APIC_QUIET, KERN_INFO "..... failed.\n"); | 2829 | apic_printk(APIC_QUIET, KERN_INFO "..... failed.\n"); |
3084 | 2830 | ||
@@ -3144,7 +2890,7 @@ void __init setup_IO_APIC(void) | |||
3144 | } | 2890 | } |
3145 | 2891 | ||
3146 | /* | 2892 | /* |
3147 | * Called after all the initialization is done. If we didnt find any | 2893 | * Called after all the initialization is done. If we didn't find any |
3148 | * APIC bugs then we can allow the modify fast path | 2894 | * APIC bugs then we can allow the modify fast path |
3149 | */ | 2895 | */ |
3150 | 2896 | ||
@@ -3157,136 +2903,84 @@ static int __init io_apic_bug_finalize(void) | |||
3157 | 2903 | ||
3158 | late_initcall(io_apic_bug_finalize); | 2904 | late_initcall(io_apic_bug_finalize); |
3159 | 2905 | ||
3160 | struct sysfs_ioapic_data { | 2906 | static void resume_ioapic_id(int ioapic_id) |
3161 | struct sys_device dev; | ||
3162 | struct IO_APIC_route_entry entry[0]; | ||
3163 | }; | ||
3164 | static struct sysfs_ioapic_data * mp_ioapic_data[MAX_IO_APICS]; | ||
3165 | |||
3166 | static int ioapic_suspend(struct sys_device *dev, pm_message_t state) | ||
3167 | { | 2907 | { |
3168 | struct IO_APIC_route_entry *entry; | ||
3169 | struct sysfs_ioapic_data *data; | ||
3170 | int i; | ||
3171 | |||
3172 | data = container_of(dev, struct sysfs_ioapic_data, dev); | ||
3173 | entry = data->entry; | ||
3174 | for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) | ||
3175 | *entry = ioapic_read_entry(dev->id, i); | ||
3176 | |||
3177 | return 0; | ||
3178 | } | ||
3179 | |||
3180 | static int ioapic_resume(struct sys_device *dev) | ||
3181 | { | ||
3182 | struct IO_APIC_route_entry *entry; | ||
3183 | struct sysfs_ioapic_data *data; | ||
3184 | unsigned long flags; | 2908 | unsigned long flags; |
3185 | union IO_APIC_reg_00 reg_00; | 2909 | union IO_APIC_reg_00 reg_00; |
3186 | int i; | ||
3187 | 2910 | ||
3188 | data = container_of(dev, struct sysfs_ioapic_data, dev); | ||
3189 | entry = data->entry; | ||
3190 | 2911 | ||
3191 | raw_spin_lock_irqsave(&ioapic_lock, flags); | 2912 | raw_spin_lock_irqsave(&ioapic_lock, flags); |
3192 | reg_00.raw = io_apic_read(dev->id, 0); | 2913 | reg_00.raw = io_apic_read(ioapic_id, 0); |
3193 | if (reg_00.bits.ID != mp_ioapics[dev->id].apicid) { | 2914 | if (reg_00.bits.ID != mpc_ioapic_id(ioapic_id)) { |
3194 | reg_00.bits.ID = mp_ioapics[dev->id].apicid; | 2915 | reg_00.bits.ID = mpc_ioapic_id(ioapic_id); |
3195 | io_apic_write(dev->id, 0, reg_00.raw); | 2916 | io_apic_write(ioapic_id, 0, reg_00.raw); |
3196 | } | 2917 | } |
3197 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); | 2918 | raw_spin_unlock_irqrestore(&ioapic_lock, flags); |
3198 | for (i = 0; i < nr_ioapic_registers[dev->id]; i++) | 2919 | } |
3199 | ioapic_write_entry(dev->id, i, entry[i]); | ||
3200 | 2920 | ||
3201 | return 0; | 2921 | static void ioapic_resume(void) |
2922 | { | ||
2923 | int ioapic_id; | ||
2924 | |||
2925 | for (ioapic_id = nr_ioapics - 1; ioapic_id >= 0; ioapic_id--) | ||
2926 | resume_ioapic_id(ioapic_id); | ||
2927 | |||
2928 | restore_ioapic_entries(); | ||
3202 | } | 2929 | } |
3203 | 2930 | ||
3204 | static struct sysdev_class ioapic_sysdev_class = { | 2931 | static struct syscore_ops ioapic_syscore_ops = { |
3205 | .name = "ioapic", | 2932 | .suspend = save_ioapic_entries, |
3206 | .suspend = ioapic_suspend, | ||
3207 | .resume = ioapic_resume, | 2933 | .resume = ioapic_resume, |
3208 | }; | 2934 | }; |
3209 | 2935 | ||
3210 | static int __init ioapic_init_sysfs(void) | 2936 | static int __init ioapic_init_ops(void) |
3211 | { | 2937 | { |
3212 | struct sys_device * dev; | 2938 | register_syscore_ops(&ioapic_syscore_ops); |
3213 | int i, size, error; | ||
3214 | |||
3215 | error = sysdev_class_register(&ioapic_sysdev_class); | ||
3216 | if (error) | ||
3217 | return error; | ||
3218 | |||
3219 | for (i = 0; i < nr_ioapics; i++ ) { | ||
3220 | size = sizeof(struct sys_device) + nr_ioapic_registers[i] | ||
3221 | * sizeof(struct IO_APIC_route_entry); | ||
3222 | mp_ioapic_data[i] = kzalloc(size, GFP_KERNEL); | ||
3223 | if (!mp_ioapic_data[i]) { | ||
3224 | printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i); | ||
3225 | continue; | ||
3226 | } | ||
3227 | dev = &mp_ioapic_data[i]->dev; | ||
3228 | dev->id = i; | ||
3229 | dev->cls = &ioapic_sysdev_class; | ||
3230 | error = sysdev_register(dev); | ||
3231 | if (error) { | ||
3232 | kfree(mp_ioapic_data[i]); | ||
3233 | mp_ioapic_data[i] = NULL; | ||
3234 | printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i); | ||
3235 | continue; | ||
3236 | } | ||
3237 | } | ||
3238 | 2939 | ||
3239 | return 0; | 2940 | return 0; |
3240 | } | 2941 | } |
3241 | 2942 | ||
3242 | device_initcall(ioapic_init_sysfs); | 2943 | device_initcall(ioapic_init_ops); |
3243 | 2944 | ||
3244 | /* | 2945 | /* |
3245 | * Dynamic irq allocate and deallocation | 2946 | * Dynamic irq allocate and deallocation |
3246 | */ | 2947 | */ |
3247 | unsigned int create_irq_nr(unsigned int irq_want, int node) | 2948 | unsigned int create_irq_nr(unsigned int from, int node) |
3248 | { | 2949 | { |
3249 | /* Allocate an unused irq */ | 2950 | struct irq_cfg *cfg; |
3250 | unsigned int irq; | ||
3251 | unsigned int new; | ||
3252 | unsigned long flags; | 2951 | unsigned long flags; |
3253 | struct irq_cfg *cfg_new = NULL; | 2952 | unsigned int ret = 0; |
3254 | struct irq_desc *desc_new = NULL; | 2953 | int irq; |
3255 | |||
3256 | irq = 0; | ||
3257 | if (irq_want < nr_irqs_gsi) | ||
3258 | irq_want = nr_irqs_gsi; | ||
3259 | |||
3260 | raw_spin_lock_irqsave(&vector_lock, flags); | ||
3261 | for (new = irq_want; new < nr_irqs; new++) { | ||
3262 | desc_new = irq_to_desc_alloc_node(new, node); | ||
3263 | if (!desc_new) { | ||
3264 | printk(KERN_INFO "can not get irq_desc for %d\n", new); | ||
3265 | continue; | ||
3266 | } | ||
3267 | cfg_new = desc_new->chip_data; | ||
3268 | |||
3269 | if (cfg_new->vector != 0) | ||
3270 | continue; | ||
3271 | 2954 | ||
3272 | desc_new = move_irq_desc(desc_new, node); | 2955 | if (from < nr_irqs_gsi) |
3273 | cfg_new = desc_new->chip_data; | 2956 | from = nr_irqs_gsi; |
3274 | 2957 | ||
3275 | if (__assign_irq_vector(new, cfg_new, apic->target_cpus()) == 0) | 2958 | irq = alloc_irq_from(from, node); |
3276 | irq = new; | 2959 | if (irq < 0) |
3277 | break; | 2960 | return 0; |
2961 | cfg = alloc_irq_cfg(irq, node); | ||
2962 | if (!cfg) { | ||
2963 | free_irq_at(irq, NULL); | ||
2964 | return 0; | ||
3278 | } | 2965 | } |
3279 | raw_spin_unlock_irqrestore(&vector_lock, flags); | ||
3280 | 2966 | ||
3281 | if (irq > 0) | 2967 | raw_spin_lock_irqsave(&vector_lock, flags); |
3282 | dynamic_irq_init_keep_chip_data(irq); | 2968 | if (!__assign_irq_vector(irq, cfg, apic->target_cpus())) |
2969 | ret = irq; | ||
2970 | raw_spin_unlock_irqrestore(&vector_lock, flags); | ||
3283 | 2971 | ||
3284 | return irq; | 2972 | if (ret) { |
2973 | irq_set_chip_data(irq, cfg); | ||
2974 | irq_clear_status_flags(irq, IRQ_NOREQUEST); | ||
2975 | } else { | ||
2976 | free_irq_at(irq, cfg); | ||
2977 | } | ||
2978 | return ret; | ||
3285 | } | 2979 | } |
3286 | 2980 | ||
3287 | int create_irq(void) | 2981 | int create_irq(void) |
3288 | { | 2982 | { |
3289 | int node = cpu_to_node(boot_cpu_id); | 2983 | int node = cpu_to_node(0); |
3290 | unsigned int irq_want; | 2984 | unsigned int irq_want; |
3291 | int irq; | 2985 | int irq; |
3292 | 2986 | ||
@@ -3301,14 +2995,17 @@ int create_irq(void) | |||
3301 | 2995 | ||
3302 | void destroy_irq(unsigned int irq) | 2996 | void destroy_irq(unsigned int irq) |
3303 | { | 2997 | { |
2998 | struct irq_cfg *cfg = irq_get_chip_data(irq); | ||
3304 | unsigned long flags; | 2999 | unsigned long flags; |
3305 | 3000 | ||
3306 | dynamic_irq_cleanup_keep_chip_data(irq); | 3001 | irq_set_status_flags(irq, IRQ_NOREQUEST|IRQ_NOPROBE); |
3307 | 3002 | ||
3308 | free_irte(irq); | 3003 | if (irq_remapped(cfg)) |
3004 | free_irte(irq); | ||
3309 | raw_spin_lock_irqsave(&vector_lock, flags); | 3005 | raw_spin_lock_irqsave(&vector_lock, flags); |
3310 | __clear_irq_vector(irq, get_irq_chip_data(irq)); | 3006 | __clear_irq_vector(irq, cfg); |
3311 | raw_spin_unlock_irqrestore(&vector_lock, flags); | 3007 | raw_spin_unlock_irqrestore(&vector_lock, flags); |
3008 | free_irq_at(irq, cfg); | ||
3312 | } | 3009 | } |
3313 | 3010 | ||
3314 | /* | 3011 | /* |
@@ -3332,7 +3029,7 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, | |||
3332 | 3029 | ||
3333 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus()); | 3030 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus()); |
3334 | 3031 | ||
3335 | if (irq_remapped(irq)) { | 3032 | if (irq_remapped(cfg)) { |
3336 | struct irte irte; | 3033 | struct irte irte; |
3337 | int ir_index; | 3034 | int ir_index; |
3338 | u16 sub_handle; | 3035 | u16 sub_handle; |
@@ -3340,14 +3037,7 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, | |||
3340 | ir_index = map_irq_to_irte_handle(irq, &sub_handle); | 3037 | ir_index = map_irq_to_irte_handle(irq, &sub_handle); |
3341 | BUG_ON(ir_index == -1); | 3038 | BUG_ON(ir_index == -1); |
3342 | 3039 | ||
3343 | memset (&irte, 0, sizeof(irte)); | 3040 | prepare_irte(&irte, cfg->vector, dest); |
3344 | |||
3345 | irte.present = 1; | ||
3346 | irte.dst_mode = apic->irq_dest_mode; | ||
3347 | irte.trigger_mode = 0; /* edge */ | ||
3348 | irte.dlvry_mode = apic->irq_delivery_mode; | ||
3349 | irte.vector = cfg->vector; | ||
3350 | irte.dest_id = IRTE_DEST(dest); | ||
3351 | 3041 | ||
3352 | /* Set source-id of interrupt request */ | 3042 | /* Set source-id of interrupt request */ |
3353 | if (pdev) | 3043 | if (pdev) |
@@ -3392,26 +3082,24 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, | |||
3392 | } | 3082 | } |
3393 | 3083 | ||
3394 | #ifdef CONFIG_SMP | 3084 | #ifdef CONFIG_SMP |
3395 | static int set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) | 3085 | static int |
3086 | msi_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force) | ||
3396 | { | 3087 | { |
3397 | struct irq_desc *desc = irq_to_desc(irq); | 3088 | struct irq_cfg *cfg = data->chip_data; |
3398 | struct irq_cfg *cfg; | ||
3399 | struct msi_msg msg; | 3089 | struct msi_msg msg; |
3400 | unsigned int dest; | 3090 | unsigned int dest; |
3401 | 3091 | ||
3402 | if (set_desc_affinity(desc, mask, &dest)) | 3092 | if (__ioapic_set_affinity(data, mask, &dest)) |
3403 | return -1; | 3093 | return -1; |
3404 | 3094 | ||
3405 | cfg = desc->chip_data; | 3095 | __get_cached_msi_msg(data->msi_desc, &msg); |
3406 | |||
3407 | get_cached_msi_msg_desc(desc, &msg); | ||
3408 | 3096 | ||
3409 | msg.data &= ~MSI_DATA_VECTOR_MASK; | 3097 | msg.data &= ~MSI_DATA_VECTOR_MASK; |
3410 | msg.data |= MSI_DATA_VECTOR(cfg->vector); | 3098 | msg.data |= MSI_DATA_VECTOR(cfg->vector); |
3411 | msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK; | 3099 | msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK; |
3412 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); | 3100 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); |
3413 | 3101 | ||
3414 | write_msi_msg_desc(desc, &msg); | 3102 | __write_msi_msg(data->msi_desc, &msg); |
3415 | 3103 | ||
3416 | return 0; | 3104 | return 0; |
3417 | } | 3105 | } |
@@ -3421,17 +3109,17 @@ static int set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) | |||
3421 | * done in the process context using interrupt-remapping hardware. | 3109 | * done in the process context using interrupt-remapping hardware. |
3422 | */ | 3110 | */ |
3423 | static int | 3111 | static int |
3424 | ir_set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) | 3112 | ir_msi_set_affinity(struct irq_data *data, const struct cpumask *mask, |
3113 | bool force) | ||
3425 | { | 3114 | { |
3426 | struct irq_desc *desc = irq_to_desc(irq); | 3115 | struct irq_cfg *cfg = data->chip_data; |
3427 | struct irq_cfg *cfg = desc->chip_data; | 3116 | unsigned int dest, irq = data->irq; |
3428 | unsigned int dest; | ||
3429 | struct irte irte; | 3117 | struct irte irte; |
3430 | 3118 | ||
3431 | if (get_irte(irq, &irte)) | 3119 | if (get_irte(irq, &irte)) |
3432 | return -1; | 3120 | return -1; |
3433 | 3121 | ||
3434 | if (set_desc_affinity(desc, mask, &dest)) | 3122 | if (__ioapic_set_affinity(data, mask, &dest)) |
3435 | return -1; | 3123 | return -1; |
3436 | 3124 | ||
3437 | irte.vector = cfg->vector; | 3125 | irte.vector = cfg->vector; |
@@ -3461,27 +3149,27 @@ ir_set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) | |||
3461 | * which implement the MSI or MSI-X Capability Structure. | 3149 | * which implement the MSI or MSI-X Capability Structure. |
3462 | */ | 3150 | */ |
3463 | static struct irq_chip msi_chip = { | 3151 | static struct irq_chip msi_chip = { |
3464 | .name = "PCI-MSI", | 3152 | .name = "PCI-MSI", |
3465 | .unmask = unmask_msi_irq, | 3153 | .irq_unmask = unmask_msi_irq, |
3466 | .mask = mask_msi_irq, | 3154 | .irq_mask = mask_msi_irq, |
3467 | .ack = ack_apic_edge, | 3155 | .irq_ack = ack_apic_edge, |
3468 | #ifdef CONFIG_SMP | 3156 | #ifdef CONFIG_SMP |
3469 | .set_affinity = set_msi_irq_affinity, | 3157 | .irq_set_affinity = msi_set_affinity, |
3470 | #endif | 3158 | #endif |
3471 | .retrigger = ioapic_retrigger_irq, | 3159 | .irq_retrigger = ioapic_retrigger_irq, |
3472 | }; | 3160 | }; |
3473 | 3161 | ||
3474 | static struct irq_chip msi_ir_chip = { | 3162 | static struct irq_chip msi_ir_chip = { |
3475 | .name = "IR-PCI-MSI", | 3163 | .name = "IR-PCI-MSI", |
3476 | .unmask = unmask_msi_irq, | 3164 | .irq_unmask = unmask_msi_irq, |
3477 | .mask = mask_msi_irq, | 3165 | .irq_mask = mask_msi_irq, |
3478 | #ifdef CONFIG_INTR_REMAP | 3166 | #ifdef CONFIG_INTR_REMAP |
3479 | .ack = ir_ack_apic_edge, | 3167 | .irq_ack = ir_ack_apic_edge, |
3480 | #ifdef CONFIG_SMP | 3168 | #ifdef CONFIG_SMP |
3481 | .set_affinity = ir_set_msi_irq_affinity, | 3169 | .irq_set_affinity = ir_msi_set_affinity, |
3482 | #endif | 3170 | #endif |
3483 | #endif | 3171 | #endif |
3484 | .retrigger = ioapic_retrigger_irq, | 3172 | .irq_retrigger = ioapic_retrigger_irq, |
3485 | }; | 3173 | }; |
3486 | 3174 | ||
3487 | /* | 3175 | /* |
@@ -3513,40 +3201,35 @@ static int msi_alloc_irte(struct pci_dev *dev, int irq, int nvec) | |||
3513 | 3201 | ||
3514 | static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq) | 3202 | static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq) |
3515 | { | 3203 | { |
3516 | int ret; | 3204 | struct irq_chip *chip = &msi_chip; |
3517 | struct msi_msg msg; | 3205 | struct msi_msg msg; |
3206 | int ret; | ||
3518 | 3207 | ||
3519 | ret = msi_compose_msg(dev, irq, &msg, -1); | 3208 | ret = msi_compose_msg(dev, irq, &msg, -1); |
3520 | if (ret < 0) | 3209 | if (ret < 0) |
3521 | return ret; | 3210 | return ret; |
3522 | 3211 | ||
3523 | set_irq_msi(irq, msidesc); | 3212 | irq_set_msi_desc(irq, msidesc); |
3524 | write_msi_msg(irq, &msg); | 3213 | write_msi_msg(irq, &msg); |
3525 | 3214 | ||
3526 | if (irq_remapped(irq)) { | 3215 | if (irq_remapped(irq_get_chip_data(irq))) { |
3527 | struct irq_desc *desc = irq_to_desc(irq); | 3216 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); |
3528 | /* | 3217 | chip = &msi_ir_chip; |
3529 | * irq migration in process context | 3218 | } |
3530 | */ | 3219 | |
3531 | desc->status |= IRQ_MOVE_PCNTXT; | 3220 | irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge"); |
3532 | set_irq_chip_and_handler_name(irq, &msi_ir_chip, handle_edge_irq, "edge"); | ||
3533 | } else | ||
3534 | set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, "edge"); | ||
3535 | 3221 | ||
3536 | dev_printk(KERN_DEBUG, &dev->dev, "irq %d for MSI/MSI-X\n", irq); | 3222 | dev_printk(KERN_DEBUG, &dev->dev, "irq %d for MSI/MSI-X\n", irq); |
3537 | 3223 | ||
3538 | return 0; | 3224 | return 0; |
3539 | } | 3225 | } |
3540 | 3226 | ||
3541 | int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | 3227 | int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) |
3542 | { | 3228 | { |
3543 | unsigned int irq; | 3229 | int node, ret, sub_handle, index = 0; |
3544 | int ret, sub_handle; | 3230 | unsigned int irq, irq_want; |
3545 | struct msi_desc *msidesc; | 3231 | struct msi_desc *msidesc; |
3546 | unsigned int irq_want; | ||
3547 | struct intel_iommu *iommu = NULL; | 3232 | struct intel_iommu *iommu = NULL; |
3548 | int index = 0; | ||
3549 | int node; | ||
3550 | 3233 | ||
3551 | /* x86 doesn't support multiple MSI yet */ | 3234 | /* x86 doesn't support multiple MSI yet */ |
3552 | if (type == PCI_CAP_ID_MSI && nvec > 1) | 3235 | if (type == PCI_CAP_ID_MSI && nvec > 1) |
@@ -3599,31 +3282,31 @@ error: | |||
3599 | return ret; | 3282 | return ret; |
3600 | } | 3283 | } |
3601 | 3284 | ||
3602 | void arch_teardown_msi_irq(unsigned int irq) | 3285 | void native_teardown_msi_irq(unsigned int irq) |
3603 | { | 3286 | { |
3604 | destroy_irq(irq); | 3287 | destroy_irq(irq); |
3605 | } | 3288 | } |
3606 | 3289 | ||
3607 | #if defined (CONFIG_DMAR) || defined (CONFIG_INTR_REMAP) | 3290 | #if defined (CONFIG_DMAR) || defined (CONFIG_INTR_REMAP) |
3608 | #ifdef CONFIG_SMP | 3291 | #ifdef CONFIG_SMP |
3609 | static int dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | 3292 | static int |
3293 | dmar_msi_set_affinity(struct irq_data *data, const struct cpumask *mask, | ||
3294 | bool force) | ||
3610 | { | 3295 | { |
3611 | struct irq_desc *desc = irq_to_desc(irq); | 3296 | struct irq_cfg *cfg = data->chip_data; |
3612 | struct irq_cfg *cfg; | 3297 | unsigned int dest, irq = data->irq; |
3613 | struct msi_msg msg; | 3298 | struct msi_msg msg; |
3614 | unsigned int dest; | ||
3615 | 3299 | ||
3616 | if (set_desc_affinity(desc, mask, &dest)) | 3300 | if (__ioapic_set_affinity(data, mask, &dest)) |
3617 | return -1; | 3301 | return -1; |
3618 | 3302 | ||
3619 | cfg = desc->chip_data; | ||
3620 | |||
3621 | dmar_msi_read(irq, &msg); | 3303 | dmar_msi_read(irq, &msg); |
3622 | 3304 | ||
3623 | msg.data &= ~MSI_DATA_VECTOR_MASK; | 3305 | msg.data &= ~MSI_DATA_VECTOR_MASK; |
3624 | msg.data |= MSI_DATA_VECTOR(cfg->vector); | 3306 | msg.data |= MSI_DATA_VECTOR(cfg->vector); |
3625 | msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK; | 3307 | msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK; |
3626 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); | 3308 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); |
3309 | msg.address_hi = MSI_ADDR_BASE_HI | MSI_ADDR_EXT_DEST_ID(dest); | ||
3627 | 3310 | ||
3628 | dmar_msi_write(irq, &msg); | 3311 | dmar_msi_write(irq, &msg); |
3629 | 3312 | ||
@@ -3633,14 +3316,14 @@ static int dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
3633 | #endif /* CONFIG_SMP */ | 3316 | #endif /* CONFIG_SMP */ |
3634 | 3317 | ||
3635 | static struct irq_chip dmar_msi_type = { | 3318 | static struct irq_chip dmar_msi_type = { |
3636 | .name = "DMAR_MSI", | 3319 | .name = "DMAR_MSI", |
3637 | .unmask = dmar_msi_unmask, | 3320 | .irq_unmask = dmar_msi_unmask, |
3638 | .mask = dmar_msi_mask, | 3321 | .irq_mask = dmar_msi_mask, |
3639 | .ack = ack_apic_edge, | 3322 | .irq_ack = ack_apic_edge, |
3640 | #ifdef CONFIG_SMP | 3323 | #ifdef CONFIG_SMP |
3641 | .set_affinity = dmar_msi_set_affinity, | 3324 | .irq_set_affinity = dmar_msi_set_affinity, |
3642 | #endif | 3325 | #endif |
3643 | .retrigger = ioapic_retrigger_irq, | 3326 | .irq_retrigger = ioapic_retrigger_irq, |
3644 | }; | 3327 | }; |
3645 | 3328 | ||
3646 | int arch_setup_dmar_msi(unsigned int irq) | 3329 | int arch_setup_dmar_msi(unsigned int irq) |
@@ -3652,8 +3335,8 @@ int arch_setup_dmar_msi(unsigned int irq) | |||
3652 | if (ret < 0) | 3335 | if (ret < 0) |
3653 | return ret; | 3336 | return ret; |
3654 | dmar_msi_write(irq, &msg); | 3337 | dmar_msi_write(irq, &msg); |
3655 | set_irq_chip_and_handler_name(irq, &dmar_msi_type, handle_edge_irq, | 3338 | irq_set_chip_and_handler_name(irq, &dmar_msi_type, handle_edge_irq, |
3656 | "edge"); | 3339 | "edge"); |
3657 | return 0; | 3340 | return 0; |
3658 | } | 3341 | } |
3659 | #endif | 3342 | #endif |
@@ -3661,26 +3344,24 @@ int arch_setup_dmar_msi(unsigned int irq) | |||
3661 | #ifdef CONFIG_HPET_TIMER | 3344 | #ifdef CONFIG_HPET_TIMER |
3662 | 3345 | ||
3663 | #ifdef CONFIG_SMP | 3346 | #ifdef CONFIG_SMP |
3664 | static int hpet_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | 3347 | static int hpet_msi_set_affinity(struct irq_data *data, |
3348 | const struct cpumask *mask, bool force) | ||
3665 | { | 3349 | { |
3666 | struct irq_desc *desc = irq_to_desc(irq); | 3350 | struct irq_cfg *cfg = data->chip_data; |
3667 | struct irq_cfg *cfg; | ||
3668 | struct msi_msg msg; | 3351 | struct msi_msg msg; |
3669 | unsigned int dest; | 3352 | unsigned int dest; |
3670 | 3353 | ||
3671 | if (set_desc_affinity(desc, mask, &dest)) | 3354 | if (__ioapic_set_affinity(data, mask, &dest)) |
3672 | return -1; | 3355 | return -1; |
3673 | 3356 | ||
3674 | cfg = desc->chip_data; | 3357 | hpet_msi_read(data->handler_data, &msg); |
3675 | |||
3676 | hpet_msi_read(irq, &msg); | ||
3677 | 3358 | ||
3678 | msg.data &= ~MSI_DATA_VECTOR_MASK; | 3359 | msg.data &= ~MSI_DATA_VECTOR_MASK; |
3679 | msg.data |= MSI_DATA_VECTOR(cfg->vector); | 3360 | msg.data |= MSI_DATA_VECTOR(cfg->vector); |
3680 | msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK; | 3361 | msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK; |
3681 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); | 3362 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); |
3682 | 3363 | ||
3683 | hpet_msi_write(irq, &msg); | 3364 | hpet_msi_write(data->handler_data, &msg); |
3684 | 3365 | ||
3685 | return 0; | 3366 | return 0; |
3686 | } | 3367 | } |
@@ -3688,34 +3369,34 @@ static int hpet_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
3688 | #endif /* CONFIG_SMP */ | 3369 | #endif /* CONFIG_SMP */ |
3689 | 3370 | ||
3690 | static struct irq_chip ir_hpet_msi_type = { | 3371 | static struct irq_chip ir_hpet_msi_type = { |
3691 | .name = "IR-HPET_MSI", | 3372 | .name = "IR-HPET_MSI", |
3692 | .unmask = hpet_msi_unmask, | 3373 | .irq_unmask = hpet_msi_unmask, |
3693 | .mask = hpet_msi_mask, | 3374 | .irq_mask = hpet_msi_mask, |
3694 | #ifdef CONFIG_INTR_REMAP | 3375 | #ifdef CONFIG_INTR_REMAP |
3695 | .ack = ir_ack_apic_edge, | 3376 | .irq_ack = ir_ack_apic_edge, |
3696 | #ifdef CONFIG_SMP | 3377 | #ifdef CONFIG_SMP |
3697 | .set_affinity = ir_set_msi_irq_affinity, | 3378 | .irq_set_affinity = ir_msi_set_affinity, |
3698 | #endif | 3379 | #endif |
3699 | #endif | 3380 | #endif |
3700 | .retrigger = ioapic_retrigger_irq, | 3381 | .irq_retrigger = ioapic_retrigger_irq, |
3701 | }; | 3382 | }; |
3702 | 3383 | ||
3703 | static struct irq_chip hpet_msi_type = { | 3384 | static struct irq_chip hpet_msi_type = { |
3704 | .name = "HPET_MSI", | 3385 | .name = "HPET_MSI", |
3705 | .unmask = hpet_msi_unmask, | 3386 | .irq_unmask = hpet_msi_unmask, |
3706 | .mask = hpet_msi_mask, | 3387 | .irq_mask = hpet_msi_mask, |
3707 | .ack = ack_apic_edge, | 3388 | .irq_ack = ack_apic_edge, |
3708 | #ifdef CONFIG_SMP | 3389 | #ifdef CONFIG_SMP |
3709 | .set_affinity = hpet_msi_set_affinity, | 3390 | .irq_set_affinity = hpet_msi_set_affinity, |
3710 | #endif | 3391 | #endif |
3711 | .retrigger = ioapic_retrigger_irq, | 3392 | .irq_retrigger = ioapic_retrigger_irq, |
3712 | }; | 3393 | }; |
3713 | 3394 | ||
3714 | int arch_setup_hpet_msi(unsigned int irq, unsigned int id) | 3395 | int arch_setup_hpet_msi(unsigned int irq, unsigned int id) |
3715 | { | 3396 | { |
3716 | int ret; | 3397 | struct irq_chip *chip = &hpet_msi_type; |
3717 | struct msi_msg msg; | 3398 | struct msi_msg msg; |
3718 | struct irq_desc *desc = irq_to_desc(irq); | 3399 | int ret; |
3719 | 3400 | ||
3720 | if (intr_remapping_enabled) { | 3401 | if (intr_remapping_enabled) { |
3721 | struct intel_iommu *iommu = map_hpet_to_ir(id); | 3402 | struct intel_iommu *iommu = map_hpet_to_ir(id); |
@@ -3733,15 +3414,12 @@ int arch_setup_hpet_msi(unsigned int irq, unsigned int id) | |||
3733 | if (ret < 0) | 3414 | if (ret < 0) |
3734 | return ret; | 3415 | return ret; |
3735 | 3416 | ||
3736 | hpet_msi_write(irq, &msg); | 3417 | hpet_msi_write(irq_get_handler_data(irq), &msg); |
3737 | desc->status |= IRQ_MOVE_PCNTXT; | 3418 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); |
3738 | if (irq_remapped(irq)) | 3419 | if (irq_remapped(irq_get_chip_data(irq))) |
3739 | set_irq_chip_and_handler_name(irq, &ir_hpet_msi_type, | 3420 | chip = &ir_hpet_msi_type; |
3740 | handle_edge_irq, "edge"); | ||
3741 | else | ||
3742 | set_irq_chip_and_handler_name(irq, &hpet_msi_type, | ||
3743 | handle_edge_irq, "edge"); | ||
3744 | 3421 | ||
3422 | irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge"); | ||
3745 | return 0; | 3423 | return 0; |
3746 | } | 3424 | } |
3747 | #endif | 3425 | #endif |
@@ -3768,33 +3446,30 @@ static void target_ht_irq(unsigned int irq, unsigned int dest, u8 vector) | |||
3768 | write_ht_irq_msg(irq, &msg); | 3446 | write_ht_irq_msg(irq, &msg); |
3769 | } | 3447 | } |
3770 | 3448 | ||
3771 | static int set_ht_irq_affinity(unsigned int irq, const struct cpumask *mask) | 3449 | static int |
3450 | ht_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force) | ||
3772 | { | 3451 | { |
3773 | struct irq_desc *desc = irq_to_desc(irq); | 3452 | struct irq_cfg *cfg = data->chip_data; |
3774 | struct irq_cfg *cfg; | ||
3775 | unsigned int dest; | 3453 | unsigned int dest; |
3776 | 3454 | ||
3777 | if (set_desc_affinity(desc, mask, &dest)) | 3455 | if (__ioapic_set_affinity(data, mask, &dest)) |
3778 | return -1; | 3456 | return -1; |
3779 | 3457 | ||
3780 | cfg = desc->chip_data; | 3458 | target_ht_irq(data->irq, dest, cfg->vector); |
3781 | |||
3782 | target_ht_irq(irq, dest, cfg->vector); | ||
3783 | |||
3784 | return 0; | 3459 | return 0; |
3785 | } | 3460 | } |
3786 | 3461 | ||
3787 | #endif | 3462 | #endif |
3788 | 3463 | ||
3789 | static struct irq_chip ht_irq_chip = { | 3464 | static struct irq_chip ht_irq_chip = { |
3790 | .name = "PCI-HT", | 3465 | .name = "PCI-HT", |
3791 | .mask = mask_ht_irq, | 3466 | .irq_mask = mask_ht_irq, |
3792 | .unmask = unmask_ht_irq, | 3467 | .irq_unmask = unmask_ht_irq, |
3793 | .ack = ack_apic_edge, | 3468 | .irq_ack = ack_apic_edge, |
3794 | #ifdef CONFIG_SMP | 3469 | #ifdef CONFIG_SMP |
3795 | .set_affinity = set_ht_irq_affinity, | 3470 | .irq_set_affinity = ht_set_affinity, |
3796 | #endif | 3471 | #endif |
3797 | .retrigger = ioapic_retrigger_irq, | 3472 | .irq_retrigger = ioapic_retrigger_irq, |
3798 | }; | 3473 | }; |
3799 | 3474 | ||
3800 | int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | 3475 | int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) |
@@ -3831,7 +3506,7 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
3831 | 3506 | ||
3832 | write_ht_irq_msg(irq, &msg); | 3507 | write_ht_irq_msg(irq, &msg); |
3833 | 3508 | ||
3834 | set_irq_chip_and_handler_name(irq, &ht_irq_chip, | 3509 | irq_set_chip_and_handler_name(irq, &ht_irq_chip, |
3835 | handle_edge_irq, "edge"); | 3510 | handle_edge_irq, "edge"); |
3836 | 3511 | ||
3837 | dev_printk(KERN_DEBUG, &dev->dev, "irq %d for HT\n", irq); | 3512 | dev_printk(KERN_DEBUG, &dev->dev, "irq %d for HT\n", irq); |
@@ -3840,7 +3515,40 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
3840 | } | 3515 | } |
3841 | #endif /* CONFIG_HT_IRQ */ | 3516 | #endif /* CONFIG_HT_IRQ */ |
3842 | 3517 | ||
3843 | int __init io_apic_get_redir_entries (int ioapic) | 3518 | static int |
3519 | io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr) | ||
3520 | { | ||
3521 | struct irq_cfg *cfg = alloc_irq_and_cfg_at(irq, node); | ||
3522 | int ret; | ||
3523 | |||
3524 | if (!cfg) | ||
3525 | return -EINVAL; | ||
3526 | ret = __add_pin_to_irq_node(cfg, node, attr->ioapic, attr->ioapic_pin); | ||
3527 | if (!ret) | ||
3528 | setup_ioapic_irq(attr->ioapic, attr->ioapic_pin, irq, cfg, | ||
3529 | attr->trigger, attr->polarity); | ||
3530 | return ret; | ||
3531 | } | ||
3532 | |||
3533 | int io_apic_setup_irq_pin_once(unsigned int irq, int node, | ||
3534 | struct io_apic_irq_attr *attr) | ||
3535 | { | ||
3536 | unsigned int id = attr->ioapic, pin = attr->ioapic_pin; | ||
3537 | int ret; | ||
3538 | |||
3539 | /* Avoid redundant programming */ | ||
3540 | if (test_bit(pin, ioapics[id].pin_programmed)) { | ||
3541 | pr_debug("Pin %d-%d already programmed\n", | ||
3542 | mpc_ioapic_id(id), pin); | ||
3543 | return 0; | ||
3544 | } | ||
3545 | ret = io_apic_setup_irq_pin(irq, node, attr); | ||
3546 | if (!ret) | ||
3547 | set_bit(pin, ioapics[id].pin_programmed); | ||
3548 | return ret; | ||
3549 | } | ||
3550 | |||
3551 | static int __init io_apic_get_redir_entries(int ioapic) | ||
3844 | { | 3552 | { |
3845 | union IO_APIC_reg_01 reg_01; | 3553 | union IO_APIC_reg_01 reg_01; |
3846 | unsigned long flags; | 3554 | unsigned long flags; |
@@ -3856,7 +3564,7 @@ int __init io_apic_get_redir_entries (int ioapic) | |||
3856 | return reg_01.bits.entries + 1; | 3564 | return reg_01.bits.entries + 1; |
3857 | } | 3565 | } |
3858 | 3566 | ||
3859 | void __init probe_nr_irqs_gsi(void) | 3567 | static void __init probe_nr_irqs_gsi(void) |
3860 | { | 3568 | { |
3861 | int nr; | 3569 | int nr; |
3862 | 3570 | ||
@@ -3867,6 +3575,11 @@ void __init probe_nr_irqs_gsi(void) | |||
3867 | printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi); | 3575 | printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi); |
3868 | } | 3576 | } |
3869 | 3577 | ||
3578 | int get_nr_irqs_gsi(void) | ||
3579 | { | ||
3580 | return nr_irqs_gsi; | ||
3581 | } | ||
3582 | |||
3870 | #ifdef CONFIG_SPARSE_IRQ | 3583 | #ifdef CONFIG_SPARSE_IRQ |
3871 | int __init arch_probe_nr_irqs(void) | 3584 | int __init arch_probe_nr_irqs(void) |
3872 | { | 3585 | { |
@@ -3885,104 +3598,28 @@ int __init arch_probe_nr_irqs(void) | |||
3885 | if (nr < nr_irqs) | 3598 | if (nr < nr_irqs) |
3886 | nr_irqs = nr; | 3599 | nr_irqs = nr; |
3887 | 3600 | ||
3888 | return 0; | 3601 | return NR_IRQS_LEGACY; |
3889 | } | 3602 | } |
3890 | #endif | 3603 | #endif |
3891 | 3604 | ||
3892 | static int __io_apic_set_pci_routing(struct device *dev, int irq, | 3605 | int io_apic_set_pci_routing(struct device *dev, int irq, |
3893 | struct io_apic_irq_attr *irq_attr) | 3606 | struct io_apic_irq_attr *irq_attr) |
3894 | { | 3607 | { |
3895 | struct irq_desc *desc; | ||
3896 | struct irq_cfg *cfg; | ||
3897 | int node; | 3608 | int node; |
3898 | int ioapic, pin; | ||
3899 | int trigger, polarity; | ||
3900 | 3609 | ||
3901 | ioapic = irq_attr->ioapic; | ||
3902 | if (!IO_APIC_IRQ(irq)) { | 3610 | if (!IO_APIC_IRQ(irq)) { |
3903 | apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n", | 3611 | apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n", |
3904 | ioapic); | 3612 | irq_attr->ioapic); |
3905 | return -EINVAL; | 3613 | return -EINVAL; |
3906 | } | 3614 | } |
3907 | 3615 | ||
3908 | if (dev) | 3616 | node = dev ? dev_to_node(dev) : cpu_to_node(0); |
3909 | node = dev_to_node(dev); | ||
3910 | else | ||
3911 | node = cpu_to_node(boot_cpu_id); | ||
3912 | |||
3913 | desc = irq_to_desc_alloc_node(irq, node); | ||
3914 | if (!desc) { | ||
3915 | printk(KERN_INFO "can not get irq_desc %d\n", irq); | ||
3916 | return 0; | ||
3917 | } | ||
3918 | |||
3919 | pin = irq_attr->ioapic_pin; | ||
3920 | trigger = irq_attr->trigger; | ||
3921 | polarity = irq_attr->polarity; | ||
3922 | 3617 | ||
3923 | /* | 3618 | return io_apic_setup_irq_pin_once(irq, node, irq_attr); |
3924 | * IRQs < 16 are already in the irq_2_pin[] map | ||
3925 | */ | ||
3926 | if (irq >= legacy_pic->nr_legacy_irqs) { | ||
3927 | cfg = desc->chip_data; | ||
3928 | if (add_pin_to_irq_node_nopanic(cfg, node, ioapic, pin)) { | ||
3929 | printk(KERN_INFO "can not add pin %d for irq %d\n", | ||
3930 | pin, irq); | ||
3931 | return 0; | ||
3932 | } | ||
3933 | } | ||
3934 | |||
3935 | setup_IO_APIC_irq(ioapic, pin, irq, desc, trigger, polarity); | ||
3936 | |||
3937 | return 0; | ||
3938 | } | ||
3939 | |||
3940 | int io_apic_set_pci_routing(struct device *dev, int irq, | ||
3941 | struct io_apic_irq_attr *irq_attr) | ||
3942 | { | ||
3943 | int ioapic, pin; | ||
3944 | /* | ||
3945 | * Avoid pin reprogramming. PRTs typically include entries | ||
3946 | * with redundant pin->gsi mappings (but unique PCI devices); | ||
3947 | * we only program the IOAPIC on the first. | ||
3948 | */ | ||
3949 | ioapic = irq_attr->ioapic; | ||
3950 | pin = irq_attr->ioapic_pin; | ||
3951 | if (test_bit(pin, mp_ioapic_routing[ioapic].pin_programmed)) { | ||
3952 | pr_debug("Pin %d-%d already programmed\n", | ||
3953 | mp_ioapics[ioapic].apicid, pin); | ||
3954 | return 0; | ||
3955 | } | ||
3956 | set_bit(pin, mp_ioapic_routing[ioapic].pin_programmed); | ||
3957 | |||
3958 | return __io_apic_set_pci_routing(dev, irq, irq_attr); | ||
3959 | } | ||
3960 | |||
3961 | u8 __init io_apic_unique_id(u8 id) | ||
3962 | { | ||
3963 | #ifdef CONFIG_X86_32 | ||
3964 | if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && | ||
3965 | !APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) | ||
3966 | return io_apic_get_unique_id(nr_ioapics, id); | ||
3967 | else | ||
3968 | return id; | ||
3969 | #else | ||
3970 | int i; | ||
3971 | DECLARE_BITMAP(used, 256); | ||
3972 | |||
3973 | bitmap_zero(used, 256); | ||
3974 | for (i = 0; i < nr_ioapics; i++) { | ||
3975 | struct mpc_ioapic *ia = &mp_ioapics[i]; | ||
3976 | __set_bit(ia->apicid, used); | ||
3977 | } | ||
3978 | if (!test_bit(id, used)) | ||
3979 | return id; | ||
3980 | return find_first_zero_bit(used, 256); | ||
3981 | #endif | ||
3982 | } | 3619 | } |
3983 | 3620 | ||
3984 | #ifdef CONFIG_X86_32 | 3621 | #ifdef CONFIG_X86_32 |
3985 | int __init io_apic_get_unique_id(int ioapic, int apic_id) | 3622 | static int __init io_apic_get_unique_id(int ioapic, int apic_id) |
3986 | { | 3623 | { |
3987 | union IO_APIC_reg_00 reg_00; | 3624 | union IO_APIC_reg_00 reg_00; |
3988 | static physid_mask_t apic_id_map = PHYSID_MASK_NONE; | 3625 | static physid_mask_t apic_id_map = PHYSID_MASK_NONE; |
@@ -4055,9 +3692,32 @@ int __init io_apic_get_unique_id(int ioapic, int apic_id) | |||
4055 | 3692 | ||
4056 | return apic_id; | 3693 | return apic_id; |
4057 | } | 3694 | } |
3695 | |||
3696 | static u8 __init io_apic_unique_id(u8 id) | ||
3697 | { | ||
3698 | if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && | ||
3699 | !APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) | ||
3700 | return io_apic_get_unique_id(nr_ioapics, id); | ||
3701 | else | ||
3702 | return id; | ||
3703 | } | ||
3704 | #else | ||
3705 | static u8 __init io_apic_unique_id(u8 id) | ||
3706 | { | ||
3707 | int i; | ||
3708 | DECLARE_BITMAP(used, 256); | ||
3709 | |||
3710 | bitmap_zero(used, 256); | ||
3711 | for (i = 0; i < nr_ioapics; i++) { | ||
3712 | __set_bit(mpc_ioapic_id(i), used); | ||
3713 | } | ||
3714 | if (!test_bit(id, used)) | ||
3715 | return id; | ||
3716 | return find_first_zero_bit(used, 256); | ||
3717 | } | ||
4058 | #endif | 3718 | #endif |
4059 | 3719 | ||
4060 | int __init io_apic_get_version(int ioapic) | 3720 | static int __init io_apic_get_version(int ioapic) |
4061 | { | 3721 | { |
4062 | union IO_APIC_reg_01 reg_01; | 3722 | union IO_APIC_reg_01 reg_01; |
4063 | unsigned long flags; | 3723 | unsigned long flags; |
@@ -4102,14 +3762,14 @@ int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity) | |||
4102 | void __init setup_ioapic_dest(void) | 3762 | void __init setup_ioapic_dest(void) |
4103 | { | 3763 | { |
4104 | int pin, ioapic, irq, irq_entry; | 3764 | int pin, ioapic, irq, irq_entry; |
4105 | struct irq_desc *desc; | ||
4106 | const struct cpumask *mask; | 3765 | const struct cpumask *mask; |
3766 | struct irq_data *idata; | ||
4107 | 3767 | ||
4108 | if (skip_ioapic_setup == 1) | 3768 | if (skip_ioapic_setup == 1) |
4109 | return; | 3769 | return; |
4110 | 3770 | ||
4111 | for (ioapic = 0; ioapic < nr_ioapics; ioapic++) | 3771 | for (ioapic = 0; ioapic < nr_ioapics; ioapic++) |
4112 | for (pin = 0; pin < nr_ioapic_registers[ioapic]; pin++) { | 3772 | for (pin = 0; pin < ioapics[ioapic].nr_registers; pin++) { |
4113 | irq_entry = find_irq_entry(ioapic, pin, mp_INT); | 3773 | irq_entry = find_irq_entry(ioapic, pin, mp_INT); |
4114 | if (irq_entry == -1) | 3774 | if (irq_entry == -1) |
4115 | continue; | 3775 | continue; |
@@ -4118,21 +3778,20 @@ void __init setup_ioapic_dest(void) | |||
4118 | if ((ioapic > 0) && (irq > 16)) | 3778 | if ((ioapic > 0) && (irq > 16)) |
4119 | continue; | 3779 | continue; |
4120 | 3780 | ||
4121 | desc = irq_to_desc(irq); | 3781 | idata = irq_get_irq_data(irq); |
4122 | 3782 | ||
4123 | /* | 3783 | /* |
4124 | * Honour affinities which have been set in early boot | 3784 | * Honour affinities which have been set in early boot |
4125 | */ | 3785 | */ |
4126 | if (desc->status & | 3786 | if (!irqd_can_balance(idata) || irqd_affinity_was_set(idata)) |
4127 | (IRQ_NO_BALANCING | IRQ_AFFINITY_SET)) | 3787 | mask = idata->affinity; |
4128 | mask = desc->affinity; | ||
4129 | else | 3788 | else |
4130 | mask = apic->target_cpus(); | 3789 | mask = apic->target_cpus(); |
4131 | 3790 | ||
4132 | if (intr_remapping_enabled) | 3791 | if (intr_remapping_enabled) |
4133 | set_ir_ioapic_affinity_irq_desc(desc, mask); | 3792 | ir_ioapic_set_affinity(idata, mask, false); |
4134 | else | 3793 | else |
4135 | set_ioapic_affinity_irq_desc(desc, mask); | 3794 | ioapic_set_affinity(idata, mask, false); |
4136 | } | 3795 | } |
4137 | 3796 | ||
4138 | } | 3797 | } |
@@ -4172,7 +3831,7 @@ static struct resource * __init ioapic_setup_resources(int nr_ioapics) | |||
4172 | return res; | 3831 | return res; |
4173 | } | 3832 | } |
4174 | 3833 | ||
4175 | void __init ioapic_init_mappings(void) | 3834 | void __init ioapic_and_gsi_init(void) |
4176 | { | 3835 | { |
4177 | unsigned long ioapic_phys, idx = FIX_IO_APIC_BASE_0; | 3836 | unsigned long ioapic_phys, idx = FIX_IO_APIC_BASE_0; |
4178 | struct resource *ioapic_res; | 3837 | struct resource *ioapic_res; |
@@ -4181,7 +3840,7 @@ void __init ioapic_init_mappings(void) | |||
4181 | ioapic_res = ioapic_setup_resources(nr_ioapics); | 3840 | ioapic_res = ioapic_setup_resources(nr_ioapics); |
4182 | for (i = 0; i < nr_ioapics; i++) { | 3841 | for (i = 0; i < nr_ioapics; i++) { |
4183 | if (smp_found_config) { | 3842 | if (smp_found_config) { |
4184 | ioapic_phys = mp_ioapics[i].apicaddr; | 3843 | ioapic_phys = mpc_ioapic_addr(i); |
4185 | #ifdef CONFIG_X86_32 | 3844 | #ifdef CONFIG_X86_32 |
4186 | if (!ioapic_phys) { | 3845 | if (!ioapic_phys) { |
4187 | printk(KERN_ERR | 3846 | printk(KERN_ERR |
@@ -4210,6 +3869,8 @@ fake_ioapic_page: | |||
4210 | ioapic_res->end = ioapic_phys + IO_APIC_SLOT_SIZE - 1; | 3869 | ioapic_res->end = ioapic_phys + IO_APIC_SLOT_SIZE - 1; |
4211 | ioapic_res++; | 3870 | ioapic_res++; |
4212 | } | 3871 | } |
3872 | |||
3873 | probe_nr_irqs_gsi(); | ||
4213 | } | 3874 | } |
4214 | 3875 | ||
4215 | void __init ioapic_insert_resources(void) | 3876 | void __init ioapic_insert_resources(void) |
@@ -4234,10 +3895,14 @@ int mp_find_ioapic(u32 gsi) | |||
4234 | { | 3895 | { |
4235 | int i = 0; | 3896 | int i = 0; |
4236 | 3897 | ||
3898 | if (nr_ioapics == 0) | ||
3899 | return -1; | ||
3900 | |||
4237 | /* Find the IOAPIC that manages this GSI. */ | 3901 | /* Find the IOAPIC that manages this GSI. */ |
4238 | for (i = 0; i < nr_ioapics; i++) { | 3902 | for (i = 0; i < nr_ioapics; i++) { |
4239 | if ((gsi >= mp_gsi_routing[i].gsi_base) | 3903 | struct mp_ioapic_gsi *gsi_cfg = mp_ioapic_gsi_routing(i); |
4240 | && (gsi <= mp_gsi_routing[i].gsi_end)) | 3904 | if ((gsi >= gsi_cfg->gsi_base) |
3905 | && (gsi <= gsi_cfg->gsi_end)) | ||
4241 | return i; | 3906 | return i; |
4242 | } | 3907 | } |
4243 | 3908 | ||
@@ -4247,18 +3912,22 @@ int mp_find_ioapic(u32 gsi) | |||
4247 | 3912 | ||
4248 | int mp_find_ioapic_pin(int ioapic, u32 gsi) | 3913 | int mp_find_ioapic_pin(int ioapic, u32 gsi) |
4249 | { | 3914 | { |
3915 | struct mp_ioapic_gsi *gsi_cfg; | ||
3916 | |||
4250 | if (WARN_ON(ioapic == -1)) | 3917 | if (WARN_ON(ioapic == -1)) |
4251 | return -1; | 3918 | return -1; |
4252 | if (WARN_ON(gsi > mp_gsi_routing[ioapic].gsi_end)) | 3919 | |
3920 | gsi_cfg = mp_ioapic_gsi_routing(ioapic); | ||
3921 | if (WARN_ON(gsi > gsi_cfg->gsi_end)) | ||
4253 | return -1; | 3922 | return -1; |
4254 | 3923 | ||
4255 | return gsi - mp_gsi_routing[ioapic].gsi_base; | 3924 | return gsi - gsi_cfg->gsi_base; |
4256 | } | 3925 | } |
4257 | 3926 | ||
4258 | static int bad_ioapic(unsigned long address) | 3927 | static __init int bad_ioapic(unsigned long address) |
4259 | { | 3928 | { |
4260 | if (nr_ioapics >= MAX_IO_APICS) { | 3929 | if (nr_ioapics >= MAX_IO_APICS) { |
4261 | printk(KERN_WARNING "WARING: Max # of I/O APICs (%d) exceeded " | 3930 | printk(KERN_WARNING "WARNING: Max # of I/O APICs (%d) exceeded " |
4262 | "(found %d), skipping\n", MAX_IO_APICS, nr_ioapics); | 3931 | "(found %d), skipping\n", MAX_IO_APICS, nr_ioapics); |
4263 | return 1; | 3932 | return 1; |
4264 | } | 3933 | } |
@@ -4274,40 +3943,42 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
4274 | { | 3943 | { |
4275 | int idx = 0; | 3944 | int idx = 0; |
4276 | int entries; | 3945 | int entries; |
3946 | struct mp_ioapic_gsi *gsi_cfg; | ||
4277 | 3947 | ||
4278 | if (bad_ioapic(address)) | 3948 | if (bad_ioapic(address)) |
4279 | return; | 3949 | return; |
4280 | 3950 | ||
4281 | idx = nr_ioapics; | 3951 | idx = nr_ioapics; |
4282 | 3952 | ||
4283 | mp_ioapics[idx].type = MP_IOAPIC; | 3953 | ioapics[idx].mp_config.type = MP_IOAPIC; |
4284 | mp_ioapics[idx].flags = MPC_APIC_USABLE; | 3954 | ioapics[idx].mp_config.flags = MPC_APIC_USABLE; |
4285 | mp_ioapics[idx].apicaddr = address; | 3955 | ioapics[idx].mp_config.apicaddr = address; |
4286 | 3956 | ||
4287 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); | 3957 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); |
4288 | mp_ioapics[idx].apicid = io_apic_unique_id(id); | 3958 | ioapics[idx].mp_config.apicid = io_apic_unique_id(id); |
4289 | mp_ioapics[idx].apicver = io_apic_get_version(idx); | 3959 | ioapics[idx].mp_config.apicver = io_apic_get_version(idx); |
4290 | 3960 | ||
4291 | /* | 3961 | /* |
4292 | * Build basic GSI lookup table to facilitate gsi->io_apic lookups | 3962 | * Build basic GSI lookup table to facilitate gsi->io_apic lookups |
4293 | * and to prevent reprogramming of IOAPIC pins (PCI GSIs). | 3963 | * and to prevent reprogramming of IOAPIC pins (PCI GSIs). |
4294 | */ | 3964 | */ |
4295 | entries = io_apic_get_redir_entries(idx); | 3965 | entries = io_apic_get_redir_entries(idx); |
4296 | mp_gsi_routing[idx].gsi_base = gsi_base; | 3966 | gsi_cfg = mp_ioapic_gsi_routing(idx); |
4297 | mp_gsi_routing[idx].gsi_end = gsi_base + entries - 1; | 3967 | gsi_cfg->gsi_base = gsi_base; |
3968 | gsi_cfg->gsi_end = gsi_base + entries - 1; | ||
4298 | 3969 | ||
4299 | /* | 3970 | /* |
4300 | * The number of IO-APIC IRQ registers (== #pins): | 3971 | * The number of IO-APIC IRQ registers (== #pins): |
4301 | */ | 3972 | */ |
4302 | nr_ioapic_registers[idx] = entries; | 3973 | ioapics[idx].nr_registers = entries; |
4303 | 3974 | ||
4304 | if (mp_gsi_routing[idx].gsi_end >= gsi_top) | 3975 | if (gsi_cfg->gsi_end >= gsi_top) |
4305 | gsi_top = mp_gsi_routing[idx].gsi_end + 1; | 3976 | gsi_top = gsi_cfg->gsi_end + 1; |
4306 | 3977 | ||
4307 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " | 3978 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " |
4308 | "GSI %d-%d\n", idx, mp_ioapics[idx].apicid, | 3979 | "GSI %d-%d\n", idx, mpc_ioapic_id(idx), |
4309 | mp_ioapics[idx].apicver, mp_ioapics[idx].apicaddr, | 3980 | mpc_ioapic_ver(idx), mpc_ioapic_addr(idx), |
4310 | mp_gsi_routing[idx].gsi_base, mp_gsi_routing[idx].gsi_end); | 3981 | gsi_cfg->gsi_base, gsi_cfg->gsi_end); |
4311 | 3982 | ||
4312 | nr_ioapics++; | 3983 | nr_ioapics++; |
4313 | } | 3984 | } |
@@ -4315,20 +3986,16 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
4315 | /* Enable IOAPIC early just for system timer */ | 3986 | /* Enable IOAPIC early just for system timer */ |
4316 | void __init pre_init_apic_IRQ0(void) | 3987 | void __init pre_init_apic_IRQ0(void) |
4317 | { | 3988 | { |
4318 | struct irq_cfg *cfg; | 3989 | struct io_apic_irq_attr attr = { 0, 0, 0, 0 }; |
4319 | struct irq_desc *desc; | ||
4320 | 3990 | ||
4321 | printk(KERN_INFO "Early APIC setup for system timer0\n"); | 3991 | printk(KERN_INFO "Early APIC setup for system timer0\n"); |
4322 | #ifndef CONFIG_SMP | 3992 | #ifndef CONFIG_SMP |
4323 | phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid); | 3993 | physid_set_mask_of_physid(boot_cpu_physical_apicid, |
3994 | &phys_cpu_present_map); | ||
4324 | #endif | 3995 | #endif |
4325 | desc = irq_to_desc_alloc_node(0, 0); | ||
4326 | |||
4327 | setup_local_APIC(); | 3996 | setup_local_APIC(); |
4328 | 3997 | ||
4329 | cfg = irq_cfg(0); | 3998 | io_apic_setup_irq_pin(0, 0, &attr); |
4330 | add_pin_to_irq_node(cfg, 0, 0, 0); | 3999 | irq_set_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, |
4331 | set_irq_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, "edge"); | 4000 | "edge"); |
4332 | |||
4333 | setup_IO_APIC_irq(0, 0, 0, desc, 0, 0); | ||
4334 | } | 4001 | } |