]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - arch/x86/kernel/apic/io_apic.c
x86, irq: Move __setup_vector_irq() before the first irq enable in cpu online path
[mirror_ubuntu-zesty-kernel.git] / arch / x86 / kernel / apic / io_apic.c
CommitLineData
1da177e4
LT
1/*
2 * Intel IO-APIC support for multi-Pentium hosts.
3 *
8f47e163 4 * Copyright (C) 1997, 1998, 1999, 2000, 2009 Ingo Molnar, Hajnalka Szabo
1da177e4
LT
5 *
6 * Many thanks to Stig Venaas for trying out countless experimental
7 * patches and reporting/debugging problems patiently!
8 *
9 * (c) 1999, Multiple IO-APIC support, developed by
10 * Ken-ichi Yaku <yaku@css1.kbnes.nec.co.jp> and
11 * Hidemi Kishimoto <kisimoto@css1.kbnes.nec.co.jp>,
12 * further tested and cleaned up by Zach Brown <zab@redhat.com>
13 * and Ingo Molnar <mingo@redhat.com>
14 *
15 * Fixes
16 * Maciej W. Rozycki : Bits for genuine 82489DX APICs;
17 * thanks to Eric Gilmore
18 * and Rolf G. Tews
19 * for testing these extensively
20 * Paul Diefenbaugh : Added full ACPI support
21 */
22
23#include <linux/mm.h>
1da177e4
LT
24#include <linux/interrupt.h>
25#include <linux/init.h>
26#include <linux/delay.h>
27#include <linux/sched.h>
d4057bdb 28#include <linux/pci.h>
1da177e4
LT
29#include <linux/mc146818rtc.h>
30#include <linux/compiler.h>
31#include <linux/acpi.h>
129f6946 32#include <linux/module.h>
1da177e4 33#include <linux/sysdev.h>
3b7d1921 34#include <linux/msi.h>
95d77884 35#include <linux/htirq.h>
7dfb7103 36#include <linux/freezer.h>
f26d6a2b 37#include <linux/kthread.h>
54168ed7 38#include <linux/jiffies.h> /* time_after() */
d4057bdb
YL
39#ifdef CONFIG_ACPI
40#include <acpi/acpi_bus.h>
41#endif
42#include <linux/bootmem.h>
43#include <linux/dmar.h>
58ac1e76 44#include <linux/hpet.h>
54d5d424 45
d4057bdb 46#include <asm/idle.h>
1da177e4
LT
47#include <asm/io.h>
48#include <asm/smp.h>
6d652ea1 49#include <asm/cpu.h>
1da177e4 50#include <asm/desc.h>
d4057bdb
YL
51#include <asm/proto.h>
52#include <asm/acpi.h>
53#include <asm/dma.h>
1da177e4 54#include <asm/timer.h>
306e440d 55#include <asm/i8259.h>
3e4ff115 56#include <asm/nmi.h>
2d3fcc1c 57#include <asm/msidef.h>
8b955b0d 58#include <asm/hypertransport.h>
a4dbc34d 59#include <asm/setup.h>
d4057bdb 60#include <asm/irq_remapping.h>
58ac1e76 61#include <asm/hpet.h>
2c1b284e 62#include <asm/hw_irq.h>
1da177e4 63
7b6aa335 64#include <asm/apic.h>
1da177e4 65
32f71aff 66#define __apicdebuginit(type) static type __init
2977fb3f
CG
67#define for_each_irq_pin(entry, head) \
68 for (entry = head; entry; entry = entry->next)
32f71aff 69
1da177e4 70/*
54168ed7
IM
71 * Is the SiS APIC rmw bug present ?
72 * -1 = don't know, 0 = no, 1 = yes
1da177e4
LT
73 */
74int sis_apic_bug = -1;
75
efa2559f
YL
76static DEFINE_SPINLOCK(ioapic_lock);
77static DEFINE_SPINLOCK(vector_lock);
78
1da177e4
LT
79/*
80 * # of IRQ routing registers
81 */
82int nr_ioapic_registers[MAX_IO_APICS];
83
9f640ccb 84/* I/O APIC entries */
b5ba7e6d 85struct mpc_ioapic mp_ioapics[MAX_IO_APICS];
9f640ccb
AS
86int nr_ioapics;
87
2a4ab640
FT
88/* IO APIC gsi routing info */
89struct mp_ioapic_gsi mp_gsi_routing[MAX_IO_APICS];
90
584f734d 91/* MP IRQ source entries */
c2c21745 92struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES];
584f734d
AS
93
94/* # of MP IRQ source entries */
95int mp_irq_entries;
96
bc07844a
TG
97/* GSI interrupts */
98static int nr_irqs_gsi = NR_IRQS_LEGACY;
99
8732fc4b
AS
100#if defined (CONFIG_MCA) || defined (CONFIG_EISA)
101int mp_bus_id_to_type[MAX_MP_BUSSES];
102#endif
103
104DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
105
efa2559f
YL
106int skip_ioapic_setup;
107
65a4e574
IM
108void arch_disable_smp_support(void)
109{
110#ifdef CONFIG_PCI
111 noioapicquirk = 1;
112 noioapicreroute = -1;
113#endif
114 skip_ioapic_setup = 1;
115}
116
54168ed7 117static int __init parse_noapic(char *str)
efa2559f
YL
118{
119 /* disable IO-APIC */
65a4e574 120 arch_disable_smp_support();
efa2559f
YL
121 return 0;
122}
123early_param("noapic", parse_noapic);
66759a01 124
0b8f1efa
YL
125struct irq_pin_list {
126 int apic, pin;
127 struct irq_pin_list *next;
128};
129
85ac16d0 130static struct irq_pin_list *get_one_free_irq_2_pin(int node)
0b8f1efa
YL
131{
132 struct irq_pin_list *pin;
0b8f1efa
YL
133
134 pin = kzalloc_node(sizeof(*pin), GFP_ATOMIC, node);
0b8f1efa
YL
135
136 return pin;
137}
138
a1420f39 139/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
0b8f1efa 140#ifdef CONFIG_SPARSE_IRQ
97943390 141static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY];
0b8f1efa 142#else
97943390 143static struct irq_cfg irq_cfgx[NR_IRQS];
0b8f1efa 144#endif
a1420f39 145
bc07844a
TG
146void __init io_apic_disable_legacy(void)
147{
148 nr_legacy_irqs = 0;
149 nr_irqs_gsi = 0;
150}
151
13a0c3c2 152int __init arch_early_irq_init(void)
8f09cd20 153{
0b8f1efa
YL
154 struct irq_cfg *cfg;
155 struct irq_desc *desc;
156 int count;
dad213ae 157 int node;
0b8f1efa 158 int i;
d6c88a50 159
0b8f1efa
YL
160 cfg = irq_cfgx;
161 count = ARRAY_SIZE(irq_cfgx);
dad213ae 162 node= cpu_to_node(boot_cpu_id);
8f09cd20 163
0b8f1efa
YL
164 for (i = 0; i < count; i++) {
165 desc = irq_to_desc(i);
166 desc->chip_data = &cfg[i];
12274e96
YL
167 zalloc_cpumask_var_node(&cfg[i].domain, GFP_NOWAIT, node);
168 zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_NOWAIT, node);
97943390
SS
169 /*
170 * For legacy IRQ's, start with assigning irq0 to irq15 to
171 * IRQ0_VECTOR to IRQ15_VECTOR on cpu 0.
172 */
173 if (i < nr_legacy_irqs) {
174 cfg[i].vector = IRQ0_VECTOR + i;
175 cpumask_set_cpu(0, cfg[i].domain);
176 }
0b8f1efa 177 }
13a0c3c2
YL
178
179 return 0;
0b8f1efa 180}
8f09cd20 181
0b8f1efa 182#ifdef CONFIG_SPARSE_IRQ
9338ad6f 183struct irq_cfg *irq_cfg(unsigned int irq)
8f09cd20 184{
0b8f1efa
YL
185 struct irq_cfg *cfg = NULL;
186 struct irq_desc *desc;
1da177e4 187
0b8f1efa
YL
188 desc = irq_to_desc(irq);
189 if (desc)
190 cfg = desc->chip_data;
0f978f45 191
0b8f1efa 192 return cfg;
8f09cd20 193}
d6c88a50 194
85ac16d0 195static struct irq_cfg *get_one_free_irq_cfg(int node)
8f09cd20 196{
0b8f1efa 197 struct irq_cfg *cfg;
0f978f45 198
0b8f1efa 199 cfg = kzalloc_node(sizeof(*cfg), GFP_ATOMIC, node);
22f65d31 200 if (cfg) {
79f55997 201 if (!zalloc_cpumask_var_node(&cfg->domain, GFP_ATOMIC, node)) {
22f65d31
MT
202 kfree(cfg);
203 cfg = NULL;
79f55997 204 } else if (!zalloc_cpumask_var_node(&cfg->old_domain,
80855f73 205 GFP_ATOMIC, node)) {
22f65d31
MT
206 free_cpumask_var(cfg->domain);
207 kfree(cfg);
208 cfg = NULL;
22f65d31
MT
209 }
210 }
0f978f45 211
0b8f1efa 212 return cfg;
8f09cd20
YL
213}
214
85ac16d0 215int arch_init_chip_data(struct irq_desc *desc, int node)
0f978f45 216{
0b8f1efa 217 struct irq_cfg *cfg;
d6c88a50 218
0b8f1efa
YL
219 cfg = desc->chip_data;
220 if (!cfg) {
85ac16d0 221 desc->chip_data = get_one_free_irq_cfg(node);
0b8f1efa
YL
222 if (!desc->chip_data) {
223 printk(KERN_ERR "can not alloc irq_cfg\n");
224 BUG_ON(1);
225 }
226 }
1da177e4 227
13a0c3c2 228 return 0;
0b8f1efa 229}
0f978f45 230
fcef5911 231/* for move_irq_desc */
48a1b10a 232static void
85ac16d0 233init_copy_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg, int node)
0f978f45 234{
48a1b10a
YL
235 struct irq_pin_list *old_entry, *head, *tail, *entry;
236
237 cfg->irq_2_pin = NULL;
238 old_entry = old_cfg->irq_2_pin;
239 if (!old_entry)
240 return;
0f978f45 241
85ac16d0 242 entry = get_one_free_irq_2_pin(node);
48a1b10a
YL
243 if (!entry)
244 return;
0f978f45 245
48a1b10a
YL
246 entry->apic = old_entry->apic;
247 entry->pin = old_entry->pin;
248 head = entry;
249 tail = entry;
250 old_entry = old_entry->next;
251 while (old_entry) {
85ac16d0 252 entry = get_one_free_irq_2_pin(node);
48a1b10a
YL
253 if (!entry) {
254 entry = head;
255 while (entry) {
256 head = entry->next;
257 kfree(entry);
258 entry = head;
259 }
260 /* still use the old one */
261 return;
262 }
263 entry->apic = old_entry->apic;
264 entry->pin = old_entry->pin;
265 tail->next = entry;
266 tail = entry;
267 old_entry = old_entry->next;
268 }
0f978f45 269
48a1b10a
YL
270 tail->next = NULL;
271 cfg->irq_2_pin = head;
0f978f45 272}
0f978f45 273
48a1b10a 274static void free_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg)
0f978f45 275{
48a1b10a 276 struct irq_pin_list *entry, *next;
0f978f45 277
48a1b10a
YL
278 if (old_cfg->irq_2_pin == cfg->irq_2_pin)
279 return;
301e6190 280
48a1b10a 281 entry = old_cfg->irq_2_pin;
0f978f45 282
48a1b10a
YL
283 while (entry) {
284 next = entry->next;
285 kfree(entry);
286 entry = next;
287 }
288 old_cfg->irq_2_pin = NULL;
0f978f45 289}
0f978f45 290
48a1b10a 291void arch_init_copy_chip_data(struct irq_desc *old_desc,
85ac16d0 292 struct irq_desc *desc, int node)
0f978f45 293{
48a1b10a
YL
294 struct irq_cfg *cfg;
295 struct irq_cfg *old_cfg;
0f978f45 296
85ac16d0 297 cfg = get_one_free_irq_cfg(node);
301e6190 298
48a1b10a
YL
299 if (!cfg)
300 return;
301
302 desc->chip_data = cfg;
303
304 old_cfg = old_desc->chip_data;
305
306 memcpy(cfg, old_cfg, sizeof(struct irq_cfg));
307
85ac16d0 308 init_copy_irq_2_pin(old_cfg, cfg, node);
0f978f45 309}
1da177e4 310
48a1b10a
YL
311static void free_irq_cfg(struct irq_cfg *old_cfg)
312{
313 kfree(old_cfg);
314}
315
316void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc)
317{
318 struct irq_cfg *old_cfg, *cfg;
319
320 old_cfg = old_desc->chip_data;
321 cfg = desc->chip_data;
322
323 if (old_cfg == cfg)
324 return;
325
326 if (old_cfg) {
327 free_irq_2_pin(old_cfg, cfg);
328 free_irq_cfg(old_cfg);
329 old_desc->chip_data = NULL;
330 }
331}
fcef5911 332/* end for move_irq_desc */
48a1b10a 333
0b8f1efa 334#else
9338ad6f 335struct irq_cfg *irq_cfg(unsigned int irq)
0b8f1efa
YL
336{
337 return irq < nr_irqs ? irq_cfgx + irq : NULL;
0f978f45 338}
1da177e4 339
0b8f1efa
YL
340#endif
341
130fe05d
LT
342struct io_apic {
343 unsigned int index;
344 unsigned int unused[3];
345 unsigned int data;
0280f7c4
SS
346 unsigned int unused2[11];
347 unsigned int eoi;
130fe05d
LT
348};
349
350static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx)
351{
352 return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx)
b5ba7e6d 353 + (mp_ioapics[idx].apicaddr & ~PAGE_MASK);
130fe05d
LT
354}
355
0280f7c4
SS
356static inline void io_apic_eoi(unsigned int apic, unsigned int vector)
357{
358 struct io_apic __iomem *io_apic = io_apic_base(apic);
359 writel(vector, &io_apic->eoi);
360}
361
130fe05d
LT
362static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg)
363{
364 struct io_apic __iomem *io_apic = io_apic_base(apic);
365 writel(reg, &io_apic->index);
366 return readl(&io_apic->data);
367}
368
369static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value)
370{
371 struct io_apic __iomem *io_apic = io_apic_base(apic);
372 writel(reg, &io_apic->index);
373 writel(value, &io_apic->data);
374}
375
376/*
377 * Re-write a value: to be used for read-modify-write
378 * cycles where the read already set up the index register.
379 *
380 * Older SiS APIC requires we rewrite the index register
381 */
382static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned int value)
383{
54168ed7 384 struct io_apic __iomem *io_apic = io_apic_base(apic);
d6c88a50
TG
385
386 if (sis_apic_bug)
387 writel(reg, &io_apic->index);
130fe05d
LT
388 writel(value, &io_apic->data);
389}
390
3145e941 391static bool io_apic_level_ack_pending(struct irq_cfg *cfg)
047c8fdb
YL
392{
393 struct irq_pin_list *entry;
394 unsigned long flags;
047c8fdb
YL
395
396 spin_lock_irqsave(&ioapic_lock, flags);
2977fb3f 397 for_each_irq_pin(entry, cfg->irq_2_pin) {
047c8fdb
YL
398 unsigned int reg;
399 int pin;
400
047c8fdb
YL
401 pin = entry->pin;
402 reg = io_apic_read(entry->apic, 0x10 + pin*2);
403 /* Is the remote IRR bit set? */
404 if (reg & IO_APIC_REDIR_REMOTE_IRR) {
405 spin_unlock_irqrestore(&ioapic_lock, flags);
406 return true;
407 }
047c8fdb
YL
408 }
409 spin_unlock_irqrestore(&ioapic_lock, flags);
410
411 return false;
412}
047c8fdb 413
cf4c6a2f
AK
414union entry_union {
415 struct { u32 w1, w2; };
416 struct IO_APIC_route_entry entry;
417};
418
419static struct IO_APIC_route_entry ioapic_read_entry(int apic, int pin)
420{
421 union entry_union eu;
422 unsigned long flags;
423 spin_lock_irqsave(&ioapic_lock, flags);
424 eu.w1 = io_apic_read(apic, 0x10 + 2 * pin);
425 eu.w2 = io_apic_read(apic, 0x11 + 2 * pin);
426 spin_unlock_irqrestore(&ioapic_lock, flags);
427 return eu.entry;
428}
429
f9dadfa7
LT
430/*
431 * When we write a new IO APIC routing entry, we need to write the high
432 * word first! If the mask bit in the low word is clear, we will enable
433 * the interrupt, and we need to make sure the entry is fully populated
434 * before that happens.
435 */
d15512f4
AK
436static void
437__ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e)
cf4c6a2f 438{
50a8d4d2
F
439 union entry_union eu = {{0, 0}};
440
cf4c6a2f 441 eu.entry = e;
f9dadfa7
LT
442 io_apic_write(apic, 0x11 + 2*pin, eu.w2);
443 io_apic_write(apic, 0x10 + 2*pin, eu.w1);
d15512f4
AK
444}
445
ca97ab90 446void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e)
d15512f4
AK
447{
448 unsigned long flags;
449 spin_lock_irqsave(&ioapic_lock, flags);
450 __ioapic_write_entry(apic, pin, e);
f9dadfa7
LT
451 spin_unlock_irqrestore(&ioapic_lock, flags);
452}
453
454/*
455 * When we mask an IO APIC routing entry, we need to write the low
456 * word first, in order to set the mask bit before we change the
457 * high bits!
458 */
459static void ioapic_mask_entry(int apic, int pin)
460{
461 unsigned long flags;
462 union entry_union eu = { .entry.mask = 1 };
463
cf4c6a2f
AK
464 spin_lock_irqsave(&ioapic_lock, flags);
465 io_apic_write(apic, 0x10 + 2*pin, eu.w1);
466 io_apic_write(apic, 0x11 + 2*pin, eu.w2);
467 spin_unlock_irqrestore(&ioapic_lock, flags);
468}
469
1da177e4
LT
470/*
471 * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
472 * shared ISA-space IRQs, so we have to support them. We are super
473 * fast in the common case, and fast for shared ISA-space IRQs.
474 */
f3d1915a
CG
475static int
476add_pin_to_irq_node_nopanic(struct irq_cfg *cfg, int node, int apic, int pin)
1da177e4 477{
2977fb3f 478 struct irq_pin_list **last, *entry;
0f978f45 479
2977fb3f
CG
480 /* don't allow duplicates */
481 last = &cfg->irq_2_pin;
482 for_each_irq_pin(entry, cfg->irq_2_pin) {
0f978f45 483 if (entry->apic == apic && entry->pin == pin)
f3d1915a 484 return 0;
2977fb3f 485 last = &entry->next;
1da177e4 486 }
0f978f45 487
875e68ec 488 entry = get_one_free_irq_2_pin(node);
a7428cd2 489 if (!entry) {
f3d1915a
CG
490 printk(KERN_ERR "can not alloc irq_pin_list (%d,%d,%d)\n",
491 node, apic, pin);
492 return -ENOMEM;
a7428cd2 493 }
1da177e4
LT
494 entry->apic = apic;
495 entry->pin = pin;
875e68ec 496
2977fb3f 497 *last = entry;
f3d1915a
CG
498 return 0;
499}
500
501static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin)
502{
503 if (add_pin_to_irq_node_nopanic(cfg, node, apic, pin))
504 panic("IO-APIC: failed to add irq-pin. Can not proceed\n");
1da177e4
LT
505}
506
507/*
508 * Reroute an IRQ to a different pin.
509 */
85ac16d0 510static void __init replace_pin_at_irq_node(struct irq_cfg *cfg, int node,
4eea6fff
JF
511 int oldapic, int oldpin,
512 int newapic, int newpin)
1da177e4 513{
535b6429 514 struct irq_pin_list *entry;
1da177e4 515
2977fb3f 516 for_each_irq_pin(entry, cfg->irq_2_pin) {
1da177e4
LT
517 if (entry->apic == oldapic && entry->pin == oldpin) {
518 entry->apic = newapic;
519 entry->pin = newpin;
0f978f45 520 /* every one is different, right? */
4eea6fff 521 return;
0f978f45 522 }
1da177e4 523 }
0f978f45 524
4eea6fff
JF
525 /* old apic/pin didn't exist, so just add new ones */
526 add_pin_to_irq_node(cfg, node, newapic, newpin);
1da177e4
LT
527}
528
c29d9db3
SS
529static void __io_apic_modify_irq(struct irq_pin_list *entry,
530 int mask_and, int mask_or,
531 void (*final)(struct irq_pin_list *entry))
532{
533 unsigned int reg, pin;
534
535 pin = entry->pin;
536 reg = io_apic_read(entry->apic, 0x10 + pin * 2);
537 reg &= mask_and;
538 reg |= mask_or;
539 io_apic_modify(entry->apic, 0x10 + pin * 2, reg);
540 if (final)
541 final(entry);
542}
543
2f210deb
JF
544static void io_apic_modify_irq(struct irq_cfg *cfg,
545 int mask_and, int mask_or,
546 void (*final)(struct irq_pin_list *entry))
87783be4 547{
87783be4 548 struct irq_pin_list *entry;
047c8fdb 549
c29d9db3
SS
550 for_each_irq_pin(entry, cfg->irq_2_pin)
551 __io_apic_modify_irq(entry, mask_and, mask_or, final);
552}
553
554static void __mask_and_edge_IO_APIC_irq(struct irq_pin_list *entry)
555{
556 __io_apic_modify_irq(entry, ~IO_APIC_REDIR_LEVEL_TRIGGER,
557 IO_APIC_REDIR_MASKED, NULL);
558}
559
560static void __unmask_and_level_IO_APIC_irq(struct irq_pin_list *entry)
561{
562 __io_apic_modify_irq(entry, ~IO_APIC_REDIR_MASKED,
563 IO_APIC_REDIR_LEVEL_TRIGGER, NULL);
87783be4 564}
047c8fdb 565
3145e941 566static void __unmask_IO_APIC_irq(struct irq_cfg *cfg)
87783be4 567{
3145e941 568 io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED, 0, NULL);
87783be4 569}
047c8fdb 570
7f3e632f 571static void io_apic_sync(struct irq_pin_list *entry)
1da177e4 572{
87783be4
CG
573 /*
574 * Synchronize the IO-APIC and the CPU by doing
575 * a dummy read from the IO-APIC
576 */
577 struct io_apic __iomem *io_apic;
578 io_apic = io_apic_base(entry->apic);
4e738e2f 579 readl(&io_apic->data);
1da177e4
LT
580}
581
3145e941 582static void __mask_IO_APIC_irq(struct irq_cfg *cfg)
87783be4 583{
3145e941 584 io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
87783be4 585}
1da177e4 586
3145e941 587static void mask_IO_APIC_irq_desc(struct irq_desc *desc)
1da177e4 588{
3145e941 589 struct irq_cfg *cfg = desc->chip_data;
1da177e4
LT
590 unsigned long flags;
591
3145e941
YL
592 BUG_ON(!cfg);
593
1da177e4 594 spin_lock_irqsave(&ioapic_lock, flags);
3145e941 595 __mask_IO_APIC_irq(cfg);
1da177e4
LT
596 spin_unlock_irqrestore(&ioapic_lock, flags);
597}
598
3145e941 599static void unmask_IO_APIC_irq_desc(struct irq_desc *desc)
1da177e4 600{
3145e941 601 struct irq_cfg *cfg = desc->chip_data;
1da177e4
LT
602 unsigned long flags;
603
604 spin_lock_irqsave(&ioapic_lock, flags);
3145e941 605 __unmask_IO_APIC_irq(cfg);
1da177e4
LT
606 spin_unlock_irqrestore(&ioapic_lock, flags);
607}
608
3145e941
YL
609static void mask_IO_APIC_irq(unsigned int irq)
610{
611 struct irq_desc *desc = irq_to_desc(irq);
612
613 mask_IO_APIC_irq_desc(desc);
614}
615static void unmask_IO_APIC_irq(unsigned int irq)
616{
617 struct irq_desc *desc = irq_to_desc(irq);
618
619 unmask_IO_APIC_irq_desc(desc);
620}
621
1da177e4
LT
622static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
623{
624 struct IO_APIC_route_entry entry;
36062448 625
1da177e4 626 /* Check delivery_mode to be sure we're not clearing an SMI pin */
cf4c6a2f 627 entry = ioapic_read_entry(apic, pin);
1da177e4
LT
628 if (entry.delivery_mode == dest_SMI)
629 return;
1da177e4
LT
630 /*
631 * Disable it in the IO-APIC irq-routing table:
632 */
f9dadfa7 633 ioapic_mask_entry(apic, pin);
1da177e4
LT
634}
635
54168ed7 636static void clear_IO_APIC (void)
1da177e4
LT
637{
638 int apic, pin;
639
640 for (apic = 0; apic < nr_ioapics; apic++)
641 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
642 clear_IO_APIC_pin(apic, pin);
643}
644
54168ed7 645#ifdef CONFIG_X86_32
1da177e4
LT
646/*
647 * support for broken MP BIOSs, enables hand-redirection of PIRQ0-7 to
648 * specific CPU-side IRQs.
649 */
650
651#define MAX_PIRQS 8
3bd25d0f
YL
652static int pirq_entries[MAX_PIRQS] = {
653 [0 ... MAX_PIRQS - 1] = -1
654};
1da177e4 655
1da177e4
LT
656static int __init ioapic_pirq_setup(char *str)
657{
658 int i, max;
659 int ints[MAX_PIRQS+1];
660
661 get_options(str, ARRAY_SIZE(ints), ints);
662
1da177e4
LT
663 apic_printk(APIC_VERBOSE, KERN_INFO
664 "PIRQ redirection, working around broken MP-BIOS.\n");
665 max = MAX_PIRQS;
666 if (ints[0] < MAX_PIRQS)
667 max = ints[0];
668
669 for (i = 0; i < max; i++) {
670 apic_printk(APIC_VERBOSE, KERN_DEBUG
671 "... PIRQ%d -> IRQ %d\n", i, ints[i+1]);
672 /*
673 * PIRQs are mapped upside down, usually.
674 */
675 pirq_entries[MAX_PIRQS-i-1] = ints[i+1];
676 }
677 return 1;
678}
679
680__setup("pirq=", ioapic_pirq_setup);
54168ed7
IM
681#endif /* CONFIG_X86_32 */
682
b24696bc
FY
683struct IO_APIC_route_entry **alloc_ioapic_entries(void)
684{
685 int apic;
686 struct IO_APIC_route_entry **ioapic_entries;
687
688 ioapic_entries = kzalloc(sizeof(*ioapic_entries) * nr_ioapics,
689 GFP_ATOMIC);
690 if (!ioapic_entries)
691 return 0;
692
693 for (apic = 0; apic < nr_ioapics; apic++) {
694 ioapic_entries[apic] =
695 kzalloc(sizeof(struct IO_APIC_route_entry) *
696 nr_ioapic_registers[apic], GFP_ATOMIC);
697 if (!ioapic_entries[apic])
698 goto nomem;
699 }
700
701 return ioapic_entries;
702
703nomem:
704 while (--apic >= 0)
705 kfree(ioapic_entries[apic]);
706 kfree(ioapic_entries);
707
708 return 0;
709}
54168ed7
IM
710
711/*
05c3dc2c 712 * Saves all the IO-APIC RTE's
54168ed7 713 */
b24696bc 714int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries)
54168ed7 715{
54168ed7
IM
716 int apic, pin;
717
b24696bc
FY
718 if (!ioapic_entries)
719 return -ENOMEM;
54168ed7
IM
720
721 for (apic = 0; apic < nr_ioapics; apic++) {
b24696bc
FY
722 if (!ioapic_entries[apic])
723 return -ENOMEM;
54168ed7 724
05c3dc2c 725 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
b24696bc 726 ioapic_entries[apic][pin] =
54168ed7 727 ioapic_read_entry(apic, pin);
b24696bc 728 }
5ffa4eb2 729
54168ed7
IM
730 return 0;
731}
732
b24696bc
FY
733/*
734 * Mask all IO APIC entries.
735 */
736void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries)
05c3dc2c
SS
737{
738 int apic, pin;
739
b24696bc
FY
740 if (!ioapic_entries)
741 return;
742
05c3dc2c 743 for (apic = 0; apic < nr_ioapics; apic++) {
b24696bc 744 if (!ioapic_entries[apic])
05c3dc2c 745 break;
b24696bc 746
05c3dc2c
SS
747 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
748 struct IO_APIC_route_entry entry;
749
b24696bc 750 entry = ioapic_entries[apic][pin];
05c3dc2c
SS
751 if (!entry.mask) {
752 entry.mask = 1;
753 ioapic_write_entry(apic, pin, entry);
754 }
755 }
756 }
757}
758
b24696bc
FY
759/*
760 * Restore IO APIC entries which was saved in ioapic_entries.
761 */
762int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries)
54168ed7
IM
763{
764 int apic, pin;
765
b24696bc
FY
766 if (!ioapic_entries)
767 return -ENOMEM;
768
5ffa4eb2 769 for (apic = 0; apic < nr_ioapics; apic++) {
b24696bc
FY
770 if (!ioapic_entries[apic])
771 return -ENOMEM;
772
54168ed7
IM
773 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
774 ioapic_write_entry(apic, pin,
b24696bc 775 ioapic_entries[apic][pin]);
5ffa4eb2 776 }
b24696bc 777 return 0;
54168ed7
IM
778}
779
b24696bc
FY
780void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries)
781{
782 int apic;
783
784 for (apic = 0; apic < nr_ioapics; apic++)
785 kfree(ioapic_entries[apic]);
786
787 kfree(ioapic_entries);
54168ed7 788}
1da177e4
LT
789
790/*
791 * Find the IRQ entry number of a certain pin.
792 */
793static int find_irq_entry(int apic, int pin, int type)
794{
795 int i;
796
797 for (i = 0; i < mp_irq_entries; i++)
c2c21745
JSR
798 if (mp_irqs[i].irqtype == type &&
799 (mp_irqs[i].dstapic == mp_ioapics[apic].apicid ||
800 mp_irqs[i].dstapic == MP_APIC_ALL) &&
801 mp_irqs[i].dstirq == pin)
1da177e4
LT
802 return i;
803
804 return -1;
805}
806
807/*
808 * Find the pin to which IRQ[irq] (ISA) is connected
809 */
fcfd636a 810static int __init find_isa_irq_pin(int irq, int type)
1da177e4
LT
811{
812 int i;
813
814 for (i = 0; i < mp_irq_entries; i++) {
c2c21745 815 int lbus = mp_irqs[i].srcbus;
1da177e4 816
d27e2b8e 817 if (test_bit(lbus, mp_bus_not_pci) &&
c2c21745
JSR
818 (mp_irqs[i].irqtype == type) &&
819 (mp_irqs[i].srcbusirq == irq))
1da177e4 820
c2c21745 821 return mp_irqs[i].dstirq;
1da177e4
LT
822 }
823 return -1;
824}
825
fcfd636a
EB
826static int __init find_isa_irq_apic(int irq, int type)
827{
828 int i;
829
830 for (i = 0; i < mp_irq_entries; i++) {
c2c21745 831 int lbus = mp_irqs[i].srcbus;
fcfd636a 832
73b2961b 833 if (test_bit(lbus, mp_bus_not_pci) &&
c2c21745
JSR
834 (mp_irqs[i].irqtype == type) &&
835 (mp_irqs[i].srcbusirq == irq))
fcfd636a
EB
836 break;
837 }
838 if (i < mp_irq_entries) {
839 int apic;
54168ed7 840 for(apic = 0; apic < nr_ioapics; apic++) {
c2c21745 841 if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic)
fcfd636a
EB
842 return apic;
843 }
844 }
845
846 return -1;
847}
848
c0a282c2 849#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
1da177e4
LT
850/*
851 * EISA Edge/Level control register, ELCR
852 */
853static int EISA_ELCR(unsigned int irq)
854{
bc07844a 855 if (irq < nr_legacy_irqs) {
1da177e4
LT
856 unsigned int port = 0x4d0 + (irq >> 3);
857 return (inb(port) >> (irq & 7)) & 1;
858 }
859 apic_printk(APIC_VERBOSE, KERN_INFO
860 "Broken MPtable reports ISA irq %d\n", irq);
861 return 0;
862}
54168ed7 863
c0a282c2 864#endif
1da177e4 865
6728801d
AS
866/* ISA interrupts are always polarity zero edge triggered,
867 * when listed as conforming in the MP table. */
868
869#define default_ISA_trigger(idx) (0)
870#define default_ISA_polarity(idx) (0)
871
1da177e4
LT
872/* EISA interrupts are always polarity zero and can be edge or level
873 * trigger depending on the ELCR value. If an interrupt is listed as
874 * EISA conforming in the MP table, that means its trigger type must
875 * be read in from the ELCR */
876
c2c21745 877#define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].srcbusirq))
6728801d 878#define default_EISA_polarity(idx) default_ISA_polarity(idx)
1da177e4
LT
879
880/* PCI interrupts are always polarity one level triggered,
881 * when listed as conforming in the MP table. */
882
883#define default_PCI_trigger(idx) (1)
884#define default_PCI_polarity(idx) (1)
885
886/* MCA interrupts are always polarity zero level triggered,
887 * when listed as conforming in the MP table. */
888
889#define default_MCA_trigger(idx) (1)
6728801d 890#define default_MCA_polarity(idx) default_ISA_polarity(idx)
1da177e4 891
61fd47e0 892static int MPBIOS_polarity(int idx)
1da177e4 893{
c2c21745 894 int bus = mp_irqs[idx].srcbus;
1da177e4
LT
895 int polarity;
896
897 /*
898 * Determine IRQ line polarity (high active or low active):
899 */
c2c21745 900 switch (mp_irqs[idx].irqflag & 3)
36062448 901 {
54168ed7
IM
902 case 0: /* conforms, ie. bus-type dependent polarity */
903 if (test_bit(bus, mp_bus_not_pci))
904 polarity = default_ISA_polarity(idx);
905 else
906 polarity = default_PCI_polarity(idx);
907 break;
908 case 1: /* high active */
909 {
910 polarity = 0;
911 break;
912 }
913 case 2: /* reserved */
914 {
915 printk(KERN_WARNING "broken BIOS!!\n");
916 polarity = 1;
917 break;
918 }
919 case 3: /* low active */
920 {
921 polarity = 1;
922 break;
923 }
924 default: /* invalid */
925 {
926 printk(KERN_WARNING "broken BIOS!!\n");
927 polarity = 1;
928 break;
929 }
1da177e4
LT
930 }
931 return polarity;
932}
933
934static int MPBIOS_trigger(int idx)
935{
c2c21745 936 int bus = mp_irqs[idx].srcbus;
1da177e4
LT
937 int trigger;
938
939 /*
940 * Determine IRQ trigger mode (edge or level sensitive):
941 */
c2c21745 942 switch ((mp_irqs[idx].irqflag>>2) & 3)
1da177e4 943 {
54168ed7
IM
944 case 0: /* conforms, ie. bus-type dependent */
945 if (test_bit(bus, mp_bus_not_pci))
946 trigger = default_ISA_trigger(idx);
947 else
948 trigger = default_PCI_trigger(idx);
c0a282c2 949#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
54168ed7
IM
950 switch (mp_bus_id_to_type[bus]) {
951 case MP_BUS_ISA: /* ISA pin */
952 {
953 /* set before the switch */
954 break;
955 }
956 case MP_BUS_EISA: /* EISA pin */
957 {
958 trigger = default_EISA_trigger(idx);
959 break;
960 }
961 case MP_BUS_PCI: /* PCI pin */
962 {
963 /* set before the switch */
964 break;
965 }
966 case MP_BUS_MCA: /* MCA pin */
967 {
968 trigger = default_MCA_trigger(idx);
969 break;
970 }
971 default:
972 {
973 printk(KERN_WARNING "broken BIOS!!\n");
974 trigger = 1;
975 break;
976 }
977 }
978#endif
1da177e4 979 break;
54168ed7 980 case 1: /* edge */
1da177e4 981 {
54168ed7 982 trigger = 0;
1da177e4
LT
983 break;
984 }
54168ed7 985 case 2: /* reserved */
1da177e4 986 {
54168ed7
IM
987 printk(KERN_WARNING "broken BIOS!!\n");
988 trigger = 1;
1da177e4
LT
989 break;
990 }
54168ed7 991 case 3: /* level */
1da177e4 992 {
54168ed7 993 trigger = 1;
1da177e4
LT
994 break;
995 }
54168ed7 996 default: /* invalid */
1da177e4
LT
997 {
998 printk(KERN_WARNING "broken BIOS!!\n");
54168ed7 999 trigger = 0;
1da177e4
LT
1000 break;
1001 }
1002 }
1003 return trigger;
1004}
1005
1006static inline int irq_polarity(int idx)
1007{
1008 return MPBIOS_polarity(idx);
1009}
1010
1011static inline int irq_trigger(int idx)
1012{
1013 return MPBIOS_trigger(idx);
1014}
1015
efa2559f 1016int (*ioapic_renumber_irq)(int ioapic, int irq);
1da177e4
LT
1017static int pin_2_irq(int idx, int apic, int pin)
1018{
1019 int irq, i;
c2c21745 1020 int bus = mp_irqs[idx].srcbus;
1da177e4
LT
1021
1022 /*
1023 * Debugging check, we are in big trouble if this message pops up!
1024 */
c2c21745 1025 if (mp_irqs[idx].dstirq != pin)
1da177e4
LT
1026 printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
1027
54168ed7 1028 if (test_bit(bus, mp_bus_not_pci)) {
c2c21745 1029 irq = mp_irqs[idx].srcbusirq;
54168ed7 1030 } else {
643befed
AS
1031 /*
1032 * PCI IRQs are mapped in order
1033 */
1034 i = irq = 0;
1035 while (i < apic)
1036 irq += nr_ioapic_registers[i++];
1037 irq += pin;
d6c88a50 1038 /*
54168ed7
IM
1039 * For MPS mode, so far only needed by ES7000 platform
1040 */
d6c88a50
TG
1041 if (ioapic_renumber_irq)
1042 irq = ioapic_renumber_irq(apic, irq);
1da177e4
LT
1043 }
1044
54168ed7 1045#ifdef CONFIG_X86_32
1da177e4
LT
1046 /*
1047 * PCI IRQ command line redirection. Yes, limits are hardcoded.
1048 */
1049 if ((pin >= 16) && (pin <= 23)) {
1050 if (pirq_entries[pin-16] != -1) {
1051 if (!pirq_entries[pin-16]) {
1052 apic_printk(APIC_VERBOSE, KERN_DEBUG
1053 "disabling PIRQ%d\n", pin-16);
1054 } else {
1055 irq = pirq_entries[pin-16];
1056 apic_printk(APIC_VERBOSE, KERN_DEBUG
1057 "using PIRQ%d -> IRQ %d\n",
1058 pin-16, irq);
1059 }
1060 }
1061 }
54168ed7
IM
1062#endif
1063
1da177e4
LT
1064 return irq;
1065}
1066
e20c06fd
YL
1067/*
1068 * Find a specific PCI IRQ entry.
1069 * Not an __init, possibly needed by modules
1070 */
1071int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin,
e5198075 1072 struct io_apic_irq_attr *irq_attr)
e20c06fd
YL
1073{
1074 int apic, i, best_guess = -1;
1075
1076 apic_printk(APIC_DEBUG,
1077 "querying PCI -> IRQ mapping bus:%d, slot:%d, pin:%d.\n",
1078 bus, slot, pin);
1079 if (test_bit(bus, mp_bus_not_pci)) {
1080 apic_printk(APIC_VERBOSE,
1081 "PCI BIOS passed nonexistent PCI bus %d!\n", bus);
1082 return -1;
1083 }
1084 for (i = 0; i < mp_irq_entries; i++) {
1085 int lbus = mp_irqs[i].srcbus;
1086
1087 for (apic = 0; apic < nr_ioapics; apic++)
1088 if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic ||
1089 mp_irqs[i].dstapic == MP_APIC_ALL)
1090 break;
1091
1092 if (!test_bit(lbus, mp_bus_not_pci) &&
1093 !mp_irqs[i].irqtype &&
1094 (bus == lbus) &&
1095 (slot == ((mp_irqs[i].srcbusirq >> 2) & 0x1f))) {
1096 int irq = pin_2_irq(i, apic, mp_irqs[i].dstirq);
1097
1098 if (!(apic || IO_APIC_IRQ(irq)))
1099 continue;
1100
1101 if (pin == (mp_irqs[i].srcbusirq & 3)) {
e5198075
YL
1102 set_io_apic_irq_attr(irq_attr, apic,
1103 mp_irqs[i].dstirq,
1104 irq_trigger(i),
1105 irq_polarity(i));
e20c06fd
YL
1106 return irq;
1107 }
1108 /*
1109 * Use the first all-but-pin matching entry as a
1110 * best-guess fuzzy result for broken mptables.
1111 */
1112 if (best_guess < 0) {
e5198075
YL
1113 set_io_apic_irq_attr(irq_attr, apic,
1114 mp_irqs[i].dstirq,
1115 irq_trigger(i),
1116 irq_polarity(i));
e20c06fd
YL
1117 best_guess = irq;
1118 }
1119 }
1120 }
1121 return best_guess;
1122}
1123EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector);
1124
497c9a19
YL
1125void lock_vector_lock(void)
1126{
1127 /* Used to the online set of cpus does not change
1128 * during assign_irq_vector.
1129 */
1130 spin_lock(&vector_lock);
1131}
1da177e4 1132
497c9a19 1133void unlock_vector_lock(void)
1da177e4 1134{
497c9a19
YL
1135 spin_unlock(&vector_lock);
1136}
1da177e4 1137
e7986739
MT
1138static int
1139__assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)
497c9a19 1140{
047c8fdb
YL
1141 /*
1142 * NOTE! The local APIC isn't very good at handling
1143 * multiple interrupts at the same interrupt level.
1144 * As the interrupt level is determined by taking the
1145 * vector number and shifting that right by 4, we
1146 * want to spread these out a bit so that they don't
1147 * all fall in the same interrupt level.
1148 *
1149 * Also, we've got to be careful not to trash gate
1150 * 0x80, because int 0x80 is hm, kind of importantish. ;)
1151 */
6579b474 1152 static int current_vector = FIRST_EXTERNAL_VECTOR + VECTOR_OFFSET_START;
ea943966 1153 static int current_offset = VECTOR_OFFSET_START % 8;
54168ed7 1154 unsigned int old_vector;
22f65d31
MT
1155 int cpu, err;
1156 cpumask_var_t tmp_mask;
ace80ab7 1157
23359a88 1158 if (cfg->move_in_progress)
54168ed7 1159 return -EBUSY;
0a1ad60d 1160
22f65d31
MT
1161 if (!alloc_cpumask_var(&tmp_mask, GFP_ATOMIC))
1162 return -ENOMEM;
ace80ab7 1163
54168ed7
IM
1164 old_vector = cfg->vector;
1165 if (old_vector) {
22f65d31
MT
1166 cpumask_and(tmp_mask, mask, cpu_online_mask);
1167 cpumask_and(tmp_mask, cfg->domain, tmp_mask);
1168 if (!cpumask_empty(tmp_mask)) {
1169 free_cpumask_var(tmp_mask);
54168ed7 1170 return 0;
22f65d31 1171 }
54168ed7 1172 }
497c9a19 1173
e7986739 1174 /* Only try and allocate irqs on cpus that are present */
22f65d31
MT
1175 err = -ENOSPC;
1176 for_each_cpu_and(cpu, mask, cpu_online_mask) {
54168ed7
IM
1177 int new_cpu;
1178 int vector, offset;
497c9a19 1179
e2d40b18 1180 apic->vector_allocation_domain(cpu, tmp_mask);
497c9a19 1181
54168ed7
IM
1182 vector = current_vector;
1183 offset = current_offset;
497c9a19 1184next:
54168ed7
IM
1185 vector += 8;
1186 if (vector >= first_system_vector) {
e7986739 1187 /* If out of vectors on large boxen, must share them. */
54168ed7 1188 offset = (offset + 1) % 8;
6579b474 1189 vector = FIRST_EXTERNAL_VECTOR + offset;
54168ed7
IM
1190 }
1191 if (unlikely(current_vector == vector))
1192 continue;
b77b881f
YL
1193
1194 if (test_bit(vector, used_vectors))
54168ed7 1195 goto next;
b77b881f 1196
22f65d31 1197 for_each_cpu_and(new_cpu, tmp_mask, cpu_online_mask)
54168ed7
IM
1198 if (per_cpu(vector_irq, new_cpu)[vector] != -1)
1199 goto next;
1200 /* Found one! */
1201 current_vector = vector;
1202 current_offset = offset;
1203 if (old_vector) {
1204 cfg->move_in_progress = 1;
22f65d31 1205 cpumask_copy(cfg->old_domain, cfg->domain);
7a959cff 1206 }
22f65d31 1207 for_each_cpu_and(new_cpu, tmp_mask, cpu_online_mask)
54168ed7
IM
1208 per_cpu(vector_irq, new_cpu)[vector] = irq;
1209 cfg->vector = vector;
22f65d31
MT
1210 cpumask_copy(cfg->domain, tmp_mask);
1211 err = 0;
1212 break;
54168ed7 1213 }
22f65d31
MT
1214 free_cpumask_var(tmp_mask);
1215 return err;
497c9a19
YL
1216}
1217
9338ad6f 1218int assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)
497c9a19
YL
1219{
1220 int err;
ace80ab7 1221 unsigned long flags;
ace80ab7
EB
1222
1223 spin_lock_irqsave(&vector_lock, flags);
3145e941 1224 err = __assign_irq_vector(irq, cfg, mask);
26a3c49c 1225 spin_unlock_irqrestore(&vector_lock, flags);
497c9a19
YL
1226 return err;
1227}
1228
3145e941 1229static void __clear_irq_vector(int irq, struct irq_cfg *cfg)
497c9a19 1230{
497c9a19
YL
1231 int cpu, vector;
1232
497c9a19
YL
1233 BUG_ON(!cfg->vector);
1234
1235 vector = cfg->vector;
22f65d31 1236 for_each_cpu_and(cpu, cfg->domain, cpu_online_mask)
497c9a19
YL
1237 per_cpu(vector_irq, cpu)[vector] = -1;
1238
1239 cfg->vector = 0;
22f65d31 1240 cpumask_clear(cfg->domain);
0ca4b6b0
MW
1241
1242 if (likely(!cfg->move_in_progress))
1243 return;
22f65d31 1244 for_each_cpu_and(cpu, cfg->old_domain, cpu_online_mask) {
0ca4b6b0
MW
1245 for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS;
1246 vector++) {
1247 if (per_cpu(vector_irq, cpu)[vector] != irq)
1248 continue;
1249 per_cpu(vector_irq, cpu)[vector] = -1;
1250 break;
1251 }
1252 }
1253 cfg->move_in_progress = 0;
497c9a19
YL
1254}
1255
1256void __setup_vector_irq(int cpu)
1257{
1258 /* Initialize vector_irq on a new cpu */
497c9a19
YL
1259 int irq, vector;
1260 struct irq_cfg *cfg;
0b8f1efa 1261 struct irq_desc *desc;
497c9a19 1262
9d133e5d
SS
1263 /*
1264 * vector_lock will make sure that we don't run into irq vector
1265 * assignments that might be happening on another cpu in parallel,
1266 * while we setup our initial vector to irq mappings.
1267 */
1268 spin_lock(&vector_lock);
497c9a19 1269 /* Mark the inuse vectors */
0b8f1efa 1270 for_each_irq_desc(irq, desc) {
0b8f1efa 1271 cfg = desc->chip_data;
22f65d31 1272 if (!cpumask_test_cpu(cpu, cfg->domain))
497c9a19
YL
1273 continue;
1274 vector = cfg->vector;
497c9a19
YL
1275 per_cpu(vector_irq, cpu)[vector] = irq;
1276 }
1277 /* Mark the free vectors */
1278 for (vector = 0; vector < NR_VECTORS; ++vector) {
1279 irq = per_cpu(vector_irq, cpu)[vector];
1280 if (irq < 0)
1281 continue;
1282
1283 cfg = irq_cfg(irq);
22f65d31 1284 if (!cpumask_test_cpu(cpu, cfg->domain))
497c9a19 1285 per_cpu(vector_irq, cpu)[vector] = -1;
54168ed7 1286 }
9d133e5d 1287 spin_unlock(&vector_lock);
1da177e4 1288}
3fde6900 1289
f5b9ed7a 1290static struct irq_chip ioapic_chip;
54168ed7 1291static struct irq_chip ir_ioapic_chip;
1da177e4 1292
54168ed7
IM
1293#define IOAPIC_AUTO -1
1294#define IOAPIC_EDGE 0
1295#define IOAPIC_LEVEL 1
1da177e4 1296
047c8fdb 1297#ifdef CONFIG_X86_32
1d025192
YL
1298static inline int IO_APIC_irq_trigger(int irq)
1299{
d6c88a50 1300 int apic, idx, pin;
1d025192 1301
d6c88a50
TG
1302 for (apic = 0; apic < nr_ioapics; apic++) {
1303 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
1304 idx = find_irq_entry(apic, pin, mp_INT);
1305 if ((idx != -1) && (irq == pin_2_irq(idx, apic, pin)))
1306 return irq_trigger(idx);
1307 }
1308 }
1309 /*
54168ed7
IM
1310 * nonexistent IRQs are edge default
1311 */
d6c88a50 1312 return 0;
1d025192 1313}
047c8fdb
YL
1314#else
1315static inline int IO_APIC_irq_trigger(int irq)
1316{
54168ed7 1317 return 1;
047c8fdb
YL
1318}
1319#endif
1d025192 1320
3145e941 1321static void ioapic_register_intr(int irq, struct irq_desc *desc, unsigned long trigger)
1da177e4 1322{
199751d7 1323
6ebcc00e 1324 if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
047c8fdb 1325 trigger == IOAPIC_LEVEL)
08678b08 1326 desc->status |= IRQ_LEVEL;
047c8fdb
YL
1327 else
1328 desc->status &= ~IRQ_LEVEL;
1329
54168ed7
IM
1330 if (irq_remapped(irq)) {
1331 desc->status |= IRQ_MOVE_PCNTXT;
1332 if (trigger)
1333 set_irq_chip_and_handler_name(irq, &ir_ioapic_chip,
1334 handle_fasteoi_irq,
1335 "fasteoi");
1336 else
1337 set_irq_chip_and_handler_name(irq, &ir_ioapic_chip,
1338 handle_edge_irq, "edge");
1339 return;
1340 }
29b61be6 1341
047c8fdb
YL
1342 if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
1343 trigger == IOAPIC_LEVEL)
a460e745 1344 set_irq_chip_and_handler_name(irq, &ioapic_chip,
54168ed7
IM
1345 handle_fasteoi_irq,
1346 "fasteoi");
047c8fdb 1347 else
a460e745 1348 set_irq_chip_and_handler_name(irq, &ioapic_chip,
54168ed7 1349 handle_edge_irq, "edge");
1da177e4
LT
1350}
1351
ca97ab90
JF
1352int setup_ioapic_entry(int apic_id, int irq,
1353 struct IO_APIC_route_entry *entry,
1354 unsigned int destination, int trigger,
0280f7c4 1355 int polarity, int vector, int pin)
1da177e4 1356{
497c9a19
YL
1357 /*
1358 * add it to the IO-APIC irq-routing table:
1359 */
1360 memset(entry,0,sizeof(*entry));
1361
54168ed7 1362 if (intr_remapping_enabled) {
c8d46cf0 1363 struct intel_iommu *iommu = map_ioapic_to_ir(apic_id);
54168ed7
IM
1364 struct irte irte;
1365 struct IR_IO_APIC_route_entry *ir_entry =
1366 (struct IR_IO_APIC_route_entry *) entry;
1367 int index;
1368
1369 if (!iommu)
c8d46cf0 1370 panic("No mapping iommu for ioapic %d\n", apic_id);
54168ed7
IM
1371
1372 index = alloc_irte(iommu, irq, 1);
1373 if (index < 0)
c8d46cf0 1374 panic("Failed to allocate IRTE for ioapic %d\n", apic_id);
54168ed7
IM
1375
1376 memset(&irte, 0, sizeof(irte));
1377
1378 irte.present = 1;
9b5bc8dc 1379 irte.dst_mode = apic->irq_dest_mode;
0280f7c4
SS
1380 /*
1381 * Trigger mode in the IRTE will always be edge, and the
1382 * actual level or edge trigger will be setup in the IO-APIC
1383 * RTE. This will help simplify level triggered irq migration.
1384 * For more details, see the comments above explainig IO-APIC
1385 * irq migration in the presence of interrupt-remapping.
1386 */
1387 irte.trigger_mode = 0;
9b5bc8dc 1388 irte.dlvry_mode = apic->irq_delivery_mode;
54168ed7
IM
1389 irte.vector = vector;
1390 irte.dest_id = IRTE_DEST(destination);
1391
f007e99c
WH
1392 /* Set source-id of interrupt request */
1393 set_ioapic_sid(&irte, apic_id);
1394
54168ed7
IM
1395 modify_irte(irq, &irte);
1396
1397 ir_entry->index2 = (index >> 15) & 0x1;
1398 ir_entry->zero = 0;
1399 ir_entry->format = 1;
1400 ir_entry->index = (index & 0x7fff);
0280f7c4
SS
1401 /*
1402 * IO-APIC RTE will be configured with virtual vector.
1403 * irq handler will do the explicit EOI to the io-apic.
1404 */
1405 ir_entry->vector = pin;
29b61be6 1406 } else {
9b5bc8dc
IM
1407 entry->delivery_mode = apic->irq_delivery_mode;
1408 entry->dest_mode = apic->irq_dest_mode;
54168ed7 1409 entry->dest = destination;
0280f7c4 1410 entry->vector = vector;
54168ed7 1411 }
497c9a19 1412
54168ed7 1413 entry->mask = 0; /* enable IRQ */
497c9a19
YL
1414 entry->trigger = trigger;
1415 entry->polarity = polarity;
497c9a19
YL
1416
1417 /* Mask level triggered irqs.
1418 * Use IRQ_DELAYED_DISABLE for edge triggered irqs.
1419 */
1420 if (trigger)
1421 entry->mask = 1;
497c9a19
YL
1422 return 0;
1423}
1424
c8d46cf0 1425static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq_desc *desc,
54168ed7 1426 int trigger, int polarity)
497c9a19
YL
1427{
1428 struct irq_cfg *cfg;
1da177e4 1429 struct IO_APIC_route_entry entry;
22f65d31 1430 unsigned int dest;
497c9a19
YL
1431
1432 if (!IO_APIC_IRQ(irq))
1433 return;
1434
3145e941 1435 cfg = desc->chip_data;
497c9a19 1436
69c89efb
SS
1437 /*
1438 * For legacy irqs, cfg->domain starts with cpu 0 for legacy
1439 * controllers like 8259. Now that IO-APIC can handle this irq, update
1440 * the cfg->domain.
1441 */
1442 if (irq < nr_legacy_irqs && cpumask_test_cpu(0, cfg->domain))
1443 apic->vector_allocation_domain(0, cfg->domain);
1444
fe402e1f 1445 if (assign_irq_vector(irq, cfg, apic->target_cpus()))
497c9a19
YL
1446 return;
1447
debccb3e 1448 dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus());
497c9a19
YL
1449
1450 apic_printk(APIC_VERBOSE,KERN_DEBUG
1451 "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> "
1452 "IRQ %d Mode:%i Active:%i)\n",
c8d46cf0 1453 apic_id, mp_ioapics[apic_id].apicid, pin, cfg->vector,
497c9a19
YL
1454 irq, trigger, polarity);
1455
1456
c8d46cf0 1457 if (setup_ioapic_entry(mp_ioapics[apic_id].apicid, irq, &entry,
0280f7c4 1458 dest, trigger, polarity, cfg->vector, pin)) {
497c9a19 1459 printk("Failed to setup ioapic entry for ioapic %d, pin %d\n",
c8d46cf0 1460 mp_ioapics[apic_id].apicid, pin);
3145e941 1461 __clear_irq_vector(irq, cfg);
497c9a19
YL
1462 return;
1463 }
1464
3145e941 1465 ioapic_register_intr(irq, desc, trigger);
bc07844a 1466 if (irq < nr_legacy_irqs)
497c9a19
YL
1467 disable_8259A_irq(irq);
1468
c8d46cf0 1469 ioapic_write_entry(apic_id, pin, entry);
497c9a19
YL
1470}
1471
b9c61b70
YL
1472static struct {
1473 DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1);
1474} mp_ioapic_routing[MAX_IO_APICS];
1475
497c9a19
YL
1476static void __init setup_IO_APIC_irqs(void)
1477{
b9c61b70 1478 int apic_id = 0, pin, idx, irq;
3c2cbd24 1479 int notcon = 0;
0b8f1efa 1480 struct irq_desc *desc;
3145e941 1481 struct irq_cfg *cfg;
85ac16d0 1482 int node = cpu_to_node(boot_cpu_id);
1da177e4
LT
1483
1484 apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
1485
b9c61b70
YL
1486#ifdef CONFIG_ACPI
1487 if (!acpi_disabled && acpi_ioapic) {
1488 apic_id = mp_find_ioapic(0);
1489 if (apic_id < 0)
1490 apic_id = 0;
1491 }
1492#endif
3c2cbd24 1493
b9c61b70
YL
1494 for (pin = 0; pin < nr_ioapic_registers[apic_id]; pin++) {
1495 idx = find_irq_entry(apic_id, pin, mp_INT);
1496 if (idx == -1) {
1497 if (!notcon) {
1498 notcon = 1;
1499 apic_printk(APIC_VERBOSE,
1500 KERN_DEBUG " %d-%d",
1501 mp_ioapics[apic_id].apicid, pin);
1502 } else
1503 apic_printk(APIC_VERBOSE, " %d-%d",
1504 mp_ioapics[apic_id].apicid, pin);
1505 continue;
1506 }
1507 if (notcon) {
1508 apic_printk(APIC_VERBOSE,
1509 " (apicid-pin) not connected\n");
1510 notcon = 0;
1511 }
33a201fa 1512
b9c61b70 1513 irq = pin_2_irq(idx, apic_id, pin);
33a201fa 1514
b9c61b70
YL
1515 /*
1516 * Skip the timer IRQ if there's a quirk handler
1517 * installed and if it returns 1:
1518 */
1519 if (apic->multi_timer_check &&
1520 apic->multi_timer_check(apic_id, irq))
1521 continue;
36062448 1522
b9c61b70
YL
1523 desc = irq_to_desc_alloc_node(irq, node);
1524 if (!desc) {
1525 printk(KERN_INFO "can not get irq_desc for %d\n", irq);
1526 continue;
3c2cbd24 1527 }
b9c61b70
YL
1528 cfg = desc->chip_data;
1529 add_pin_to_irq_node(cfg, node, apic_id, pin);
4c6f18fc
YL
1530 /*
1531 * don't mark it in pin_programmed, so later acpi could
1532 * set it correctly when irq < 16
1533 */
b9c61b70
YL
1534 setup_IO_APIC_irq(apic_id, pin, irq, desc,
1535 irq_trigger(idx), irq_polarity(idx));
1da177e4
LT
1536 }
1537
3c2cbd24
CG
1538 if (notcon)
1539 apic_printk(APIC_VERBOSE,
2a554fb1 1540 " (apicid-pin) not connected\n");
1da177e4
LT
1541}
1542
1543/*
f7633ce5 1544 * Set up the timer pin, possibly with the 8259A-master behind.
1da177e4 1545 */
c8d46cf0 1546static void __init setup_timer_IRQ0_pin(unsigned int apic_id, unsigned int pin,
f7633ce5 1547 int vector)
1da177e4
LT
1548{
1549 struct IO_APIC_route_entry entry;
1da177e4 1550
54168ed7
IM
1551 if (intr_remapping_enabled)
1552 return;
54168ed7 1553
36062448 1554 memset(&entry, 0, sizeof(entry));
1da177e4
LT
1555
1556 /*
1557 * We use logical delivery to get the timer IRQ
1558 * to the first CPU.
1559 */
9b5bc8dc 1560 entry.dest_mode = apic->irq_dest_mode;
f72dccac 1561 entry.mask = 0; /* don't mask IRQ for edge */
debccb3e 1562 entry.dest = apic->cpu_mask_to_apicid(apic->target_cpus());
9b5bc8dc 1563 entry.delivery_mode = apic->irq_delivery_mode;
1da177e4
LT
1564 entry.polarity = 0;
1565 entry.trigger = 0;
1566 entry.vector = vector;
1567
1568 /*
1569 * The timer IRQ doesn't have to know that behind the
f7633ce5 1570 * scene we may have a 8259A-master in AEOI mode ...
1da177e4 1571 */
54168ed7 1572 set_irq_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, "edge");
1da177e4
LT
1573
1574 /*
1575 * Add it to the IO-APIC irq-routing table:
1576 */
c8d46cf0 1577 ioapic_write_entry(apic_id, pin, entry);
1da177e4
LT
1578}
1579
32f71aff
MR
1580
1581__apicdebuginit(void) print_IO_APIC(void)
1da177e4
LT
1582{
1583 int apic, i;
1584 union IO_APIC_reg_00 reg_00;
1585 union IO_APIC_reg_01 reg_01;
1586 union IO_APIC_reg_02 reg_02;
1587 union IO_APIC_reg_03 reg_03;
1588 unsigned long flags;
0f978f45 1589 struct irq_cfg *cfg;
0b8f1efa 1590 struct irq_desc *desc;
8f09cd20 1591 unsigned int irq;
1da177e4 1592
36062448 1593 printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries);
1da177e4
LT
1594 for (i = 0; i < nr_ioapics; i++)
1595 printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n",
b5ba7e6d 1596 mp_ioapics[i].apicid, nr_ioapic_registers[i]);
1da177e4
LT
1597
1598 /*
1599 * We are a bit conservative about what we expect. We have to
1600 * know about every hardware change ASAP.
1601 */
1602 printk(KERN_INFO "testing the IO APIC.......................\n");
1603
1604 for (apic = 0; apic < nr_ioapics; apic++) {
1605
1606 spin_lock_irqsave(&ioapic_lock, flags);
1607 reg_00.raw = io_apic_read(apic, 0);
1608 reg_01.raw = io_apic_read(apic, 1);
1609 if (reg_01.bits.version >= 0x10)
1610 reg_02.raw = io_apic_read(apic, 2);
d6c88a50
TG
1611 if (reg_01.bits.version >= 0x20)
1612 reg_03.raw = io_apic_read(apic, 3);
1da177e4
LT
1613 spin_unlock_irqrestore(&ioapic_lock, flags);
1614
54168ed7 1615 printk("\n");
b5ba7e6d 1616 printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].apicid);
1da177e4
LT
1617 printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw);
1618 printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID);
1619 printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type);
1620 printk(KERN_DEBUG "....... : LTS : %X\n", reg_00.bits.LTS);
1da177e4 1621
54168ed7 1622 printk(KERN_DEBUG ".... register #01: %08X\n", *(int *)&reg_01);
1da177e4 1623 printk(KERN_DEBUG "....... : max redirection entries: %04X\n", reg_01.bits.entries);
1da177e4
LT
1624
1625 printk(KERN_DEBUG "....... : PRQ implemented: %X\n", reg_01.bits.PRQ);
1626 printk(KERN_DEBUG "....... : IO APIC version: %04X\n", reg_01.bits.version);
1da177e4
LT
1627
1628 /*
1629 * Some Intel chipsets with IO APIC VERSION of 0x1? don't have reg_02,
1630 * but the value of reg_02 is read as the previous read register
1631 * value, so ignore it if reg_02 == reg_01.
1632 */
1633 if (reg_01.bits.version >= 0x10 && reg_02.raw != reg_01.raw) {
1634 printk(KERN_DEBUG ".... register #02: %08X\n", reg_02.raw);
1635 printk(KERN_DEBUG "....... : arbitration: %02X\n", reg_02.bits.arbitration);
1da177e4
LT
1636 }
1637
1638 /*
1639 * Some Intel chipsets with IO APIC VERSION of 0x2? don't have reg_02
1640 * or reg_03, but the value of reg_0[23] is read as the previous read
1641 * register value, so ignore it if reg_03 == reg_0[12].
1642 */
1643 if (reg_01.bits.version >= 0x20 && reg_03.raw != reg_02.raw &&
1644 reg_03.raw != reg_01.raw) {
1645 printk(KERN_DEBUG ".... register #03: %08X\n", reg_03.raw);
1646 printk(KERN_DEBUG "....... : Boot DT : %X\n", reg_03.bits.boot_DT);
1da177e4
LT
1647 }
1648
1649 printk(KERN_DEBUG ".... IRQ redirection table:\n");
1650
d83e94ac
YL
1651 printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol"
1652 " Stat Dmod Deli Vect: \n");
1da177e4
LT
1653
1654 for (i = 0; i <= reg_01.bits.entries; i++) {
1655 struct IO_APIC_route_entry entry;
1656
cf4c6a2f 1657 entry = ioapic_read_entry(apic, i);
1da177e4 1658
54168ed7
IM
1659 printk(KERN_DEBUG " %02x %03X ",
1660 i,
1661 entry.dest
1662 );
1da177e4
LT
1663
1664 printk("%1d %1d %1d %1d %1d %1d %1d %02X\n",
1665 entry.mask,
1666 entry.trigger,
1667 entry.irr,
1668 entry.polarity,
1669 entry.delivery_status,
1670 entry.dest_mode,
1671 entry.delivery_mode,
1672 entry.vector
1673 );
1674 }
1675 }
1da177e4 1676 printk(KERN_DEBUG "IRQ to pin mappings:\n");
0b8f1efa
YL
1677 for_each_irq_desc(irq, desc) {
1678 struct irq_pin_list *entry;
1679
0b8f1efa
YL
1680 cfg = desc->chip_data;
1681 entry = cfg->irq_2_pin;
0f978f45 1682 if (!entry)
1da177e4 1683 continue;
8f09cd20 1684 printk(KERN_DEBUG "IRQ%d ", irq);
2977fb3f 1685 for_each_irq_pin(entry, cfg->irq_2_pin)
1da177e4 1686 printk("-> %d:%d", entry->apic, entry->pin);
1da177e4
LT
1687 printk("\n");
1688 }
1689
1690 printk(KERN_INFO ".................................... done.\n");
1691
1692 return;
1693}
1694
251e1e44 1695__apicdebuginit(void) print_APIC_field(int base)
1da177e4 1696{
251e1e44 1697 int i;
1da177e4 1698
251e1e44
IM
1699 printk(KERN_DEBUG);
1700
1701 for (i = 0; i < 8; i++)
1702 printk(KERN_CONT "%08x", apic_read(base + i*0x10));
1703
1704 printk(KERN_CONT "\n");
1da177e4
LT
1705}
1706
32f71aff 1707__apicdebuginit(void) print_local_APIC(void *dummy)
1da177e4 1708{
97a52714 1709 unsigned int i, v, ver, maxlvt;
7ab6af7a 1710 u64 icr;
1da177e4 1711
251e1e44 1712 printk(KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n",
1da177e4 1713 smp_processor_id(), hard_smp_processor_id());
66823114 1714 v = apic_read(APIC_ID);
54168ed7 1715 printk(KERN_INFO "... APIC ID: %08x (%01x)\n", v, read_apic_id());
1da177e4
LT
1716 v = apic_read(APIC_LVR);
1717 printk(KERN_INFO "... APIC VERSION: %08x\n", v);
1718 ver = GET_APIC_VERSION(v);
e05d723f 1719 maxlvt = lapic_get_maxlvt();
1da177e4
LT
1720
1721 v = apic_read(APIC_TASKPRI);
1722 printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK);
1723
54168ed7 1724 if (APIC_INTEGRATED(ver)) { /* !82489DX */
a11b5abe
YL
1725 if (!APIC_XAPIC(ver)) {
1726 v = apic_read(APIC_ARBPRI);
1727 printk(KERN_DEBUG "... APIC ARBPRI: %08x (%02x)\n", v,
1728 v & APIC_ARBPRI_MASK);
1729 }
1da177e4
LT
1730 v = apic_read(APIC_PROCPRI);
1731 printk(KERN_DEBUG "... APIC PROCPRI: %08x\n", v);
1732 }
1733
a11b5abe
YL
1734 /*
1735 * Remote read supported only in the 82489DX and local APIC for
1736 * Pentium processors.
1737 */
1738 if (!APIC_INTEGRATED(ver) || maxlvt == 3) {
1739 v = apic_read(APIC_RRR);
1740 printk(KERN_DEBUG "... APIC RRR: %08x\n", v);
1741 }
1742
1da177e4
LT
1743 v = apic_read(APIC_LDR);
1744 printk(KERN_DEBUG "... APIC LDR: %08x\n", v);
a11b5abe
YL
1745 if (!x2apic_enabled()) {
1746 v = apic_read(APIC_DFR);
1747 printk(KERN_DEBUG "... APIC DFR: %08x\n", v);
1748 }
1da177e4
LT
1749 v = apic_read(APIC_SPIV);
1750 printk(KERN_DEBUG "... APIC SPIV: %08x\n", v);
1751
1752 printk(KERN_DEBUG "... APIC ISR field:\n");
251e1e44 1753 print_APIC_field(APIC_ISR);
1da177e4 1754 printk(KERN_DEBUG "... APIC TMR field:\n");
251e1e44 1755 print_APIC_field(APIC_TMR);
1da177e4 1756 printk(KERN_DEBUG "... APIC IRR field:\n");
251e1e44 1757 print_APIC_field(APIC_IRR);
1da177e4 1758
54168ed7
IM
1759 if (APIC_INTEGRATED(ver)) { /* !82489DX */
1760 if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
1da177e4 1761 apic_write(APIC_ESR, 0);
54168ed7 1762
1da177e4
LT
1763 v = apic_read(APIC_ESR);
1764 printk(KERN_DEBUG "... APIC ESR: %08x\n", v);
1765 }
1766
7ab6af7a 1767 icr = apic_icr_read();
0c425cec
IM
1768 printk(KERN_DEBUG "... APIC ICR: %08x\n", (u32)icr);
1769 printk(KERN_DEBUG "... APIC ICR2: %08x\n", (u32)(icr >> 32));
1da177e4
LT
1770
1771 v = apic_read(APIC_LVTT);
1772 printk(KERN_DEBUG "... APIC LVTT: %08x\n", v);
1773
1774 if (maxlvt > 3) { /* PC is LVT#4. */
1775 v = apic_read(APIC_LVTPC);
1776 printk(KERN_DEBUG "... APIC LVTPC: %08x\n", v);
1777 }
1778 v = apic_read(APIC_LVT0);
1779 printk(KERN_DEBUG "... APIC LVT0: %08x\n", v);
1780 v = apic_read(APIC_LVT1);
1781 printk(KERN_DEBUG "... APIC LVT1: %08x\n", v);
1782
1783 if (maxlvt > 2) { /* ERR is LVT#3. */
1784 v = apic_read(APIC_LVTERR);
1785 printk(KERN_DEBUG "... APIC LVTERR: %08x\n", v);
1786 }
1787
1788 v = apic_read(APIC_TMICT);
1789 printk(KERN_DEBUG "... APIC TMICT: %08x\n", v);
1790 v = apic_read(APIC_TMCCT);
1791 printk(KERN_DEBUG "... APIC TMCCT: %08x\n", v);
1792 v = apic_read(APIC_TDCR);
1793 printk(KERN_DEBUG "... APIC TDCR: %08x\n", v);
97a52714
AH
1794
1795 if (boot_cpu_has(X86_FEATURE_EXTAPIC)) {
1796 v = apic_read(APIC_EFEAT);
1797 maxlvt = (v >> 16) & 0xff;
1798 printk(KERN_DEBUG "... APIC EFEAT: %08x\n", v);
1799 v = apic_read(APIC_ECTRL);
1800 printk(KERN_DEBUG "... APIC ECTRL: %08x\n", v);
1801 for (i = 0; i < maxlvt; i++) {
1802 v = apic_read(APIC_EILVTn(i));
1803 printk(KERN_DEBUG "... APIC EILVT%d: %08x\n", i, v);
1804 }
1805 }
1da177e4
LT
1806 printk("\n");
1807}
1808
2626eb2b 1809__apicdebuginit(void) print_local_APICs(int maxcpu)
1da177e4 1810{
ffd5aae7
YL
1811 int cpu;
1812
2626eb2b
CG
1813 if (!maxcpu)
1814 return;
1815
ffd5aae7 1816 preempt_disable();
2626eb2b
CG
1817 for_each_online_cpu(cpu) {
1818 if (cpu >= maxcpu)
1819 break;
ffd5aae7 1820 smp_call_function_single(cpu, print_local_APIC, NULL, 1);
2626eb2b 1821 }
ffd5aae7 1822 preempt_enable();
1da177e4
LT
1823}
1824
32f71aff 1825__apicdebuginit(void) print_PIC(void)
1da177e4 1826{
1da177e4
LT
1827 unsigned int v;
1828 unsigned long flags;
1829
2626eb2b 1830 if (!nr_legacy_irqs)
1da177e4
LT
1831 return;
1832
1833 printk(KERN_DEBUG "\nprinting PIC contents\n");
1834
1835 spin_lock_irqsave(&i8259A_lock, flags);
1836
1837 v = inb(0xa1) << 8 | inb(0x21);
1838 printk(KERN_DEBUG "... PIC IMR: %04x\n", v);
1839
1840 v = inb(0xa0) << 8 | inb(0x20);
1841 printk(KERN_DEBUG "... PIC IRR: %04x\n", v);
1842
54168ed7
IM
1843 outb(0x0b,0xa0);
1844 outb(0x0b,0x20);
1da177e4 1845 v = inb(0xa0) << 8 | inb(0x20);
54168ed7
IM
1846 outb(0x0a,0xa0);
1847 outb(0x0a,0x20);
1da177e4
LT
1848
1849 spin_unlock_irqrestore(&i8259A_lock, flags);
1850
1851 printk(KERN_DEBUG "... PIC ISR: %04x\n", v);
1852
1853 v = inb(0x4d1) << 8 | inb(0x4d0);
1854 printk(KERN_DEBUG "... PIC ELCR: %04x\n", v);
1855}
1856
2626eb2b
CG
1857static int __initdata show_lapic = 1;
1858static __init int setup_show_lapic(char *arg)
1859{
1860 int num = -1;
1861
1862 if (strcmp(arg, "all") == 0) {
1863 show_lapic = CONFIG_NR_CPUS;
1864 } else {
1865 get_option(&arg, &num);
1866 if (num >= 0)
1867 show_lapic = num;
1868 }
1869
1870 return 1;
1871}
1872__setup("show_lapic=", setup_show_lapic);
1873
1874__apicdebuginit(int) print_ICs(void)
32f71aff 1875{
2626eb2b
CG
1876 if (apic_verbosity == APIC_QUIET)
1877 return 0;
1878
32f71aff 1879 print_PIC();
4797f6b0
YL
1880
1881 /* don't print out if apic is not there */
8312136f 1882 if (!cpu_has_apic && !apic_from_smp_config())
4797f6b0
YL
1883 return 0;
1884
2626eb2b 1885 print_local_APICs(show_lapic);
32f71aff
MR
1886 print_IO_APIC();
1887
1888 return 0;
1889}
1890
2626eb2b 1891fs_initcall(print_ICs);
32f71aff 1892
1da177e4 1893
efa2559f
YL
1894/* Where if anywhere is the i8259 connect in external int mode */
1895static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
1896
54168ed7 1897void __init enable_IO_APIC(void)
1da177e4
LT
1898{
1899 union IO_APIC_reg_01 reg_01;
fcfd636a 1900 int i8259_apic, i8259_pin;
54168ed7 1901 int apic;
1da177e4
LT
1902 unsigned long flags;
1903
1da177e4
LT
1904 /*
1905 * The number of IO-APIC IRQ registers (== #pins):
1906 */
fcfd636a 1907 for (apic = 0; apic < nr_ioapics; apic++) {
1da177e4 1908 spin_lock_irqsave(&ioapic_lock, flags);
fcfd636a 1909 reg_01.raw = io_apic_read(apic, 1);
1da177e4 1910 spin_unlock_irqrestore(&ioapic_lock, flags);
fcfd636a
EB
1911 nr_ioapic_registers[apic] = reg_01.bits.entries+1;
1912 }
bc07844a
TG
1913
1914 if (!nr_legacy_irqs)
1915 return;
1916
54168ed7 1917 for(apic = 0; apic < nr_ioapics; apic++) {
fcfd636a
EB
1918 int pin;
1919 /* See if any of the pins is in ExtINT mode */
1008fddc 1920 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
fcfd636a 1921 struct IO_APIC_route_entry entry;
cf4c6a2f 1922 entry = ioapic_read_entry(apic, pin);
fcfd636a 1923
fcfd636a
EB
1924 /* If the interrupt line is enabled and in ExtInt mode
1925 * I have found the pin where the i8259 is connected.
1926 */
1927 if ((entry.mask == 0) && (entry.delivery_mode == dest_ExtINT)) {
1928 ioapic_i8259.apic = apic;
1929 ioapic_i8259.pin = pin;
1930 goto found_i8259;
1931 }
1932 }
1933 }
1934 found_i8259:
1935 /* Look to see what if the MP table has reported the ExtINT */
1936 /* If we could not find the appropriate pin by looking at the ioapic
1937 * the i8259 probably is not connected the ioapic but give the
1938 * mptable a chance anyway.
1939 */
1940 i8259_pin = find_isa_irq_pin(0, mp_ExtINT);
1941 i8259_apic = find_isa_irq_apic(0, mp_ExtINT);
1942 /* Trust the MP table if nothing is setup in the hardware */
1943 if ((ioapic_i8259.pin == -1) && (i8259_pin >= 0)) {
1944 printk(KERN_WARNING "ExtINT not setup in hardware but reported by MP table\n");
1945 ioapic_i8259.pin = i8259_pin;
1946 ioapic_i8259.apic = i8259_apic;
1947 }
1948 /* Complain if the MP table and the hardware disagree */
1949 if (((ioapic_i8259.apic != i8259_apic) || (ioapic_i8259.pin != i8259_pin)) &&
1950 (i8259_pin >= 0) && (ioapic_i8259.pin >= 0))
1951 {
1952 printk(KERN_WARNING "ExtINT in hardware and MP table differ\n");
1da177e4
LT
1953 }
1954
1955 /*
1956 * Do not trust the IO-APIC being empty at bootup
1957 */
1958 clear_IO_APIC();
1959}
1960
1961/*
1962 * Not an __init, needed by the reboot code
1963 */
1964void disable_IO_APIC(void)
1965{
1966 /*
1967 * Clear the IO-APIC before rebooting:
1968 */
1969 clear_IO_APIC();
1970
bc07844a
TG
1971 if (!nr_legacy_irqs)
1972 return;
1973
650927ef 1974 /*
0b968d23 1975 * If the i8259 is routed through an IOAPIC
650927ef 1976 * Put that IOAPIC in virtual wire mode
0b968d23 1977 * so legacy interrupts can be delivered.
7c6d9f97
SS
1978 *
1979 * With interrupt-remapping, for now we will use virtual wire A mode,
1980 * as virtual wire B is little complex (need to configure both
1981 * IOAPIC RTE aswell as interrupt-remapping table entry).
1982 * As this gets called during crash dump, keep this simple for now.
650927ef 1983 */
7c6d9f97 1984 if (ioapic_i8259.pin != -1 && !intr_remapping_enabled) {
650927ef 1985 struct IO_APIC_route_entry entry;
650927ef
EB
1986
1987 memset(&entry, 0, sizeof(entry));
1988 entry.mask = 0; /* Enabled */
1989 entry.trigger = 0; /* Edge */
1990 entry.irr = 0;
1991 entry.polarity = 0; /* High */
1992 entry.delivery_status = 0;
1993 entry.dest_mode = 0; /* Physical */
fcfd636a 1994 entry.delivery_mode = dest_ExtINT; /* ExtInt */
650927ef 1995 entry.vector = 0;
54168ed7 1996 entry.dest = read_apic_id();
650927ef
EB
1997
1998 /*
1999 * Add it to the IO-APIC irq-routing table:
2000 */
cf4c6a2f 2001 ioapic_write_entry(ioapic_i8259.apic, ioapic_i8259.pin, entry);
650927ef 2002 }
54168ed7 2003
7c6d9f97
SS
2004 /*
2005 * Use virtual wire A mode when interrupt remapping is enabled.
2006 */
8312136f 2007 if (cpu_has_apic || apic_from_smp_config())
3f4c3955
CG
2008 disconnect_bsp_APIC(!intr_remapping_enabled &&
2009 ioapic_i8259.pin != -1);
1da177e4
LT
2010}
2011
54168ed7 2012#ifdef CONFIG_X86_32
1da177e4
LT
2013/*
2014 * function to set the IO-APIC physical IDs based on the
2015 * values stored in the MPC table.
2016 *
2017 * by Matt Domsch <Matt_Domsch@dell.com> Tue Dec 21 12:25:05 CST 1999
2018 */
2019
de934103 2020void __init setup_ioapic_ids_from_mpc(void)
1da177e4
LT
2021{
2022 union IO_APIC_reg_00 reg_00;
2023 physid_mask_t phys_id_present_map;
c8d46cf0 2024 int apic_id;
1da177e4
LT
2025 int i;
2026 unsigned char old_id;
2027 unsigned long flags;
2028
de934103 2029 if (acpi_ioapic)
d49c4288 2030 return;
ca05fea6
NP
2031 /*
2032 * Don't check I/O APIC IDs for xAPIC systems. They have
2033 * no meaning without the serial APIC bus.
2034 */
7c5c1e42
SL
2035 if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
2036 || APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
ca05fea6 2037 return;
1da177e4
LT
2038 /*
2039 * This is broken; anything with a real cpu count has to
2040 * circumvent this idiocy regardless.
2041 */
7abc0753 2042 apic->ioapic_phys_id_map(&phys_cpu_present_map, &phys_id_present_map);
1da177e4
LT
2043
2044 /*
2045 * Set the IOAPIC ID to the value stored in the MPC table.
2046 */
c8d46cf0 2047 for (apic_id = 0; apic_id < nr_ioapics; apic_id++) {
1da177e4
LT
2048
2049 /* Read the register 0 value */
2050 spin_lock_irqsave(&ioapic_lock, flags);
c8d46cf0 2051 reg_00.raw = io_apic_read(apic_id, 0);
1da177e4 2052 spin_unlock_irqrestore(&ioapic_lock, flags);
36062448 2053
c8d46cf0 2054 old_id = mp_ioapics[apic_id].apicid;
1da177e4 2055
c8d46cf0 2056 if (mp_ioapics[apic_id].apicid >= get_physical_broadcast()) {
1da177e4 2057 printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n",
c8d46cf0 2058 apic_id, mp_ioapics[apic_id].apicid);
1da177e4
LT
2059 printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
2060 reg_00.bits.ID);
c8d46cf0 2061 mp_ioapics[apic_id].apicid = reg_00.bits.ID;
1da177e4
LT
2062 }
2063
1da177e4
LT
2064 /*
2065 * Sanity check, is the ID really free? Every APIC in a
2066 * system must have a unique ID or we get lots of nice
2067 * 'stuck on smp_invalidate_needed IPI wait' messages.
2068 */
7abc0753 2069 if (apic->check_apicid_used(&phys_id_present_map,
c8d46cf0 2070 mp_ioapics[apic_id].apicid)) {
1da177e4 2071 printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
c8d46cf0 2072 apic_id, mp_ioapics[apic_id].apicid);
1da177e4
LT
2073 for (i = 0; i < get_physical_broadcast(); i++)
2074 if (!physid_isset(i, phys_id_present_map))
2075 break;
2076 if (i >= get_physical_broadcast())
2077 panic("Max APIC ID exceeded!\n");
2078 printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
2079 i);
2080 physid_set(i, phys_id_present_map);
c8d46cf0 2081 mp_ioapics[apic_id].apicid = i;
1da177e4
LT
2082 } else {
2083 physid_mask_t tmp;
7abc0753 2084 apic->apicid_to_cpu_present(mp_ioapics[apic_id].apicid, &tmp);
1da177e4
LT
2085 apic_printk(APIC_VERBOSE, "Setting %d in the "
2086 "phys_id_present_map\n",
c8d46cf0 2087 mp_ioapics[apic_id].apicid);
1da177e4
LT
2088 physids_or(phys_id_present_map, phys_id_present_map, tmp);
2089 }
2090
2091
2092 /*
2093 * We need to adjust the IRQ routing table
2094 * if the ID changed.
2095 */
c8d46cf0 2096 if (old_id != mp_ioapics[apic_id].apicid)
1da177e4 2097 for (i = 0; i < mp_irq_entries; i++)
c2c21745
JSR
2098 if (mp_irqs[i].dstapic == old_id)
2099 mp_irqs[i].dstapic
c8d46cf0 2100 = mp_ioapics[apic_id].apicid;
1da177e4
LT
2101
2102 /*
2103 * Read the right value from the MPC table and
2104 * write it into the ID register.
36062448 2105 */
1da177e4
LT
2106 apic_printk(APIC_VERBOSE, KERN_INFO
2107 "...changing IO-APIC physical APIC ID to %d ...",
c8d46cf0 2108 mp_ioapics[apic_id].apicid);
1da177e4 2109
c8d46cf0 2110 reg_00.bits.ID = mp_ioapics[apic_id].apicid;
1da177e4 2111 spin_lock_irqsave(&ioapic_lock, flags);
c8d46cf0 2112 io_apic_write(apic_id, 0, reg_00.raw);
a2d332fa 2113 spin_unlock_irqrestore(&ioapic_lock, flags);
1da177e4
LT
2114
2115 /*
2116 * Sanity check
2117 */
2118 spin_lock_irqsave(&ioapic_lock, flags);
c8d46cf0 2119 reg_00.raw = io_apic_read(apic_id, 0);
1da177e4 2120 spin_unlock_irqrestore(&ioapic_lock, flags);
c8d46cf0 2121 if (reg_00.bits.ID != mp_ioapics[apic_id].apicid)
1da177e4
LT
2122 printk("could not set ID!\n");
2123 else
2124 apic_printk(APIC_VERBOSE, " ok.\n");
2125 }
2126}
54168ed7 2127#endif
1da177e4 2128
7ce0bcfd 2129int no_timer_check __initdata;
8542b200
ZA
2130
2131static int __init notimercheck(char *s)
2132{
2133 no_timer_check = 1;
2134 return 1;
2135}
2136__setup("no_timer_check", notimercheck);
2137
1da177e4
LT
2138/*
2139 * There is a nasty bug in some older SMP boards, their mptable lies
2140 * about the timer IRQ. We do the following to work around the situation:
2141 *
2142 * - timer IRQ defaults to IO-APIC IRQ
2143 * - if this function detects that timer IRQs are defunct, then we fall
2144 * back to ISA timer IRQs
2145 */
f0a7a5c9 2146static int __init timer_irq_works(void)
1da177e4
LT
2147{
2148 unsigned long t1 = jiffies;
4aae0702 2149 unsigned long flags;
1da177e4 2150
8542b200
ZA
2151 if (no_timer_check)
2152 return 1;
2153
4aae0702 2154 local_save_flags(flags);
1da177e4
LT
2155 local_irq_enable();
2156 /* Let ten ticks pass... */
2157 mdelay((10 * 1000) / HZ);
4aae0702 2158 local_irq_restore(flags);
1da177e4
LT
2159
2160 /*
2161 * Expect a few ticks at least, to be sure some possible
2162 * glue logic does not lock up after one or two first
2163 * ticks in a non-ExtINT mode. Also the local APIC
2164 * might have cached one ExtINT interrupt. Finally, at
2165 * least one tick may be lost due to delays.
2166 */
54168ed7
IM
2167
2168 /* jiffies wrap? */
1d16b53e 2169 if (time_after(jiffies, t1 + 4))
1da177e4 2170 return 1;
1da177e4
LT
2171 return 0;
2172}
2173
2174/*
2175 * In the SMP+IOAPIC case it might happen that there are an unspecified
2176 * number of pending IRQ events unhandled. These cases are very rare,
2177 * so we 'resend' these IRQs via IPIs, to the same CPU. It's much
2178 * better to do it this way as thus we do not have to be aware of
2179 * 'pending' interrupts in the IRQ path, except at this point.
2180 */
2181/*
2182 * Edge triggered needs to resend any interrupt
2183 * that was delayed but this is now handled in the device
2184 * independent code.
2185 */
2186
2187/*
2188 * Starting up a edge-triggered IO-APIC interrupt is
2189 * nasty - we need to make sure that we get the edge.
2190 * If it is already asserted for some reason, we need
2191 * return 1 to indicate that is was pending.
2192 *
2193 * This is not complete - we should be able to fake
2194 * an edge even if it isn't on the 8259A...
2195 */
54168ed7 2196
f5b9ed7a 2197static unsigned int startup_ioapic_irq(unsigned int irq)
1da177e4
LT
2198{
2199 int was_pending = 0;
2200 unsigned long flags;
0b8f1efa 2201 struct irq_cfg *cfg;
1da177e4
LT
2202
2203 spin_lock_irqsave(&ioapic_lock, flags);
bc07844a 2204 if (irq < nr_legacy_irqs) {
1da177e4
LT
2205 disable_8259A_irq(irq);
2206 if (i8259A_irq_pending(irq))
2207 was_pending = 1;
2208 }
0b8f1efa 2209 cfg = irq_cfg(irq);
3145e941 2210 __unmask_IO_APIC_irq(cfg);
1da177e4
LT
2211 spin_unlock_irqrestore(&ioapic_lock, flags);
2212
2213 return was_pending;
2214}
2215
ace80ab7 2216static int ioapic_retrigger_irq(unsigned int irq)
1da177e4 2217{
54168ed7
IM
2218
2219 struct irq_cfg *cfg = irq_cfg(irq);
2220 unsigned long flags;
2221
2222 spin_lock_irqsave(&vector_lock, flags);
dac5f412 2223 apic->send_IPI_mask(cpumask_of(cpumask_first(cfg->domain)), cfg->vector);
54168ed7 2224 spin_unlock_irqrestore(&vector_lock, flags);
c0ad90a3
IM
2225
2226 return 1;
2227}
497c9a19 2228
54168ed7
IM
2229/*
2230 * Level and edge triggered IO-APIC interrupts need different handling,
2231 * so we use two separate IRQ descriptors. Edge triggered IRQs can be
2232 * handled with the level-triggered descriptor, but that one has slightly
2233 * more overhead. Level-triggered interrupts cannot be handled with the
2234 * edge-triggered handler, without risking IRQ storms and other ugly
2235 * races.
2236 */
497c9a19 2237
54168ed7 2238#ifdef CONFIG_SMP
9338ad6f 2239void send_cleanup_vector(struct irq_cfg *cfg)
e85abf8f
GH
2240{
2241 cpumask_var_t cleanup_mask;
2242
2243 if (unlikely(!alloc_cpumask_var(&cleanup_mask, GFP_ATOMIC))) {
2244 unsigned int i;
e85abf8f
GH
2245 for_each_cpu_and(i, cfg->old_domain, cpu_online_mask)
2246 apic->send_IPI_mask(cpumask_of(i), IRQ_MOVE_CLEANUP_VECTOR);
2247 } else {
2248 cpumask_and(cleanup_mask, cfg->old_domain, cpu_online_mask);
e85abf8f
GH
2249 apic->send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
2250 free_cpumask_var(cleanup_mask);
2251 }
2252 cfg->move_in_progress = 0;
2253}
2254
4420471f 2255static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq_cfg *cfg)
e85abf8f
GH
2256{
2257 int apic, pin;
2258 struct irq_pin_list *entry;
2259 u8 vector = cfg->vector;
2260
2977fb3f 2261 for_each_irq_pin(entry, cfg->irq_2_pin) {
e85abf8f
GH
2262 unsigned int reg;
2263
e85abf8f
GH
2264 apic = entry->apic;
2265 pin = entry->pin;
2266 /*
2267 * With interrupt-remapping, destination information comes
2268 * from interrupt-remapping table entry.
2269 */
2270 if (!irq_remapped(irq))
2271 io_apic_write(apic, 0x11 + pin*2, dest);
2272 reg = io_apic_read(apic, 0x10 + pin*2);
2273 reg &= ~IO_APIC_REDIR_VECTOR_MASK;
2274 reg |= vector;
2275 io_apic_modify(apic, 0x10 + pin*2, reg);
e85abf8f
GH
2276 }
2277}
2278
2279/*
2280 * Either sets desc->affinity to a valid value, and returns
18374d89 2281 * ->cpu_mask_to_apicid of that in dest_id, or returns -1 and
e85abf8f
GH
2282 * leaves desc->affinity untouched.
2283 */
9338ad6f 2284unsigned int
18374d89
SS
2285set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask,
2286 unsigned int *dest_id)
e85abf8f
GH
2287{
2288 struct irq_cfg *cfg;
2289 unsigned int irq;
2290
2291 if (!cpumask_intersects(mask, cpu_online_mask))
18374d89 2292 return -1;
e85abf8f
GH
2293
2294 irq = desc->irq;
2295 cfg = desc->chip_data;
2296 if (assign_irq_vector(irq, cfg, mask))
18374d89 2297 return -1;
e85abf8f 2298
e85abf8f
GH
2299 cpumask_copy(desc->affinity, mask);
2300
18374d89
SS
2301 *dest_id = apic->cpu_mask_to_apicid_and(desc->affinity, cfg->domain);
2302 return 0;
e85abf8f
GH
2303}
2304
4420471f 2305static int
e85abf8f
GH
2306set_ioapic_affinity_irq_desc(struct irq_desc *desc, const struct cpumask *mask)
2307{
2308 struct irq_cfg *cfg;
2309 unsigned long flags;
2310 unsigned int dest;
2311 unsigned int irq;
4420471f 2312 int ret = -1;
e85abf8f
GH
2313
2314 irq = desc->irq;
2315 cfg = desc->chip_data;
2316
2317 spin_lock_irqsave(&ioapic_lock, flags);
18374d89
SS
2318 ret = set_desc_affinity(desc, mask, &dest);
2319 if (!ret) {
e85abf8f
GH
2320 /* Only the high 8 bits are valid. */
2321 dest = SET_APIC_LOGICAL_ID(dest);
2322 __target_IO_APIC_irq(irq, dest, cfg);
2323 }
2324 spin_unlock_irqrestore(&ioapic_lock, flags);
4420471f
IM
2325
2326 return ret;
e85abf8f
GH
2327}
2328
4420471f 2329static int
e85abf8f
GH
2330set_ioapic_affinity_irq(unsigned int irq, const struct cpumask *mask)
2331{
2332 struct irq_desc *desc;
2333
2334 desc = irq_to_desc(irq);
2335
4420471f 2336 return set_ioapic_affinity_irq_desc(desc, mask);
e85abf8f 2337}
497c9a19 2338
54168ed7 2339#ifdef CONFIG_INTR_REMAP
497c9a19 2340
54168ed7
IM
2341/*
2342 * Migrate the IO-APIC irq in the presence of intr-remapping.
2343 *
0280f7c4
SS
2344 * For both level and edge triggered, irq migration is a simple atomic
2345 * update(of vector and cpu destination) of IRTE and flush the hardware cache.
54168ed7 2346 *
0280f7c4
SS
2347 * For level triggered, we eliminate the io-apic RTE modification (with the
2348 * updated vector information), by using a virtual vector (io-apic pin number).
2349 * Real vector that is used for interrupting cpu will be coming from
2350 * the interrupt-remapping table entry.
54168ed7 2351 */
d5dedd45 2352static int
e7986739 2353migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask)
497c9a19 2354{
54168ed7 2355 struct irq_cfg *cfg;
54168ed7 2356 struct irte irte;
54168ed7 2357 unsigned int dest;
3145e941 2358 unsigned int irq;
d5dedd45 2359 int ret = -1;
497c9a19 2360
22f65d31 2361 if (!cpumask_intersects(mask, cpu_online_mask))
d5dedd45 2362 return ret;
497c9a19 2363
3145e941 2364 irq = desc->irq;
54168ed7 2365 if (get_irte(irq, &irte))
d5dedd45 2366 return ret;
497c9a19 2367
3145e941
YL
2368 cfg = desc->chip_data;
2369 if (assign_irq_vector(irq, cfg, mask))
d5dedd45 2370 return ret;
54168ed7 2371
debccb3e 2372 dest = apic->cpu_mask_to_apicid_and(cfg->domain, mask);
54168ed7 2373
54168ed7
IM
2374 irte.vector = cfg->vector;
2375 irte.dest_id = IRTE_DEST(dest);
2376
2377 /*
2378 * Modified the IRTE and flushes the Interrupt entry cache.
2379 */
2380 modify_irte(irq, &irte);
2381
22f65d31
MT
2382 if (cfg->move_in_progress)
2383 send_cleanup_vector(cfg);
54168ed7 2384
7f7ace0c 2385 cpumask_copy(desc->affinity, mask);
d5dedd45
YL
2386
2387 return 0;
54168ed7
IM
2388}
2389
54168ed7
IM
2390/*
2391 * Migrates the IRQ destination in the process context.
2392 */
d5dedd45 2393static int set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc,
968ea6d8 2394 const struct cpumask *mask)
54168ed7 2395{
d5dedd45 2396 return migrate_ioapic_irq_desc(desc, mask);
3145e941 2397}
d5dedd45 2398static int set_ir_ioapic_affinity_irq(unsigned int irq,
968ea6d8 2399 const struct cpumask *mask)
3145e941
YL
2400{
2401 struct irq_desc *desc = irq_to_desc(irq);
2402
d5dedd45 2403 return set_ir_ioapic_affinity_irq_desc(desc, mask);
54168ed7 2404}
29b61be6 2405#else
d5dedd45 2406static inline int set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc,
29b61be6
SS
2407 const struct cpumask *mask)
2408{
d5dedd45 2409 return 0;
29b61be6 2410}
54168ed7
IM
2411#endif
2412
2413asmlinkage void smp_irq_move_cleanup_interrupt(void)
2414{
2415 unsigned vector, me;
8f2466f4 2416
54168ed7 2417 ack_APIC_irq();
54168ed7 2418 exit_idle();
54168ed7
IM
2419 irq_enter();
2420
2421 me = smp_processor_id();
2422 for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) {
2423 unsigned int irq;
68a8ca59 2424 unsigned int irr;
54168ed7
IM
2425 struct irq_desc *desc;
2426 struct irq_cfg *cfg;
2427 irq = __get_cpu_var(vector_irq)[vector];
2428
0b8f1efa
YL
2429 if (irq == -1)
2430 continue;
2431
54168ed7
IM
2432 desc = irq_to_desc(irq);
2433 if (!desc)
2434 continue;
2435
2436 cfg = irq_cfg(irq);
239007b8 2437 raw_spin_lock(&desc->lock);
54168ed7 2438
22f65d31 2439 if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain))
54168ed7
IM
2440 goto unlock;
2441
68a8ca59
SS
2442 irr = apic_read(APIC_IRR + (vector / 32 * 0x10));
2443 /*
2444 * Check if the vector that needs to be cleanedup is
2445 * registered at the cpu's IRR. If so, then this is not
2446 * the best time to clean it up. Lets clean it up in the
2447 * next attempt by sending another IRQ_MOVE_CLEANUP_VECTOR
2448 * to myself.
2449 */
2450 if (irr & (1 << (vector % 32))) {
2451 apic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR);
2452 goto unlock;
2453 }
54168ed7 2454 __get_cpu_var(vector_irq)[vector] = -1;
54168ed7 2455unlock:
239007b8 2456 raw_spin_unlock(&desc->lock);
54168ed7
IM
2457 }
2458
2459 irq_exit();
2460}
2461
a5e74b84 2462static void __irq_complete_move(struct irq_desc **descp, unsigned vector)
54168ed7 2463{
3145e941
YL
2464 struct irq_desc *desc = *descp;
2465 struct irq_cfg *cfg = desc->chip_data;
a5e74b84 2466 unsigned me;
54168ed7 2467
fcef5911 2468 if (likely(!cfg->move_in_progress))
54168ed7
IM
2469 return;
2470
54168ed7 2471 me = smp_processor_id();
10b888d6 2472
fcef5911 2473 if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain))
22f65d31 2474 send_cleanup_vector(cfg);
497c9a19 2475}
a5e74b84
SS
2476
2477static void irq_complete_move(struct irq_desc **descp)
2478{
2479 __irq_complete_move(descp, ~get_irq_regs()->orig_ax);
2480}
2481
2482void irq_force_complete_move(int irq)
2483{
2484 struct irq_desc *desc = irq_to_desc(irq);
2485 struct irq_cfg *cfg = desc->chip_data;
2486
2487 __irq_complete_move(&desc, cfg->vector);
2488}
497c9a19 2489#else
3145e941 2490static inline void irq_complete_move(struct irq_desc **descp) {}
497c9a19 2491#endif
3145e941 2492
1d025192
YL
2493static void ack_apic_edge(unsigned int irq)
2494{
3145e941
YL
2495 struct irq_desc *desc = irq_to_desc(irq);
2496
2497 irq_complete_move(&desc);
1d025192
YL
2498 move_native_irq(irq);
2499 ack_APIC_irq();
2500}
2501
3eb2cce8 2502atomic_t irq_mis_count;
3eb2cce8 2503
c29d9db3
SS
2504/*
2505 * IO-APIC versions below 0x20 don't support EOI register.
2506 * For the record, here is the information about various versions:
2507 * 0Xh 82489DX
2508 * 1Xh I/OAPIC or I/O(x)APIC which are not PCI 2.2 Compliant
2509 * 2Xh I/O(x)APIC which is PCI 2.2 Compliant
2510 * 30h-FFh Reserved
2511 *
2512 * Some of the Intel ICH Specs (ICH2 to ICH5) documents the io-apic
2513 * version as 0x2. This is an error with documentation and these ICH chips
2514 * use io-apic's of version 0x20.
2515 *
2516 * For IO-APIC's with EOI register, we use that to do an explicit EOI.
2517 * Otherwise, we simulate the EOI message manually by changing the trigger
2518 * mode to edge and then back to level, with RTE being masked during this.
2519*/
b3ec0a37
SS
2520static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg)
2521{
2522 struct irq_pin_list *entry;
2523
2524 for_each_irq_pin(entry, cfg->irq_2_pin) {
c29d9db3
SS
2525 if (mp_ioapics[entry->apic].apicver >= 0x20) {
2526 /*
2527 * Intr-remapping uses pin number as the virtual vector
2528 * in the RTE. Actual vector is programmed in
2529 * intr-remapping table entry. Hence for the io-apic
2530 * EOI we use the pin number.
2531 */
2532 if (irq_remapped(irq))
2533 io_apic_eoi(entry->apic, entry->pin);
2534 else
2535 io_apic_eoi(entry->apic, cfg->vector);
2536 } else {
2537 __mask_and_edge_IO_APIC_irq(entry);
2538 __unmask_and_level_IO_APIC_irq(entry);
2539 }
b3ec0a37
SS
2540 }
2541}
2542
2543static void eoi_ioapic_irq(struct irq_desc *desc)
2544{
2545 struct irq_cfg *cfg;
2546 unsigned long flags;
2547 unsigned int irq;
2548
2549 irq = desc->irq;
2550 cfg = desc->chip_data;
2551
2552 spin_lock_irqsave(&ioapic_lock, flags);
2553 __eoi_ioapic_irq(irq, cfg);
2554 spin_unlock_irqrestore(&ioapic_lock, flags);
2555}
2556
047c8fdb
YL
2557static void ack_apic_level(unsigned int irq)
2558{
3145e941 2559 struct irq_desc *desc = irq_to_desc(irq);
3eb2cce8
YL
2560 unsigned long v;
2561 int i;
3145e941 2562 struct irq_cfg *cfg;
54168ed7 2563 int do_unmask_irq = 0;
047c8fdb 2564
3145e941 2565 irq_complete_move(&desc);
047c8fdb 2566#ifdef CONFIG_GENERIC_PENDING_IRQ
54168ed7 2567 /* If we are moving the irq we need to mask it */
3145e941 2568 if (unlikely(desc->status & IRQ_MOVE_PENDING)) {
54168ed7 2569 do_unmask_irq = 1;
3145e941 2570 mask_IO_APIC_irq_desc(desc);
54168ed7 2571 }
047c8fdb
YL
2572#endif
2573
3eb2cce8 2574 /*
916a0fe7
JF
2575 * It appears there is an erratum which affects at least version 0x11
2576 * of I/O APIC (that's the 82093AA and cores integrated into various
2577 * chipsets). Under certain conditions a level-triggered interrupt is
2578 * erroneously delivered as edge-triggered one but the respective IRR
2579 * bit gets set nevertheless. As a result the I/O unit expects an EOI
2580 * message but it will never arrive and further interrupts are blocked
2581 * from the source. The exact reason is so far unknown, but the
2582 * phenomenon was observed when two consecutive interrupt requests
2583 * from a given source get delivered to the same CPU and the source is
2584 * temporarily disabled in between.
2585 *
2586 * A workaround is to simulate an EOI message manually. We achieve it
2587 * by setting the trigger mode to edge and then to level when the edge
2588 * trigger mode gets detected in the TMR of a local APIC for a
2589 * level-triggered interrupt. We mask the source for the time of the
2590 * operation to prevent an edge-triggered interrupt escaping meanwhile.
2591 * The idea is from Manfred Spraul. --macro
1c83995b
SS
2592 *
2593 * Also in the case when cpu goes offline, fixup_irqs() will forward
2594 * any unhandled interrupt on the offlined cpu to the new cpu
2595 * destination that is handling the corresponding interrupt. This
2596 * interrupt forwarding is done via IPI's. Hence, in this case also
2597 * level-triggered io-apic interrupt will be seen as an edge
2598 * interrupt in the IRR. And we can't rely on the cpu's EOI
2599 * to be broadcasted to the IO-APIC's which will clear the remoteIRR
2600 * corresponding to the level-triggered interrupt. Hence on IO-APIC's
2601 * supporting EOI register, we do an explicit EOI to clear the
2602 * remote IRR and on IO-APIC's which don't have an EOI register,
2603 * we use the above logic (mask+edge followed by unmask+level) from
2604 * Manfred Spraul to clear the remote IRR.
916a0fe7 2605 */
3145e941
YL
2606 cfg = desc->chip_data;
2607 i = cfg->vector;
3eb2cce8 2608 v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
3eb2cce8 2609
54168ed7
IM
2610 /*
2611 * We must acknowledge the irq before we move it or the acknowledge will
2612 * not propagate properly.
2613 */
2614 ack_APIC_irq();
2615
1c83995b
SS
2616 /*
2617 * Tail end of clearing remote IRR bit (either by delivering the EOI
2618 * message via io-apic EOI register write or simulating it using
2619 * mask+edge followed by unnask+level logic) manually when the
2620 * level triggered interrupt is seen as the edge triggered interrupt
2621 * at the cpu.
2622 */
ca64c47c
MR
2623 if (!(v & (1 << (i & 0x1f)))) {
2624 atomic_inc(&irq_mis_count);
2625
c29d9db3 2626 eoi_ioapic_irq(desc);
ca64c47c
MR
2627 }
2628
54168ed7
IM
2629 /* Now we can move and renable the irq */
2630 if (unlikely(do_unmask_irq)) {
2631 /* Only migrate the irq if the ack has been received.
2632 *
2633 * On rare occasions the broadcast level triggered ack gets
2634 * delayed going to ioapics, and if we reprogram the
2635 * vector while Remote IRR is still set the irq will never
2636 * fire again.
2637 *
2638 * To prevent this scenario we read the Remote IRR bit
2639 * of the ioapic. This has two effects.
2640 * - On any sane system the read of the ioapic will
2641 * flush writes (and acks) going to the ioapic from
2642 * this cpu.
2643 * - We get to see if the ACK has actually been delivered.
2644 *
2645 * Based on failed experiments of reprogramming the
2646 * ioapic entry from outside of irq context starting
2647 * with masking the ioapic entry and then polling until
2648 * Remote IRR was clear before reprogramming the
2649 * ioapic I don't trust the Remote IRR bit to be
2650 * completey accurate.
2651 *
2652 * However there appears to be no other way to plug
2653 * this race, so if the Remote IRR bit is not
2654 * accurate and is causing problems then it is a hardware bug
2655 * and you can go talk to the chipset vendor about it.
2656 */
3145e941
YL
2657 cfg = desc->chip_data;
2658 if (!io_apic_level_ack_pending(cfg))
54168ed7 2659 move_masked_irq(irq);
3145e941 2660 unmask_IO_APIC_irq_desc(desc);
54168ed7 2661 }
3eb2cce8 2662}
1d025192 2663
d0b03bd1
HW
2664#ifdef CONFIG_INTR_REMAP
2665static void ir_ack_apic_edge(unsigned int irq)
2666{
5d0ae2db 2667 ack_APIC_irq();
d0b03bd1
HW
2668}
2669
2670static void ir_ack_apic_level(unsigned int irq)
2671{
5d0ae2db
WH
2672 struct irq_desc *desc = irq_to_desc(irq);
2673
2674 ack_APIC_irq();
2675 eoi_ioapic_irq(desc);
d0b03bd1
HW
2676}
2677#endif /* CONFIG_INTR_REMAP */
2678
f5b9ed7a 2679static struct irq_chip ioapic_chip __read_mostly = {
d6c88a50
TG
2680 .name = "IO-APIC",
2681 .startup = startup_ioapic_irq,
2682 .mask = mask_IO_APIC_irq,
2683 .unmask = unmask_IO_APIC_irq,
2684 .ack = ack_apic_edge,
2685 .eoi = ack_apic_level,
54d5d424 2686#ifdef CONFIG_SMP
d6c88a50 2687 .set_affinity = set_ioapic_affinity_irq,
54d5d424 2688#endif
ace80ab7 2689 .retrigger = ioapic_retrigger_irq,
1da177e4
LT
2690};
2691
54168ed7 2692static struct irq_chip ir_ioapic_chip __read_mostly = {
d6c88a50
TG
2693 .name = "IR-IO-APIC",
2694 .startup = startup_ioapic_irq,
2695 .mask = mask_IO_APIC_irq,
2696 .unmask = unmask_IO_APIC_irq,
a1e38ca5 2697#ifdef CONFIG_INTR_REMAP
d0b03bd1
HW
2698 .ack = ir_ack_apic_edge,
2699 .eoi = ir_ack_apic_level,
54168ed7 2700#ifdef CONFIG_SMP
d6c88a50 2701 .set_affinity = set_ir_ioapic_affinity_irq,
a1e38ca5 2702#endif
54168ed7
IM
2703#endif
2704 .retrigger = ioapic_retrigger_irq,
2705};
1da177e4
LT
2706
2707static inline void init_IO_APIC_traps(void)
2708{
2709 int irq;
08678b08 2710 struct irq_desc *desc;
da51a821 2711 struct irq_cfg *cfg;
1da177e4
LT
2712
2713 /*
2714 * NOTE! The local APIC isn't very good at handling
2715 * multiple interrupts at the same interrupt level.
2716 * As the interrupt level is determined by taking the
2717 * vector number and shifting that right by 4, we
2718 * want to spread these out a bit so that they don't
2719 * all fall in the same interrupt level.
2720 *
2721 * Also, we've got to be careful not to trash gate
2722 * 0x80, because int 0x80 is hm, kind of importantish. ;)
2723 */
0b8f1efa 2724 for_each_irq_desc(irq, desc) {
0b8f1efa
YL
2725 cfg = desc->chip_data;
2726 if (IO_APIC_IRQ(irq) && cfg && !cfg->vector) {
1da177e4
LT
2727 /*
2728 * Hmm.. We don't have an entry for this,
2729 * so default to an old-fashioned 8259
2730 * interrupt if we can..
2731 */
bc07844a 2732 if (irq < nr_legacy_irqs)
1da177e4 2733 make_8259A_irq(irq);
0b8f1efa 2734 else
1da177e4 2735 /* Strange. Oh, well.. */
08678b08 2736 desc->chip = &no_irq_chip;
1da177e4
LT
2737 }
2738 }
2739}
2740
f5b9ed7a
IM
2741/*
2742 * The local APIC irq-chip implementation:
2743 */
1da177e4 2744
36062448 2745static void mask_lapic_irq(unsigned int irq)
1da177e4
LT
2746{
2747 unsigned long v;
2748
2749 v = apic_read(APIC_LVT0);
593f4a78 2750 apic_write(APIC_LVT0, v | APIC_LVT_MASKED);
1da177e4
LT
2751}
2752
36062448 2753static void unmask_lapic_irq(unsigned int irq)
1da177e4 2754{
f5b9ed7a 2755 unsigned long v;
1da177e4 2756
f5b9ed7a 2757 v = apic_read(APIC_LVT0);
593f4a78 2758 apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED);
f5b9ed7a 2759}
1da177e4 2760
3145e941 2761static void ack_lapic_irq(unsigned int irq)
1d025192
YL
2762{
2763 ack_APIC_irq();
2764}
2765
f5b9ed7a 2766static struct irq_chip lapic_chip __read_mostly = {
9a1c6192 2767 .name = "local-APIC",
f5b9ed7a
IM
2768 .mask = mask_lapic_irq,
2769 .unmask = unmask_lapic_irq,
c88ac1df 2770 .ack = ack_lapic_irq,
1da177e4
LT
2771};
2772
3145e941 2773static void lapic_register_intr(int irq, struct irq_desc *desc)
c88ac1df 2774{
08678b08 2775 desc->status &= ~IRQ_LEVEL;
c88ac1df
MR
2776 set_irq_chip_and_handler_name(irq, &lapic_chip, handle_edge_irq,
2777 "edge");
c88ac1df
MR
2778}
2779
e9427101 2780static void __init setup_nmi(void)
1da177e4
LT
2781{
2782 /*
36062448 2783 * Dirty trick to enable the NMI watchdog ...
1da177e4
LT
2784 * We put the 8259A master into AEOI mode and
2785 * unmask on all local APICs LVT0 as NMI.
2786 *
2787 * The idea to use the 8259A in AEOI mode ('8259A Virtual Wire')
2788 * is from Maciej W. Rozycki - so we do not have to EOI from
2789 * the NMI handler or the timer interrupt.
36062448 2790 */
1da177e4
LT
2791 apic_printk(APIC_VERBOSE, KERN_INFO "activating NMI Watchdog ...");
2792
e9427101 2793 enable_NMI_through_LVT0();
1da177e4
LT
2794
2795 apic_printk(APIC_VERBOSE, " done.\n");
2796}
2797
2798/*
2799 * This looks a bit hackish but it's about the only one way of sending
2800 * a few INTA cycles to 8259As and any associated glue logic. ICR does
2801 * not support the ExtINT mode, unfortunately. We need to send these
2802 * cycles as some i82489DX-based boards have glue logic that keeps the
2803 * 8259A interrupt line asserted until INTA. --macro
2804 */
28acf285 2805static inline void __init unlock_ExtINT_logic(void)
1da177e4 2806{
fcfd636a 2807 int apic, pin, i;
1da177e4
LT
2808 struct IO_APIC_route_entry entry0, entry1;
2809 unsigned char save_control, save_freq_select;
1da177e4 2810
fcfd636a 2811 pin = find_isa_irq_pin(8, mp_INT);
956fb531
AB
2812 if (pin == -1) {
2813 WARN_ON_ONCE(1);
2814 return;
2815 }
fcfd636a 2816 apic = find_isa_irq_apic(8, mp_INT);
956fb531
AB
2817 if (apic == -1) {
2818 WARN_ON_ONCE(1);
1da177e4 2819 return;
956fb531 2820 }
1da177e4 2821
cf4c6a2f 2822 entry0 = ioapic_read_entry(apic, pin);
fcfd636a 2823 clear_IO_APIC_pin(apic, pin);
1da177e4
LT
2824
2825 memset(&entry1, 0, sizeof(entry1));
2826
2827 entry1.dest_mode = 0; /* physical delivery */
2828 entry1.mask = 0; /* unmask IRQ now */
d83e94ac 2829 entry1.dest = hard_smp_processor_id();
1da177e4
LT
2830 entry1.delivery_mode = dest_ExtINT;
2831 entry1.polarity = entry0.polarity;
2832 entry1.trigger = 0;
2833 entry1.vector = 0;
2834
cf4c6a2f 2835 ioapic_write_entry(apic, pin, entry1);
1da177e4
LT
2836
2837 save_control = CMOS_READ(RTC_CONTROL);
2838 save_freq_select = CMOS_READ(RTC_FREQ_SELECT);
2839 CMOS_WRITE((save_freq_select & ~RTC_RATE_SELECT) | 0x6,
2840 RTC_FREQ_SELECT);
2841 CMOS_WRITE(save_control | RTC_PIE, RTC_CONTROL);
2842
2843 i = 100;
2844 while (i-- > 0) {
2845 mdelay(10);
2846 if ((CMOS_READ(RTC_INTR_FLAGS) & RTC_PF) == RTC_PF)
2847 i -= 10;
2848 }
2849
2850 CMOS_WRITE(save_control, RTC_CONTROL);
2851 CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
fcfd636a 2852 clear_IO_APIC_pin(apic, pin);
1da177e4 2853
cf4c6a2f 2854 ioapic_write_entry(apic, pin, entry0);
1da177e4
LT
2855}
2856
efa2559f 2857static int disable_timer_pin_1 __initdata;
047c8fdb 2858/* Actually the next is obsolete, but keep it for paranoid reasons -AK */
54168ed7 2859static int __init disable_timer_pin_setup(char *arg)
efa2559f
YL
2860{
2861 disable_timer_pin_1 = 1;
2862 return 0;
2863}
54168ed7 2864early_param("disable_timer_pin_1", disable_timer_pin_setup);
efa2559f
YL
2865
2866int timer_through_8259 __initdata;
2867
1da177e4
LT
2868/*
2869 * This code may look a bit paranoid, but it's supposed to cooperate with
2870 * a wide range of boards and BIOS bugs. Fortunately only the timer IRQ
2871 * is so screwy. Thanks to Brian Perkins for testing/hacking this beast
2872 * fanatically on his truly buggy board.
54168ed7
IM
2873 *
2874 * FIXME: really need to revamp this for all platforms.
1da177e4 2875 */
8542b200 2876static inline void __init check_timer(void)
1da177e4 2877{
3145e941
YL
2878 struct irq_desc *desc = irq_to_desc(0);
2879 struct irq_cfg *cfg = desc->chip_data;
85ac16d0 2880 int node = cpu_to_node(boot_cpu_id);
fcfd636a 2881 int apic1, pin1, apic2, pin2;
4aae0702 2882 unsigned long flags;
047c8fdb 2883 int no_pin1 = 0;
4aae0702
IM
2884
2885 local_irq_save(flags);
d4d25dec 2886
1da177e4
LT
2887 /*
2888 * get/set the timer IRQ vector:
2889 */
2890 disable_8259A_irq(0);
fe402e1f 2891 assign_irq_vector(0, cfg, apic->target_cpus());
1da177e4
LT
2892
2893 /*
d11d5794
MR
2894 * As IRQ0 is to be enabled in the 8259A, the virtual
2895 * wire has to be disabled in the local APIC. Also
2896 * timer interrupts need to be acknowledged manually in
2897 * the 8259A for the i82489DX when using the NMI
2898 * watchdog as that APIC treats NMIs as level-triggered.
2899 * The AEOI mode will finish them in the 8259A
2900 * automatically.
1da177e4 2901 */
593f4a78 2902 apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
1da177e4 2903 init_8259A(1);
54168ed7 2904#ifdef CONFIG_X86_32
f72dccac
YL
2905 {
2906 unsigned int ver;
2907
2908 ver = apic_read(APIC_LVR);
2909 ver = GET_APIC_VERSION(ver);
2910 timer_ack = (nmi_watchdog == NMI_IO_APIC && !APIC_INTEGRATED(ver));
2911 }
54168ed7 2912#endif
1da177e4 2913
fcfd636a
EB
2914 pin1 = find_isa_irq_pin(0, mp_INT);
2915 apic1 = find_isa_irq_apic(0, mp_INT);
2916 pin2 = ioapic_i8259.pin;
2917 apic2 = ioapic_i8259.apic;
1da177e4 2918
49a66a0b
MR
2919 apic_printk(APIC_QUIET, KERN_INFO "..TIMER: vector=0x%02X "
2920 "apic1=%d pin1=%d apic2=%d pin2=%d\n",
497c9a19 2921 cfg->vector, apic1, pin1, apic2, pin2);
1da177e4 2922
691874fa
MR
2923 /*
2924 * Some BIOS writers are clueless and report the ExtINTA
2925 * I/O APIC input from the cascaded 8259A as the timer
2926 * interrupt input. So just in case, if only one pin
2927 * was found above, try it both directly and through the
2928 * 8259A.
2929 */
2930 if (pin1 == -1) {
54168ed7
IM
2931 if (intr_remapping_enabled)
2932 panic("BIOS bug: timer not connected to IO-APIC");
691874fa
MR
2933 pin1 = pin2;
2934 apic1 = apic2;
2935 no_pin1 = 1;
2936 } else if (pin2 == -1) {
2937 pin2 = pin1;
2938 apic2 = apic1;
2939 }
2940
1da177e4
LT
2941 if (pin1 != -1) {
2942 /*
2943 * Ok, does IRQ0 through the IOAPIC work?
2944 */
691874fa 2945 if (no_pin1) {
85ac16d0 2946 add_pin_to_irq_node(cfg, node, apic1, pin1);
497c9a19 2947 setup_timer_IRQ0_pin(apic1, pin1, cfg->vector);
f72dccac
YL
2948 } else {
2949 /* for edge trigger, setup_IO_APIC_irq already
2950 * leave it unmasked.
2951 * so only need to unmask if it is level-trigger
2952 * do we really have level trigger timer?
2953 */
2954 int idx;
2955 idx = find_irq_entry(apic1, pin1, mp_INT);
2956 if (idx != -1 && irq_trigger(idx))
2957 unmask_IO_APIC_irq_desc(desc);
691874fa 2958 }
1da177e4
LT
2959 if (timer_irq_works()) {
2960 if (nmi_watchdog == NMI_IO_APIC) {
1da177e4
LT
2961 setup_nmi();
2962 enable_8259A_irq(0);
1da177e4 2963 }
66759a01
CE
2964 if (disable_timer_pin_1 > 0)
2965 clear_IO_APIC_pin(0, pin1);
4aae0702 2966 goto out;
1da177e4 2967 }
54168ed7
IM
2968 if (intr_remapping_enabled)
2969 panic("timer doesn't work through Interrupt-remapped IO-APIC");
f72dccac 2970 local_irq_disable();
fcfd636a 2971 clear_IO_APIC_pin(apic1, pin1);
691874fa 2972 if (!no_pin1)
49a66a0b
MR
2973 apic_printk(APIC_QUIET, KERN_ERR "..MP-BIOS bug: "
2974 "8254 timer not connected to IO-APIC\n");
1da177e4 2975
49a66a0b
MR
2976 apic_printk(APIC_QUIET, KERN_INFO "...trying to set up timer "
2977 "(IRQ0) through the 8259A ...\n");
2978 apic_printk(APIC_QUIET, KERN_INFO
2979 "..... (found apic %d pin %d) ...\n", apic2, pin2);
1da177e4
LT
2980 /*
2981 * legacy devices should be connected to IO APIC #0
2982 */
85ac16d0 2983 replace_pin_at_irq_node(cfg, node, apic1, pin1, apic2, pin2);
497c9a19 2984 setup_timer_IRQ0_pin(apic2, pin2, cfg->vector);
ecd29476 2985 enable_8259A_irq(0);
1da177e4 2986 if (timer_irq_works()) {
49a66a0b 2987 apic_printk(APIC_QUIET, KERN_INFO "....... works.\n");
35542c5e 2988 timer_through_8259 = 1;
1da177e4 2989 if (nmi_watchdog == NMI_IO_APIC) {
60134ebe 2990 disable_8259A_irq(0);
1da177e4 2991 setup_nmi();
60134ebe 2992 enable_8259A_irq(0);
1da177e4 2993 }
4aae0702 2994 goto out;
1da177e4
LT
2995 }
2996 /*
2997 * Cleanup, just in case ...
2998 */
f72dccac 2999 local_irq_disable();
ecd29476 3000 disable_8259A_irq(0);
fcfd636a 3001 clear_IO_APIC_pin(apic2, pin2);
49a66a0b 3002 apic_printk(APIC_QUIET, KERN_INFO "....... failed.\n");
1da177e4 3003 }
1da177e4
LT
3004
3005 if (nmi_watchdog == NMI_IO_APIC) {
49a66a0b
MR
3006 apic_printk(APIC_QUIET, KERN_WARNING "timer doesn't work "
3007 "through the IO-APIC - disabling NMI Watchdog!\n");
067fa0ff 3008 nmi_watchdog = NMI_NONE;
1da177e4 3009 }
54168ed7 3010#ifdef CONFIG_X86_32
d11d5794 3011 timer_ack = 0;
54168ed7 3012#endif
1da177e4 3013
49a66a0b
MR
3014 apic_printk(APIC_QUIET, KERN_INFO
3015 "...trying to set up timer as Virtual Wire IRQ...\n");
1da177e4 3016
3145e941 3017 lapic_register_intr(0, desc);
497c9a19 3018 apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector); /* Fixed mode */
1da177e4
LT
3019 enable_8259A_irq(0);
3020
3021 if (timer_irq_works()) {
49a66a0b 3022 apic_printk(APIC_QUIET, KERN_INFO "..... works.\n");
4aae0702 3023 goto out;
1da177e4 3024 }
f72dccac 3025 local_irq_disable();
e67465f1 3026 disable_8259A_irq(0);
497c9a19 3027 apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | cfg->vector);
49a66a0b 3028 apic_printk(APIC_QUIET, KERN_INFO "..... failed.\n");
1da177e4 3029
49a66a0b
MR
3030 apic_printk(APIC_QUIET, KERN_INFO
3031 "...trying to set up timer as ExtINT IRQ...\n");
1da177e4 3032
1da177e4
LT
3033 init_8259A(0);
3034 make_8259A_irq(0);
593f4a78 3035 apic_write(APIC_LVT0, APIC_DM_EXTINT);
1da177e4
LT
3036
3037 unlock_ExtINT_logic();
3038
3039 if (timer_irq_works()) {
49a66a0b 3040 apic_printk(APIC_QUIET, KERN_INFO "..... works.\n");
4aae0702 3041 goto out;
1da177e4 3042 }
f72dccac 3043 local_irq_disable();
49a66a0b 3044 apic_printk(APIC_QUIET, KERN_INFO "..... failed :(.\n");
1da177e4 3045 panic("IO-APIC + timer doesn't work! Boot with apic=debug and send a "
49a66a0b 3046 "report. Then try booting with the 'noapic' option.\n");
4aae0702
IM
3047out:
3048 local_irq_restore(flags);
1da177e4
LT
3049}
3050
3051/*
af174783
MR
3052 * Traditionally ISA IRQ2 is the cascade IRQ, and is not available
3053 * to devices. However there may be an I/O APIC pin available for
3054 * this interrupt regardless. The pin may be left unconnected, but
3055 * typically it will be reused as an ExtINT cascade interrupt for
3056 * the master 8259A. In the MPS case such a pin will normally be
3057 * reported as an ExtINT interrupt in the MP table. With ACPI
3058 * there is no provision for ExtINT interrupts, and in the absence
3059 * of an override it would be treated as an ordinary ISA I/O APIC
3060 * interrupt, that is edge-triggered and unmasked by default. We
3061 * used to do this, but it caused problems on some systems because
3062 * of the NMI watchdog and sometimes IRQ0 of the 8254 timer using
3063 * the same ExtINT cascade interrupt to drive the local APIC of the
3064 * bootstrap processor. Therefore we refrain from routing IRQ2 to
3065 * the I/O APIC in all cases now. No actual device should request
3066 * it anyway. --macro
1da177e4 3067 */
bc07844a 3068#define PIC_IRQS (1UL << PIC_CASCADE_IR)
1da177e4
LT
3069
3070void __init setup_IO_APIC(void)
3071{
54168ed7 3072
54168ed7
IM
3073 /*
3074 * calling enable_IO_APIC() is moved to setup_local_APIC for BP
3075 */
bc07844a 3076 io_apic_irqs = nr_legacy_irqs ? ~PIC_IRQS : ~0UL;
1da177e4 3077
54168ed7 3078 apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n");
d6c88a50 3079 /*
54168ed7
IM
3080 * Set up IO-APIC IRQ routing.
3081 */
de934103
TG
3082 x86_init.mpparse.setup_ioapic_ids();
3083
1da177e4
LT
3084 sync_Arb_IDs();
3085 setup_IO_APIC_irqs();
3086 init_IO_APIC_traps();
bc07844a
TG
3087 if (nr_legacy_irqs)
3088 check_timer();
1da177e4
LT
3089}
3090
3091/*
54168ed7
IM
3092 * Called after all the initialization is done. If we didnt find any
3093 * APIC bugs then we can allow the modify fast path
1da177e4 3094 */
36062448 3095
1da177e4
LT
3096static int __init io_apic_bug_finalize(void)
3097{
d6c88a50
TG
3098 if (sis_apic_bug == -1)
3099 sis_apic_bug = 0;
3100 return 0;
1da177e4
LT
3101}
3102
3103late_initcall(io_apic_bug_finalize);
3104
3105struct sysfs_ioapic_data {
3106 struct sys_device dev;
3107 struct IO_APIC_route_entry entry[0];
3108};
54168ed7 3109static struct sysfs_ioapic_data * mp_ioapic_data[MAX_IO_APICS];
1da177e4 3110
438510f6 3111static int ioapic_suspend(struct sys_device *dev, pm_message_t state)
1da177e4
LT
3112{
3113 struct IO_APIC_route_entry *entry;
3114 struct sysfs_ioapic_data *data;
1da177e4 3115 int i;
36062448 3116
1da177e4
LT
3117 data = container_of(dev, struct sysfs_ioapic_data, dev);
3118 entry = data->entry;
54168ed7
IM
3119 for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ )
3120 *entry = ioapic_read_entry(dev->id, i);
1da177e4
LT
3121
3122 return 0;
3123}
3124
3125static int ioapic_resume(struct sys_device *dev)
3126{
3127 struct IO_APIC_route_entry *entry;
3128 struct sysfs_ioapic_data *data;
3129 unsigned long flags;
3130 union IO_APIC_reg_00 reg_00;
3131 int i;
36062448 3132
1da177e4
LT
3133 data = container_of(dev, struct sysfs_ioapic_data, dev);
3134 entry = data->entry;
3135
3136 spin_lock_irqsave(&ioapic_lock, flags);
3137 reg_00.raw = io_apic_read(dev->id, 0);
b5ba7e6d
JSR
3138 if (reg_00.bits.ID != mp_ioapics[dev->id].apicid) {
3139 reg_00.bits.ID = mp_ioapics[dev->id].apicid;
1da177e4
LT
3140 io_apic_write(dev->id, 0, reg_00.raw);
3141 }
1da177e4 3142 spin_unlock_irqrestore(&ioapic_lock, flags);
36062448 3143 for (i = 0; i < nr_ioapic_registers[dev->id]; i++)
cf4c6a2f 3144 ioapic_write_entry(dev->id, i, entry[i]);
1da177e4
LT
3145
3146 return 0;
3147}
3148
3149static struct sysdev_class ioapic_sysdev_class = {
af5ca3f4 3150 .name = "ioapic",
1da177e4
LT
3151 .suspend = ioapic_suspend,
3152 .resume = ioapic_resume,
3153};
3154
3155static int __init ioapic_init_sysfs(void)
3156{
54168ed7
IM
3157 struct sys_device * dev;
3158 int i, size, error;
1da177e4
LT
3159
3160 error = sysdev_class_register(&ioapic_sysdev_class);
3161 if (error)
3162 return error;
3163
54168ed7 3164 for (i = 0; i < nr_ioapics; i++ ) {
36062448 3165 size = sizeof(struct sys_device) + nr_ioapic_registers[i]
1da177e4 3166 * sizeof(struct IO_APIC_route_entry);
25556c16 3167 mp_ioapic_data[i] = kzalloc(size, GFP_KERNEL);
1da177e4
LT
3168 if (!mp_ioapic_data[i]) {
3169 printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
3170 continue;
3171 }
1da177e4 3172 dev = &mp_ioapic_data[i]->dev;
36062448 3173 dev->id = i;
1da177e4
LT
3174 dev->cls = &ioapic_sysdev_class;
3175 error = sysdev_register(dev);
3176 if (error) {
3177 kfree(mp_ioapic_data[i]);
3178 mp_ioapic_data[i] = NULL;
3179 printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
3180 continue;
3181 }
3182 }
3183
3184 return 0;
3185}
3186
3187device_initcall(ioapic_init_sysfs);
3188
3fc471ed 3189/*
95d77884 3190 * Dynamic irq allocate and deallocation
3fc471ed 3191 */
d047f53a 3192unsigned int create_irq_nr(unsigned int irq_want, int node)
3fc471ed 3193{
ace80ab7 3194 /* Allocate an unused irq */
54168ed7
IM
3195 unsigned int irq;
3196 unsigned int new;
3fc471ed 3197 unsigned long flags;
0b8f1efa 3198 struct irq_cfg *cfg_new = NULL;
0b8f1efa 3199 struct irq_desc *desc_new = NULL;
199751d7
YL
3200
3201 irq = 0;
abcaa2b8
YL
3202 if (irq_want < nr_irqs_gsi)
3203 irq_want = nr_irqs_gsi;
3204
ace80ab7 3205 spin_lock_irqsave(&vector_lock, flags);
9594949b 3206 for (new = irq_want; new < nr_irqs; new++) {
85ac16d0 3207 desc_new = irq_to_desc_alloc_node(new, node);
0b8f1efa
YL
3208 if (!desc_new) {
3209 printk(KERN_INFO "can not get irq_desc for %d\n", new);
ace80ab7 3210 continue;
0b8f1efa
YL
3211 }
3212 cfg_new = desc_new->chip_data;
3213
3214 if (cfg_new->vector != 0)
ace80ab7 3215 continue;
d047f53a 3216
15e957d0 3217 desc_new = move_irq_desc(desc_new, node);
37ef2a30 3218 cfg_new = desc_new->chip_data;
d047f53a 3219
fe402e1f 3220 if (__assign_irq_vector(new, cfg_new, apic->target_cpus()) == 0)
ace80ab7
EB
3221 irq = new;
3222 break;
3223 }
3224 spin_unlock_irqrestore(&vector_lock, flags);
3fc471ed 3225
199751d7 3226 if (irq > 0) {
3fc471ed 3227 dynamic_irq_init(irq);
0b8f1efa
YL
3228 /* restore it, in case dynamic_irq_init clear it */
3229 if (desc_new)
3230 desc_new->chip_data = cfg_new;
3fc471ed
EB
3231 }
3232 return irq;
3233}
3234
199751d7
YL
3235int create_irq(void)
3236{
d047f53a 3237 int node = cpu_to_node(boot_cpu_id);
be5d5350 3238 unsigned int irq_want;
54168ed7
IM
3239 int irq;
3240
be5d5350 3241 irq_want = nr_irqs_gsi;
d047f53a 3242 irq = create_irq_nr(irq_want, node);
54168ed7
IM
3243
3244 if (irq == 0)
3245 irq = -1;
3246
3247 return irq;
199751d7
YL
3248}
3249
3fc471ed
EB
3250void destroy_irq(unsigned int irq)
3251{
3252 unsigned long flags;
0b8f1efa
YL
3253 struct irq_cfg *cfg;
3254 struct irq_desc *desc;
3fc471ed 3255
0b8f1efa
YL
3256 /* store it, in case dynamic_irq_cleanup clear it */
3257 desc = irq_to_desc(irq);
3258 cfg = desc->chip_data;
3fc471ed 3259 dynamic_irq_cleanup(irq);
0b8f1efa 3260 /* connect back irq_cfg */
25f6e89b 3261 desc->chip_data = cfg;
3fc471ed 3262
54168ed7 3263 free_irte(irq);
3fc471ed 3264 spin_lock_irqsave(&vector_lock, flags);
3145e941 3265 __clear_irq_vector(irq, cfg);
3fc471ed
EB
3266 spin_unlock_irqrestore(&vector_lock, flags);
3267}
3fc471ed 3268
2d3fcc1c 3269/*
27b46d76 3270 * MSI message composition
2d3fcc1c
EB
3271 */
3272#ifdef CONFIG_PCI_MSI
c8bc6f3c
SS
3273static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq,
3274 struct msi_msg *msg, u8 hpet_id)
2d3fcc1c 3275{
497c9a19
YL
3276 struct irq_cfg *cfg;
3277 int err;
2d3fcc1c
EB
3278 unsigned dest;
3279
f1182638
JB
3280 if (disable_apic)
3281 return -ENXIO;
3282
3145e941 3283 cfg = irq_cfg(irq);
fe402e1f 3284 err = assign_irq_vector(irq, cfg, apic->target_cpus());
497c9a19
YL
3285 if (err)
3286 return err;
2d3fcc1c 3287
debccb3e 3288 dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus());
497c9a19 3289
54168ed7
IM
3290 if (irq_remapped(irq)) {
3291 struct irte irte;
3292 int ir_index;
3293 u16 sub_handle;
3294
3295 ir_index = map_irq_to_irte_handle(irq, &sub_handle);
3296 BUG_ON(ir_index == -1);
3297
3298 memset (&irte, 0, sizeof(irte));
3299
3300 irte.present = 1;
9b5bc8dc 3301 irte.dst_mode = apic->irq_dest_mode;
54168ed7 3302 irte.trigger_mode = 0; /* edge */
9b5bc8dc 3303 irte.dlvry_mode = apic->irq_delivery_mode;
54168ed7
IM
3304 irte.vector = cfg->vector;
3305 irte.dest_id = IRTE_DEST(dest);
3306
f007e99c 3307 /* Set source-id of interrupt request */
c8bc6f3c
SS
3308 if (pdev)
3309 set_msi_sid(&irte, pdev);
3310 else
3311 set_hpet_sid(&irte, hpet_id);
f007e99c 3312
54168ed7
IM
3313 modify_irte(irq, &irte);
3314
3315 msg->address_hi = MSI_ADDR_BASE_HI;
3316 msg->data = sub_handle;
3317 msg->address_lo = MSI_ADDR_BASE_LO | MSI_ADDR_IR_EXT_INT |
3318 MSI_ADDR_IR_SHV |
3319 MSI_ADDR_IR_INDEX1(ir_index) |
3320 MSI_ADDR_IR_INDEX2(ir_index);
29b61be6 3321 } else {
9d783ba0
SS
3322 if (x2apic_enabled())
3323 msg->address_hi = MSI_ADDR_BASE_HI |
3324 MSI_ADDR_EXT_DEST_ID(dest);
3325 else
3326 msg->address_hi = MSI_ADDR_BASE_HI;
3327
54168ed7
IM
3328 msg->address_lo =
3329 MSI_ADDR_BASE_LO |
9b5bc8dc 3330 ((apic->irq_dest_mode == 0) ?
54168ed7
IM
3331 MSI_ADDR_DEST_MODE_PHYSICAL:
3332 MSI_ADDR_DEST_MODE_LOGICAL) |
9b5bc8dc 3333 ((apic->irq_delivery_mode != dest_LowestPrio) ?
54168ed7
IM
3334 MSI_ADDR_REDIRECTION_CPU:
3335 MSI_ADDR_REDIRECTION_LOWPRI) |
3336 MSI_ADDR_DEST_ID(dest);
497c9a19 3337
54168ed7
IM
3338 msg->data =
3339 MSI_DATA_TRIGGER_EDGE |
3340 MSI_DATA_LEVEL_ASSERT |
9b5bc8dc 3341 ((apic->irq_delivery_mode != dest_LowestPrio) ?
54168ed7
IM
3342 MSI_DATA_DELIVERY_FIXED:
3343 MSI_DATA_DELIVERY_LOWPRI) |
3344 MSI_DATA_VECTOR(cfg->vector);
3345 }
497c9a19 3346 return err;
2d3fcc1c
EB
3347}
3348
3b7d1921 3349#ifdef CONFIG_SMP
d5dedd45 3350static int set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask)
2d3fcc1c 3351{
3145e941 3352 struct irq_desc *desc = irq_to_desc(irq);
497c9a19 3353 struct irq_cfg *cfg;
3b7d1921
EB
3354 struct msi_msg msg;
3355 unsigned int dest;
3b7d1921 3356
18374d89 3357 if (set_desc_affinity(desc, mask, &dest))
d5dedd45 3358 return -1;
2d3fcc1c 3359
3145e941 3360 cfg = desc->chip_data;
2d3fcc1c 3361
3145e941 3362 read_msi_msg_desc(desc, &msg);
3b7d1921
EB
3363
3364 msg.data &= ~MSI_DATA_VECTOR_MASK;
497c9a19 3365 msg.data |= MSI_DATA_VECTOR(cfg->vector);
3b7d1921
EB
3366 msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
3367 msg.address_lo |= MSI_ADDR_DEST_ID(dest);
3368
3145e941 3369 write_msi_msg_desc(desc, &msg);
d5dedd45
YL
3370
3371 return 0;
2d3fcc1c 3372}
54168ed7
IM
3373#ifdef CONFIG_INTR_REMAP
3374/*
3375 * Migrate the MSI irq to another cpumask. This migration is
3376 * done in the process context using interrupt-remapping hardware.
3377 */
d5dedd45 3378static int
e7986739 3379ir_set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask)
54168ed7 3380{
3145e941 3381 struct irq_desc *desc = irq_to_desc(irq);
a7883dec 3382 struct irq_cfg *cfg = desc->chip_data;
54168ed7 3383 unsigned int dest;
54168ed7 3384 struct irte irte;
54168ed7
IM
3385
3386 if (get_irte(irq, &irte))
d5dedd45 3387 return -1;
54168ed7 3388
18374d89 3389 if (set_desc_affinity(desc, mask, &dest))
d5dedd45 3390 return -1;
54168ed7 3391
54168ed7
IM
3392 irte.vector = cfg->vector;
3393 irte.dest_id = IRTE_DEST(dest);
3394
3395 /*
3396 * atomically update the IRTE with the new destination and vector.
3397 */
3398 modify_irte(irq, &irte);
3399
3400 /*
3401 * After this point, all the interrupts will start arriving
3402 * at the new destination. So, time to cleanup the previous
3403 * vector allocation.
3404 */
22f65d31
MT
3405 if (cfg->move_in_progress)
3406 send_cleanup_vector(cfg);
d5dedd45
YL
3407
3408 return 0;
54168ed7 3409}
3145e941 3410
54168ed7 3411#endif
3b7d1921 3412#endif /* CONFIG_SMP */
2d3fcc1c 3413
3b7d1921
EB
3414/*
3415 * IRQ Chip for MSI PCI/PCI-X/PCI-Express Devices,
3416 * which implement the MSI or MSI-X Capability Structure.
3417 */
3418static struct irq_chip msi_chip = {
3419 .name = "PCI-MSI",
3420 .unmask = unmask_msi_irq,
3421 .mask = mask_msi_irq,
1d025192 3422 .ack = ack_apic_edge,
3b7d1921
EB
3423#ifdef CONFIG_SMP
3424 .set_affinity = set_msi_irq_affinity,
3425#endif
3426 .retrigger = ioapic_retrigger_irq,
2d3fcc1c
EB
3427};
3428
54168ed7
IM
3429static struct irq_chip msi_ir_chip = {
3430 .name = "IR-PCI-MSI",
3431 .unmask = unmask_msi_irq,
3432 .mask = mask_msi_irq,
a1e38ca5 3433#ifdef CONFIG_INTR_REMAP
d0b03bd1 3434 .ack = ir_ack_apic_edge,
54168ed7
IM
3435#ifdef CONFIG_SMP
3436 .set_affinity = ir_set_msi_irq_affinity,
a1e38ca5 3437#endif
54168ed7
IM
3438#endif
3439 .retrigger = ioapic_retrigger_irq,
3440};
3441
3442/*
3443 * Map the PCI dev to the corresponding remapping hardware unit
3444 * and allocate 'nvec' consecutive interrupt-remapping table entries
3445 * in it.
3446 */
3447static int msi_alloc_irte(struct pci_dev *dev, int irq, int nvec)
3448{
3449 struct intel_iommu *iommu;
3450 int index;
3451
3452 iommu = map_dev_to_ir(dev);
3453 if (!iommu) {
3454 printk(KERN_ERR
3455 "Unable to map PCI %s to iommu\n", pci_name(dev));
3456 return -ENOENT;
3457 }
3458
3459 index = alloc_irte(iommu, irq, nvec);
3460 if (index < 0) {
3461 printk(KERN_ERR
3462 "Unable to allocate %d IRTE for PCI %s\n", nvec,
d6c88a50 3463 pci_name(dev));
54168ed7
IM
3464 return -ENOSPC;
3465 }
3466 return index;
3467}
1d025192 3468
3145e941 3469static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)
1d025192
YL
3470{
3471 int ret;
3472 struct msi_msg msg;
3473
c8bc6f3c 3474 ret = msi_compose_msg(dev, irq, &msg, -1);
1d025192
YL
3475 if (ret < 0)
3476 return ret;
3477
3145e941 3478 set_irq_msi(irq, msidesc);
1d025192
YL
3479 write_msi_msg(irq, &msg);
3480
54168ed7
IM
3481 if (irq_remapped(irq)) {
3482 struct irq_desc *desc = irq_to_desc(irq);
3483 /*
3484 * irq migration in process context
3485 */
3486 desc->status |= IRQ_MOVE_PCNTXT;
3487 set_irq_chip_and_handler_name(irq, &msi_ir_chip, handle_edge_irq, "edge");
3488 } else
54168ed7 3489 set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, "edge");
1d025192 3490
c81bba49
YL
3491 dev_printk(KERN_DEBUG, &dev->dev, "irq %d for MSI/MSI-X\n", irq);
3492
1d025192
YL
3493 return 0;
3494}
3495
047c8fdb
YL
3496int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
3497{
54168ed7
IM
3498 unsigned int irq;
3499 int ret, sub_handle;
0b8f1efa 3500 struct msi_desc *msidesc;
54168ed7 3501 unsigned int irq_want;
1cc18521 3502 struct intel_iommu *iommu = NULL;
54168ed7 3503 int index = 0;
d047f53a 3504 int node;
54168ed7 3505
1c8d7b0a
MW
3506 /* x86 doesn't support multiple MSI yet */
3507 if (type == PCI_CAP_ID_MSI && nvec > 1)
3508 return 1;
3509
d047f53a 3510 node = dev_to_node(&dev->dev);
be5d5350 3511 irq_want = nr_irqs_gsi;
54168ed7 3512 sub_handle = 0;
0b8f1efa 3513 list_for_each_entry(msidesc, &dev->msi_list, list) {
d047f53a 3514 irq = create_irq_nr(irq_want, node);
54168ed7
IM
3515 if (irq == 0)
3516 return -1;
f1ee5548 3517 irq_want = irq + 1;
54168ed7
IM
3518 if (!intr_remapping_enabled)
3519 goto no_ir;
3520
3521 if (!sub_handle) {
3522 /*
3523 * allocate the consecutive block of IRTE's
3524 * for 'nvec'
3525 */
3526 index = msi_alloc_irte(dev, irq, nvec);
3527 if (index < 0) {
3528 ret = index;
3529 goto error;
3530 }
3531 } else {
3532 iommu = map_dev_to_ir(dev);
3533 if (!iommu) {
3534 ret = -ENOENT;
3535 goto error;
3536 }
3537 /*
3538 * setup the mapping between the irq and the IRTE
3539 * base index, the sub_handle pointing to the
3540 * appropriate interrupt remap table entry.
3541 */
3542 set_irte_irq(irq, iommu, index, sub_handle);
3543 }
3544no_ir:
0b8f1efa 3545 ret = setup_msi_irq(dev, msidesc, irq);
54168ed7
IM
3546 if (ret < 0)
3547 goto error;
3548 sub_handle++;
3549 }
3550 return 0;
047c8fdb
YL
3551
3552error:
54168ed7
IM
3553 destroy_irq(irq);
3554 return ret;
047c8fdb
YL
3555}
3556
3b7d1921
EB
3557void arch_teardown_msi_irq(unsigned int irq)
3558{
f7feaca7 3559 destroy_irq(irq);
3b7d1921
EB
3560}
3561
9d783ba0 3562#if defined (CONFIG_DMAR) || defined (CONFIG_INTR_REMAP)
54168ed7 3563#ifdef CONFIG_SMP
d5dedd45 3564static int dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask)
54168ed7 3565{
3145e941 3566 struct irq_desc *desc = irq_to_desc(irq);
54168ed7
IM
3567 struct irq_cfg *cfg;
3568 struct msi_msg msg;
3569 unsigned int dest;
54168ed7 3570
18374d89 3571 if (set_desc_affinity(desc, mask, &dest))
d5dedd45 3572 return -1;
54168ed7 3573
3145e941 3574 cfg = desc->chip_data;
54168ed7
IM
3575
3576 dmar_msi_read(irq, &msg);
3577
3578 msg.data &= ~MSI_DATA_VECTOR_MASK;
3579 msg.data |= MSI_DATA_VECTOR(cfg->vector);
3580 msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
3581 msg.address_lo |= MSI_ADDR_DEST_ID(dest);
3582
3583 dmar_msi_write(irq, &msg);
d5dedd45
YL
3584
3585 return 0;
54168ed7 3586}
3145e941 3587
54168ed7
IM
3588#endif /* CONFIG_SMP */
3589
8f7007aa 3590static struct irq_chip dmar_msi_type = {
54168ed7
IM
3591 .name = "DMAR_MSI",
3592 .unmask = dmar_msi_unmask,
3593 .mask = dmar_msi_mask,
3594 .ack = ack_apic_edge,
3595#ifdef CONFIG_SMP
3596 .set_affinity = dmar_msi_set_affinity,
3597#endif
3598 .retrigger = ioapic_retrigger_irq,
3599};
3600
3601int arch_setup_dmar_msi(unsigned int irq)
3602{
3603 int ret;
3604 struct msi_msg msg;
2d3fcc1c 3605
c8bc6f3c 3606 ret = msi_compose_msg(NULL, irq, &msg, -1);
54168ed7
IM
3607 if (ret < 0)
3608 return ret;
3609 dmar_msi_write(irq, &msg);
3610 set_irq_chip_and_handler_name(irq, &dmar_msi_type, handle_edge_irq,
3611 "edge");
3612 return 0;
3613}
3614#endif
3615
58ac1e76 3616#ifdef CONFIG_HPET_TIMER
3617
3618#ifdef CONFIG_SMP
d5dedd45 3619static int hpet_msi_set_affinity(unsigned int irq, const struct cpumask *mask)
58ac1e76 3620{
3145e941 3621 struct irq_desc *desc = irq_to_desc(irq);
58ac1e76 3622 struct irq_cfg *cfg;
58ac1e76 3623 struct msi_msg msg;
3624 unsigned int dest;
58ac1e76 3625
18374d89 3626 if (set_desc_affinity(desc, mask, &dest))
d5dedd45 3627 return -1;
58ac1e76 3628
3145e941 3629 cfg = desc->chip_data;
58ac1e76 3630
3631 hpet_msi_read(irq, &msg);
3632
3633 msg.data &= ~MSI_DATA_VECTOR_MASK;
3634 msg.data |= MSI_DATA_VECTOR(cfg->vector);
3635 msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
3636 msg.address_lo |= MSI_ADDR_DEST_ID(dest);
3637
3638 hpet_msi_write(irq, &msg);
d5dedd45
YL
3639
3640 return 0;
58ac1e76 3641}
3145e941 3642
58ac1e76 3643#endif /* CONFIG_SMP */
3644
c8bc6f3c
SS
3645static struct irq_chip ir_hpet_msi_type = {
3646 .name = "IR-HPET_MSI",
3647 .unmask = hpet_msi_unmask,
3648 .mask = hpet_msi_mask,
3649#ifdef CONFIG_INTR_REMAP
3650 .ack = ir_ack_apic_edge,
3651#ifdef CONFIG_SMP
3652 .set_affinity = ir_set_msi_irq_affinity,
3653#endif
3654#endif
3655 .retrigger = ioapic_retrigger_irq,
3656};
3657
1cc18521 3658static struct irq_chip hpet_msi_type = {
58ac1e76 3659 .name = "HPET_MSI",
3660 .unmask = hpet_msi_unmask,
3661 .mask = hpet_msi_mask,
3662 .ack = ack_apic_edge,
3663#ifdef CONFIG_SMP
3664 .set_affinity = hpet_msi_set_affinity,
3665#endif
3666 .retrigger = ioapic_retrigger_irq,
3667};
3668
c8bc6f3c 3669int arch_setup_hpet_msi(unsigned int irq, unsigned int id)
58ac1e76 3670{
3671 int ret;
3672 struct msi_msg msg;
6ec3cfec 3673 struct irq_desc *desc = irq_to_desc(irq);
58ac1e76 3674
c8bc6f3c
SS
3675 if (intr_remapping_enabled) {
3676 struct intel_iommu *iommu = map_hpet_to_ir(id);
3677 int index;
3678
3679 if (!iommu)
3680 return -1;
3681
3682 index = alloc_irte(iommu, irq, 1);
3683 if (index < 0)
3684 return -1;
3685 }
3686
3687 ret = msi_compose_msg(NULL, irq, &msg, id);
58ac1e76 3688 if (ret < 0)
3689 return ret;
3690
3691 hpet_msi_write(irq, &msg);
6ec3cfec 3692 desc->status |= IRQ_MOVE_PCNTXT;
c8bc6f3c
SS
3693 if (irq_remapped(irq))
3694 set_irq_chip_and_handler_name(irq, &ir_hpet_msi_type,
3695 handle_edge_irq, "edge");
3696 else
3697 set_irq_chip_and_handler_name(irq, &hpet_msi_type,
3698 handle_edge_irq, "edge");
c81bba49 3699
58ac1e76 3700 return 0;
3701}
3702#endif
3703
54168ed7 3704#endif /* CONFIG_PCI_MSI */
8b955b0d
EB
3705/*
3706 * Hypertransport interrupt support
3707 */
3708#ifdef CONFIG_HT_IRQ
3709
3710#ifdef CONFIG_SMP
3711
497c9a19 3712static void target_ht_irq(unsigned int irq, unsigned int dest, u8 vector)
8b955b0d 3713{
ec68307c
EB
3714 struct ht_irq_msg msg;
3715 fetch_ht_irq_msg(irq, &msg);
8b955b0d 3716
497c9a19 3717 msg.address_lo &= ~(HT_IRQ_LOW_VECTOR_MASK | HT_IRQ_LOW_DEST_ID_MASK);
ec68307c 3718 msg.address_hi &= ~(HT_IRQ_HIGH_DEST_ID_MASK);
8b955b0d 3719
497c9a19 3720 msg.address_lo |= HT_IRQ_LOW_VECTOR(vector) | HT_IRQ_LOW_DEST_ID(dest);
ec68307c 3721 msg.address_hi |= HT_IRQ_HIGH_DEST_ID(dest);
8b955b0d 3722
ec68307c 3723 write_ht_irq_msg(irq, &msg);
8b955b0d
EB
3724}
3725
d5dedd45 3726static int set_ht_irq_affinity(unsigned int irq, const struct cpumask *mask)
8b955b0d 3727{
3145e941 3728 struct irq_desc *desc = irq_to_desc(irq);
497c9a19 3729 struct irq_cfg *cfg;
8b955b0d 3730 unsigned int dest;
8b955b0d 3731
18374d89 3732 if (set_desc_affinity(desc, mask, &dest))
d5dedd45 3733 return -1;
8b955b0d 3734
3145e941 3735 cfg = desc->chip_data;
8b955b0d 3736
497c9a19 3737 target_ht_irq(irq, dest, cfg->vector);
d5dedd45
YL
3738
3739 return 0;
8b955b0d 3740}
3145e941 3741
8b955b0d
EB
3742#endif
3743
c37e108d 3744static struct irq_chip ht_irq_chip = {
8b955b0d
EB
3745 .name = "PCI-HT",
3746 .mask = mask_ht_irq,
3747 .unmask = unmask_ht_irq,
1d025192 3748 .ack = ack_apic_edge,
8b955b0d
EB
3749#ifdef CONFIG_SMP
3750 .set_affinity = set_ht_irq_affinity,
3751#endif
3752 .retrigger = ioapic_retrigger_irq,
3753};
3754
3755int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
3756{
497c9a19
YL
3757 struct irq_cfg *cfg;
3758 int err;
8b955b0d 3759
f1182638
JB
3760 if (disable_apic)
3761 return -ENXIO;
3762
3145e941 3763 cfg = irq_cfg(irq);
fe402e1f 3764 err = assign_irq_vector(irq, cfg, apic->target_cpus());
54168ed7 3765 if (!err) {
ec68307c 3766 struct ht_irq_msg msg;
8b955b0d 3767 unsigned dest;
8b955b0d 3768
debccb3e
IM
3769 dest = apic->cpu_mask_to_apicid_and(cfg->domain,
3770 apic->target_cpus());
8b955b0d 3771
ec68307c 3772 msg.address_hi = HT_IRQ_HIGH_DEST_ID(dest);
8b955b0d 3773
ec68307c
EB
3774 msg.address_lo =
3775 HT_IRQ_LOW_BASE |
8b955b0d 3776 HT_IRQ_LOW_DEST_ID(dest) |
497c9a19 3777 HT_IRQ_LOW_VECTOR(cfg->vector) |
9b5bc8dc 3778 ((apic->irq_dest_mode == 0) ?
8b955b0d
EB
3779 HT_IRQ_LOW_DM_PHYSICAL :
3780 HT_IRQ_LOW_DM_LOGICAL) |
3781 HT_IRQ_LOW_RQEOI_EDGE |
9b5bc8dc 3782 ((apic->irq_delivery_mode != dest_LowestPrio) ?
8b955b0d
EB
3783 HT_IRQ_LOW_MT_FIXED :
3784 HT_IRQ_LOW_MT_ARBITRATED) |
3785 HT_IRQ_LOW_IRQ_MASKED;
3786
ec68307c 3787 write_ht_irq_msg(irq, &msg);
8b955b0d 3788
a460e745
IM
3789 set_irq_chip_and_handler_name(irq, &ht_irq_chip,
3790 handle_edge_irq, "edge");
c81bba49
YL
3791
3792 dev_printk(KERN_DEBUG, &dev->dev, "irq %d for HT\n", irq);
8b955b0d 3793 }
497c9a19 3794 return err;
8b955b0d
EB
3795}
3796#endif /* CONFIG_HT_IRQ */
3797
9d6a4d08
YL
3798int __init io_apic_get_redir_entries (int ioapic)
3799{
3800 union IO_APIC_reg_01 reg_01;
3801 unsigned long flags;
3802
3803 spin_lock_irqsave(&ioapic_lock, flags);
3804 reg_01.raw = io_apic_read(ioapic, 1);
3805 spin_unlock_irqrestore(&ioapic_lock, flags);
3806
3807 return reg_01.bits.entries;
3808}
3809
be5d5350 3810void __init probe_nr_irqs_gsi(void)
9d6a4d08 3811{
be5d5350
YL
3812 int nr = 0;
3813
cc6c5006
YL
3814 nr = acpi_probe_gsi();
3815 if (nr > nr_irqs_gsi) {
be5d5350 3816 nr_irqs_gsi = nr;
cc6c5006
YL
3817 } else {
3818 /* for acpi=off or acpi is not compiled in */
3819 int idx;
3820
3821 nr = 0;
3822 for (idx = 0; idx < nr_ioapics; idx++)
3823 nr += io_apic_get_redir_entries(idx) + 1;
3824
3825 if (nr > nr_irqs_gsi)
3826 nr_irqs_gsi = nr;
3827 }
3828
3829 printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi);
9d6a4d08
YL
3830}
3831
4a046d17
YL
3832#ifdef CONFIG_SPARSE_IRQ
3833int __init arch_probe_nr_irqs(void)
3834{
3835 int nr;
3836
f1ee5548
YL
3837 if (nr_irqs > (NR_VECTORS * nr_cpu_ids))
3838 nr_irqs = NR_VECTORS * nr_cpu_ids;
4a046d17 3839
f1ee5548
YL
3840 nr = nr_irqs_gsi + 8 * nr_cpu_ids;
3841#if defined(CONFIG_PCI_MSI) || defined(CONFIG_HT_IRQ)
3842 /*
3843 * for MSI and HT dyn irq
3844 */
9959c888 3845 nr += nr_irqs_gsi * 64;
f1ee5548
YL
3846#endif
3847 if (nr < nr_irqs)
4a046d17
YL
3848 nr_irqs = nr;
3849
3850 return 0;
3851}
3852#endif
3853
e5198075
YL
3854static int __io_apic_set_pci_routing(struct device *dev, int irq,
3855 struct io_apic_irq_attr *irq_attr)
5ef21837
YL
3856{
3857 struct irq_desc *desc;
3858 struct irq_cfg *cfg;
3859 int node;
e5198075
YL
3860 int ioapic, pin;
3861 int trigger, polarity;
5ef21837 3862
e5198075 3863 ioapic = irq_attr->ioapic;
5ef21837
YL
3864 if (!IO_APIC_IRQ(irq)) {
3865 apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
3866 ioapic);
3867 return -EINVAL;
3868 }
3869
3870 if (dev)
3871 node = dev_to_node(dev);
3872 else
3873 node = cpu_to_node(boot_cpu_id);
3874
3875 desc = irq_to_desc_alloc_node(irq, node);
3876 if (!desc) {
3877 printk(KERN_INFO "can not get irq_desc %d\n", irq);
3878 return 0;
3879 }
3880
e5198075
YL
3881 pin = irq_attr->ioapic_pin;
3882 trigger = irq_attr->trigger;
3883 polarity = irq_attr->polarity;
3884
5ef21837
YL
3885 /*
3886 * IRQs < 16 are already in the irq_2_pin[] map
3887 */
bc07844a 3888 if (irq >= nr_legacy_irqs) {
5ef21837 3889 cfg = desc->chip_data;
f3d1915a
CG
3890 if (add_pin_to_irq_node_nopanic(cfg, node, ioapic, pin)) {
3891 printk(KERN_INFO "can not add pin %d for irq %d\n",
3892 pin, irq);
3893 return 0;
3894 }
5ef21837
YL
3895 }
3896
e5198075 3897 setup_IO_APIC_irq(ioapic, pin, irq, desc, trigger, polarity);
5ef21837
YL
3898
3899 return 0;
3900}
3901
e5198075
YL
3902int io_apic_set_pci_routing(struct device *dev, int irq,
3903 struct io_apic_irq_attr *irq_attr)
5ef21837 3904{
e5198075 3905 int ioapic, pin;
5ef21837
YL
3906 /*
3907 * Avoid pin reprogramming. PRTs typically include entries
3908 * with redundant pin->gsi mappings (but unique PCI devices);
3909 * we only program the IOAPIC on the first.
3910 */
e5198075
YL
3911 ioapic = irq_attr->ioapic;
3912 pin = irq_attr->ioapic_pin;
5ef21837
YL
3913 if (test_bit(pin, mp_ioapic_routing[ioapic].pin_programmed)) {
3914 pr_debug("Pin %d-%d already programmed\n",
3915 mp_ioapics[ioapic].apicid, pin);
3916 return 0;
3917 }
3918 set_bit(pin, mp_ioapic_routing[ioapic].pin_programmed);
3919
e5198075 3920 return __io_apic_set_pci_routing(dev, irq, irq_attr);
5ef21837
YL
3921}
3922
2a4ab640
FT
3923u8 __init io_apic_unique_id(u8 id)
3924{
3925#ifdef CONFIG_X86_32
3926 if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
3927 !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
3928 return io_apic_get_unique_id(nr_ioapics, id);
3929 else
3930 return id;
3931#else
3932 int i;
3933 DECLARE_BITMAP(used, 256);
1da177e4 3934
2a4ab640
FT
3935 bitmap_zero(used, 256);
3936 for (i = 0; i < nr_ioapics; i++) {
3937 struct mpc_ioapic *ia = &mp_ioapics[i];
3938 __set_bit(ia->apicid, used);
3939 }
3940 if (!test_bit(id, used))
3941 return id;
3942 return find_first_zero_bit(used, 256);
3943#endif
3944}
1da177e4 3945
54168ed7 3946#ifdef CONFIG_X86_32
36062448 3947int __init io_apic_get_unique_id(int ioapic, int apic_id)
1da177e4
LT
3948{
3949 union IO_APIC_reg_00 reg_00;
3950 static physid_mask_t apic_id_map = PHYSID_MASK_NONE;
3951 physid_mask_t tmp;
3952 unsigned long flags;
3953 int i = 0;
3954
3955 /*
36062448
PC
3956 * The P4 platform supports up to 256 APIC IDs on two separate APIC
3957 * buses (one for LAPICs, one for IOAPICs), where predecessors only
1da177e4 3958 * supports up to 16 on one shared APIC bus.
36062448 3959 *
1da177e4
LT
3960 * TBD: Expand LAPIC/IOAPIC support on P4-class systems to take full
3961 * advantage of new APIC bus architecture.
3962 */
3963
3964 if (physids_empty(apic_id_map))
7abc0753 3965 apic->ioapic_phys_id_map(&phys_cpu_present_map, &apic_id_map);
1da177e4
LT
3966
3967 spin_lock_irqsave(&ioapic_lock, flags);
3968 reg_00.raw = io_apic_read(ioapic, 0);
3969 spin_unlock_irqrestore(&ioapic_lock, flags);
3970
3971 if (apic_id >= get_physical_broadcast()) {
3972 printk(KERN_WARNING "IOAPIC[%d]: Invalid apic_id %d, trying "
3973 "%d\n", ioapic, apic_id, reg_00.bits.ID);
3974 apic_id = reg_00.bits.ID;
3975 }
3976
3977 /*
36062448 3978 * Every APIC in a system must have a unique ID or we get lots of nice
1da177e4
LT
3979 * 'stuck on smp_invalidate_needed IPI wait' messages.
3980 */
7abc0753 3981 if (apic->check_apicid_used(&apic_id_map, apic_id)) {
1da177e4
LT
3982
3983 for (i = 0; i < get_physical_broadcast(); i++) {
7abc0753 3984 if (!apic->check_apicid_used(&apic_id_map, i))
1da177e4
LT
3985 break;
3986 }
3987
3988 if (i == get_physical_broadcast())
3989 panic("Max apic_id exceeded!\n");
3990
3991 printk(KERN_WARNING "IOAPIC[%d]: apic_id %d already used, "
3992 "trying %d\n", ioapic, apic_id, i);
3993
3994 apic_id = i;
36062448 3995 }
1da177e4 3996
7abc0753 3997 apic->apicid_to_cpu_present(apic_id, &tmp);
1da177e4
LT
3998 physids_or(apic_id_map, apic_id_map, tmp);
3999
4000 if (reg_00.bits.ID != apic_id) {
4001 reg_00.bits.ID = apic_id;
4002
4003 spin_lock_irqsave(&ioapic_lock, flags);
4004 io_apic_write(ioapic, 0, reg_00.raw);
4005 reg_00.raw = io_apic_read(ioapic, 0);
4006 spin_unlock_irqrestore(&ioapic_lock, flags);
4007
4008 /* Sanity check */
6070f9ec
AD
4009 if (reg_00.bits.ID != apic_id) {
4010 printk("IOAPIC[%d]: Unable to change apic_id!\n", ioapic);
4011 return -1;
4012 }
1da177e4
LT
4013 }
4014
4015 apic_printk(APIC_VERBOSE, KERN_INFO
4016 "IOAPIC[%d]: Assigned apic_id %d\n", ioapic, apic_id);
4017
4018 return apic_id;
4019}
58f892e0 4020#endif
1da177e4 4021
36062448 4022int __init io_apic_get_version(int ioapic)
1da177e4
LT
4023{
4024 union IO_APIC_reg_01 reg_01;
4025 unsigned long flags;
4026
4027 spin_lock_irqsave(&ioapic_lock, flags);
4028 reg_01.raw = io_apic_read(ioapic, 1);
4029 spin_unlock_irqrestore(&ioapic_lock, flags);
4030
4031 return reg_01.bits.version;
4032}
4033
61fd47e0
SL
4034int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity)
4035{
4036 int i;
4037
4038 if (skip_ioapic_setup)
4039 return -1;
4040
4041 for (i = 0; i < mp_irq_entries; i++)
c2c21745
JSR
4042 if (mp_irqs[i].irqtype == mp_INT &&
4043 mp_irqs[i].srcbusirq == bus_irq)
61fd47e0
SL
4044 break;
4045 if (i >= mp_irq_entries)
4046 return -1;
4047
4048 *trigger = irq_trigger(i);
4049 *polarity = irq_polarity(i);
4050 return 0;
4051}
4052
497c9a19
YL
4053/*
4054 * This function currently is only a helper for the i386 smp boot process where
4055 * we need to reprogram the ioredtbls to cater for the cpus which have come online
fe402e1f 4056 * so mask in all cases should simply be apic->target_cpus()
497c9a19
YL
4057 */
4058#ifdef CONFIG_SMP
4059void __init setup_ioapic_dest(void)
4060{
b9c61b70 4061 int pin, ioapic = 0, irq, irq_entry;
6c2e9403 4062 struct irq_desc *desc;
22f65d31 4063 const struct cpumask *mask;
497c9a19
YL
4064
4065 if (skip_ioapic_setup == 1)
4066 return;
4067
b9c61b70
YL
4068#ifdef CONFIG_ACPI
4069 if (!acpi_disabled && acpi_ioapic) {
4070 ioapic = mp_find_ioapic(0);
4071 if (ioapic < 0)
4072 ioapic = 0;
4073 }
4074#endif
6c2e9403 4075
b9c61b70
YL
4076 for (pin = 0; pin < nr_ioapic_registers[ioapic]; pin++) {
4077 irq_entry = find_irq_entry(ioapic, pin, mp_INT);
4078 if (irq_entry == -1)
4079 continue;
4080 irq = pin_2_irq(irq_entry, ioapic, pin);
6c2e9403 4081
b9c61b70 4082 desc = irq_to_desc(irq);
6c2e9403 4083
b9c61b70
YL
4084 /*
4085 * Honour affinities which have been set in early boot
4086 */
4087 if (desc->status &
4088 (IRQ_NO_BALANCING | IRQ_AFFINITY_SET))
4089 mask = desc->affinity;
4090 else
4091 mask = apic->target_cpus();
497c9a19 4092
b9c61b70
YL
4093 if (intr_remapping_enabled)
4094 set_ir_ioapic_affinity_irq_desc(desc, mask);
4095 else
4096 set_ioapic_affinity_irq_desc(desc, mask);
497c9a19 4097 }
b9c61b70 4098
497c9a19
YL
4099}
4100#endif
4101
54168ed7
IM
4102#define IOAPIC_RESOURCE_NAME_SIZE 11
4103
4104static struct resource *ioapic_resources;
4105
ffc43836 4106static struct resource * __init ioapic_setup_resources(int nr_ioapics)
54168ed7
IM
4107{
4108 unsigned long n;
4109 struct resource *res;
4110 char *mem;
4111 int i;
4112
4113 if (nr_ioapics <= 0)
4114 return NULL;
4115
4116 n = IOAPIC_RESOURCE_NAME_SIZE + sizeof(struct resource);
4117 n *= nr_ioapics;
4118
4119 mem = alloc_bootmem(n);
4120 res = (void *)mem;
4121
ffc43836 4122 mem += sizeof(struct resource) * nr_ioapics;
54168ed7 4123
ffc43836
CG
4124 for (i = 0; i < nr_ioapics; i++) {
4125 res[i].name = mem;
4126 res[i].flags = IORESOURCE_MEM | IORESOURCE_BUSY;
4343fe10 4127 snprintf(mem, IOAPIC_RESOURCE_NAME_SIZE, "IOAPIC %u", i);
ffc43836 4128 mem += IOAPIC_RESOURCE_NAME_SIZE;
54168ed7
IM
4129 }
4130
4131 ioapic_resources = res;
4132
4133 return res;
4134}
54168ed7 4135
f3294a33
YL
4136void __init ioapic_init_mappings(void)
4137{
4138 unsigned long ioapic_phys, idx = FIX_IO_APIC_BASE_0;
54168ed7 4139 struct resource *ioapic_res;
d6c88a50 4140 int i;
f3294a33 4141
ffc43836 4142 ioapic_res = ioapic_setup_resources(nr_ioapics);
f3294a33
YL
4143 for (i = 0; i < nr_ioapics; i++) {
4144 if (smp_found_config) {
b5ba7e6d 4145 ioapic_phys = mp_ioapics[i].apicaddr;
54168ed7 4146#ifdef CONFIG_X86_32
d6c88a50
TG
4147 if (!ioapic_phys) {
4148 printk(KERN_ERR
4149 "WARNING: bogus zero IO-APIC "
4150 "address found in MPTABLE, "
4151 "disabling IO/APIC support!\n");
4152 smp_found_config = 0;
4153 skip_ioapic_setup = 1;
4154 goto fake_ioapic_page;
4155 }
54168ed7 4156#endif
f3294a33 4157 } else {
54168ed7 4158#ifdef CONFIG_X86_32
f3294a33 4159fake_ioapic_page:
54168ed7 4160#endif
e79c65a9 4161 ioapic_phys = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
f3294a33
YL
4162 ioapic_phys = __pa(ioapic_phys);
4163 }
4164 set_fixmap_nocache(idx, ioapic_phys);
e79c65a9
CG
4165 apic_printk(APIC_VERBOSE, "mapped IOAPIC to %08lx (%08lx)\n",
4166 __fix_to_virt(idx) + (ioapic_phys & ~PAGE_MASK),
4167 ioapic_phys);
f3294a33 4168 idx++;
54168ed7 4169
ffc43836 4170 ioapic_res->start = ioapic_phys;
e79c65a9 4171 ioapic_res->end = ioapic_phys + IO_APIC_SLOT_SIZE - 1;
ffc43836 4172 ioapic_res++;
f3294a33
YL
4173 }
4174}
4175
857fdc53 4176void __init ioapic_insert_resources(void)
54168ed7
IM
4177{
4178 int i;
4179 struct resource *r = ioapic_resources;
4180
4181 if (!r) {
857fdc53 4182 if (nr_ioapics > 0)
04c93ce4
BZ
4183 printk(KERN_ERR
4184 "IO APIC resources couldn't be allocated.\n");
857fdc53 4185 return;
54168ed7
IM
4186 }
4187
4188 for (i = 0; i < nr_ioapics; i++) {
4189 insert_resource(&iomem_resource, r);
4190 r++;
4191 }
54168ed7 4192}
2a4ab640
FT
4193
4194int mp_find_ioapic(int gsi)
4195{
4196 int i = 0;
4197
4198 /* Find the IOAPIC that manages this GSI. */
4199 for (i = 0; i < nr_ioapics; i++) {
4200 if ((gsi >= mp_gsi_routing[i].gsi_base)
4201 && (gsi <= mp_gsi_routing[i].gsi_end))
4202 return i;
4203 }
54168ed7 4204
2a4ab640
FT
4205 printk(KERN_ERR "ERROR: Unable to locate IOAPIC for GSI %d\n", gsi);
4206 return -1;
4207}
4208
4209int mp_find_ioapic_pin(int ioapic, int gsi)
4210{
4211 if (WARN_ON(ioapic == -1))
4212 return -1;
4213 if (WARN_ON(gsi > mp_gsi_routing[ioapic].gsi_end))
4214 return -1;
4215
4216 return gsi - mp_gsi_routing[ioapic].gsi_base;
4217}
4218
4219static int bad_ioapic(unsigned long address)
4220{
4221 if (nr_ioapics >= MAX_IO_APICS) {
4222 printk(KERN_WARNING "WARING: Max # of I/O APICs (%d) exceeded "
4223 "(found %d), skipping\n", MAX_IO_APICS, nr_ioapics);
4224 return 1;
4225 }
4226 if (!address) {
4227 printk(KERN_WARNING "WARNING: Bogus (zero) I/O APIC address"
4228 " found in table, skipping!\n");
4229 return 1;
4230 }
54168ed7
IM
4231 return 0;
4232}
4233
2a4ab640
FT
4234void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
4235{
4236 int idx = 0;
4237
4238 if (bad_ioapic(address))
4239 return;
4240
4241 idx = nr_ioapics;
4242
4243 mp_ioapics[idx].type = MP_IOAPIC;
4244 mp_ioapics[idx].flags = MPC_APIC_USABLE;
4245 mp_ioapics[idx].apicaddr = address;
4246
4247 set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
4248 mp_ioapics[idx].apicid = io_apic_unique_id(id);
4249 mp_ioapics[idx].apicver = io_apic_get_version(idx);
4250
4251 /*
4252 * Build basic GSI lookup table to facilitate gsi->io_apic lookups
4253 * and to prevent reprogramming of IOAPIC pins (PCI GSIs).
4254 */
4255 mp_gsi_routing[idx].gsi_base = gsi_base;
4256 mp_gsi_routing[idx].gsi_end = gsi_base +
4257 io_apic_get_redir_entries(idx);
4258
4259 printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, "
4260 "GSI %d-%d\n", idx, mp_ioapics[idx].apicid,
4261 mp_ioapics[idx].apicver, mp_ioapics[idx].apicaddr,
4262 mp_gsi_routing[idx].gsi_base, mp_gsi_routing[idx].gsi_end);
4263
4264 nr_ioapics++;
4265}