1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/mm.h>
24#include <linux/interrupt.h>
25#include <linux/init.h>
26#include <linux/delay.h>
27#include <linux/sched.h>
28#include <linux/pci.h>
29#include <linux/mc146818rtc.h>
30#include <linux/compiler.h>
31#include <linux/acpi.h>
32#include <linux/module.h>
33#include <linux/syscore_ops.h>
34#include <linux/msi.h>
35#include <linux/htirq.h>
36#include <linux/freezer.h>
37#include <linux/kthread.h>
38#include <linux/jiffies.h>
39#include <linux/slab.h>
40#ifdef CONFIG_ACPI
41#include <acpi/acpi_bus.h>
42#endif
43#include <linux/bootmem.h>
44#include <linux/dmar.h>
45#include <linux/hpet.h>
46
47#include <asm/idle.h>
48#include <asm/io.h>
49#include <asm/smp.h>
50#include <asm/cpu.h>
51#include <asm/desc.h>
52#include <asm/proto.h>
53#include <asm/acpi.h>
54#include <asm/dma.h>
55#include <asm/timer.h>
56#include <asm/i8259.h>
57#include <asm/msidef.h>
58#include <asm/hypertransport.h>
59#include <asm/setup.h>
60#include <asm/irq_remapping.h>
61#include <asm/hpet.h>
62#include <asm/hw_irq.h>
63
64#include <asm/apic.h>
65
66#define __apicdebuginit(type) static type __init
67#define for_each_irq_pin(entry, head) \
68 for (entry = head; entry; entry = entry->next)
69
70
71
72
73
74int sis_apic_bug = -1;
75
76static DEFINE_RAW_SPINLOCK(ioapic_lock);
77static DEFINE_RAW_SPINLOCK(vector_lock);
78
79static struct ioapic {
80
81
82
83 int nr_registers;
84
85
86
87 struct IO_APIC_route_entry *saved_registers;
88
89 struct mpc_ioapic mp_config;
90
91 struct mp_ioapic_gsi gsi_config;
92 DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1);
93} ioapics[MAX_IO_APICS];
94
95#define mpc_ioapic_ver(ioapic_idx) ioapics[ioapic_idx].mp_config.apicver
96
97int mpc_ioapic_id(int ioapic_idx)
98{
99 return ioapics[ioapic_idx].mp_config.apicid;
100}
101
102unsigned int mpc_ioapic_addr(int ioapic_idx)
103{
104 return ioapics[ioapic_idx].mp_config.apicaddr;
105}
106
107struct mp_ioapic_gsi *mp_ioapic_gsi_routing(int ioapic_idx)
108{
109 return &ioapics[ioapic_idx].gsi_config;
110}
111
112int nr_ioapics;
113
114
115u32 gsi_top;
116
117
118struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES];
119
120
121int mp_irq_entries;
122
123
124static int nr_irqs_gsi = NR_IRQS_LEGACY;
125
126#if defined (CONFIG_MCA) || defined (CONFIG_EISA)
127int mp_bus_id_to_type[MAX_MP_BUSSES];
128#endif
129
130DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
131
132int skip_ioapic_setup;
133
134
135
136
137void disable_ioapic_support(void)
138{
139#ifdef CONFIG_PCI
140 noioapicquirk = 1;
141 noioapicreroute = -1;
142#endif
143 skip_ioapic_setup = 1;
144}
145
146static int __init parse_noapic(char *str)
147{
148
149 disable_ioapic_support();
150 return 0;
151}
152early_param("noapic", parse_noapic);
153
154static int io_apic_setup_irq_pin(unsigned int irq, int node,
155 struct io_apic_irq_attr *attr);
156
157
158void mp_save_irq(struct mpc_intsrc *m)
159{
160 int i;
161
162 apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
163 " IRQ %02x, APIC ID %x, APIC INT %02x\n",
164 m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,
165 m->srcbusirq, m->dstapic, m->dstirq);
166
167 for (i = 0; i < mp_irq_entries; i++) {
168 if (!memcmp(&mp_irqs[i], m, sizeof(*m)))
169 return;
170 }
171
172 memcpy(&mp_irqs[mp_irq_entries], m, sizeof(*m));
173 if (++mp_irq_entries == MAX_IRQ_SOURCES)
174 panic("Max # of irq sources exceeded!!\n");
175}
176
177struct irq_pin_list {
178 int apic, pin;
179 struct irq_pin_list *next;
180};
181
182static struct irq_pin_list *alloc_irq_pin_list(int node)
183{
184 return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node);
185}
186
187
188
189static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY];
190
191int __init arch_early_irq_init(void)
192{
193 struct irq_cfg *cfg;
194 int count, node, i;
195
196 if (!legacy_pic->nr_legacy_irqs)
197 io_apic_irqs = ~0UL;
198
199 for (i = 0; i < nr_ioapics; i++) {
200 ioapics[i].saved_registers =
201 kzalloc(sizeof(struct IO_APIC_route_entry) *
202 ioapics[i].nr_registers, GFP_KERNEL);
203 if (!ioapics[i].saved_registers)
204 pr_err("IOAPIC %d: suspend/resume impossible!\n", i);
205 }
206
207 cfg = irq_cfgx;
208 count = ARRAY_SIZE(irq_cfgx);
209 node = cpu_to_node(0);
210
211
212 irq_reserve_irqs(0, legacy_pic->nr_legacy_irqs);
213
214 for (i = 0; i < count; i++) {
215 irq_set_chip_data(i, &cfg[i]);
216 zalloc_cpumask_var_node(&cfg[i].domain, GFP_KERNEL, node);
217 zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_KERNEL, node);
218
219
220
221
222 if (i < legacy_pic->nr_legacy_irqs) {
223 cfg[i].vector = IRQ0_VECTOR + i;
224 cpumask_set_cpu(0, cfg[i].domain);
225 }
226 }
227
228 return 0;
229}
230
231static struct irq_cfg *irq_cfg(unsigned int irq)
232{
233 return irq_get_chip_data(irq);
234}
235
236static struct irq_cfg *alloc_irq_cfg(unsigned int irq, int node)
237{
238 struct irq_cfg *cfg;
239
240 cfg = kzalloc_node(sizeof(*cfg), GFP_KERNEL, node);
241 if (!cfg)
242 return NULL;
243 if (!zalloc_cpumask_var_node(&cfg->domain, GFP_KERNEL, node))
244 goto out_cfg;
245 if (!zalloc_cpumask_var_node(&cfg->old_domain, GFP_KERNEL, node))
246 goto out_domain;
247 return cfg;
248out_domain:
249 free_cpumask_var(cfg->domain);
250out_cfg:
251 kfree(cfg);
252 return NULL;
253}
254
255static void free_irq_cfg(unsigned int at, struct irq_cfg *cfg)
256{
257 if (!cfg)
258 return;
259 irq_set_chip_data(at, NULL);
260 free_cpumask_var(cfg->domain);
261 free_cpumask_var(cfg->old_domain);
262 kfree(cfg);
263}
264
265static struct irq_cfg *alloc_irq_and_cfg_at(unsigned int at, int node)
266{
267 int res = irq_alloc_desc_at(at, node);
268 struct irq_cfg *cfg;
269
270 if (res < 0) {
271 if (res != -EEXIST)
272 return NULL;
273 cfg = irq_get_chip_data(at);
274 if (cfg)
275 return cfg;
276 }
277
278 cfg = alloc_irq_cfg(at, node);
279 if (cfg)
280 irq_set_chip_data(at, cfg);
281 else
282 irq_free_desc(at);
283 return cfg;
284}
285
286static int alloc_irq_from(unsigned int from, int node)
287{
288 return irq_alloc_desc_from(from, node);
289}
290
291static void free_irq_at(unsigned int at, struct irq_cfg *cfg)
292{
293 free_irq_cfg(at, cfg);
294 irq_free_desc(at);
295}
296
297struct io_apic {
298 unsigned int index;
299 unsigned int unused[3];
300 unsigned int data;
301 unsigned int unused2[11];
302 unsigned int eoi;
303};
304
305static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx)
306{
307 return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx)
308 + (mpc_ioapic_addr(idx) & ~PAGE_MASK);
309}
310
311static inline void io_apic_eoi(unsigned int apic, unsigned int vector)
312{
313 struct io_apic __iomem *io_apic = io_apic_base(apic);
314 writel(vector, &io_apic->eoi);
315}
316
317static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg)
318{
319 struct io_apic __iomem *io_apic = io_apic_base(apic);
320 writel(reg, &io_apic->index);
321 return readl(&io_apic->data);
322}
323
324static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value)
325{
326 struct io_apic __iomem *io_apic = io_apic_base(apic);
327 writel(reg, &io_apic->index);
328 writel(value, &io_apic->data);
329}
330
331
332
333
334
335
336
337static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned int value)
338{
339 struct io_apic __iomem *io_apic = io_apic_base(apic);
340
341 if (sis_apic_bug)
342 writel(reg, &io_apic->index);
343 writel(value, &io_apic->data);
344}
345
346static bool io_apic_level_ack_pending(struct irq_cfg *cfg)
347{
348 struct irq_pin_list *entry;
349 unsigned long flags;
350
351 raw_spin_lock_irqsave(&ioapic_lock, flags);
352 for_each_irq_pin(entry, cfg->irq_2_pin) {
353 unsigned int reg;
354 int pin;
355
356 pin = entry->pin;
357 reg = io_apic_read(entry->apic, 0x10 + pin*2);
358
359 if (reg & IO_APIC_REDIR_REMOTE_IRR) {
360 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
361 return true;
362 }
363 }
364 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
365
366 return false;
367}
368
369union entry_union {
370 struct { u32 w1, w2; };
371 struct IO_APIC_route_entry entry;
372};
373
374static struct IO_APIC_route_entry __ioapic_read_entry(int apic, int pin)
375{
376 union entry_union eu;
377
378 eu.w1 = io_apic_read(apic, 0x10 + 2 * pin);
379 eu.w2 = io_apic_read(apic, 0x11 + 2 * pin);
380 return eu.entry;
381}
382
383static struct IO_APIC_route_entry ioapic_read_entry(int apic, int pin)
384{
385 union entry_union eu;
386 unsigned long flags;
387 raw_spin_lock_irqsave(&ioapic_lock, flags);
388 eu.entry = __ioapic_read_entry(apic, pin);
389 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
390 return eu.entry;
391}
392
393
394
395
396
397
398
399static void
400__ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e)
401{
402 union entry_union eu = {{0, 0}};
403
404 eu.entry = e;
405 io_apic_write(apic, 0x11 + 2*pin, eu.w2);
406 io_apic_write(apic, 0x10 + 2*pin, eu.w1);
407}
408
409static void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e)
410{
411 unsigned long flags;
412 raw_spin_lock_irqsave(&ioapic_lock, flags);
413 __ioapic_write_entry(apic, pin, e);
414 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
415}
416
417
418
419
420
421
422static void ioapic_mask_entry(int apic, int pin)
423{
424 unsigned long flags;
425 union entry_union eu = { .entry.mask = 1 };
426
427 raw_spin_lock_irqsave(&ioapic_lock, flags);
428 io_apic_write(apic, 0x10 + 2*pin, eu.w1);
429 io_apic_write(apic, 0x11 + 2*pin, eu.w2);
430 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
431}
432
433
434
435
436
437
438static int
439__add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin)
440{
441 struct irq_pin_list **last, *entry;
442
443
444 last = &cfg->irq_2_pin;
445 for_each_irq_pin(entry, cfg->irq_2_pin) {
446 if (entry->apic == apic && entry->pin == pin)
447 return 0;
448 last = &entry->next;
449 }
450
451 entry = alloc_irq_pin_list(node);
452 if (!entry) {
453 printk(KERN_ERR "can not alloc irq_pin_list (%d,%d,%d)\n",
454 node, apic, pin);
455 return -ENOMEM;
456 }
457 entry->apic = apic;
458 entry->pin = pin;
459
460 *last = entry;
461 return 0;
462}
463
464static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin)
465{
466 if (__add_pin_to_irq_node(cfg, node, apic, pin))
467 panic("IO-APIC: failed to add irq-pin. Can not proceed\n");
468}
469
470
471
472
473static void __init replace_pin_at_irq_node(struct irq_cfg *cfg, int node,
474 int oldapic, int oldpin,
475 int newapic, int newpin)
476{
477 struct irq_pin_list *entry;
478
479 for_each_irq_pin(entry, cfg->irq_2_pin) {
480 if (entry->apic == oldapic && entry->pin == oldpin) {
481 entry->apic = newapic;
482 entry->pin = newpin;
483
484 return;
485 }
486 }
487
488
489 add_pin_to_irq_node(cfg, node, newapic, newpin);
490}
491
492static void __io_apic_modify_irq(struct irq_pin_list *entry,
493 int mask_and, int mask_or,
494 void (*final)(struct irq_pin_list *entry))
495{
496 unsigned int reg, pin;
497
498 pin = entry->pin;
499 reg = io_apic_read(entry->apic, 0x10 + pin * 2);
500 reg &= mask_and;
501 reg |= mask_or;
502 io_apic_modify(entry->apic, 0x10 + pin * 2, reg);
503 if (final)
504 final(entry);
505}
506
507static void io_apic_modify_irq(struct irq_cfg *cfg,
508 int mask_and, int mask_or,
509 void (*final)(struct irq_pin_list *entry))
510{
511 struct irq_pin_list *entry;
512
513 for_each_irq_pin(entry, cfg->irq_2_pin)
514 __io_apic_modify_irq(entry, mask_and, mask_or, final);
515}
516
517static void io_apic_sync(struct irq_pin_list *entry)
518{
519
520
521
522
523 struct io_apic __iomem *io_apic;
524 io_apic = io_apic_base(entry->apic);
525 readl(&io_apic->data);
526}
527
528static void mask_ioapic(struct irq_cfg *cfg)
529{
530 unsigned long flags;
531
532 raw_spin_lock_irqsave(&ioapic_lock, flags);
533 io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
534 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
535}
536
537static void mask_ioapic_irq(struct irq_data *data)
538{
539 mask_ioapic(data->chip_data);
540}
541
542static void __unmask_ioapic(struct irq_cfg *cfg)
543{
544 io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED, 0, NULL);
545}
546
547static void unmask_ioapic(struct irq_cfg *cfg)
548{
549 unsigned long flags;
550
551 raw_spin_lock_irqsave(&ioapic_lock, flags);
552 __unmask_ioapic(cfg);
553 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
554}
555
556static void unmask_ioapic_irq(struct irq_data *data)
557{
558 unmask_ioapic(data->chip_data);
559}
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577static void __eoi_ioapic_pin(int apic, int pin, int vector, struct irq_cfg *cfg)
578{
579 if (mpc_ioapic_ver(apic) >= 0x20) {
580
581
582
583
584
585
586 if (cfg && irq_remapped(cfg))
587 io_apic_eoi(apic, pin);
588 else
589 io_apic_eoi(apic, vector);
590 } else {
591 struct IO_APIC_route_entry entry, entry1;
592
593 entry = entry1 = __ioapic_read_entry(apic, pin);
594
595
596
597
598 entry1.mask = 1;
599 entry1.trigger = IOAPIC_EDGE;
600
601 __ioapic_write_entry(apic, pin, entry1);
602
603
604
605
606 __ioapic_write_entry(apic, pin, entry);
607 }
608}
609
610static void eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg)
611{
612 struct irq_pin_list *entry;
613 unsigned long flags;
614
615 raw_spin_lock_irqsave(&ioapic_lock, flags);
616 for_each_irq_pin(entry, cfg->irq_2_pin)
617 __eoi_ioapic_pin(entry->apic, entry->pin, cfg->vector, cfg);
618 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
619}
620
621static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
622{
623 struct IO_APIC_route_entry entry;
624
625
626 entry = ioapic_read_entry(apic, pin);
627 if (entry.delivery_mode == dest_SMI)
628 return;
629
630
631
632
633
634 if (!entry.mask) {
635 entry.mask = 1;
636 ioapic_write_entry(apic, pin, entry);
637 entry = ioapic_read_entry(apic, pin);
638 }
639
640 if (entry.irr) {
641 unsigned long flags;
642
643
644
645
646
647
648 if (!entry.trigger) {
649 entry.trigger = IOAPIC_LEVEL;
650 ioapic_write_entry(apic, pin, entry);
651 }
652
653 raw_spin_lock_irqsave(&ioapic_lock, flags);
654 __eoi_ioapic_pin(apic, pin, entry.vector, NULL);
655 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
656 }
657
658
659
660
661
662 ioapic_mask_entry(apic, pin);
663 entry = ioapic_read_entry(apic, pin);
664 if (entry.irr)
665 printk(KERN_ERR "Unable to reset IRR for apic: %d, pin :%d\n",
666 mpc_ioapic_id(apic), pin);
667}
668
669static void clear_IO_APIC (void)
670{
671 int apic, pin;
672
673 for (apic = 0; apic < nr_ioapics; apic++)
674 for (pin = 0; pin < ioapics[apic].nr_registers; pin++)
675 clear_IO_APIC_pin(apic, pin);
676}
677
678#ifdef CONFIG_X86_32
679
680
681
682
683
684#define MAX_PIRQS 8
685static int pirq_entries[MAX_PIRQS] = {
686 [0 ... MAX_PIRQS - 1] = -1
687};
688
689static int __init ioapic_pirq_setup(char *str)
690{
691 int i, max;
692 int ints[MAX_PIRQS+1];
693
694 get_options(str, ARRAY_SIZE(ints), ints);
695
696 apic_printk(APIC_VERBOSE, KERN_INFO
697 "PIRQ redirection, working around broken MP-BIOS.\n");
698 max = MAX_PIRQS;
699 if (ints[0] < MAX_PIRQS)
700 max = ints[0];
701
702 for (i = 0; i < max; i++) {
703 apic_printk(APIC_VERBOSE, KERN_DEBUG
704 "... PIRQ%d -> IRQ %d\n", i, ints[i+1]);
705
706
707
708 pirq_entries[MAX_PIRQS-i-1] = ints[i+1];
709 }
710 return 1;
711}
712
713__setup("pirq=", ioapic_pirq_setup);
714#endif
715
716
717
718
719int save_ioapic_entries(void)
720{
721 int apic, pin;
722 int err = 0;
723
724 for (apic = 0; apic < nr_ioapics; apic++) {
725 if (!ioapics[apic].saved_registers) {
726 err = -ENOMEM;
727 continue;
728 }
729
730 for (pin = 0; pin < ioapics[apic].nr_registers; pin++)
731 ioapics[apic].saved_registers[pin] =
732 ioapic_read_entry(apic, pin);
733 }
734
735 return err;
736}
737
738
739
740
741void mask_ioapic_entries(void)
742{
743 int apic, pin;
744
745 for (apic = 0; apic < nr_ioapics; apic++) {
746 if (!ioapics[apic].saved_registers)
747 continue;
748
749 for (pin = 0; pin < ioapics[apic].nr_registers; pin++) {
750 struct IO_APIC_route_entry entry;
751
752 entry = ioapics[apic].saved_registers[pin];
753 if (!entry.mask) {
754 entry.mask = 1;
755 ioapic_write_entry(apic, pin, entry);
756 }
757 }
758 }
759}
760
761
762
763
764int restore_ioapic_entries(void)
765{
766 int apic, pin;
767
768 for (apic = 0; apic < nr_ioapics; apic++) {
769 if (!ioapics[apic].saved_registers)
770 continue;
771
772 for (pin = 0; pin < ioapics[apic].nr_registers; pin++)
773 ioapic_write_entry(apic, pin,
774 ioapics[apic].saved_registers[pin]);
775 }
776 return 0;
777}
778
779
780
781
782static int find_irq_entry(int ioapic_idx, int pin, int type)
783{
784 int i;
785
786 for (i = 0; i < mp_irq_entries; i++)
787 if (mp_irqs[i].irqtype == type &&
788 (mp_irqs[i].dstapic == mpc_ioapic_id(ioapic_idx) ||
789 mp_irqs[i].dstapic == MP_APIC_ALL) &&
790 mp_irqs[i].dstirq == pin)
791 return i;
792
793 return -1;
794}
795
796
797
798
799static int __init find_isa_irq_pin(int irq, int type)
800{
801 int i;
802
803 for (i = 0; i < mp_irq_entries; i++) {
804 int lbus = mp_irqs[i].srcbus;
805
806 if (test_bit(lbus, mp_bus_not_pci) &&
807 (mp_irqs[i].irqtype == type) &&
808 (mp_irqs[i].srcbusirq == irq))
809
810 return mp_irqs[i].dstirq;
811 }
812 return -1;
813}
814
815static int __init find_isa_irq_apic(int irq, int type)
816{
817 int i;
818
819 for (i = 0; i < mp_irq_entries; i++) {
820 int lbus = mp_irqs[i].srcbus;
821
822 if (test_bit(lbus, mp_bus_not_pci) &&
823 (mp_irqs[i].irqtype == type) &&
824 (mp_irqs[i].srcbusirq == irq))
825 break;
826 }
827
828 if (i < mp_irq_entries) {
829 int ioapic_idx;
830
831 for (ioapic_idx = 0; ioapic_idx < nr_ioapics; ioapic_idx++)
832 if (mpc_ioapic_id(ioapic_idx) == mp_irqs[i].dstapic)
833 return ioapic_idx;
834 }
835
836 return -1;
837}
838
839#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
840
841
842
843static int EISA_ELCR(unsigned int irq)
844{
845 if (irq < legacy_pic->nr_legacy_irqs) {
846 unsigned int port = 0x4d0 + (irq >> 3);
847 return (inb(port) >> (irq & 7)) & 1;
848 }
849 apic_printk(APIC_VERBOSE, KERN_INFO
850 "Broken MPtable reports ISA irq %d\n", irq);
851 return 0;
852}
853
854#endif
855
856
857
858
859#define default_ISA_trigger(idx) (0)
860#define default_ISA_polarity(idx) (0)
861
862
863
864
865
866
867#define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].srcbusirq))
868#define default_EISA_polarity(idx) default_ISA_polarity(idx)
869
870
871
872
873#define default_PCI_trigger(idx) (1)
874#define default_PCI_polarity(idx) (1)
875
876
877
878
879#define default_MCA_trigger(idx) (1)
880#define default_MCA_polarity(idx) default_ISA_polarity(idx)
881
882static int irq_polarity(int idx)
883{
884 int bus = mp_irqs[idx].srcbus;
885 int polarity;
886
887
888
889
890 switch (mp_irqs[idx].irqflag & 3)
891 {
892 case 0:
893 if (test_bit(bus, mp_bus_not_pci))
894 polarity = default_ISA_polarity(idx);
895 else
896 polarity = default_PCI_polarity(idx);
897 break;
898 case 1:
899 {
900 polarity = 0;
901 break;
902 }
903 case 2:
904 {
905 printk(KERN_WARNING "broken BIOS!!\n");
906 polarity = 1;
907 break;
908 }
909 case 3:
910 {
911 polarity = 1;
912 break;
913 }
914 default:
915 {
916 printk(KERN_WARNING "broken BIOS!!\n");
917 polarity = 1;
918 break;
919 }
920 }
921 return polarity;
922}
923
924static int irq_trigger(int idx)
925{
926 int bus = mp_irqs[idx].srcbus;
927 int trigger;
928
929
930
931
932 switch ((mp_irqs[idx].irqflag>>2) & 3)
933 {
934 case 0:
935 if (test_bit(bus, mp_bus_not_pci))
936 trigger = default_ISA_trigger(idx);
937 else
938 trigger = default_PCI_trigger(idx);
939#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
940 switch (mp_bus_id_to_type[bus]) {
941 case MP_BUS_ISA:
942 {
943
944 break;
945 }
946 case MP_BUS_EISA:
947 {
948 trigger = default_EISA_trigger(idx);
949 break;
950 }
951 case MP_BUS_PCI:
952 {
953
954 break;
955 }
956 case MP_BUS_MCA:
957 {
958 trigger = default_MCA_trigger(idx);
959 break;
960 }
961 default:
962 {
963 printk(KERN_WARNING "broken BIOS!!\n");
964 trigger = 1;
965 break;
966 }
967 }
968#endif
969 break;
970 case 1:
971 {
972 trigger = 0;
973 break;
974 }
975 case 2:
976 {
977 printk(KERN_WARNING "broken BIOS!!\n");
978 trigger = 1;
979 break;
980 }
981 case 3:
982 {
983 trigger = 1;
984 break;
985 }
986 default:
987 {
988 printk(KERN_WARNING "broken BIOS!!\n");
989 trigger = 0;
990 break;
991 }
992 }
993 return trigger;
994}
995
996static int pin_2_irq(int idx, int apic, int pin)
997{
998 int irq;
999 int bus = mp_irqs[idx].srcbus;
1000 struct mp_ioapic_gsi *gsi_cfg = mp_ioapic_gsi_routing(apic);
1001
1002
1003
1004
1005 if (mp_irqs[idx].dstirq != pin)
1006 printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
1007
1008 if (test_bit(bus, mp_bus_not_pci)) {
1009 irq = mp_irqs[idx].srcbusirq;
1010 } else {
1011 u32 gsi = gsi_cfg->gsi_base + pin;
1012
1013 if (gsi >= NR_IRQS_LEGACY)
1014 irq = gsi;
1015 else
1016 irq = gsi_top + gsi;
1017 }
1018
1019#ifdef CONFIG_X86_32
1020
1021
1022
1023 if ((pin >= 16) && (pin <= 23)) {
1024 if (pirq_entries[pin-16] != -1) {
1025 if (!pirq_entries[pin-16]) {
1026 apic_printk(APIC_VERBOSE, KERN_DEBUG
1027 "disabling PIRQ%d\n", pin-16);
1028 } else {
1029 irq = pirq_entries[pin-16];
1030 apic_printk(APIC_VERBOSE, KERN_DEBUG
1031 "using PIRQ%d -> IRQ %d\n",
1032 pin-16, irq);
1033 }
1034 }
1035 }
1036#endif
1037
1038 return irq;
1039}
1040
1041
1042
1043
1044
1045int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin,
1046 struct io_apic_irq_attr *irq_attr)
1047{
1048 int ioapic_idx, i, best_guess = -1;
1049
1050 apic_printk(APIC_DEBUG,
1051 "querying PCI -> IRQ mapping bus:%d, slot:%d, pin:%d.\n",
1052 bus, slot, pin);
1053 if (test_bit(bus, mp_bus_not_pci)) {
1054 apic_printk(APIC_VERBOSE,
1055 "PCI BIOS passed nonexistent PCI bus %d!\n", bus);
1056 return -1;
1057 }
1058 for (i = 0; i < mp_irq_entries; i++) {
1059 int lbus = mp_irqs[i].srcbus;
1060
1061 for (ioapic_idx = 0; ioapic_idx < nr_ioapics; ioapic_idx++)
1062 if (mpc_ioapic_id(ioapic_idx) == mp_irqs[i].dstapic ||
1063 mp_irqs[i].dstapic == MP_APIC_ALL)
1064 break;
1065
1066 if (!test_bit(lbus, mp_bus_not_pci) &&
1067 !mp_irqs[i].irqtype &&
1068 (bus == lbus) &&
1069 (slot == ((mp_irqs[i].srcbusirq >> 2) & 0x1f))) {
1070 int irq = pin_2_irq(i, ioapic_idx, mp_irqs[i].dstirq);
1071
1072 if (!(ioapic_idx || IO_APIC_IRQ(irq)))
1073 continue;
1074
1075 if (pin == (mp_irqs[i].srcbusirq & 3)) {
1076 set_io_apic_irq_attr(irq_attr, ioapic_idx,
1077 mp_irqs[i].dstirq,
1078 irq_trigger(i),
1079 irq_polarity(i));
1080 return irq;
1081 }
1082
1083
1084
1085
1086 if (best_guess < 0) {
1087 set_io_apic_irq_attr(irq_attr, ioapic_idx,
1088 mp_irqs[i].dstirq,
1089 irq_trigger(i),
1090 irq_polarity(i));
1091 best_guess = irq;
1092 }
1093 }
1094 }
1095 return best_guess;
1096}
1097EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector);
1098
1099void lock_vector_lock(void)
1100{
1101
1102
1103
1104 raw_spin_lock(&vector_lock);
1105}
1106
1107void unlock_vector_lock(void)
1108{
1109 raw_spin_unlock(&vector_lock);
1110}
1111
1112static int
1113__assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)
1114{
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126 static int current_vector = FIRST_EXTERNAL_VECTOR + VECTOR_OFFSET_START;
1127 static int current_offset = VECTOR_OFFSET_START % 8;
1128 unsigned int old_vector;
1129 int cpu, err;
1130 cpumask_var_t tmp_mask;
1131
1132 if (cfg->move_in_progress)
1133 return -EBUSY;
1134
1135 if (!alloc_cpumask_var(&tmp_mask, GFP_ATOMIC))
1136 return -ENOMEM;
1137
1138 old_vector = cfg->vector;
1139 if (old_vector) {
1140 cpumask_and(tmp_mask, mask, cpu_online_mask);
1141 cpumask_and(tmp_mask, cfg->domain, tmp_mask);
1142 if (!cpumask_empty(tmp_mask)) {
1143 free_cpumask_var(tmp_mask);
1144 return 0;
1145 }
1146 }
1147
1148
1149 err = -ENOSPC;
1150 for_each_cpu_and(cpu, mask, cpu_online_mask) {
1151 int new_cpu;
1152 int vector, offset;
1153
1154 apic->vector_allocation_domain(cpu, tmp_mask);
1155
1156 vector = current_vector;
1157 offset = current_offset;
1158next:
1159 vector += 8;
1160 if (vector >= first_system_vector) {
1161
1162 offset = (offset + 1) % 8;
1163 vector = FIRST_EXTERNAL_VECTOR + offset;
1164 }
1165 if (unlikely(current_vector == vector))
1166 continue;
1167
1168 if (test_bit(vector, used_vectors))
1169 goto next;
1170
1171 for_each_cpu_and(new_cpu, tmp_mask, cpu_online_mask)
1172 if (per_cpu(vector_irq, new_cpu)[vector] != -1)
1173 goto next;
1174
1175 current_vector = vector;
1176 current_offset = offset;
1177 if (old_vector) {
1178 cfg->move_in_progress = 1;
1179 cpumask_copy(cfg->old_domain, cfg->domain);
1180 }
1181 for_each_cpu_and(new_cpu, tmp_mask, cpu_online_mask)
1182 per_cpu(vector_irq, new_cpu)[vector] = irq;
1183 cfg->vector = vector;
1184 cpumask_copy(cfg->domain, tmp_mask);
1185 err = 0;
1186 break;
1187 }
1188 free_cpumask_var(tmp_mask);
1189 return err;
1190}
1191
1192int assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)
1193{
1194 int err;
1195 unsigned long flags;
1196
1197 raw_spin_lock_irqsave(&vector_lock, flags);
1198 err = __assign_irq_vector(irq, cfg, mask);
1199 raw_spin_unlock_irqrestore(&vector_lock, flags);
1200 return err;
1201}
1202
1203static void __clear_irq_vector(int irq, struct irq_cfg *cfg)
1204{
1205 int cpu, vector;
1206
1207 BUG_ON(!cfg->vector);
1208
1209 vector = cfg->vector;
1210 for_each_cpu_and(cpu, cfg->domain, cpu_online_mask)
1211 per_cpu(vector_irq, cpu)[vector] = -1;
1212
1213 cfg->vector = 0;
1214 cpumask_clear(cfg->domain);
1215
1216 if (likely(!cfg->move_in_progress))
1217 return;
1218 for_each_cpu_and(cpu, cfg->old_domain, cpu_online_mask) {
1219 for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS;
1220 vector++) {
1221 if (per_cpu(vector_irq, cpu)[vector] != irq)
1222 continue;
1223 per_cpu(vector_irq, cpu)[vector] = -1;
1224 break;
1225 }
1226 }
1227 cfg->move_in_progress = 0;
1228}
1229
1230void __setup_vector_irq(int cpu)
1231{
1232
1233 int irq, vector;
1234 struct irq_cfg *cfg;
1235
1236
1237
1238
1239
1240
1241 raw_spin_lock(&vector_lock);
1242
1243 for_each_active_irq(irq) {
1244 cfg = irq_get_chip_data(irq);
1245 if (!cfg)
1246 continue;
1247
1248
1249
1250
1251 if (irq < legacy_pic->nr_legacy_irqs && !IO_APIC_IRQ(irq))
1252 cpumask_set_cpu(cpu, cfg->domain);
1253
1254 if (!cpumask_test_cpu(cpu, cfg->domain))
1255 continue;
1256 vector = cfg->vector;
1257 per_cpu(vector_irq, cpu)[vector] = irq;
1258 }
1259
1260 for (vector = 0; vector < NR_VECTORS; ++vector) {
1261 irq = per_cpu(vector_irq, cpu)[vector];
1262 if (irq < 0)
1263 continue;
1264
1265 cfg = irq_cfg(irq);
1266 if (!cpumask_test_cpu(cpu, cfg->domain))
1267 per_cpu(vector_irq, cpu)[vector] = -1;
1268 }
1269 raw_spin_unlock(&vector_lock);
1270}
1271
1272static struct irq_chip ioapic_chip;
1273
1274#ifdef CONFIG_X86_32
1275static inline int IO_APIC_irq_trigger(int irq)
1276{
1277 int apic, idx, pin;
1278
1279 for (apic = 0; apic < nr_ioapics; apic++) {
1280 for (pin = 0; pin < ioapics[apic].nr_registers; pin++) {
1281 idx = find_irq_entry(apic, pin, mp_INT);
1282 if ((idx != -1) && (irq == pin_2_irq(idx, apic, pin)))
1283 return irq_trigger(idx);
1284 }
1285 }
1286
1287
1288
1289 return 0;
1290}
1291#else
1292static inline int IO_APIC_irq_trigger(int irq)
1293{
1294 return 1;
1295}
1296#endif
1297
1298static void ioapic_register_intr(unsigned int irq, struct irq_cfg *cfg,
1299 unsigned long trigger)
1300{
1301 struct irq_chip *chip = &ioapic_chip;
1302 irq_flow_handler_t hdl;
1303 bool fasteoi;
1304
1305 if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
1306 trigger == IOAPIC_LEVEL) {
1307 irq_set_status_flags(irq, IRQ_LEVEL);
1308 fasteoi = true;
1309 } else {
1310 irq_clear_status_flags(irq, IRQ_LEVEL);
1311 fasteoi = false;
1312 }
1313
1314 if (irq_remapped(cfg)) {
1315 irq_set_status_flags(irq, IRQ_MOVE_PCNTXT);
1316 irq_remap_modify_chip_defaults(chip);
1317 fasteoi = trigger != 0;
1318 }
1319
1320 hdl = fasteoi ? handle_fasteoi_irq : handle_edge_irq;
1321 irq_set_chip_and_handler_name(irq, chip, hdl,
1322 fasteoi ? "fasteoi" : "edge");
1323}
1324
1325
1326static int setup_ir_ioapic_entry(int irq,
1327 struct IR_IO_APIC_route_entry *entry,
1328 unsigned int destination, int vector,
1329 struct io_apic_irq_attr *attr)
1330{
1331 int index;
1332 struct irte irte;
1333 int ioapic_id = mpc_ioapic_id(attr->ioapic);
1334 struct intel_iommu *iommu = map_ioapic_to_ir(ioapic_id);
1335
1336 if (!iommu) {
1337 pr_warn("No mapping iommu for ioapic %d\n", ioapic_id);
1338 return -ENODEV;
1339 }
1340
1341 index = alloc_irte(iommu, irq, 1);
1342 if (index < 0) {
1343 pr_warn("Failed to allocate IRTE for ioapic %d\n", ioapic_id);
1344 return -ENOMEM;
1345 }
1346
1347 prepare_irte(&irte, vector, destination);
1348
1349
1350 set_ioapic_sid(&irte, ioapic_id);
1351
1352 modify_irte(irq, &irte);
1353
1354 apic_printk(APIC_VERBOSE, KERN_DEBUG "IOAPIC[%d]: "
1355 "Set IRTE entry (P:%d FPD:%d Dst_Mode:%d "
1356 "Redir_hint:%d Trig_Mode:%d Dlvry_Mode:%X "
1357 "Avail:%X Vector:%02X Dest:%08X "
1358 "SID:%04X SQ:%X SVT:%X)\n",
1359 attr->ioapic, irte.present, irte.fpd, irte.dst_mode,
1360 irte.redir_hint, irte.trigger_mode, irte.dlvry_mode,
1361 irte.avail, irte.vector, irte.dest_id,
1362 irte.sid, irte.sq, irte.svt);
1363
1364 memset(entry, 0, sizeof(*entry));
1365
1366 entry->index2 = (index >> 15) & 0x1;
1367 entry->zero = 0;
1368 entry->format = 1;
1369 entry->index = (index & 0x7fff);
1370
1371
1372
1373
1374 entry->vector = attr->ioapic_pin;
1375 entry->mask = 0;
1376 entry->trigger = attr->trigger;
1377 entry->polarity = attr->polarity;
1378
1379
1380
1381
1382 if (attr->trigger)
1383 entry->mask = 1;
1384
1385 return 0;
1386}
1387
1388static int setup_ioapic_entry(int irq, struct IO_APIC_route_entry *entry,
1389 unsigned int destination, int vector,
1390 struct io_apic_irq_attr *attr)
1391{
1392 if (intr_remapping_enabled)
1393 return setup_ir_ioapic_entry(irq,
1394 (struct IR_IO_APIC_route_entry *)entry,
1395 destination, vector, attr);
1396
1397 memset(entry, 0, sizeof(*entry));
1398
1399 entry->delivery_mode = apic->irq_delivery_mode;
1400 entry->dest_mode = apic->irq_dest_mode;
1401 entry->dest = destination;
1402 entry->vector = vector;
1403 entry->mask = 0;
1404 entry->trigger = attr->trigger;
1405 entry->polarity = attr->polarity;
1406
1407
1408
1409
1410
1411 if (attr->trigger)
1412 entry->mask = 1;
1413
1414 return 0;
1415}
1416
1417static void setup_ioapic_irq(unsigned int irq, struct irq_cfg *cfg,
1418 struct io_apic_irq_attr *attr)
1419{
1420 struct IO_APIC_route_entry entry;
1421 unsigned int dest;
1422
1423 if (!IO_APIC_IRQ(irq))
1424 return;
1425
1426
1427
1428
1429
1430 if (irq < legacy_pic->nr_legacy_irqs && cpumask_test_cpu(0, cfg->domain))
1431 apic->vector_allocation_domain(0, cfg->domain);
1432
1433 if (assign_irq_vector(irq, cfg, apic->target_cpus()))
1434 return;
1435
1436 dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus());
1437
1438 apic_printk(APIC_VERBOSE,KERN_DEBUG
1439 "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> "
1440 "IRQ %d Mode:%i Active:%i Dest:%d)\n",
1441 attr->ioapic, mpc_ioapic_id(attr->ioapic), attr->ioapic_pin,
1442 cfg->vector, irq, attr->trigger, attr->polarity, dest);
1443
1444 if (setup_ioapic_entry(irq, &entry, dest, cfg->vector, attr)) {
1445 pr_warn("Failed to setup ioapic entry for ioapic %d, pin %d\n",
1446 mpc_ioapic_id(attr->ioapic), attr->ioapic_pin);
1447 __clear_irq_vector(irq, cfg);
1448
1449 return;
1450 }
1451
1452 ioapic_register_intr(irq, cfg, attr->trigger);
1453 if (irq < legacy_pic->nr_legacy_irqs)
1454 legacy_pic->mask(irq);
1455
1456 ioapic_write_entry(attr->ioapic, attr->ioapic_pin, entry);
1457}
1458
1459static bool __init io_apic_pin_not_connected(int idx, int ioapic_idx, int pin)
1460{
1461 if (idx != -1)
1462 return false;
1463
1464 apic_printk(APIC_VERBOSE, KERN_DEBUG " apic %d pin %d not connected\n",
1465 mpc_ioapic_id(ioapic_idx), pin);
1466 return true;
1467}
1468
1469static void __init __io_apic_setup_irqs(unsigned int ioapic_idx)
1470{
1471 int idx, node = cpu_to_node(0);
1472 struct io_apic_irq_attr attr;
1473 unsigned int pin, irq;
1474
1475 for (pin = 0; pin < ioapics[ioapic_idx].nr_registers; pin++) {
1476 idx = find_irq_entry(ioapic_idx, pin, mp_INT);
1477 if (io_apic_pin_not_connected(idx, ioapic_idx, pin))
1478 continue;
1479
1480 irq = pin_2_irq(idx, ioapic_idx, pin);
1481
1482 if ((ioapic_idx > 0) && (irq > 16))
1483 continue;
1484
1485
1486
1487
1488
1489 if (apic->multi_timer_check &&
1490 apic->multi_timer_check(ioapic_idx, irq))
1491 continue;
1492
1493 set_io_apic_irq_attr(&attr, ioapic_idx, pin, irq_trigger(idx),
1494 irq_polarity(idx));
1495
1496 io_apic_setup_irq_pin(irq, node, &attr);
1497 }
1498}
1499
1500static void __init setup_IO_APIC_irqs(void)
1501{
1502 unsigned int ioapic_idx;
1503
1504 apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
1505
1506 for (ioapic_idx = 0; ioapic_idx < nr_ioapics; ioapic_idx++)
1507 __io_apic_setup_irqs(ioapic_idx);
1508}
1509
1510
1511
1512
1513
1514
1515void setup_IO_APIC_irq_extra(u32 gsi)
1516{
1517 int ioapic_idx = 0, pin, idx, irq, node = cpu_to_node(0);
1518 struct io_apic_irq_attr attr;
1519
1520
1521
1522
1523 ioapic_idx = mp_find_ioapic(gsi);
1524 if (ioapic_idx < 0)
1525 return;
1526
1527 pin = mp_find_ioapic_pin(ioapic_idx, gsi);
1528 idx = find_irq_entry(ioapic_idx, pin, mp_INT);
1529 if (idx == -1)
1530 return;
1531
1532 irq = pin_2_irq(idx, ioapic_idx, pin);
1533
1534
1535 if (ioapic_idx == 0 || irq < NR_IRQS_LEGACY)
1536 return;
1537
1538 set_io_apic_irq_attr(&attr, ioapic_idx, pin, irq_trigger(idx),
1539 irq_polarity(idx));
1540
1541 io_apic_setup_irq_pin_once(irq, node, &attr);
1542}
1543
1544
1545
1546
1547static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx,
1548 unsigned int pin, int vector)
1549{
1550 struct IO_APIC_route_entry entry;
1551
1552 if (intr_remapping_enabled)
1553 return;
1554
1555 memset(&entry, 0, sizeof(entry));
1556
1557
1558
1559
1560
1561 entry.dest_mode = apic->irq_dest_mode;
1562 entry.mask = 0;
1563 entry.dest = apic->cpu_mask_to_apicid(apic->target_cpus());
1564 entry.delivery_mode = apic->irq_delivery_mode;
1565 entry.polarity = 0;
1566 entry.trigger = 0;
1567 entry.vector = vector;
1568
1569
1570
1571
1572
1573 irq_set_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq,
1574 "edge");
1575
1576
1577
1578
1579 ioapic_write_entry(ioapic_idx, pin, entry);
1580}
1581
1582__apicdebuginit(void) print_IO_APIC(int ioapic_idx)
1583{
1584 int i;
1585 union IO_APIC_reg_00 reg_00;
1586 union IO_APIC_reg_01 reg_01;
1587 union IO_APIC_reg_02 reg_02;
1588 union IO_APIC_reg_03 reg_03;
1589 unsigned long flags;
1590
1591 raw_spin_lock_irqsave(&ioapic_lock, flags);
1592 reg_00.raw = io_apic_read(ioapic_idx, 0);
1593 reg_01.raw = io_apic_read(ioapic_idx, 1);
1594 if (reg_01.bits.version >= 0x10)
1595 reg_02.raw = io_apic_read(ioapic_idx, 2);
1596 if (reg_01.bits.version >= 0x20)
1597 reg_03.raw = io_apic_read(ioapic_idx, 3);
1598 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
1599
1600 printk("\n");
1601 printk(KERN_DEBUG "IO APIC #%d......\n", mpc_ioapic_id(ioapic_idx));
1602 printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw);
1603 printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID);
1604 printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type);
1605 printk(KERN_DEBUG "....... : LTS : %X\n", reg_00.bits.LTS);
1606
1607 printk(KERN_DEBUG ".... register #01: %08X\n", *(int *)®_01);
1608 printk(KERN_DEBUG "....... : max redirection entries: %02X\n",
1609 reg_01.bits.entries);
1610
1611 printk(KERN_DEBUG "....... : PRQ implemented: %X\n", reg_01.bits.PRQ);
1612 printk(KERN_DEBUG "....... : IO APIC version: %02X\n",
1613 reg_01.bits.version);
1614
1615
1616
1617
1618
1619
1620 if (reg_01.bits.version >= 0x10 && reg_02.raw != reg_01.raw) {
1621 printk(KERN_DEBUG ".... register #02: %08X\n", reg_02.raw);
1622 printk(KERN_DEBUG "....... : arbitration: %02X\n", reg_02.bits.arbitration);
1623 }
1624
1625
1626
1627
1628
1629
1630 if (reg_01.bits.version >= 0x20 && reg_03.raw != reg_02.raw &&
1631 reg_03.raw != reg_01.raw) {
1632 printk(KERN_DEBUG ".... register #03: %08X\n", reg_03.raw);
1633 printk(KERN_DEBUG "....... : Boot DT : %X\n", reg_03.bits.boot_DT);
1634 }
1635
1636 printk(KERN_DEBUG ".... IRQ redirection table:\n");
1637
1638 if (intr_remapping_enabled) {
1639 printk(KERN_DEBUG " NR Indx Fmt Mask Trig IRR"
1640 " Pol Stat Indx2 Zero Vect:\n");
1641 } else {
1642 printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol"
1643 " Stat Dmod Deli Vect:\n");
1644 }
1645
1646 for (i = 0; i <= reg_01.bits.entries; i++) {
1647 if (intr_remapping_enabled) {
1648 struct IO_APIC_route_entry entry;
1649 struct IR_IO_APIC_route_entry *ir_entry;
1650
1651 entry = ioapic_read_entry(ioapic_idx, i);
1652 ir_entry = (struct IR_IO_APIC_route_entry *) &entry;
1653 printk(KERN_DEBUG " %02x %04X ",
1654 i,
1655 ir_entry->index
1656 );
1657 printk("%1d %1d %1d %1d %1d "
1658 "%1d %1d %X %02X\n",
1659 ir_entry->format,
1660 ir_entry->mask,
1661 ir_entry->trigger,
1662 ir_entry->irr,
1663 ir_entry->polarity,
1664 ir_entry->delivery_status,
1665 ir_entry->index2,
1666 ir_entry->zero,
1667 ir_entry->vector
1668 );
1669 } else {
1670 struct IO_APIC_route_entry entry;
1671
1672 entry = ioapic_read_entry(ioapic_idx, i);
1673 printk(KERN_DEBUG " %02x %02X ",
1674 i,
1675 entry.dest
1676 );
1677 printk("%1d %1d %1d %1d %1d "
1678 "%1d %1d %02X\n",
1679 entry.mask,
1680 entry.trigger,
1681 entry.irr,
1682 entry.polarity,
1683 entry.delivery_status,
1684 entry.dest_mode,
1685 entry.delivery_mode,
1686 entry.vector
1687 );
1688 }
1689 }
1690}
1691
1692__apicdebuginit(void) print_IO_APICs(void)
1693{
1694 int ioapic_idx;
1695 struct irq_cfg *cfg;
1696 unsigned int irq;
1697 struct irq_chip *chip;
1698
1699 printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries);
1700 for (ioapic_idx = 0; ioapic_idx < nr_ioapics; ioapic_idx++)
1701 printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n",
1702 mpc_ioapic_id(ioapic_idx),
1703 ioapics[ioapic_idx].nr_registers);
1704
1705
1706
1707
1708
1709 printk(KERN_INFO "testing the IO APIC.......................\n");
1710
1711 for (ioapic_idx = 0; ioapic_idx < nr_ioapics; ioapic_idx++)
1712 print_IO_APIC(ioapic_idx);
1713
1714 printk(KERN_DEBUG "IRQ to pin mappings:\n");
1715 for_each_active_irq(irq) {
1716 struct irq_pin_list *entry;
1717
1718 chip = irq_get_chip(irq);
1719 if (chip != &ioapic_chip)
1720 continue;
1721
1722 cfg = irq_get_chip_data(irq);
1723 if (!cfg)
1724 continue;
1725 entry = cfg->irq_2_pin;
1726 if (!entry)
1727 continue;
1728 printk(KERN_DEBUG "IRQ%d ", irq);
1729 for_each_irq_pin(entry, cfg->irq_2_pin)
1730 printk("-> %d:%d", entry->apic, entry->pin);
1731 printk("\n");
1732 }
1733
1734 printk(KERN_INFO ".................................... done.\n");
1735}
1736
1737__apicdebuginit(void) print_APIC_field(int base)
1738{
1739 int i;
1740
1741 printk(KERN_DEBUG);
1742
1743 for (i = 0; i < 8; i++)
1744 printk(KERN_CONT "%08x", apic_read(base + i*0x10));
1745
1746 printk(KERN_CONT "\n");
1747}
1748
1749__apicdebuginit(void) print_local_APIC(void *dummy)
1750{
1751 unsigned int i, v, ver, maxlvt;
1752 u64 icr;
1753
1754 printk(KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n",
1755 smp_processor_id(), hard_smp_processor_id());
1756 v = apic_read(APIC_ID);
1757 printk(KERN_INFO "... APIC ID: %08x (%01x)\n", v, read_apic_id());
1758 v = apic_read(APIC_LVR);
1759 printk(KERN_INFO "... APIC VERSION: %08x\n", v);
1760 ver = GET_APIC_VERSION(v);
1761 maxlvt = lapic_get_maxlvt();
1762
1763 v = apic_read(APIC_TASKPRI);
1764 printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK);
1765
1766 if (APIC_INTEGRATED(ver)) {
1767 if (!APIC_XAPIC(ver)) {
1768 v = apic_read(APIC_ARBPRI);
1769 printk(KERN_DEBUG "... APIC ARBPRI: %08x (%02x)\n", v,
1770 v & APIC_ARBPRI_MASK);
1771 }
1772 v = apic_read(APIC_PROCPRI);
1773 printk(KERN_DEBUG "... APIC PROCPRI: %08x\n", v);
1774 }
1775
1776
1777
1778
1779
1780 if (!APIC_INTEGRATED(ver) || maxlvt == 3) {
1781 v = apic_read(APIC_RRR);
1782 printk(KERN_DEBUG "... APIC RRR: %08x\n", v);
1783 }
1784
1785 v = apic_read(APIC_LDR);
1786 printk(KERN_DEBUG "... APIC LDR: %08x\n", v);
1787 if (!x2apic_enabled()) {
1788 v = apic_read(APIC_DFR);
1789 printk(KERN_DEBUG "... APIC DFR: %08x\n", v);
1790 }
1791 v = apic_read(APIC_SPIV);
1792 printk(KERN_DEBUG "... APIC SPIV: %08x\n", v);
1793
1794 printk(KERN_DEBUG "... APIC ISR field:\n");
1795 print_APIC_field(APIC_ISR);
1796 printk(KERN_DEBUG "... APIC TMR field:\n");
1797 print_APIC_field(APIC_TMR);
1798 printk(KERN_DEBUG "... APIC IRR field:\n");
1799 print_APIC_field(APIC_IRR);
1800
1801 if (APIC_INTEGRATED(ver)) {
1802 if (maxlvt > 3)
1803 apic_write(APIC_ESR, 0);
1804
1805 v = apic_read(APIC_ESR);
1806 printk(KERN_DEBUG "... APIC ESR: %08x\n", v);
1807 }
1808
1809 icr = apic_icr_read();
1810 printk(KERN_DEBUG "... APIC ICR: %08x\n", (u32)icr);
1811 printk(KERN_DEBUG "... APIC ICR2: %08x\n", (u32)(icr >> 32));
1812
1813 v = apic_read(APIC_LVTT);
1814 printk(KERN_DEBUG "... APIC LVTT: %08x\n", v);
1815
1816 if (maxlvt > 3) {
1817 v = apic_read(APIC_LVTPC);
1818 printk(KERN_DEBUG "... APIC LVTPC: %08x\n", v);
1819 }
1820 v = apic_read(APIC_LVT0);
1821 printk(KERN_DEBUG "... APIC LVT0: %08x\n", v);
1822 v = apic_read(APIC_LVT1);
1823 printk(KERN_DEBUG "... APIC LVT1: %08x\n", v);
1824
1825 if (maxlvt > 2) {
1826 v = apic_read(APIC_LVTERR);
1827 printk(KERN_DEBUG "... APIC LVTERR: %08x\n", v);
1828 }
1829
1830 v = apic_read(APIC_TMICT);
1831 printk(KERN_DEBUG "... APIC TMICT: %08x\n", v);
1832 v = apic_read(APIC_TMCCT);
1833 printk(KERN_DEBUG "... APIC TMCCT: %08x\n", v);
1834 v = apic_read(APIC_TDCR);
1835 printk(KERN_DEBUG "... APIC TDCR: %08x\n", v);
1836
1837 if (boot_cpu_has(X86_FEATURE_EXTAPIC)) {
1838 v = apic_read(APIC_EFEAT);
1839 maxlvt = (v >> 16) & 0xff;
1840 printk(KERN_DEBUG "... APIC EFEAT: %08x\n", v);
1841 v = apic_read(APIC_ECTRL);
1842 printk(KERN_DEBUG "... APIC ECTRL: %08x\n", v);
1843 for (i = 0; i < maxlvt; i++) {
1844 v = apic_read(APIC_EILVTn(i));
1845 printk(KERN_DEBUG "... APIC EILVT%d: %08x\n", i, v);
1846 }
1847 }
1848 printk("\n");
1849}
1850
1851__apicdebuginit(void) print_local_APICs(int maxcpu)
1852{
1853 int cpu;
1854
1855 if (!maxcpu)
1856 return;
1857
1858 preempt_disable();
1859 for_each_online_cpu(cpu) {
1860 if (cpu >= maxcpu)
1861 break;
1862 smp_call_function_single(cpu, print_local_APIC, NULL, 1);
1863 }
1864 preempt_enable();
1865}
1866
1867__apicdebuginit(void) print_PIC(void)
1868{
1869 unsigned int v;
1870 unsigned long flags;
1871
1872 if (!legacy_pic->nr_legacy_irqs)
1873 return;
1874
1875 printk(KERN_DEBUG "\nprinting PIC contents\n");
1876
1877 raw_spin_lock_irqsave(&i8259A_lock, flags);
1878
1879 v = inb(0xa1) << 8 | inb(0x21);
1880 printk(KERN_DEBUG "... PIC IMR: %04x\n", v);
1881
1882 v = inb(0xa0) << 8 | inb(0x20);
1883 printk(KERN_DEBUG "... PIC IRR: %04x\n", v);
1884
1885 outb(0x0b,0xa0);
1886 outb(0x0b,0x20);
1887 v = inb(0xa0) << 8 | inb(0x20);
1888 outb(0x0a,0xa0);
1889 outb(0x0a,0x20);
1890
1891 raw_spin_unlock_irqrestore(&i8259A_lock, flags);
1892
1893 printk(KERN_DEBUG "... PIC ISR: %04x\n", v);
1894
1895 v = inb(0x4d1) << 8 | inb(0x4d0);
1896 printk(KERN_DEBUG "... PIC ELCR: %04x\n", v);
1897}
1898
1899static int __initdata show_lapic = 1;
1900static __init int setup_show_lapic(char *arg)
1901{
1902 int num = -1;
1903
1904 if (strcmp(arg, "all") == 0) {
1905 show_lapic = CONFIG_NR_CPUS;
1906 } else {
1907 get_option(&arg, &num);
1908 if (num >= 0)
1909 show_lapic = num;
1910 }
1911
1912 return 1;
1913}
1914__setup("show_lapic=", setup_show_lapic);
1915
1916__apicdebuginit(int) print_ICs(void)
1917{
1918 if (apic_verbosity == APIC_QUIET)
1919 return 0;
1920
1921 print_PIC();
1922
1923
1924 if (!cpu_has_apic && !apic_from_smp_config())
1925 return 0;
1926
1927 print_local_APICs(show_lapic);
1928 print_IO_APICs();
1929
1930 return 0;
1931}
1932
1933late_initcall(print_ICs);
1934
1935
1936
1937static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
1938
1939void __init enable_IO_APIC(void)
1940{
1941 int i8259_apic, i8259_pin;
1942 int apic;
1943
1944 if (!legacy_pic->nr_legacy_irqs)
1945 return;
1946
1947 for(apic = 0; apic < nr_ioapics; apic++) {
1948 int pin;
1949
1950 for (pin = 0; pin < ioapics[apic].nr_registers; pin++) {
1951 struct IO_APIC_route_entry entry;
1952 entry = ioapic_read_entry(apic, pin);
1953
1954
1955
1956
1957 if ((entry.mask == 0) && (entry.delivery_mode == dest_ExtINT)) {
1958 ioapic_i8259.apic = apic;
1959 ioapic_i8259.pin = pin;
1960 goto found_i8259;
1961 }
1962 }
1963 }
1964 found_i8259:
1965
1966
1967
1968
1969
1970 i8259_pin = find_isa_irq_pin(0, mp_ExtINT);
1971 i8259_apic = find_isa_irq_apic(0, mp_ExtINT);
1972
1973 if ((ioapic_i8259.pin == -1) && (i8259_pin >= 0)) {
1974 printk(KERN_WARNING "ExtINT not setup in hardware but reported by MP table\n");
1975 ioapic_i8259.pin = i8259_pin;
1976 ioapic_i8259.apic = i8259_apic;
1977 }
1978
1979 if (((ioapic_i8259.apic != i8259_apic) || (ioapic_i8259.pin != i8259_pin)) &&
1980 (i8259_pin >= 0) && (ioapic_i8259.pin >= 0))
1981 {
1982 printk(KERN_WARNING "ExtINT in hardware and MP table differ\n");
1983 }
1984
1985
1986
1987
1988 clear_IO_APIC();
1989}
1990
1991
1992
1993
1994void disable_IO_APIC(void)
1995{
1996
1997
1998
1999 clear_IO_APIC();
2000
2001 if (!legacy_pic->nr_legacy_irqs)
2002 return;
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014 if (ioapic_i8259.pin != -1 && !intr_remapping_enabled) {
2015 struct IO_APIC_route_entry entry;
2016
2017 memset(&entry, 0, sizeof(entry));
2018 entry.mask = 0;
2019 entry.trigger = 0;
2020 entry.irr = 0;
2021 entry.polarity = 0;
2022 entry.delivery_status = 0;
2023 entry.dest_mode = 0;
2024 entry.delivery_mode = dest_ExtINT;
2025 entry.vector = 0;
2026 entry.dest = read_apic_id();
2027
2028
2029
2030
2031 ioapic_write_entry(ioapic_i8259.apic, ioapic_i8259.pin, entry);
2032 }
2033
2034
2035
2036
2037 if (cpu_has_apic || apic_from_smp_config())
2038 disconnect_bsp_APIC(!intr_remapping_enabled &&
2039 ioapic_i8259.pin != -1);
2040}
2041
2042#ifdef CONFIG_X86_32
2043
2044
2045
2046
2047
2048
2049void __init setup_ioapic_ids_from_mpc_nocheck(void)
2050{
2051 union IO_APIC_reg_00 reg_00;
2052 physid_mask_t phys_id_present_map;
2053 int ioapic_idx;
2054 int i;
2055 unsigned char old_id;
2056 unsigned long flags;
2057
2058
2059
2060
2061
2062 apic->ioapic_phys_id_map(&phys_cpu_present_map, &phys_id_present_map);
2063
2064
2065
2066
2067 for (ioapic_idx = 0; ioapic_idx < nr_ioapics; ioapic_idx++) {
2068
2069 raw_spin_lock_irqsave(&ioapic_lock, flags);
2070 reg_00.raw = io_apic_read(ioapic_idx, 0);
2071 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
2072
2073 old_id = mpc_ioapic_id(ioapic_idx);
2074
2075 if (mpc_ioapic_id(ioapic_idx) >= get_physical_broadcast()) {
2076 printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n",
2077 ioapic_idx, mpc_ioapic_id(ioapic_idx));
2078 printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
2079 reg_00.bits.ID);
2080 ioapics[ioapic_idx].mp_config.apicid = reg_00.bits.ID;
2081 }
2082
2083
2084
2085
2086
2087
2088 if (apic->check_apicid_used(&phys_id_present_map,
2089 mpc_ioapic_id(ioapic_idx))) {
2090 printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
2091 ioapic_idx, mpc_ioapic_id(ioapic_idx));
2092 for (i = 0; i < get_physical_broadcast(); i++)
2093 if (!physid_isset(i, phys_id_present_map))
2094 break;
2095 if (i >= get_physical_broadcast())
2096 panic("Max APIC ID exceeded!\n");
2097 printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
2098 i);
2099 physid_set(i, phys_id_present_map);
2100 ioapics[ioapic_idx].mp_config.apicid = i;
2101 } else {
2102 physid_mask_t tmp;
2103 apic->apicid_to_cpu_present(mpc_ioapic_id(ioapic_idx),
2104 &tmp);
2105 apic_printk(APIC_VERBOSE, "Setting %d in the "
2106 "phys_id_present_map\n",
2107 mpc_ioapic_id(ioapic_idx));
2108 physids_or(phys_id_present_map, phys_id_present_map, tmp);
2109 }
2110
2111
2112
2113
2114
2115 if (old_id != mpc_ioapic_id(ioapic_idx))
2116 for (i = 0; i < mp_irq_entries; i++)
2117 if (mp_irqs[i].dstapic == old_id)
2118 mp_irqs[i].dstapic
2119 = mpc_ioapic_id(ioapic_idx);
2120
2121
2122
2123
2124
2125 if (mpc_ioapic_id(ioapic_idx) == reg_00.bits.ID)
2126 continue;
2127
2128 apic_printk(APIC_VERBOSE, KERN_INFO
2129 "...changing IO-APIC physical APIC ID to %d ...",
2130 mpc_ioapic_id(ioapic_idx));
2131
2132 reg_00.bits.ID = mpc_ioapic_id(ioapic_idx);
2133 raw_spin_lock_irqsave(&ioapic_lock, flags);
2134 io_apic_write(ioapic_idx, 0, reg_00.raw);
2135 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
2136
2137
2138
2139
2140 raw_spin_lock_irqsave(&ioapic_lock, flags);
2141 reg_00.raw = io_apic_read(ioapic_idx, 0);
2142 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
2143 if (reg_00.bits.ID != mpc_ioapic_id(ioapic_idx))
2144 printk("could not set ID!\n");
2145 else
2146 apic_printk(APIC_VERBOSE, " ok.\n");
2147 }
2148}
2149
2150void __init setup_ioapic_ids_from_mpc(void)
2151{
2152
2153 if (acpi_ioapic)
2154 return;
2155
2156
2157
2158
2159 if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
2160 || APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
2161 return;
2162 setup_ioapic_ids_from_mpc_nocheck();
2163}
2164#endif
2165
2166int no_timer_check __initdata;
2167
2168static int __init notimercheck(char *s)
2169{
2170 no_timer_check = 1;
2171 return 1;
2172}
2173__setup("no_timer_check", notimercheck);
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183static int __init timer_irq_works(void)
2184{
2185 unsigned long t1 = jiffies;
2186 unsigned long flags;
2187
2188 if (no_timer_check)
2189 return 1;
2190
2191 local_save_flags(flags);
2192 local_irq_enable();
2193
2194 mdelay((10 * 1000) / HZ);
2195 local_irq_restore(flags);
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206 if (time_after(jiffies, t1 + 4))
2207 return 1;
2208 return 0;
2209}
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234static unsigned int startup_ioapic_irq(struct irq_data *data)
2235{
2236 int was_pending = 0, irq = data->irq;
2237 unsigned long flags;
2238
2239 raw_spin_lock_irqsave(&ioapic_lock, flags);
2240 if (irq < legacy_pic->nr_legacy_irqs) {
2241 legacy_pic->mask(irq);
2242 if (legacy_pic->irq_pending(irq))
2243 was_pending = 1;
2244 }
2245 __unmask_ioapic(data->chip_data);
2246 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
2247
2248 return was_pending;
2249}
2250
2251static int ioapic_retrigger_irq(struct irq_data *data)
2252{
2253 struct irq_cfg *cfg = data->chip_data;
2254 unsigned long flags;
2255
2256 raw_spin_lock_irqsave(&vector_lock, flags);
2257 apic->send_IPI_mask(cpumask_of(cpumask_first(cfg->domain)), cfg->vector);
2258 raw_spin_unlock_irqrestore(&vector_lock, flags);
2259
2260 return 1;
2261}
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272#ifdef CONFIG_SMP
2273void send_cleanup_vector(struct irq_cfg *cfg)
2274{
2275 cpumask_var_t cleanup_mask;
2276
2277 if (unlikely(!alloc_cpumask_var(&cleanup_mask, GFP_ATOMIC))) {
2278 unsigned int i;
2279 for_each_cpu_and(i, cfg->old_domain, cpu_online_mask)
2280 apic->send_IPI_mask(cpumask_of(i), IRQ_MOVE_CLEANUP_VECTOR);
2281 } else {
2282 cpumask_and(cleanup_mask, cfg->old_domain, cpu_online_mask);
2283 apic->send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
2284 free_cpumask_var(cleanup_mask);
2285 }
2286 cfg->move_in_progress = 0;
2287}
2288
2289static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq_cfg *cfg)
2290{
2291 int apic, pin;
2292 struct irq_pin_list *entry;
2293 u8 vector = cfg->vector;
2294
2295 for_each_irq_pin(entry, cfg->irq_2_pin) {
2296 unsigned int reg;
2297
2298 apic = entry->apic;
2299 pin = entry->pin;
2300
2301
2302
2303
2304 if (!irq_remapped(cfg))
2305 io_apic_write(apic, 0x11 + pin*2, dest);
2306 reg = io_apic_read(apic, 0x10 + pin*2);
2307 reg &= ~IO_APIC_REDIR_VECTOR_MASK;
2308 reg |= vector;
2309 io_apic_modify(apic, 0x10 + pin*2, reg);
2310 }
2311}
2312
2313
2314
2315
2316
2317
2318int __ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,
2319 unsigned int *dest_id)
2320{
2321 struct irq_cfg *cfg = data->chip_data;
2322
2323 if (!cpumask_intersects(mask, cpu_online_mask))
2324 return -1;
2325
2326 if (assign_irq_vector(data->irq, data->chip_data, mask))
2327 return -1;
2328
2329 cpumask_copy(data->affinity, mask);
2330
2331 *dest_id = apic->cpu_mask_to_apicid_and(mask, cfg->domain);
2332 return 0;
2333}
2334
2335static int
2336ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,
2337 bool force)
2338{
2339 unsigned int dest, irq = data->irq;
2340 unsigned long flags;
2341 int ret;
2342
2343 raw_spin_lock_irqsave(&ioapic_lock, flags);
2344 ret = __ioapic_set_affinity(data, mask, &dest);
2345 if (!ret) {
2346
2347 dest = SET_APIC_LOGICAL_ID(dest);
2348 __target_IO_APIC_irq(irq, dest, data->chip_data);
2349 }
2350 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
2351 return ret;
2352}
2353
2354#ifdef CONFIG_IRQ_REMAP
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370static int
2371ir_ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,
2372 bool force)
2373{
2374 struct irq_cfg *cfg = data->chip_data;
2375 unsigned int dest, irq = data->irq;
2376 struct irte irte;
2377
2378 if (!cpumask_intersects(mask, cpu_online_mask))
2379 return -EINVAL;
2380
2381 if (get_irte(irq, &irte))
2382 return -EBUSY;
2383
2384 if (assign_irq_vector(irq, cfg, mask))
2385 return -EBUSY;
2386
2387 dest = apic->cpu_mask_to_apicid_and(cfg->domain, mask);
2388
2389 irte.vector = cfg->vector;
2390 irte.dest_id = IRTE_DEST(dest);
2391
2392
2393
2394
2395
2396 modify_irte(irq, &irte);
2397
2398
2399
2400
2401
2402
2403 if (cfg->move_in_progress)
2404 send_cleanup_vector(cfg);
2405
2406 cpumask_copy(data->affinity, mask);
2407 return 0;
2408}
2409
2410#else
2411static inline int
2412ir_ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,
2413 bool force)
2414{
2415 return 0;
2416}
2417#endif
2418
2419asmlinkage void smp_irq_move_cleanup_interrupt(void)
2420{
2421 unsigned vector, me;
2422
2423 ack_APIC_irq();
2424 exit_idle();
2425 irq_enter();
2426
2427 me = smp_processor_id();
2428 for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) {
2429 unsigned int irq;
2430 unsigned int irr;
2431 struct irq_desc *desc;
2432 struct irq_cfg *cfg;
2433 irq = __this_cpu_read(vector_irq[vector]);
2434
2435 if (irq == -1)
2436 continue;
2437
2438 desc = irq_to_desc(irq);
2439 if (!desc)
2440 continue;
2441
2442 cfg = irq_cfg(irq);
2443 raw_spin_lock(&desc->lock);
2444
2445
2446
2447
2448
2449 if (cfg->move_in_progress)
2450 goto unlock;
2451
2452 if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain))
2453 goto unlock;
2454
2455 irr = apic_read(APIC_IRR + (vector / 32 * 0x10));
2456
2457
2458
2459
2460
2461
2462
2463 if (irr & (1 << (vector % 32))) {
2464 apic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR);
2465 goto unlock;
2466 }
2467 __this_cpu_write(vector_irq[vector], -1);
2468unlock:
2469 raw_spin_unlock(&desc->lock);
2470 }
2471
2472 irq_exit();
2473}
2474
2475static void __irq_complete_move(struct irq_cfg *cfg, unsigned vector)
2476{
2477 unsigned me;
2478
2479 if (likely(!cfg->move_in_progress))
2480 return;
2481
2482 me = smp_processor_id();
2483
2484 if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain))
2485 send_cleanup_vector(cfg);
2486}
2487
2488static void irq_complete_move(struct irq_cfg *cfg)
2489{
2490 __irq_complete_move(cfg, ~get_irq_regs()->orig_ax);
2491}
2492
2493void irq_force_complete_move(int irq)
2494{
2495 struct irq_cfg *cfg = irq_get_chip_data(irq);
2496
2497 if (!cfg)
2498 return;
2499
2500 __irq_complete_move(cfg, cfg->vector);
2501}
2502#else
2503static inline void irq_complete_move(struct irq_cfg *cfg) { }
2504#endif
2505
2506static void ack_apic_edge(struct irq_data *data)
2507{
2508 irq_complete_move(data->chip_data);
2509 irq_move_irq(data);
2510 ack_APIC_irq();
2511}
2512
2513atomic_t irq_mis_count;
2514
2515static void ack_apic_level(struct irq_data *data)
2516{
2517 struct irq_cfg *cfg = data->chip_data;
2518 int i, do_unmask_irq = 0, irq = data->irq;
2519 unsigned long v;
2520
2521 irq_complete_move(cfg);
2522#ifdef CONFIG_GENERIC_PENDING_IRQ
2523
2524 if (unlikely(irqd_is_setaffinity_pending(data))) {
2525 do_unmask_irq = 1;
2526 mask_ioapic(cfg);
2527 }
2528#endif
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562 i = cfg->vector;
2563 v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
2564
2565
2566
2567
2568
2569 ack_APIC_irq();
2570
2571
2572
2573
2574
2575
2576
2577
2578 if (!(v & (1 << (i & 0x1f)))) {
2579 atomic_inc(&irq_mis_count);
2580
2581 eoi_ioapic_irq(irq, cfg);
2582 }
2583
2584
2585 if (unlikely(do_unmask_irq)) {
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612 if (!io_apic_level_ack_pending(cfg))
2613 irq_move_masked_irq(data);
2614 unmask_ioapic(cfg);
2615 }
2616}
2617
2618#ifdef CONFIG_IRQ_REMAP
2619static void ir_ack_apic_edge(struct irq_data *data)
2620{
2621 ack_APIC_irq();
2622}
2623
2624static void ir_ack_apic_level(struct irq_data *data)
2625{
2626 ack_APIC_irq();
2627 eoi_ioapic_irq(data->irq, data->chip_data);
2628}
2629
2630static void ir_print_prefix(struct irq_data *data, struct seq_file *p)
2631{
2632 seq_printf(p, " IR-%s", data->chip->name);
2633}
2634
2635static void irq_remap_modify_chip_defaults(struct irq_chip *chip)
2636{
2637 chip->irq_print_chip = ir_print_prefix;
2638 chip->irq_ack = ir_ack_apic_edge;
2639 chip->irq_eoi = ir_ack_apic_level;
2640
2641#ifdef CONFIG_SMP
2642 chip->irq_set_affinity = ir_ioapic_set_affinity;
2643#endif
2644}
2645#endif
2646
2647static struct irq_chip ioapic_chip __read_mostly = {
2648 .name = "IO-APIC",
2649 .irq_startup = startup_ioapic_irq,
2650 .irq_mask = mask_ioapic_irq,
2651 .irq_unmask = unmask_ioapic_irq,
2652 .irq_ack = ack_apic_edge,
2653 .irq_eoi = ack_apic_level,
2654#ifdef CONFIG_SMP
2655 .irq_set_affinity = ioapic_set_affinity,
2656#endif
2657 .irq_retrigger = ioapic_retrigger_irq,
2658};
2659
2660static inline void init_IO_APIC_traps(void)
2661{
2662 struct irq_cfg *cfg;
2663 unsigned int irq;
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676 for_each_active_irq(irq) {
2677 cfg = irq_get_chip_data(irq);
2678 if (IO_APIC_IRQ(irq) && cfg && !cfg->vector) {
2679
2680
2681
2682
2683
2684 if (irq < legacy_pic->nr_legacy_irqs)
2685 legacy_pic->make_irq(irq);
2686 else
2687
2688 irq_set_chip(irq, &no_irq_chip);
2689 }
2690 }
2691}
2692
2693
2694
2695
2696
2697static void mask_lapic_irq(struct irq_data *data)
2698{
2699 unsigned long v;
2700
2701 v = apic_read(APIC_LVT0);
2702 apic_write(APIC_LVT0, v | APIC_LVT_MASKED);
2703}
2704
2705static void unmask_lapic_irq(struct irq_data *data)
2706{
2707 unsigned long v;
2708
2709 v = apic_read(APIC_LVT0);
2710 apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED);
2711}
2712
2713static void ack_lapic_irq(struct irq_data *data)
2714{
2715 ack_APIC_irq();
2716}
2717
2718static struct irq_chip lapic_chip __read_mostly = {
2719 .name = "local-APIC",
2720 .irq_mask = mask_lapic_irq,
2721 .irq_unmask = unmask_lapic_irq,
2722 .irq_ack = ack_lapic_irq,
2723};
2724
2725static void lapic_register_intr(int irq)
2726{
2727 irq_clear_status_flags(irq, IRQ_LEVEL);
2728 irq_set_chip_and_handler_name(irq, &lapic_chip, handle_edge_irq,
2729 "edge");
2730}
2731
2732
2733
2734
2735
2736
2737
2738
2739static inline void __init unlock_ExtINT_logic(void)
2740{
2741 int apic, pin, i;
2742 struct IO_APIC_route_entry entry0, entry1;
2743 unsigned char save_control, save_freq_select;
2744
2745 pin = find_isa_irq_pin(8, mp_INT);
2746 if (pin == -1) {
2747 WARN_ON_ONCE(1);
2748 return;
2749 }
2750 apic = find_isa_irq_apic(8, mp_INT);
2751 if (apic == -1) {
2752 WARN_ON_ONCE(1);
2753 return;
2754 }
2755
2756 entry0 = ioapic_read_entry(apic, pin);
2757 clear_IO_APIC_pin(apic, pin);
2758
2759 memset(&entry1, 0, sizeof(entry1));
2760
2761 entry1.dest_mode = 0;
2762 entry1.mask = 0;
2763 entry1.dest = hard_smp_processor_id();
2764 entry1.delivery_mode = dest_ExtINT;
2765 entry1.polarity = entry0.polarity;
2766 entry1.trigger = 0;
2767 entry1.vector = 0;
2768
2769 ioapic_write_entry(apic, pin, entry1);
2770
2771 save_control = CMOS_READ(RTC_CONTROL);
2772 save_freq_select = CMOS_READ(RTC_FREQ_SELECT);
2773 CMOS_WRITE((save_freq_select & ~RTC_RATE_SELECT) | 0x6,
2774 RTC_FREQ_SELECT);
2775 CMOS_WRITE(save_control | RTC_PIE, RTC_CONTROL);
2776
2777 i = 100;
2778 while (i-- > 0) {
2779 mdelay(10);
2780 if ((CMOS_READ(RTC_INTR_FLAGS) & RTC_PF) == RTC_PF)
2781 i -= 10;
2782 }
2783
2784 CMOS_WRITE(save_control, RTC_CONTROL);
2785 CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
2786 clear_IO_APIC_pin(apic, pin);
2787
2788 ioapic_write_entry(apic, pin, entry0);
2789}
2790
2791static int disable_timer_pin_1 __initdata;
2792
2793static int __init disable_timer_pin_setup(char *arg)
2794{
2795 disable_timer_pin_1 = 1;
2796 return 0;
2797}
2798early_param("disable_timer_pin_1", disable_timer_pin_setup);
2799
2800int timer_through_8259 __initdata;
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810static inline void __init check_timer(void)
2811{
2812 struct irq_cfg *cfg = irq_get_chip_data(0);
2813 int node = cpu_to_node(0);
2814 int apic1, pin1, apic2, pin2;
2815 unsigned long flags;
2816 int no_pin1 = 0;
2817
2818 local_irq_save(flags);
2819
2820
2821
2822
2823 legacy_pic->mask(0);
2824 assign_irq_vector(0, cfg, apic->target_cpus());
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835 apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
2836 legacy_pic->init(1);
2837
2838 pin1 = find_isa_irq_pin(0, mp_INT);
2839 apic1 = find_isa_irq_apic(0, mp_INT);
2840 pin2 = ioapic_i8259.pin;
2841 apic2 = ioapic_i8259.apic;
2842
2843 apic_printk(APIC_QUIET, KERN_INFO "..TIMER: vector=0x%02X "
2844 "apic1=%d pin1=%d apic2=%d pin2=%d\n",
2845 cfg->vector, apic1, pin1, apic2, pin2);
2846
2847
2848
2849
2850
2851
2852
2853
2854 if (pin1 == -1) {
2855 if (intr_remapping_enabled)
2856 panic("BIOS bug: timer not connected to IO-APIC");
2857 pin1 = pin2;
2858 apic1 = apic2;
2859 no_pin1 = 1;
2860 } else if (pin2 == -1) {
2861 pin2 = pin1;
2862 apic2 = apic1;
2863 }
2864
2865 if (pin1 != -1) {
2866
2867
2868
2869 if (no_pin1) {
2870 add_pin_to_irq_node(cfg, node, apic1, pin1);
2871 setup_timer_IRQ0_pin(apic1, pin1, cfg->vector);
2872 } else {
2873
2874
2875
2876
2877
2878 int idx;
2879 idx = find_irq_entry(apic1, pin1, mp_INT);
2880 if (idx != -1 && irq_trigger(idx))
2881 unmask_ioapic(cfg);
2882 }
2883 if (timer_irq_works()) {
2884 if (disable_timer_pin_1 > 0)
2885 clear_IO_APIC_pin(0, pin1);
2886 goto out;
2887 }
2888 if (intr_remapping_enabled)
2889 panic("timer doesn't work through Interrupt-remapped IO-APIC");
2890 local_irq_disable();
2891 clear_IO_APIC_pin(apic1, pin1);
2892 if (!no_pin1)
2893 apic_printk(APIC_QUIET, KERN_ERR "..MP-BIOS bug: "
2894 "8254 timer not connected to IO-APIC\n");
2895
2896 apic_printk(APIC_QUIET, KERN_INFO "...trying to set up timer "
2897 "(IRQ0) through the 8259A ...\n");
2898 apic_printk(APIC_QUIET, KERN_INFO
2899 "..... (found apic %d pin %d) ...\n", apic2, pin2);
2900
2901
2902
2903 replace_pin_at_irq_node(cfg, node, apic1, pin1, apic2, pin2);
2904 setup_timer_IRQ0_pin(apic2, pin2, cfg->vector);
2905 legacy_pic->unmask(0);
2906 if (timer_irq_works()) {
2907 apic_printk(APIC_QUIET, KERN_INFO "....... works.\n");
2908 timer_through_8259 = 1;
2909 goto out;
2910 }
2911
2912
2913
2914 local_irq_disable();
2915 legacy_pic->mask(0);
2916 clear_IO_APIC_pin(apic2, pin2);
2917 apic_printk(APIC_QUIET, KERN_INFO "....... failed.\n");
2918 }
2919
2920 apic_printk(APIC_QUIET, KERN_INFO
2921 "...trying to set up timer as Virtual Wire IRQ...\n");
2922
2923 lapic_register_intr(0);
2924 apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector);
2925 legacy_pic->unmask(0);
2926
2927 if (timer_irq_works()) {
2928 apic_printk(APIC_QUIET, KERN_INFO "..... works.\n");
2929 goto out;
2930 }
2931 local_irq_disable();
2932 legacy_pic->mask(0);
2933 apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | cfg->vector);
2934 apic_printk(APIC_QUIET, KERN_INFO "..... failed.\n");
2935
2936 apic_printk(APIC_QUIET, KERN_INFO
2937 "...trying to set up timer as ExtINT IRQ...\n");
2938
2939 legacy_pic->init(0);
2940 legacy_pic->make_irq(0);
2941 apic_write(APIC_LVT0, APIC_DM_EXTINT);
2942
2943 unlock_ExtINT_logic();
2944
2945 if (timer_irq_works()) {
2946 apic_printk(APIC_QUIET, KERN_INFO "..... works.\n");
2947 goto out;
2948 }
2949 local_irq_disable();
2950 apic_printk(APIC_QUIET, KERN_INFO "..... failed :(.\n");
2951 panic("IO-APIC + timer doesn't work! Boot with apic=debug and send a "
2952 "report. Then try booting with the 'noapic' option.\n");
2953out:
2954 local_irq_restore(flags);
2955}
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974#define PIC_IRQS (1UL << PIC_CASCADE_IR)
2975
2976void __init setup_IO_APIC(void)
2977{
2978
2979
2980
2981
2982 io_apic_irqs = legacy_pic->nr_legacy_irqs ? ~PIC_IRQS : ~0UL;
2983
2984 apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n");
2985
2986
2987
2988 x86_init.mpparse.setup_ioapic_ids();
2989
2990 sync_Arb_IDs();
2991 setup_IO_APIC_irqs();
2992 init_IO_APIC_traps();
2993 if (legacy_pic->nr_legacy_irqs)
2994 check_timer();
2995}
2996
2997
2998
2999
3000
3001
3002static int __init io_apic_bug_finalize(void)
3003{
3004 if (sis_apic_bug == -1)
3005 sis_apic_bug = 0;
3006 return 0;
3007}
3008
3009late_initcall(io_apic_bug_finalize);
3010
3011static void resume_ioapic_id(int ioapic_idx)
3012{
3013 unsigned long flags;
3014 union IO_APIC_reg_00 reg_00;
3015
3016 raw_spin_lock_irqsave(&ioapic_lock, flags);
3017 reg_00.raw = io_apic_read(ioapic_idx, 0);
3018 if (reg_00.bits.ID != mpc_ioapic_id(ioapic_idx)) {
3019 reg_00.bits.ID = mpc_ioapic_id(ioapic_idx);
3020 io_apic_write(ioapic_idx, 0, reg_00.raw);
3021 }
3022 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
3023}
3024
3025static void ioapic_resume(void)
3026{
3027 int ioapic_idx;
3028
3029 for (ioapic_idx = nr_ioapics - 1; ioapic_idx >= 0; ioapic_idx--)
3030 resume_ioapic_id(ioapic_idx);
3031
3032 restore_ioapic_entries();
3033}
3034
3035static struct syscore_ops ioapic_syscore_ops = {
3036 .suspend = save_ioapic_entries,
3037 .resume = ioapic_resume,
3038};
3039
3040static int __init ioapic_init_ops(void)
3041{
3042 register_syscore_ops(&ioapic_syscore_ops);
3043
3044 return 0;
3045}
3046
3047device_initcall(ioapic_init_ops);
3048
3049
3050
3051
3052unsigned int create_irq_nr(unsigned int from, int node)
3053{
3054 struct irq_cfg *cfg;
3055 unsigned long flags;
3056 unsigned int ret = 0;
3057 int irq;
3058
3059 if (from < nr_irqs_gsi)
3060 from = nr_irqs_gsi;
3061
3062 irq = alloc_irq_from(from, node);
3063 if (irq < 0)
3064 return 0;
3065 cfg = alloc_irq_cfg(irq, node);
3066 if (!cfg) {
3067 free_irq_at(irq, NULL);
3068 return 0;
3069 }
3070
3071 raw_spin_lock_irqsave(&vector_lock, flags);
3072 if (!__assign_irq_vector(irq, cfg, apic->target_cpus()))
3073 ret = irq;
3074 raw_spin_unlock_irqrestore(&vector_lock, flags);
3075
3076 if (ret) {
3077 irq_set_chip_data(irq, cfg);
3078 irq_clear_status_flags(irq, IRQ_NOREQUEST);
3079 } else {
3080 free_irq_at(irq, cfg);
3081 }
3082 return ret;
3083}
3084
3085int create_irq(void)
3086{
3087 int node = cpu_to_node(0);
3088 unsigned int irq_want;
3089 int irq;
3090
3091 irq_want = nr_irqs_gsi;
3092 irq = create_irq_nr(irq_want, node);
3093
3094 if (irq == 0)
3095 irq = -1;
3096
3097 return irq;
3098}
3099
3100void destroy_irq(unsigned int irq)
3101{
3102 struct irq_cfg *cfg = irq_get_chip_data(irq);
3103 unsigned long flags;
3104
3105 irq_set_status_flags(irq, IRQ_NOREQUEST|IRQ_NOPROBE);
3106
3107 if (irq_remapped(cfg))
3108 free_irte(irq);
3109 raw_spin_lock_irqsave(&vector_lock, flags);
3110 __clear_irq_vector(irq, cfg);
3111 raw_spin_unlock_irqrestore(&vector_lock, flags);
3112 free_irq_at(irq, cfg);
3113}
3114
3115
3116
3117
3118#ifdef CONFIG_PCI_MSI
3119static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq,
3120 struct msi_msg *msg, u8 hpet_id)
3121{
3122 struct irq_cfg *cfg;
3123 int err;
3124 unsigned dest;
3125
3126 if (disable_apic)
3127 return -ENXIO;
3128
3129 cfg = irq_cfg(irq);
3130 err = assign_irq_vector(irq, cfg, apic->target_cpus());
3131 if (err)
3132 return err;
3133
3134 dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus());
3135
3136 if (irq_remapped(cfg)) {
3137 struct irte irte;
3138 int ir_index;
3139 u16 sub_handle;
3140
3141 ir_index = map_irq_to_irte_handle(irq, &sub_handle);
3142 BUG_ON(ir_index == -1);
3143
3144 prepare_irte(&irte, cfg->vector, dest);
3145
3146
3147 if (pdev)
3148 set_msi_sid(&irte, pdev);
3149 else
3150 set_hpet_sid(&irte, hpet_id);
3151
3152 modify_irte(irq, &irte);
3153
3154 msg->address_hi = MSI_ADDR_BASE_HI;
3155 msg->data = sub_handle;
3156 msg->address_lo = MSI_ADDR_BASE_LO | MSI_ADDR_IR_EXT_INT |
3157 MSI_ADDR_IR_SHV |
3158 MSI_ADDR_IR_INDEX1(ir_index) |
3159 MSI_ADDR_IR_INDEX2(ir_index);
3160 } else {
3161 if (x2apic_enabled())
3162 msg->address_hi = MSI_ADDR_BASE_HI |
3163 MSI_ADDR_EXT_DEST_ID(dest);
3164 else
3165 msg->address_hi = MSI_ADDR_BASE_HI;
3166
3167 msg->address_lo =
3168 MSI_ADDR_BASE_LO |
3169 ((apic->irq_dest_mode == 0) ?
3170 MSI_ADDR_DEST_MODE_PHYSICAL:
3171 MSI_ADDR_DEST_MODE_LOGICAL) |
3172 ((apic->irq_delivery_mode != dest_LowestPrio) ?
3173 MSI_ADDR_REDIRECTION_CPU:
3174 MSI_ADDR_REDIRECTION_LOWPRI) |
3175 MSI_ADDR_DEST_ID(dest);
3176
3177 msg->data =
3178 MSI_DATA_TRIGGER_EDGE |
3179 MSI_DATA_LEVEL_ASSERT |
3180 ((apic->irq_delivery_mode != dest_LowestPrio) ?
3181 MSI_DATA_DELIVERY_FIXED:
3182 MSI_DATA_DELIVERY_LOWPRI) |
3183 MSI_DATA_VECTOR(cfg->vector);
3184 }
3185 return err;
3186}
3187
3188#ifdef CONFIG_SMP
3189static int
3190msi_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force)
3191{
3192 struct irq_cfg *cfg = data->chip_data;
3193 struct msi_msg msg;
3194 unsigned int dest;
3195
3196 if (__ioapic_set_affinity(data, mask, &dest))
3197 return -1;
3198
3199 __get_cached_msi_msg(data->msi_desc, &msg);
3200
3201 msg.data &= ~MSI_DATA_VECTOR_MASK;
3202 msg.data |= MSI_DATA_VECTOR(cfg->vector);
3203 msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
3204 msg.address_lo |= MSI_ADDR_DEST_ID(dest);
3205
3206 __write_msi_msg(data->msi_desc, &msg);
3207
3208 return 0;
3209}
3210#endif
3211
3212
3213
3214
3215
3216static struct irq_chip msi_chip = {
3217 .name = "PCI-MSI",
3218 .irq_unmask = unmask_msi_irq,
3219 .irq_mask = mask_msi_irq,
3220 .irq_ack = ack_apic_edge,
3221#ifdef CONFIG_SMP
3222 .irq_set_affinity = msi_set_affinity,
3223#endif
3224 .irq_retrigger = ioapic_retrigger_irq,
3225};
3226
3227
3228
3229
3230
3231
3232static int msi_alloc_irte(struct pci_dev *dev, int irq, int nvec)
3233{
3234 struct intel_iommu *iommu;
3235 int index;
3236
3237 iommu = map_dev_to_ir(dev);
3238 if (!iommu) {
3239 printk(KERN_ERR
3240 "Unable to map PCI %s to iommu\n", pci_name(dev));
3241 return -ENOENT;
3242 }
3243
3244 index = alloc_irte(iommu, irq, nvec);
3245 if (index < 0) {
3246 printk(KERN_ERR
3247 "Unable to allocate %d IRTE for PCI %s\n", nvec,
3248 pci_name(dev));
3249 return -ENOSPC;
3250 }
3251 return index;
3252}
3253
3254static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)
3255{
3256 struct irq_chip *chip = &msi_chip;
3257 struct msi_msg msg;
3258 int ret;
3259
3260 ret = msi_compose_msg(dev, irq, &msg, -1);
3261 if (ret < 0)
3262 return ret;
3263
3264 irq_set_msi_desc(irq, msidesc);
3265 write_msi_msg(irq, &msg);
3266
3267 if (irq_remapped(irq_get_chip_data(irq))) {
3268 irq_set_status_flags(irq, IRQ_MOVE_PCNTXT);
3269 irq_remap_modify_chip_defaults(chip);
3270 }
3271
3272 irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge");
3273
3274 dev_printk(KERN_DEBUG, &dev->dev, "irq %d for MSI/MSI-X\n", irq);
3275
3276 return 0;
3277}
3278
3279int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
3280{
3281 int node, ret, sub_handle, index = 0;
3282 unsigned int irq, irq_want;
3283 struct msi_desc *msidesc;
3284 struct intel_iommu *iommu = NULL;
3285
3286
3287 if (type == PCI_CAP_ID_MSI && nvec > 1)
3288 return 1;
3289
3290 node = dev_to_node(&dev->dev);
3291 irq_want = nr_irqs_gsi;
3292 sub_handle = 0;
3293 list_for_each_entry(msidesc, &dev->msi_list, list) {
3294 irq = create_irq_nr(irq_want, node);
3295 if (irq == 0)
3296 return -1;
3297 irq_want = irq + 1;
3298 if (!intr_remapping_enabled)
3299 goto no_ir;
3300
3301 if (!sub_handle) {
3302
3303
3304
3305
3306 index = msi_alloc_irte(dev, irq, nvec);
3307 if (index < 0) {
3308 ret = index;
3309 goto error;
3310 }
3311 } else {
3312 iommu = map_dev_to_ir(dev);
3313 if (!iommu) {
3314 ret = -ENOENT;
3315 goto error;
3316 }
3317
3318
3319
3320
3321
3322 set_irte_irq(irq, iommu, index, sub_handle);
3323 }
3324no_ir:
3325 ret = setup_msi_irq(dev, msidesc, irq);
3326 if (ret < 0)
3327 goto error;
3328 sub_handle++;
3329 }
3330 return 0;
3331
3332error:
3333 destroy_irq(irq);
3334 return ret;
3335}
3336
3337void native_teardown_msi_irq(unsigned int irq)
3338{
3339 destroy_irq(irq);
3340}
3341
3342#ifdef CONFIG_DMAR_TABLE
3343#ifdef CONFIG_SMP
3344static int
3345dmar_msi_set_affinity(struct irq_data *data, const struct cpumask *mask,
3346 bool force)
3347{
3348 struct irq_cfg *cfg = data->chip_data;
3349 unsigned int dest, irq = data->irq;
3350 struct msi_msg msg;
3351
3352 if (__ioapic_set_affinity(data, mask, &dest))
3353 return -1;
3354
3355 dmar_msi_read(irq, &msg);
3356
3357 msg.data &= ~MSI_DATA_VECTOR_MASK;
3358 msg.data |= MSI_DATA_VECTOR(cfg->vector);
3359 msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
3360 msg.address_lo |= MSI_ADDR_DEST_ID(dest);
3361 msg.address_hi = MSI_ADDR_BASE_HI | MSI_ADDR_EXT_DEST_ID(dest);
3362
3363 dmar_msi_write(irq, &msg);
3364
3365 return 0;
3366}
3367
3368#endif
3369
3370static struct irq_chip dmar_msi_type = {
3371 .name = "DMAR_MSI",
3372 .irq_unmask = dmar_msi_unmask,
3373 .irq_mask = dmar_msi_mask,
3374 .irq_ack = ack_apic_edge,
3375#ifdef CONFIG_SMP
3376 .irq_set_affinity = dmar_msi_set_affinity,
3377#endif
3378 .irq_retrigger = ioapic_retrigger_irq,
3379};
3380
3381int arch_setup_dmar_msi(unsigned int irq)
3382{
3383 int ret;
3384 struct msi_msg msg;
3385
3386 ret = msi_compose_msg(NULL, irq, &msg, -1);
3387 if (ret < 0)
3388 return ret;
3389 dmar_msi_write(irq, &msg);
3390 irq_set_chip_and_handler_name(irq, &dmar_msi_type, handle_edge_irq,
3391 "edge");
3392 return 0;
3393}
3394#endif
3395
3396#ifdef CONFIG_HPET_TIMER
3397
3398#ifdef CONFIG_SMP
3399static int hpet_msi_set_affinity(struct irq_data *data,
3400 const struct cpumask *mask, bool force)
3401{
3402 struct irq_cfg *cfg = data->chip_data;
3403 struct msi_msg msg;
3404 unsigned int dest;
3405
3406 if (__ioapic_set_affinity(data, mask, &dest))
3407 return -1;
3408
3409 hpet_msi_read(data->handler_data, &msg);
3410
3411 msg.data &= ~MSI_DATA_VECTOR_MASK;
3412 msg.data |= MSI_DATA_VECTOR(cfg->vector);
3413 msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
3414 msg.address_lo |= MSI_ADDR_DEST_ID(dest);
3415
3416 hpet_msi_write(data->handler_data, &msg);
3417
3418 return 0;
3419}
3420
3421#endif
3422
3423static struct irq_chip hpet_msi_type = {
3424 .name = "HPET_MSI",
3425 .irq_unmask = hpet_msi_unmask,
3426 .irq_mask = hpet_msi_mask,
3427 .irq_ack = ack_apic_edge,
3428#ifdef CONFIG_SMP
3429 .irq_set_affinity = hpet_msi_set_affinity,
3430#endif
3431 .irq_retrigger = ioapic_retrigger_irq,
3432};
3433
3434int arch_setup_hpet_msi(unsigned int irq, unsigned int id)
3435{
3436 struct irq_chip *chip = &hpet_msi_type;
3437 struct msi_msg msg;
3438 int ret;
3439
3440 if (intr_remapping_enabled) {
3441 struct intel_iommu *iommu = map_hpet_to_ir(id);
3442 int index;
3443
3444 if (!iommu)
3445 return -1;
3446
3447 index = alloc_irte(iommu, irq, 1);
3448 if (index < 0)
3449 return -1;
3450 }
3451
3452 ret = msi_compose_msg(NULL, irq, &msg, id);
3453 if (ret < 0)
3454 return ret;
3455
3456 hpet_msi_write(irq_get_handler_data(irq), &msg);
3457 irq_set_status_flags(irq, IRQ_MOVE_PCNTXT);
3458 if (irq_remapped(irq_get_chip_data(irq)))
3459 irq_remap_modify_chip_defaults(chip);
3460
3461 irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge");
3462 return 0;
3463}
3464#endif
3465
3466#endif
3467
3468
3469
3470#ifdef CONFIG_HT_IRQ
3471
3472#ifdef CONFIG_SMP
3473
3474static void target_ht_irq(unsigned int irq, unsigned int dest, u8 vector)
3475{
3476 struct ht_irq_msg msg;
3477 fetch_ht_irq_msg(irq, &msg);
3478
3479 msg.address_lo &= ~(HT_IRQ_LOW_VECTOR_MASK | HT_IRQ_LOW_DEST_ID_MASK);
3480 msg.address_hi &= ~(HT_IRQ_HIGH_DEST_ID_MASK);
3481
3482 msg.address_lo |= HT_IRQ_LOW_VECTOR(vector) | HT_IRQ_LOW_DEST_ID(dest);
3483 msg.address_hi |= HT_IRQ_HIGH_DEST_ID(dest);
3484
3485 write_ht_irq_msg(irq, &msg);
3486}
3487
3488static int
3489ht_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force)
3490{
3491 struct irq_cfg *cfg = data->chip_data;
3492 unsigned int dest;
3493
3494 if (__ioapic_set_affinity(data, mask, &dest))
3495 return -1;
3496
3497 target_ht_irq(data->irq, dest, cfg->vector);
3498 return 0;
3499}
3500
3501#endif
3502
3503static struct irq_chip ht_irq_chip = {
3504 .name = "PCI-HT",
3505 .irq_mask = mask_ht_irq,
3506 .irq_unmask = unmask_ht_irq,
3507 .irq_ack = ack_apic_edge,
3508#ifdef CONFIG_SMP
3509 .irq_set_affinity = ht_set_affinity,
3510#endif
3511 .irq_retrigger = ioapic_retrigger_irq,
3512};
3513
3514int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
3515{
3516 struct irq_cfg *cfg;
3517 int err;
3518
3519 if (disable_apic)
3520 return -ENXIO;
3521
3522 cfg = irq_cfg(irq);
3523 err = assign_irq_vector(irq, cfg, apic->target_cpus());
3524 if (!err) {
3525 struct ht_irq_msg msg;
3526 unsigned dest;
3527
3528 dest = apic->cpu_mask_to_apicid_and(cfg->domain,
3529 apic->target_cpus());
3530
3531 msg.address_hi = HT_IRQ_HIGH_DEST_ID(dest);
3532
3533 msg.address_lo =
3534 HT_IRQ_LOW_BASE |
3535 HT_IRQ_LOW_DEST_ID(dest) |
3536 HT_IRQ_LOW_VECTOR(cfg->vector) |
3537 ((apic->irq_dest_mode == 0) ?
3538 HT_IRQ_LOW_DM_PHYSICAL :
3539 HT_IRQ_LOW_DM_LOGICAL) |
3540 HT_IRQ_LOW_RQEOI_EDGE |
3541 ((apic->irq_delivery_mode != dest_LowestPrio) ?
3542 HT_IRQ_LOW_MT_FIXED :
3543 HT_IRQ_LOW_MT_ARBITRATED) |
3544 HT_IRQ_LOW_IRQ_MASKED;
3545
3546 write_ht_irq_msg(irq, &msg);
3547
3548 irq_set_chip_and_handler_name(irq, &ht_irq_chip,
3549 handle_edge_irq, "edge");
3550
3551 dev_printk(KERN_DEBUG, &dev->dev, "irq %d for HT\n", irq);
3552 }
3553 return err;
3554}
3555#endif
3556
3557static int
3558io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr)
3559{
3560 struct irq_cfg *cfg = alloc_irq_and_cfg_at(irq, node);
3561 int ret;
3562
3563 if (!cfg)
3564 return -EINVAL;
3565 ret = __add_pin_to_irq_node(cfg, node, attr->ioapic, attr->ioapic_pin);
3566 if (!ret)
3567 setup_ioapic_irq(irq, cfg, attr);
3568 return ret;
3569}
3570
3571int io_apic_setup_irq_pin_once(unsigned int irq, int node,
3572 struct io_apic_irq_attr *attr)
3573{
3574 unsigned int ioapic_idx = attr->ioapic, pin = attr->ioapic_pin;
3575 int ret;
3576
3577
3578 if (test_bit(pin, ioapics[ioapic_idx].pin_programmed)) {
3579 pr_debug("Pin %d-%d already programmed\n",
3580 mpc_ioapic_id(ioapic_idx), pin);
3581 return 0;
3582 }
3583 ret = io_apic_setup_irq_pin(irq, node, attr);
3584 if (!ret)
3585 set_bit(pin, ioapics[ioapic_idx].pin_programmed);
3586 return ret;
3587}
3588
3589static int __init io_apic_get_redir_entries(int ioapic)
3590{
3591 union IO_APIC_reg_01 reg_01;
3592 unsigned long flags;
3593
3594 raw_spin_lock_irqsave(&ioapic_lock, flags);
3595 reg_01.raw = io_apic_read(ioapic, 1);
3596 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
3597
3598
3599
3600
3601
3602 return reg_01.bits.entries + 1;
3603}
3604
3605static void __init probe_nr_irqs_gsi(void)
3606{
3607 int nr;
3608
3609 nr = gsi_top + NR_IRQS_LEGACY;
3610 if (nr > nr_irqs_gsi)
3611 nr_irqs_gsi = nr;
3612
3613 printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi);
3614}
3615
3616int get_nr_irqs_gsi(void)
3617{
3618 return nr_irqs_gsi;
3619}
3620
3621int __init arch_probe_nr_irqs(void)
3622{
3623 int nr;
3624
3625 if (nr_irqs > (NR_VECTORS * nr_cpu_ids))
3626 nr_irqs = NR_VECTORS * nr_cpu_ids;
3627
3628 nr = nr_irqs_gsi + 8 * nr_cpu_ids;
3629#if defined(CONFIG_PCI_MSI) || defined(CONFIG_HT_IRQ)
3630
3631
3632
3633 nr += nr_irqs_gsi * 16;
3634#endif
3635 if (nr < nr_irqs)
3636 nr_irqs = nr;
3637
3638 return NR_IRQS_LEGACY;
3639}
3640
3641int io_apic_set_pci_routing(struct device *dev, int irq,
3642 struct io_apic_irq_attr *irq_attr)
3643{
3644 int node;
3645
3646 if (!IO_APIC_IRQ(irq)) {
3647 apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
3648 irq_attr->ioapic);
3649 return -EINVAL;
3650 }
3651
3652 node = dev ? dev_to_node(dev) : cpu_to_node(0);
3653
3654 return io_apic_setup_irq_pin_once(irq, node, irq_attr);
3655}
3656
3657#ifdef CONFIG_X86_32
3658static int __init io_apic_get_unique_id(int ioapic, int apic_id)
3659{
3660 union IO_APIC_reg_00 reg_00;
3661 static physid_mask_t apic_id_map = PHYSID_MASK_NONE;
3662 physid_mask_t tmp;
3663 unsigned long flags;
3664 int i = 0;
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675 if (physids_empty(apic_id_map))
3676 apic->ioapic_phys_id_map(&phys_cpu_present_map, &apic_id_map);
3677
3678 raw_spin_lock_irqsave(&ioapic_lock, flags);
3679 reg_00.raw = io_apic_read(ioapic, 0);
3680 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
3681
3682 if (apic_id >= get_physical_broadcast()) {
3683 printk(KERN_WARNING "IOAPIC[%d]: Invalid apic_id %d, trying "
3684 "%d\n", ioapic, apic_id, reg_00.bits.ID);
3685 apic_id = reg_00.bits.ID;
3686 }
3687
3688
3689
3690
3691
3692 if (apic->check_apicid_used(&apic_id_map, apic_id)) {
3693
3694 for (i = 0; i < get_physical_broadcast(); i++) {
3695 if (!apic->check_apicid_used(&apic_id_map, i))
3696 break;
3697 }
3698
3699 if (i == get_physical_broadcast())
3700 panic("Max apic_id exceeded!\n");
3701
3702 printk(KERN_WARNING "IOAPIC[%d]: apic_id %d already used, "
3703 "trying %d\n", ioapic, apic_id, i);
3704
3705 apic_id = i;
3706 }
3707
3708 apic->apicid_to_cpu_present(apic_id, &tmp);
3709 physids_or(apic_id_map, apic_id_map, tmp);
3710
3711 if (reg_00.bits.ID != apic_id) {
3712 reg_00.bits.ID = apic_id;
3713
3714 raw_spin_lock_irqsave(&ioapic_lock, flags);
3715 io_apic_write(ioapic, 0, reg_00.raw);
3716 reg_00.raw = io_apic_read(ioapic, 0);
3717 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
3718
3719
3720 if (reg_00.bits.ID != apic_id) {
3721 printk("IOAPIC[%d]: Unable to change apic_id!\n", ioapic);
3722 return -1;
3723 }
3724 }
3725
3726 apic_printk(APIC_VERBOSE, KERN_INFO
3727 "IOAPIC[%d]: Assigned apic_id %d\n", ioapic, apic_id);
3728
3729 return apic_id;
3730}
3731
3732static u8 __init io_apic_unique_id(u8 id)
3733{
3734 if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
3735 !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
3736 return io_apic_get_unique_id(nr_ioapics, id);
3737 else
3738 return id;
3739}
3740#else
3741static u8 __init io_apic_unique_id(u8 id)
3742{
3743 int i;
3744 DECLARE_BITMAP(used, 256);
3745
3746 bitmap_zero(used, 256);
3747 for (i = 0; i < nr_ioapics; i++) {
3748 __set_bit(mpc_ioapic_id(i), used);
3749 }
3750 if (!test_bit(id, used))
3751 return id;
3752 return find_first_zero_bit(used, 256);
3753}
3754#endif
3755
3756static int __init io_apic_get_version(int ioapic)
3757{
3758 union IO_APIC_reg_01 reg_01;
3759 unsigned long flags;
3760
3761 raw_spin_lock_irqsave(&ioapic_lock, flags);
3762 reg_01.raw = io_apic_read(ioapic, 1);
3763 raw_spin_unlock_irqrestore(&ioapic_lock, flags);
3764
3765 return reg_01.bits.version;
3766}
3767
3768int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity)
3769{
3770 int ioapic, pin, idx;
3771
3772 if (skip_ioapic_setup)
3773 return -1;
3774
3775 ioapic = mp_find_ioapic(gsi);
3776 if (ioapic < 0)
3777 return -1;
3778
3779 pin = mp_find_ioapic_pin(ioapic, gsi);
3780 if (pin < 0)
3781 return -1;
3782
3783 idx = find_irq_entry(ioapic, pin, mp_INT);
3784 if (idx < 0)
3785 return -1;
3786
3787 *trigger = irq_trigger(idx);
3788 *polarity = irq_polarity(idx);
3789 return 0;
3790}
3791
3792
3793
3794
3795
3796
3797#ifdef CONFIG_SMP
3798void __init setup_ioapic_dest(void)
3799{
3800 int pin, ioapic, irq, irq_entry;
3801 const struct cpumask *mask;
3802 struct irq_data *idata;
3803
3804 if (skip_ioapic_setup == 1)
3805 return;
3806
3807 for (ioapic = 0; ioapic < nr_ioapics; ioapic++)
3808 for (pin = 0; pin < ioapics[ioapic].nr_registers; pin++) {
3809 irq_entry = find_irq_entry(ioapic, pin, mp_INT);
3810 if (irq_entry == -1)
3811 continue;
3812 irq = pin_2_irq(irq_entry, ioapic, pin);
3813
3814 if ((ioapic > 0) && (irq > 16))
3815 continue;
3816
3817 idata = irq_get_irq_data(irq);
3818
3819
3820
3821
3822 if (!irqd_can_balance(idata) || irqd_affinity_was_set(idata))
3823 mask = idata->affinity;
3824 else
3825 mask = apic->target_cpus();
3826
3827 if (intr_remapping_enabled)
3828 ir_ioapic_set_affinity(idata, mask, false);
3829 else
3830 ioapic_set_affinity(idata, mask, false);
3831 }
3832
3833}
3834#endif
3835
3836#define IOAPIC_RESOURCE_NAME_SIZE 11
3837
3838static struct resource *ioapic_resources;
3839
3840static struct resource * __init ioapic_setup_resources(int nr_ioapics)
3841{
3842 unsigned long n;
3843 struct resource *res;
3844 char *mem;
3845 int i;
3846
3847 if (nr_ioapics <= 0)
3848 return NULL;
3849
3850 n = IOAPIC_RESOURCE_NAME_SIZE + sizeof(struct resource);
3851 n *= nr_ioapics;
3852
3853 mem = alloc_bootmem(n);
3854 res = (void *)mem;
3855
3856 mem += sizeof(struct resource) * nr_ioapics;
3857
3858 for (i = 0; i < nr_ioapics; i++) {
3859 res[i].name = mem;
3860 res[i].flags = IORESOURCE_MEM | IORESOURCE_BUSY;
3861 snprintf(mem, IOAPIC_RESOURCE_NAME_SIZE, "IOAPIC %u", i);
3862 mem += IOAPIC_RESOURCE_NAME_SIZE;
3863 }
3864
3865 ioapic_resources = res;
3866
3867 return res;
3868}
3869
3870void __init ioapic_and_gsi_init(void)
3871{
3872 unsigned long ioapic_phys, idx = FIX_IO_APIC_BASE_0;
3873 struct resource *ioapic_res;
3874 int i;
3875
3876 ioapic_res = ioapic_setup_resources(nr_ioapics);
3877 for (i = 0; i < nr_ioapics; i++) {
3878 if (smp_found_config) {
3879 ioapic_phys = mpc_ioapic_addr(i);
3880#ifdef CONFIG_X86_32
3881 if (!ioapic_phys) {
3882 printk(KERN_ERR
3883 "WARNING: bogus zero IO-APIC "
3884 "address found in MPTABLE, "
3885 "disabling IO/APIC support!\n");
3886 smp_found_config = 0;
3887 skip_ioapic_setup = 1;
3888 goto fake_ioapic_page;
3889 }
3890#endif
3891 } else {
3892#ifdef CONFIG_X86_32
3893fake_ioapic_page:
3894#endif
3895 ioapic_phys = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
3896 ioapic_phys = __pa(ioapic_phys);
3897 }
3898 set_fixmap_nocache(idx, ioapic_phys);
3899 apic_printk(APIC_VERBOSE, "mapped IOAPIC to %08lx (%08lx)\n",
3900 __fix_to_virt(idx) + (ioapic_phys & ~PAGE_MASK),
3901 ioapic_phys);
3902 idx++;
3903
3904 ioapic_res->start = ioapic_phys;
3905 ioapic_res->end = ioapic_phys + IO_APIC_SLOT_SIZE - 1;
3906 ioapic_res++;
3907 }
3908
3909 probe_nr_irqs_gsi();
3910}
3911
3912void __init ioapic_insert_resources(void)
3913{
3914 int i;
3915 struct resource *r = ioapic_resources;
3916
3917 if (!r) {
3918 if (nr_ioapics > 0)
3919 printk(KERN_ERR
3920 "IO APIC resources couldn't be allocated.\n");
3921 return;
3922 }
3923
3924 for (i = 0; i < nr_ioapics; i++) {
3925 insert_resource(&iomem_resource, r);
3926 r++;
3927 }
3928}
3929
3930int mp_find_ioapic(u32 gsi)
3931{
3932 int i = 0;
3933
3934 if (nr_ioapics == 0)
3935 return -1;
3936
3937
3938 for (i = 0; i < nr_ioapics; i++) {
3939 struct mp_ioapic_gsi *gsi_cfg = mp_ioapic_gsi_routing(i);
3940 if ((gsi >= gsi_cfg->gsi_base)
3941 && (gsi <= gsi_cfg->gsi_end))
3942 return i;
3943 }
3944
3945 printk(KERN_ERR "ERROR: Unable to locate IOAPIC for GSI %d\n", gsi);
3946 return -1;
3947}
3948
3949int mp_find_ioapic_pin(int ioapic, u32 gsi)
3950{
3951 struct mp_ioapic_gsi *gsi_cfg;
3952
3953 if (WARN_ON(ioapic == -1))
3954 return -1;
3955
3956 gsi_cfg = mp_ioapic_gsi_routing(ioapic);
3957 if (WARN_ON(gsi > gsi_cfg->gsi_end))
3958 return -1;
3959
3960 return gsi - gsi_cfg->gsi_base;
3961}
3962
3963static __init int bad_ioapic(unsigned long address)
3964{
3965 if (nr_ioapics >= MAX_IO_APICS) {
3966 printk(KERN_WARNING "WARNING: Max # of I/O APICs (%d) exceeded "
3967 "(found %d), skipping\n", MAX_IO_APICS, nr_ioapics);
3968 return 1;
3969 }
3970 if (!address) {
3971 printk(KERN_WARNING "WARNING: Bogus (zero) I/O APIC address"
3972 " found in table, skipping!\n");
3973 return 1;
3974 }
3975 return 0;
3976}
3977
3978void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
3979{
3980 int idx = 0;
3981 int entries;
3982 struct mp_ioapic_gsi *gsi_cfg;
3983
3984 if (bad_ioapic(address))
3985 return;
3986
3987 idx = nr_ioapics;
3988
3989 ioapics[idx].mp_config.type = MP_IOAPIC;
3990 ioapics[idx].mp_config.flags = MPC_APIC_USABLE;
3991 ioapics[idx].mp_config.apicaddr = address;
3992
3993 set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
3994 ioapics[idx].mp_config.apicid = io_apic_unique_id(id);
3995 ioapics[idx].mp_config.apicver = io_apic_get_version(idx);
3996
3997
3998
3999
4000
4001 entries = io_apic_get_redir_entries(idx);
4002 gsi_cfg = mp_ioapic_gsi_routing(idx);
4003 gsi_cfg->gsi_base = gsi_base;
4004 gsi_cfg->gsi_end = gsi_base + entries - 1;
4005
4006
4007
4008
4009 ioapics[idx].nr_registers = entries;
4010
4011 if (gsi_cfg->gsi_end >= gsi_top)
4012 gsi_top = gsi_cfg->gsi_end + 1;
4013
4014 printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, "
4015 "GSI %d-%d\n", idx, mpc_ioapic_id(idx),
4016 mpc_ioapic_ver(idx), mpc_ioapic_addr(idx),
4017 gsi_cfg->gsi_base, gsi_cfg->gsi_end);
4018
4019 nr_ioapics++;
4020}
4021
4022
4023void __init pre_init_apic_IRQ0(void)
4024{
4025 struct io_apic_irq_attr attr = { 0, 0, 0, 0 };
4026
4027 printk(KERN_INFO "Early APIC setup for system timer0\n");
4028#ifndef CONFIG_SMP
4029 physid_set_mask_of_physid(boot_cpu_physical_apicid,
4030 &phys_cpu_present_map);
4031#endif
4032 setup_local_APIC();
4033
4034 io_apic_setup_irq_pin(0, 0, &attr);
4035 irq_set_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq,
4036 "edge");
4037}
4038