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/mc146818rtc.h>
29#include <linux/compiler.h>
30#include <linux/acpi.h>
31#include <linux/module.h>
32#include <linux/sysdev.h>
33#include <linux/pci.h>
34#include <linux/msi.h>
35#include <linux/htirq.h>
36#include <linux/freezer.h>
37#include <linux/kthread.h>
38
39#include <asm/io.h>
40#include <asm/smp.h>
41#include <asm/desc.h>
42#include <asm/timer.h>
43#include <asm/i8259.h>
44#include <asm/nmi.h>
45#include <asm/msidef.h>
46#include <asm/hypertransport.h>
47
48#include <mach_apic.h>
49#include <mach_apicdef.h>
50
51#include "io_ports.h"
52
53int (*ioapic_renumber_irq)(int ioapic, int irq);
54atomic_t irq_mis_count;
55
56
57static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
58
59static DEFINE_SPINLOCK(ioapic_lock);
60static DEFINE_SPINLOCK(vector_lock);
61
62int timer_over_8254 __initdata = 1;
63
64
65
66
67
68int sis_apic_bug = -1;
69
70
71
72
73int nr_ioapic_registers[MAX_IO_APICS];
74
75static int disable_timer_pin_1 __initdata;
76
77
78
79
80
81#define MAX_PLUS_SHARED_IRQS NR_IRQS
82#define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
83
84
85
86
87
88
89
90
91static struct irq_pin_list {
92 int apic, pin, next;
93} irq_2_pin[PIN_MAP_SIZE];
94
95struct io_apic {
96 unsigned int index;
97 unsigned int unused[3];
98 unsigned int data;
99};
100
101static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx)
102{
103 return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx)
104 + (mp_ioapics[idx].mpc_apicaddr & ~PAGE_MASK);
105}
106
107static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg)
108{
109 struct io_apic __iomem *io_apic = io_apic_base(apic);
110 writel(reg, &io_apic->index);
111 return readl(&io_apic->data);
112}
113
114static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value)
115{
116 struct io_apic __iomem *io_apic = io_apic_base(apic);
117 writel(reg, &io_apic->index);
118 writel(value, &io_apic->data);
119}
120
121
122
123
124
125
126
127static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned int value)
128{
129 volatile struct io_apic __iomem *io_apic = io_apic_base(apic);
130 if (sis_apic_bug)
131 writel(reg, &io_apic->index);
132 writel(value, &io_apic->data);
133}
134
135union entry_union {
136 struct { u32 w1, w2; };
137 struct IO_APIC_route_entry entry;
138};
139
140static struct IO_APIC_route_entry ioapic_read_entry(int apic, int pin)
141{
142 union entry_union eu;
143 unsigned long flags;
144 spin_lock_irqsave(&ioapic_lock, flags);
145 eu.w1 = io_apic_read(apic, 0x10 + 2 * pin);
146 eu.w2 = io_apic_read(apic, 0x11 + 2 * pin);
147 spin_unlock_irqrestore(&ioapic_lock, flags);
148 return eu.entry;
149}
150
151
152
153
154
155
156
157static void
158__ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e)
159{
160 union entry_union eu;
161 eu.entry = e;
162 io_apic_write(apic, 0x11 + 2*pin, eu.w2);
163 io_apic_write(apic, 0x10 + 2*pin, eu.w1);
164}
165
166static void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e)
167{
168 unsigned long flags;
169 spin_lock_irqsave(&ioapic_lock, flags);
170 __ioapic_write_entry(apic, pin, e);
171 spin_unlock_irqrestore(&ioapic_lock, flags);
172}
173
174
175
176
177
178
179static void ioapic_mask_entry(int apic, int pin)
180{
181 unsigned long flags;
182 union entry_union eu = { .entry.mask = 1 };
183
184 spin_lock_irqsave(&ioapic_lock, flags);
185 io_apic_write(apic, 0x10 + 2*pin, eu.w1);
186 io_apic_write(apic, 0x11 + 2*pin, eu.w2);
187 spin_unlock_irqrestore(&ioapic_lock, flags);
188}
189
190
191
192
193
194
195static void add_pin_to_irq(unsigned int irq, int apic, int pin)
196{
197 static int first_free_entry = NR_IRQS;
198 struct irq_pin_list *entry = irq_2_pin + irq;
199
200 while (entry->next)
201 entry = irq_2_pin + entry->next;
202
203 if (entry->pin != -1) {
204 entry->next = first_free_entry;
205 entry = irq_2_pin + entry->next;
206 if (++first_free_entry >= PIN_MAP_SIZE)
207 panic("io_apic.c: whoops");
208 }
209 entry->apic = apic;
210 entry->pin = pin;
211}
212
213
214
215
216static void __init replace_pin_at_irq(unsigned int irq,
217 int oldapic, int oldpin,
218 int newapic, int newpin)
219{
220 struct irq_pin_list *entry = irq_2_pin + irq;
221
222 while (1) {
223 if (entry->apic == oldapic && entry->pin == oldpin) {
224 entry->apic = newapic;
225 entry->pin = newpin;
226 }
227 if (!entry->next)
228 break;
229 entry = irq_2_pin + entry->next;
230 }
231}
232
233static void __modify_IO_APIC_irq (unsigned int irq, unsigned long enable, unsigned long disable)
234{
235 struct irq_pin_list *entry = irq_2_pin + irq;
236 unsigned int pin, reg;
237
238 for (;;) {
239 pin = entry->pin;
240 if (pin == -1)
241 break;
242 reg = io_apic_read(entry->apic, 0x10 + pin*2);
243 reg &= ~disable;
244 reg |= enable;
245 io_apic_modify(entry->apic, 0x10 + pin*2, reg);
246 if (!entry->next)
247 break;
248 entry = irq_2_pin + entry->next;
249 }
250}
251
252
253static void __mask_IO_APIC_irq (unsigned int irq)
254{
255 __modify_IO_APIC_irq(irq, 0x00010000, 0);
256}
257
258
259static void __unmask_IO_APIC_irq (unsigned int irq)
260{
261 __modify_IO_APIC_irq(irq, 0, 0x00010000);
262}
263
264
265static void __mask_and_edge_IO_APIC_irq (unsigned int irq)
266{
267 __modify_IO_APIC_irq(irq, 0x00010000, 0x00008000);
268}
269
270
271static void __unmask_and_level_IO_APIC_irq (unsigned int irq)
272{
273 __modify_IO_APIC_irq(irq, 0x00008000, 0x00010000);
274}
275
276static void mask_IO_APIC_irq (unsigned int irq)
277{
278 unsigned long flags;
279
280 spin_lock_irqsave(&ioapic_lock, flags);
281 __mask_IO_APIC_irq(irq);
282 spin_unlock_irqrestore(&ioapic_lock, flags);
283}
284
285static void unmask_IO_APIC_irq (unsigned int irq)
286{
287 unsigned long flags;
288
289 spin_lock_irqsave(&ioapic_lock, flags);
290 __unmask_IO_APIC_irq(irq);
291 spin_unlock_irqrestore(&ioapic_lock, flags);
292}
293
294static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
295{
296 struct IO_APIC_route_entry entry;
297
298
299 entry = ioapic_read_entry(apic, pin);
300 if (entry.delivery_mode == dest_SMI)
301 return;
302
303
304
305
306 ioapic_mask_entry(apic, pin);
307}
308
309static void clear_IO_APIC (void)
310{
311 int apic, pin;
312
313 for (apic = 0; apic < nr_ioapics; apic++)
314 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
315 clear_IO_APIC_pin(apic, pin);
316}
317
318#ifdef CONFIG_SMP
319static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask)
320{
321 unsigned long flags;
322 int pin;
323 struct irq_pin_list *entry = irq_2_pin + irq;
324 unsigned int apicid_value;
325 cpumask_t tmp;
326
327 cpus_and(tmp, cpumask, cpu_online_map);
328 if (cpus_empty(tmp))
329 tmp = TARGET_CPUS;
330
331 cpus_and(cpumask, tmp, CPU_MASK_ALL);
332
333 apicid_value = cpu_mask_to_apicid(cpumask);
334
335 apicid_value = apicid_value << 24;
336 spin_lock_irqsave(&ioapic_lock, flags);
337 for (;;) {
338 pin = entry->pin;
339 if (pin == -1)
340 break;
341 io_apic_write(entry->apic, 0x10 + 1 + pin*2, apicid_value);
342 if (!entry->next)
343 break;
344 entry = irq_2_pin + entry->next;
345 }
346 irq_desc[irq].affinity = cpumask;
347 spin_unlock_irqrestore(&ioapic_lock, flags);
348}
349
350#if defined(CONFIG_IRQBALANCE)
351# include <asm/processor.h>
352# include <linux/kernel_stat.h>
353# include <linux/slab.h>
354# include <linux/timer.h>
355
356#ifdef CONFIG_BALANCED_IRQ_DEBUG
357# define TDprintk(x...) do { printk("<%ld:%s:%d>: ", jiffies, __FILE__, __LINE__); printk(x); } while (0)
358# define Dprintk(x...) do { TDprintk(x); } while (0)
359# else
360# define TDprintk(x...)
361# define Dprintk(x...)
362# endif
363
364#define IRQBALANCE_CHECK_ARCH -999
365#define MAX_BALANCED_IRQ_INTERVAL (5*HZ)
366#define MIN_BALANCED_IRQ_INTERVAL (HZ/2)
367#define BALANCED_IRQ_MORE_DELTA (HZ/10)
368#define BALANCED_IRQ_LESS_DELTA (HZ)
369
370static int irqbalance_disabled __read_mostly = IRQBALANCE_CHECK_ARCH;
371static int physical_balance __read_mostly;
372static long balanced_irq_interval __read_mostly = MAX_BALANCED_IRQ_INTERVAL;
373
374static struct irq_cpu_info {
375 unsigned long * last_irq;
376 unsigned long * irq_delta;
377 unsigned long irq;
378} irq_cpu_data[NR_CPUS];
379
380#define CPU_IRQ(cpu) (irq_cpu_data[cpu].irq)
381#define LAST_CPU_IRQ(cpu,irq) (irq_cpu_data[cpu].last_irq[irq])
382#define IRQ_DELTA(cpu,irq) (irq_cpu_data[cpu].irq_delta[irq])
383
384#define IDLE_ENOUGH(cpu,now) \
385 (idle_cpu(cpu) && ((now) - per_cpu(irq_stat, (cpu)).idle_timestamp > 1))
386
387#define IRQ_ALLOWED(cpu, allowed_mask) cpu_isset(cpu, allowed_mask)
388
389#define CPU_TO_PACKAGEINDEX(i) (first_cpu(cpu_sibling_map[i]))
390
391static cpumask_t balance_irq_affinity[NR_IRQS] = {
392 [0 ... NR_IRQS-1] = CPU_MASK_ALL
393};
394
395void set_balance_irq_affinity(unsigned int irq, cpumask_t mask)
396{
397 balance_irq_affinity[irq] = mask;
398}
399
400static unsigned long move(int curr_cpu, cpumask_t allowed_mask,
401 unsigned long now, int direction)
402{
403 int search_idle = 1;
404 int cpu = curr_cpu;
405
406 goto inside;
407
408 do {
409 if (unlikely(cpu == curr_cpu))
410 search_idle = 0;
411inside:
412 if (direction == 1) {
413 cpu++;
414 if (cpu >= NR_CPUS)
415 cpu = 0;
416 } else {
417 cpu--;
418 if (cpu == -1)
419 cpu = NR_CPUS-1;
420 }
421 } while (!cpu_online(cpu) || !IRQ_ALLOWED(cpu,allowed_mask) ||
422 (search_idle && !IDLE_ENOUGH(cpu,now)));
423
424 return cpu;
425}
426
427static inline void balance_irq(int cpu, int irq)
428{
429 unsigned long now = jiffies;
430 cpumask_t allowed_mask;
431 unsigned int new_cpu;
432
433 if (irqbalance_disabled)
434 return;
435
436 cpus_and(allowed_mask, cpu_online_map, balance_irq_affinity[irq]);
437 new_cpu = move(cpu, allowed_mask, now, 1);
438 if (cpu != new_cpu) {
439 set_pending_irq(irq, cpumask_of_cpu(new_cpu));
440 }
441}
442
443static inline void rotate_irqs_among_cpus(unsigned long useful_load_threshold)
444{
445 int i, j;
446 Dprintk("Rotating IRQs among CPUs.\n");
447 for_each_online_cpu(i) {
448 for (j = 0; j < NR_IRQS; j++) {
449 if (!irq_desc[j].action)
450 continue;
451
452 if (IRQ_DELTA(CPU_TO_PACKAGEINDEX(i),j) <
453 useful_load_threshold)
454 continue;
455 balance_irq(i, j);
456 }
457 }
458 balanced_irq_interval = max((long)MIN_BALANCED_IRQ_INTERVAL,
459 balanced_irq_interval - BALANCED_IRQ_LESS_DELTA);
460 return;
461}
462
463static void do_irq_balance(void)
464{
465 int i, j;
466 unsigned long max_cpu_irq = 0, min_cpu_irq = (~0);
467 unsigned long move_this_load = 0;
468 int max_loaded = 0, min_loaded = 0;
469 int load;
470 unsigned long useful_load_threshold = balanced_irq_interval + 10;
471 int selected_irq;
472 int tmp_loaded, first_attempt = 1;
473 unsigned long tmp_cpu_irq;
474 unsigned long imbalance = 0;
475 cpumask_t allowed_mask, target_cpu_mask, tmp;
476
477 for_each_possible_cpu(i) {
478 int package_index;
479 CPU_IRQ(i) = 0;
480 if (!cpu_online(i))
481 continue;
482 package_index = CPU_TO_PACKAGEINDEX(i);
483 for (j = 0; j < NR_IRQS; j++) {
484 unsigned long value_now, delta;
485
486 if (!irq_desc[j].action || irq_balancing_disabled(j))
487 continue;
488 if ( package_index == i )
489 IRQ_DELTA(package_index,j) = 0;
490
491 value_now = (unsigned long) kstat_cpu(i).irqs[j];
492
493
494 delta = value_now - LAST_CPU_IRQ(i,j);
495
496
497 LAST_CPU_IRQ(i,j) = value_now;
498
499
500 if (delta < useful_load_threshold)
501 continue;
502
503 IRQ_DELTA(package_index,j) += delta;
504
505
506 if (i != package_index)
507 CPU_IRQ(i) += delta;
508
509
510
511
512
513
514 CPU_IRQ(package_index) += delta;
515 }
516 }
517
518 for_each_online_cpu(i) {
519 if (i != CPU_TO_PACKAGEINDEX(i))
520 continue;
521 if (min_cpu_irq > CPU_IRQ(i)) {
522 min_cpu_irq = CPU_IRQ(i);
523 min_loaded = i;
524 }
525 }
526 max_cpu_irq = ULONG_MAX;
527
528tryanothercpu:
529
530
531
532
533 tmp_cpu_irq = 0;
534 tmp_loaded = -1;
535 for_each_online_cpu(i) {
536 if (i != CPU_TO_PACKAGEINDEX(i))
537 continue;
538 if (max_cpu_irq <= CPU_IRQ(i))
539 continue;
540 if (tmp_cpu_irq < CPU_IRQ(i)) {
541 tmp_cpu_irq = CPU_IRQ(i);
542 tmp_loaded = i;
543 }
544 }
545
546 if (tmp_loaded == -1) {
547
548
549
550
551 if (!first_attempt && imbalance >= useful_load_threshold) {
552 rotate_irqs_among_cpus(useful_load_threshold);
553 return;
554 }
555 goto not_worth_the_effort;
556 }
557
558 first_attempt = 0;
559 max_cpu_irq = tmp_cpu_irq;
560 max_loaded = tmp_loaded;
561 imbalance = (max_cpu_irq - min_cpu_irq) / 2;
562
563 Dprintk("max_loaded cpu = %d\n", max_loaded);
564 Dprintk("min_loaded cpu = %d\n", min_loaded);
565 Dprintk("max_cpu_irq load = %ld\n", max_cpu_irq);
566 Dprintk("min_cpu_irq load = %ld\n", min_cpu_irq);
567 Dprintk("load imbalance = %lu\n", imbalance);
568
569
570
571
572 if (imbalance < (max_cpu_irq >> 3)) {
573 Dprintk("Imbalance too trivial\n");
574 goto not_worth_the_effort;
575 }
576
577tryanotherirq:
578
579
580
581 move_this_load = 0;
582 selected_irq = -1;
583 for (j = 0; j < NR_IRQS; j++) {
584
585 if (!irq_desc[j].action)
586 continue;
587 if (imbalance <= IRQ_DELTA(max_loaded,j))
588 continue;
589
590
591
592 if (move_this_load < IRQ_DELTA(max_loaded,j)) {
593 move_this_load = IRQ_DELTA(max_loaded,j);
594 selected_irq = j;
595 }
596 }
597 if (selected_irq == -1) {
598 goto tryanothercpu;
599 }
600
601 imbalance = move_this_load;
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616 load = CPU_IRQ(min_loaded) >> 1;
617 for_each_cpu_mask(j, cpu_sibling_map[min_loaded]) {
618 if (load > CPU_IRQ(j)) {
619
620 load = CPU_IRQ(j);
621 min_loaded = j;
622 }
623 }
624
625 cpus_and(allowed_mask,
626 cpu_online_map,
627 balance_irq_affinity[selected_irq]);
628 target_cpu_mask = cpumask_of_cpu(min_loaded);
629 cpus_and(tmp, target_cpu_mask, allowed_mask);
630
631 if (!cpus_empty(tmp)) {
632
633 Dprintk("irq = %d moved to cpu = %d\n",
634 selected_irq, min_loaded);
635
636 set_pending_irq(selected_irq, cpumask_of_cpu(min_loaded));
637
638
639
640
641 balanced_irq_interval = max((long)MIN_BALANCED_IRQ_INTERVAL,
642 balanced_irq_interval - BALANCED_IRQ_LESS_DELTA);
643 return;
644 }
645 goto tryanotherirq;
646
647not_worth_the_effort:
648
649
650
651
652 balanced_irq_interval = min((long)MAX_BALANCED_IRQ_INTERVAL,
653 balanced_irq_interval + BALANCED_IRQ_MORE_DELTA);
654 Dprintk("IRQ worth rotating not found\n");
655 return;
656}
657
658static int balanced_irq(void *unused)
659{
660 int i;
661 unsigned long prev_balance_time = jiffies;
662 long time_remaining = balanced_irq_interval;
663
664
665 for (i = 0 ; i < NR_IRQS ; i++) {
666 irq_desc[i].pending_mask = cpumask_of_cpu(0);
667 set_pending_irq(i, cpumask_of_cpu(0));
668 }
669
670 for ( ; ; ) {
671 time_remaining = schedule_timeout_interruptible(time_remaining);
672 try_to_freeze();
673 if (time_after(jiffies,
674 prev_balance_time+balanced_irq_interval)) {
675 preempt_disable();
676 do_irq_balance();
677 prev_balance_time = jiffies;
678 time_remaining = balanced_irq_interval;
679 preempt_enable();
680 }
681 }
682 return 0;
683}
684
685static int __init balanced_irq_init(void)
686{
687 int i;
688 struct cpuinfo_x86 *c;
689 cpumask_t tmp;
690
691 cpus_shift_right(tmp, cpu_online_map, 2);
692 c = &boot_cpu_data;
693
694 if (irqbalance_disabled == IRQBALANCE_CHECK_ARCH)
695 irqbalance_disabled = NO_BALANCE_IRQ;
696 if (irqbalance_disabled)
697 return 0;
698
699
700 if (num_online_cpus() < 2) {
701 irqbalance_disabled = 1;
702 return 0;
703 }
704
705
706
707
708 if (smp_num_siblings > 1 && !cpus_empty(tmp))
709 physical_balance = 1;
710
711 for_each_online_cpu(i) {
712 irq_cpu_data[i].irq_delta = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL);
713 irq_cpu_data[i].last_irq = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL);
714 if (irq_cpu_data[i].irq_delta == NULL || irq_cpu_data[i].last_irq == NULL) {
715 printk(KERN_ERR "balanced_irq_init: out of memory");
716 goto failed;
717 }
718 memset(irq_cpu_data[i].irq_delta,0,sizeof(unsigned long) * NR_IRQS);
719 memset(irq_cpu_data[i].last_irq,0,sizeof(unsigned long) * NR_IRQS);
720 }
721
722 printk(KERN_INFO "Starting balanced_irq\n");
723 if (!IS_ERR(kthread_run(balanced_irq, NULL, "kirqd")))
724 return 0;
725 printk(KERN_ERR "balanced_irq_init: failed to spawn balanced_irq");
726failed:
727 for_each_possible_cpu(i) {
728 kfree(irq_cpu_data[i].irq_delta);
729 irq_cpu_data[i].irq_delta = NULL;
730 kfree(irq_cpu_data[i].last_irq);
731 irq_cpu_data[i].last_irq = NULL;
732 }
733 return 0;
734}
735
736int __devinit irqbalance_disable(char *str)
737{
738 irqbalance_disabled = 1;
739 return 1;
740}
741
742__setup("noirqbalance", irqbalance_disable);
743
744late_initcall(balanced_irq_init);
745#endif
746#endif
747
748#ifndef CONFIG_SMP
749void fastcall send_IPI_self(int vector)
750{
751 unsigned int cfg;
752
753
754
755
756 apic_wait_icr_idle();
757 cfg = APIC_DM_FIXED | APIC_DEST_SELF | vector | APIC_DEST_LOGICAL;
758
759
760
761 apic_write_around(APIC_ICR, cfg);
762}
763#endif
764
765
766
767
768
769
770
771#define MAX_PIRQS 8
772static int pirq_entries [MAX_PIRQS];
773static int pirqs_enabled;
774int skip_ioapic_setup;
775
776static int __init ioapic_setup(char *str)
777{
778 skip_ioapic_setup = 1;
779 return 1;
780}
781
782__setup("noapic", ioapic_setup);
783
784static int __init ioapic_pirq_setup(char *str)
785{
786 int i, max;
787 int ints[MAX_PIRQS+1];
788
789 get_options(str, ARRAY_SIZE(ints), ints);
790
791 for (i = 0; i < MAX_PIRQS; i++)
792 pirq_entries[i] = -1;
793
794 pirqs_enabled = 1;
795 apic_printk(APIC_VERBOSE, KERN_INFO
796 "PIRQ redirection, working around broken MP-BIOS.\n");
797 max = MAX_PIRQS;
798 if (ints[0] < MAX_PIRQS)
799 max = ints[0];
800
801 for (i = 0; i < max; i++) {
802 apic_printk(APIC_VERBOSE, KERN_DEBUG
803 "... PIRQ%d -> IRQ %d\n", i, ints[i+1]);
804
805
806
807 pirq_entries[MAX_PIRQS-i-1] = ints[i+1];
808 }
809 return 1;
810}
811
812__setup("pirq=", ioapic_pirq_setup);
813
814
815
816
817static int find_irq_entry(int apic, int pin, int type)
818{
819 int i;
820
821 for (i = 0; i < mp_irq_entries; i++)
822 if (mp_irqs[i].mpc_irqtype == type &&
823 (mp_irqs[i].mpc_dstapic == mp_ioapics[apic].mpc_apicid ||
824 mp_irqs[i].mpc_dstapic == MP_APIC_ALL) &&
825 mp_irqs[i].mpc_dstirq == pin)
826 return i;
827
828 return -1;
829}
830
831
832
833
834static int __init find_isa_irq_pin(int irq, int type)
835{
836 int i;
837
838 for (i = 0; i < mp_irq_entries; i++) {
839 int lbus = mp_irqs[i].mpc_srcbus;
840
841 if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA ||
842 mp_bus_id_to_type[lbus] == MP_BUS_EISA ||
843 mp_bus_id_to_type[lbus] == MP_BUS_MCA
844 ) &&
845 (mp_irqs[i].mpc_irqtype == type) &&
846 (mp_irqs[i].mpc_srcbusirq == irq))
847
848 return mp_irqs[i].mpc_dstirq;
849 }
850 return -1;
851}
852
853static int __init find_isa_irq_apic(int irq, int type)
854{
855 int i;
856
857 for (i = 0; i < mp_irq_entries; i++) {
858 int lbus = mp_irqs[i].mpc_srcbus;
859
860 if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA ||
861 mp_bus_id_to_type[lbus] == MP_BUS_EISA ||
862 mp_bus_id_to_type[lbus] == MP_BUS_MCA
863 ) &&
864 (mp_irqs[i].mpc_irqtype == type) &&
865 (mp_irqs[i].mpc_srcbusirq == irq))
866 break;
867 }
868 if (i < mp_irq_entries) {
869 int apic;
870 for(apic = 0; apic < nr_ioapics; apic++) {
871 if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic)
872 return apic;
873 }
874 }
875
876 return -1;
877}
878
879
880
881
882
883static int pin_2_irq(int idx, int apic, int pin);
884
885int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
886{
887 int apic, i, best_guess = -1;
888
889 apic_printk(APIC_DEBUG, "querying PCI -> IRQ mapping bus:%d, "
890 "slot:%d, pin:%d.\n", bus, slot, pin);
891 if (mp_bus_id_to_pci_bus[bus] == -1) {
892 printk(KERN_WARNING "PCI BIOS passed nonexistent PCI bus %d!\n", bus);
893 return -1;
894 }
895 for (i = 0; i < mp_irq_entries; i++) {
896 int lbus = mp_irqs[i].mpc_srcbus;
897
898 for (apic = 0; apic < nr_ioapics; apic++)
899 if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic ||
900 mp_irqs[i].mpc_dstapic == MP_APIC_ALL)
901 break;
902
903 if ((mp_bus_id_to_type[lbus] == MP_BUS_PCI) &&
904 !mp_irqs[i].mpc_irqtype &&
905 (bus == lbus) &&
906 (slot == ((mp_irqs[i].mpc_srcbusirq >> 2) & 0x1f))) {
907 int irq = pin_2_irq(i,apic,mp_irqs[i].mpc_dstirq);
908
909 if (!(apic || IO_APIC_IRQ(irq)))
910 continue;
911
912 if (pin == (mp_irqs[i].mpc_srcbusirq & 3))
913 return irq;
914
915
916
917
918 if (best_guess < 0)
919 best_guess = irq;
920 }
921 }
922 return best_guess;
923}
924EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector);
925
926
927
928
929
930
931#ifdef CONFIG_SMP
932void __init setup_ioapic_dest(void)
933{
934 int pin, ioapic, irq, irq_entry;
935
936 if (skip_ioapic_setup == 1)
937 return;
938
939 for (ioapic = 0; ioapic < nr_ioapics; ioapic++) {
940 for (pin = 0; pin < nr_ioapic_registers[ioapic]; pin++) {
941 irq_entry = find_irq_entry(ioapic, pin, mp_INT);
942 if (irq_entry == -1)
943 continue;
944 irq = pin_2_irq(irq_entry, ioapic, pin);
945 set_ioapic_affinity_irq(irq, TARGET_CPUS);
946 }
947
948 }
949}
950#endif
951
952
953
954
955static int EISA_ELCR(unsigned int irq)
956{
957 if (irq < 16) {
958 unsigned int port = 0x4d0 + (irq >> 3);
959 return (inb(port) >> (irq & 7)) & 1;
960 }
961 apic_printk(APIC_VERBOSE, KERN_INFO
962 "Broken MPtable reports ISA irq %d\n", irq);
963 return 0;
964}
965
966
967
968
969
970
971#define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].mpc_srcbusirq))
972#define default_EISA_polarity(idx) (0)
973
974
975
976
977#define default_ISA_trigger(idx) (0)
978#define default_ISA_polarity(idx) (0)
979
980
981
982
983#define default_PCI_trigger(idx) (1)
984#define default_PCI_polarity(idx) (1)
985
986
987
988
989#define default_MCA_trigger(idx) (1)
990#define default_MCA_polarity(idx) (0)
991
992static int __init MPBIOS_polarity(int idx)
993{
994 int bus = mp_irqs[idx].mpc_srcbus;
995 int polarity;
996
997
998
999
1000 switch (mp_irqs[idx].mpc_irqflag & 3)
1001 {
1002 case 0:
1003 {
1004 switch (mp_bus_id_to_type[bus])
1005 {
1006 case MP_BUS_ISA:
1007 {
1008 polarity = default_ISA_polarity(idx);
1009 break;
1010 }
1011 case MP_BUS_EISA:
1012 {
1013 polarity = default_EISA_polarity(idx);
1014 break;
1015 }
1016 case MP_BUS_PCI:
1017 {
1018 polarity = default_PCI_polarity(idx);
1019 break;
1020 }
1021 case MP_BUS_MCA:
1022 {
1023 polarity = default_MCA_polarity(idx);
1024 break;
1025 }
1026 default:
1027 {
1028 printk(KERN_WARNING "broken BIOS!!\n");
1029 polarity = 1;
1030 break;
1031 }
1032 }
1033 break;
1034 }
1035 case 1:
1036 {
1037 polarity = 0;
1038 break;
1039 }
1040 case 2:
1041 {
1042 printk(KERN_WARNING "broken BIOS!!\n");
1043 polarity = 1;
1044 break;
1045 }
1046 case 3:
1047 {
1048 polarity = 1;
1049 break;
1050 }
1051 default:
1052 {
1053 printk(KERN_WARNING "broken BIOS!!\n");
1054 polarity = 1;
1055 break;
1056 }
1057 }
1058 return polarity;
1059}
1060
1061static int MPBIOS_trigger(int idx)
1062{
1063 int bus = mp_irqs[idx].mpc_srcbus;
1064 int trigger;
1065
1066
1067
1068
1069 switch ((mp_irqs[idx].mpc_irqflag>>2) & 3)
1070 {
1071 case 0:
1072 {
1073 switch (mp_bus_id_to_type[bus])
1074 {
1075 case MP_BUS_ISA:
1076 {
1077 trigger = default_ISA_trigger(idx);
1078 break;
1079 }
1080 case MP_BUS_EISA:
1081 {
1082 trigger = default_EISA_trigger(idx);
1083 break;
1084 }
1085 case MP_BUS_PCI:
1086 {
1087 trigger = default_PCI_trigger(idx);
1088 break;
1089 }
1090 case MP_BUS_MCA:
1091 {
1092 trigger = default_MCA_trigger(idx);
1093 break;
1094 }
1095 default:
1096 {
1097 printk(KERN_WARNING "broken BIOS!!\n");
1098 trigger = 1;
1099 break;
1100 }
1101 }
1102 break;
1103 }
1104 case 1:
1105 {
1106 trigger = 0;
1107 break;
1108 }
1109 case 2:
1110 {
1111 printk(KERN_WARNING "broken BIOS!!\n");
1112 trigger = 1;
1113 break;
1114 }
1115 case 3:
1116 {
1117 trigger = 1;
1118 break;
1119 }
1120 default:
1121 {
1122 printk(KERN_WARNING "broken BIOS!!\n");
1123 trigger = 0;
1124 break;
1125 }
1126 }
1127 return trigger;
1128}
1129
1130static inline int irq_polarity(int idx)
1131{
1132 return MPBIOS_polarity(idx);
1133}
1134
1135static inline int irq_trigger(int idx)
1136{
1137 return MPBIOS_trigger(idx);
1138}
1139
1140static int pin_2_irq(int idx, int apic, int pin)
1141{
1142 int irq, i;
1143 int bus = mp_irqs[idx].mpc_srcbus;
1144
1145
1146
1147
1148 if (mp_irqs[idx].mpc_dstirq != pin)
1149 printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
1150
1151 switch (mp_bus_id_to_type[bus])
1152 {
1153 case MP_BUS_ISA:
1154 case MP_BUS_EISA:
1155 case MP_BUS_MCA:
1156 {
1157 irq = mp_irqs[idx].mpc_srcbusirq;
1158 break;
1159 }
1160 case MP_BUS_PCI:
1161 {
1162
1163
1164
1165 i = irq = 0;
1166 while (i < apic)
1167 irq += nr_ioapic_registers[i++];
1168 irq += pin;
1169
1170
1171
1172
1173 if (ioapic_renumber_irq)
1174 irq = ioapic_renumber_irq(apic, irq);
1175
1176 break;
1177 }
1178 default:
1179 {
1180 printk(KERN_ERR "unknown bus type %d.\n",bus);
1181 irq = 0;
1182 break;
1183 }
1184 }
1185
1186
1187
1188
1189 if ((pin >= 16) && (pin <= 23)) {
1190 if (pirq_entries[pin-16] != -1) {
1191 if (!pirq_entries[pin-16]) {
1192 apic_printk(APIC_VERBOSE, KERN_DEBUG
1193 "disabling PIRQ%d\n", pin-16);
1194 } else {
1195 irq = pirq_entries[pin-16];
1196 apic_printk(APIC_VERBOSE, KERN_DEBUG
1197 "using PIRQ%d -> IRQ %d\n",
1198 pin-16, irq);
1199 }
1200 }
1201 }
1202 return irq;
1203}
1204
1205static inline int IO_APIC_irq_trigger(int irq)
1206{
1207 int apic, idx, pin;
1208
1209 for (apic = 0; apic < nr_ioapics; apic++) {
1210 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
1211 idx = find_irq_entry(apic,pin,mp_INT);
1212 if ((idx != -1) && (irq == pin_2_irq(idx,apic,pin)))
1213 return irq_trigger(idx);
1214 }
1215 }
1216
1217
1218
1219 return 0;
1220}
1221
1222
1223static u8 irq_vector[NR_IRQ_VECTORS] __read_mostly = { FIRST_DEVICE_VECTOR , 0 };
1224
1225static int __assign_irq_vector(int irq)
1226{
1227 static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0;
1228 int vector, offset, i;
1229
1230 BUG_ON((unsigned)irq >= NR_IRQ_VECTORS);
1231
1232 if (irq_vector[irq] > 0)
1233 return irq_vector[irq];
1234
1235 vector = current_vector;
1236 offset = current_offset;
1237next:
1238 vector += 8;
1239 if (vector >= FIRST_SYSTEM_VECTOR) {
1240 offset = (offset + 1) % 8;
1241 vector = FIRST_DEVICE_VECTOR + offset;
1242 }
1243 if (vector == current_vector)
1244 return -ENOSPC;
1245 if (vector == SYSCALL_VECTOR)
1246 goto next;
1247 for (i = 0; i < NR_IRQ_VECTORS; i++)
1248 if (irq_vector[i] == vector)
1249 goto next;
1250
1251 current_vector = vector;
1252 current_offset = offset;
1253 irq_vector[irq] = vector;
1254
1255 return vector;
1256}
1257
1258static int assign_irq_vector(int irq)
1259{
1260 unsigned long flags;
1261 int vector;
1262
1263 spin_lock_irqsave(&vector_lock, flags);
1264 vector = __assign_irq_vector(irq);
1265 spin_unlock_irqrestore(&vector_lock, flags);
1266
1267 return vector;
1268}
1269static struct irq_chip ioapic_chip;
1270
1271#define IOAPIC_AUTO -1
1272#define IOAPIC_EDGE 0
1273#define IOAPIC_LEVEL 1
1274
1275static void ioapic_register_intr(int irq, int vector, unsigned long trigger)
1276{
1277 if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
1278 trigger == IOAPIC_LEVEL) {
1279 irq_desc[irq].status |= IRQ_LEVEL;
1280 set_irq_chip_and_handler_name(irq, &ioapic_chip,
1281 handle_fasteoi_irq, "fasteoi");
1282 } else {
1283 irq_desc[irq].status &= ~IRQ_LEVEL;
1284 set_irq_chip_and_handler_name(irq, &ioapic_chip,
1285 handle_edge_irq, "edge");
1286 }
1287 set_intr_gate(vector, interrupt[irq]);
1288}
1289
1290static void __init setup_IO_APIC_irqs(void)
1291{
1292 struct IO_APIC_route_entry entry;
1293 int apic, pin, idx, irq, first_notcon = 1, vector;
1294 unsigned long flags;
1295
1296 apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
1297
1298 for (apic = 0; apic < nr_ioapics; apic++) {
1299 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
1300
1301
1302
1303
1304 memset(&entry,0,sizeof(entry));
1305
1306 entry.delivery_mode = INT_DELIVERY_MODE;
1307 entry.dest_mode = INT_DEST_MODE;
1308 entry.mask = 0;
1309 entry.dest.logical.logical_dest =
1310 cpu_mask_to_apicid(TARGET_CPUS);
1311
1312 idx = find_irq_entry(apic,pin,mp_INT);
1313 if (idx == -1) {
1314 if (first_notcon) {
1315 apic_printk(APIC_VERBOSE, KERN_DEBUG
1316 " IO-APIC (apicid-pin) %d-%d",
1317 mp_ioapics[apic].mpc_apicid,
1318 pin);
1319 first_notcon = 0;
1320 } else
1321 apic_printk(APIC_VERBOSE, ", %d-%d",
1322 mp_ioapics[apic].mpc_apicid, pin);
1323 continue;
1324 }
1325
1326 entry.trigger = irq_trigger(idx);
1327 entry.polarity = irq_polarity(idx);
1328
1329 if (irq_trigger(idx)) {
1330 entry.trigger = 1;
1331 entry.mask = 1;
1332 }
1333
1334 irq = pin_2_irq(idx, apic, pin);
1335
1336
1337
1338
1339 if (multi_timer_check(apic, irq))
1340 continue;
1341 else
1342 add_pin_to_irq(irq, apic, pin);
1343
1344 if (!apic && !IO_APIC_IRQ(irq))
1345 continue;
1346
1347 if (IO_APIC_IRQ(irq)) {
1348 vector = assign_irq_vector(irq);
1349 entry.vector = vector;
1350 ioapic_register_intr(irq, vector, IOAPIC_AUTO);
1351
1352 if (!apic && (irq < 16))
1353 disable_8259A_irq(irq);
1354 }
1355 spin_lock_irqsave(&ioapic_lock, flags);
1356 __ioapic_write_entry(apic, pin, entry);
1357 spin_unlock_irqrestore(&ioapic_lock, flags);
1358 }
1359 }
1360
1361 if (!first_notcon)
1362 apic_printk(APIC_VERBOSE, " not connected.\n");
1363}
1364
1365
1366
1367
1368static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, int vector)
1369{
1370 struct IO_APIC_route_entry entry;
1371
1372 memset(&entry,0,sizeof(entry));
1373
1374 disable_8259A_irq(0);
1375
1376
1377 apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
1378
1379
1380
1381
1382
1383 entry.dest_mode = INT_DEST_MODE;
1384 entry.mask = 0;
1385 entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
1386 entry.delivery_mode = INT_DELIVERY_MODE;
1387 entry.polarity = 0;
1388 entry.trigger = 0;
1389 entry.vector = vector;
1390
1391
1392
1393
1394
1395 irq_desc[0].chip = &ioapic_chip;
1396 set_irq_handler(0, handle_edge_irq);
1397
1398
1399
1400
1401 ioapic_write_entry(apic, pin, entry);
1402
1403 enable_8259A_irq(0);
1404}
1405
1406void __init print_IO_APIC(void)
1407{
1408 int apic, i;
1409 union IO_APIC_reg_00 reg_00;
1410 union IO_APIC_reg_01 reg_01;
1411 union IO_APIC_reg_02 reg_02;
1412 union IO_APIC_reg_03 reg_03;
1413 unsigned long flags;
1414
1415 if (apic_verbosity == APIC_QUIET)
1416 return;
1417
1418 printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries);
1419 for (i = 0; i < nr_ioapics; i++)
1420 printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n",
1421 mp_ioapics[i].mpc_apicid, nr_ioapic_registers[i]);
1422
1423
1424
1425
1426
1427 printk(KERN_INFO "testing the IO APIC.......................\n");
1428
1429 for (apic = 0; apic < nr_ioapics; apic++) {
1430
1431 spin_lock_irqsave(&ioapic_lock, flags);
1432 reg_00.raw = io_apic_read(apic, 0);
1433 reg_01.raw = io_apic_read(apic, 1);
1434 if (reg_01.bits.version >= 0x10)
1435 reg_02.raw = io_apic_read(apic, 2);
1436 if (reg_01.bits.version >= 0x20)
1437 reg_03.raw = io_apic_read(apic, 3);
1438 spin_unlock_irqrestore(&ioapic_lock, flags);
1439
1440 printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid);
1441 printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw);
1442 printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID);
1443 printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type);
1444 printk(KERN_DEBUG "....... : LTS : %X\n", reg_00.bits.LTS);
1445
1446 printk(KERN_DEBUG ".... register #01: %08X\n", reg_01.raw);
1447 printk(KERN_DEBUG "....... : max redirection entries: %04X\n", reg_01.bits.entries);
1448
1449 printk(KERN_DEBUG "....... : PRQ implemented: %X\n", reg_01.bits.PRQ);
1450 printk(KERN_DEBUG "....... : IO APIC version: %04X\n", reg_01.bits.version);
1451
1452
1453
1454
1455
1456
1457 if (reg_01.bits.version >= 0x10 && reg_02.raw != reg_01.raw) {
1458 printk(KERN_DEBUG ".... register #02: %08X\n", reg_02.raw);
1459 printk(KERN_DEBUG "....... : arbitration: %02X\n", reg_02.bits.arbitration);
1460 }
1461
1462
1463
1464
1465
1466
1467 if (reg_01.bits.version >= 0x20 && reg_03.raw != reg_02.raw &&
1468 reg_03.raw != reg_01.raw) {
1469 printk(KERN_DEBUG ".... register #03: %08X\n", reg_03.raw);
1470 printk(KERN_DEBUG "....... : Boot DT : %X\n", reg_03.bits.boot_DT);
1471 }
1472
1473 printk(KERN_DEBUG ".... IRQ redirection table:\n");
1474
1475 printk(KERN_DEBUG " NR Log Phy Mask Trig IRR Pol"
1476 " Stat Dest Deli Vect: \n");
1477
1478 for (i = 0; i <= reg_01.bits.entries; i++) {
1479 struct IO_APIC_route_entry entry;
1480
1481 entry = ioapic_read_entry(apic, i);
1482
1483 printk(KERN_DEBUG " %02x %03X %02X ",
1484 i,
1485 entry.dest.logical.logical_dest,
1486 entry.dest.physical.physical_dest
1487 );
1488
1489 printk("%1d %1d %1d %1d %1d %1d %1d %02X\n",
1490 entry.mask,
1491 entry.trigger,
1492 entry.irr,
1493 entry.polarity,
1494 entry.delivery_status,
1495 entry.dest_mode,
1496 entry.delivery_mode,
1497 entry.vector
1498 );
1499 }
1500 }
1501 printk(KERN_DEBUG "IRQ to pin mappings:\n");
1502 for (i = 0; i < NR_IRQS; i++) {
1503 struct irq_pin_list *entry = irq_2_pin + i;
1504 if (entry->pin < 0)
1505 continue;
1506 printk(KERN_DEBUG "IRQ%d ", i);
1507 for (;;) {
1508 printk("-> %d:%d", entry->apic, entry->pin);
1509 if (!entry->next)
1510 break;
1511 entry = irq_2_pin + entry->next;
1512 }
1513 printk("\n");
1514 }
1515
1516 printk(KERN_INFO ".................................... done.\n");
1517
1518 return;
1519}
1520
1521#if 0
1522
1523static void print_APIC_bitfield (int base)
1524{
1525 unsigned int v;
1526 int i, j;
1527
1528 if (apic_verbosity == APIC_QUIET)
1529 return;
1530
1531 printk(KERN_DEBUG "0123456789abcdef0123456789abcdef\n" KERN_DEBUG);
1532 for (i = 0; i < 8; i++) {
1533 v = apic_read(base + i*0x10);
1534 for (j = 0; j < 32; j++) {
1535 if (v & (1<<j))
1536 printk("1");
1537 else
1538 printk("0");
1539 }
1540 printk("\n");
1541 }
1542}
1543
1544void print_local_APIC(void * dummy)
1545{
1546 unsigned int v, ver, maxlvt;
1547
1548 if (apic_verbosity == APIC_QUIET)
1549 return;
1550
1551 printk("\n" KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n",
1552 smp_processor_id(), hard_smp_processor_id());
1553 v = apic_read(APIC_ID);
1554 printk(KERN_INFO "... APIC ID: %08x (%01x)\n", v, GET_APIC_ID(v));
1555 v = apic_read(APIC_LVR);
1556 printk(KERN_INFO "... APIC VERSION: %08x\n", v);
1557 ver = GET_APIC_VERSION(v);
1558 maxlvt = lapic_get_maxlvt();
1559
1560 v = apic_read(APIC_TASKPRI);
1561 printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK);
1562
1563 if (APIC_INTEGRATED(ver)) {
1564 v = apic_read(APIC_ARBPRI);
1565 printk(KERN_DEBUG "... APIC ARBPRI: %08x (%02x)\n", v,
1566 v & APIC_ARBPRI_MASK);
1567 v = apic_read(APIC_PROCPRI);
1568 printk(KERN_DEBUG "... APIC PROCPRI: %08x\n", v);
1569 }
1570
1571 v = apic_read(APIC_EOI);
1572 printk(KERN_DEBUG "... APIC EOI: %08x\n", v);
1573 v = apic_read(APIC_RRR);
1574 printk(KERN_DEBUG "... APIC RRR: %08x\n", v);
1575 v = apic_read(APIC_LDR);
1576 printk(KERN_DEBUG "... APIC LDR: %08x\n", v);
1577 v = apic_read(APIC_DFR);
1578 printk(KERN_DEBUG "... APIC DFR: %08x\n", v);
1579 v = apic_read(APIC_SPIV);
1580 printk(KERN_DEBUG "... APIC SPIV: %08x\n", v);
1581
1582 printk(KERN_DEBUG "... APIC ISR field:\n");
1583 print_APIC_bitfield(APIC_ISR);
1584 printk(KERN_DEBUG "... APIC TMR field:\n");
1585 print_APIC_bitfield(APIC_TMR);
1586 printk(KERN_DEBUG "... APIC IRR field:\n");
1587 print_APIC_bitfield(APIC_IRR);
1588
1589 if (APIC_INTEGRATED(ver)) {
1590 if (maxlvt > 3)
1591 apic_write(APIC_ESR, 0);
1592 v = apic_read(APIC_ESR);
1593 printk(KERN_DEBUG "... APIC ESR: %08x\n", v);
1594 }
1595
1596 v = apic_read(APIC_ICR);
1597 printk(KERN_DEBUG "... APIC ICR: %08x\n", v);
1598 v = apic_read(APIC_ICR2);
1599 printk(KERN_DEBUG "... APIC ICR2: %08x\n", v);
1600
1601 v = apic_read(APIC_LVTT);
1602 printk(KERN_DEBUG "... APIC LVTT: %08x\n", v);
1603
1604 if (maxlvt > 3) {
1605 v = apic_read(APIC_LVTPC);
1606 printk(KERN_DEBUG "... APIC LVTPC: %08x\n", v);
1607 }
1608 v = apic_read(APIC_LVT0);
1609 printk(KERN_DEBUG "... APIC LVT0: %08x\n", v);
1610 v = apic_read(APIC_LVT1);
1611 printk(KERN_DEBUG "... APIC LVT1: %08x\n", v);
1612
1613 if (maxlvt > 2) {
1614 v = apic_read(APIC_LVTERR);
1615 printk(KERN_DEBUG "... APIC LVTERR: %08x\n", v);
1616 }
1617
1618 v = apic_read(APIC_TMICT);
1619 printk(KERN_DEBUG "... APIC TMICT: %08x\n", v);
1620 v = apic_read(APIC_TMCCT);
1621 printk(KERN_DEBUG "... APIC TMCCT: %08x\n", v);
1622 v = apic_read(APIC_TDCR);
1623 printk(KERN_DEBUG "... APIC TDCR: %08x\n", v);
1624 printk("\n");
1625}
1626
1627void print_all_local_APICs (void)
1628{
1629 on_each_cpu(print_local_APIC, NULL, 1, 1);
1630}
1631
1632void print_PIC(void)
1633{
1634 unsigned int v;
1635 unsigned long flags;
1636
1637 if (apic_verbosity == APIC_QUIET)
1638 return;
1639
1640 printk(KERN_DEBUG "\nprinting PIC contents\n");
1641
1642 spin_lock_irqsave(&i8259A_lock, flags);
1643
1644 v = inb(0xa1) << 8 | inb(0x21);
1645 printk(KERN_DEBUG "... PIC IMR: %04x\n", v);
1646
1647 v = inb(0xa0) << 8 | inb(0x20);
1648 printk(KERN_DEBUG "... PIC IRR: %04x\n", v);
1649
1650 outb(0x0b,0xa0);
1651 outb(0x0b,0x20);
1652 v = inb(0xa0) << 8 | inb(0x20);
1653 outb(0x0a,0xa0);
1654 outb(0x0a,0x20);
1655
1656 spin_unlock_irqrestore(&i8259A_lock, flags);
1657
1658 printk(KERN_DEBUG "... PIC ISR: %04x\n", v);
1659
1660 v = inb(0x4d1) << 8 | inb(0x4d0);
1661 printk(KERN_DEBUG "... PIC ELCR: %04x\n", v);
1662}
1663
1664#endif
1665
1666static void __init enable_IO_APIC(void)
1667{
1668 union IO_APIC_reg_01 reg_01;
1669 int i8259_apic, i8259_pin;
1670 int i, apic;
1671 unsigned long flags;
1672
1673 for (i = 0; i < PIN_MAP_SIZE; i++) {
1674 irq_2_pin[i].pin = -1;
1675 irq_2_pin[i].next = 0;
1676 }
1677 if (!pirqs_enabled)
1678 for (i = 0; i < MAX_PIRQS; i++)
1679 pirq_entries[i] = -1;
1680
1681
1682
1683
1684 for (apic = 0; apic < nr_ioapics; apic++) {
1685 spin_lock_irqsave(&ioapic_lock, flags);
1686 reg_01.raw = io_apic_read(apic, 1);
1687 spin_unlock_irqrestore(&ioapic_lock, flags);
1688 nr_ioapic_registers[apic] = reg_01.bits.entries+1;
1689 }
1690 for(apic = 0; apic < nr_ioapics; apic++) {
1691 int pin;
1692
1693 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
1694 struct IO_APIC_route_entry entry;
1695 entry = ioapic_read_entry(apic, pin);
1696
1697
1698
1699
1700
1701 if ((entry.mask == 0) && (entry.delivery_mode == dest_ExtINT)) {
1702 ioapic_i8259.apic = apic;
1703 ioapic_i8259.pin = pin;
1704 goto found_i8259;
1705 }
1706 }
1707 }
1708 found_i8259:
1709
1710
1711
1712
1713
1714 i8259_pin = find_isa_irq_pin(0, mp_ExtINT);
1715 i8259_apic = find_isa_irq_apic(0, mp_ExtINT);
1716
1717 if ((ioapic_i8259.pin == -1) && (i8259_pin >= 0)) {
1718 printk(KERN_WARNING "ExtINT not setup in hardware but reported by MP table\n");
1719 ioapic_i8259.pin = i8259_pin;
1720 ioapic_i8259.apic = i8259_apic;
1721 }
1722
1723 if (((ioapic_i8259.apic != i8259_apic) || (ioapic_i8259.pin != i8259_pin)) &&
1724 (i8259_pin >= 0) && (ioapic_i8259.pin >= 0))
1725 {
1726 printk(KERN_WARNING "ExtINT in hardware and MP table differ\n");
1727 }
1728
1729
1730
1731
1732 clear_IO_APIC();
1733}
1734
1735
1736
1737
1738void disable_IO_APIC(void)
1739{
1740
1741
1742
1743 clear_IO_APIC();
1744
1745
1746
1747
1748
1749
1750 if (ioapic_i8259.pin != -1) {
1751 struct IO_APIC_route_entry entry;
1752
1753 memset(&entry, 0, sizeof(entry));
1754 entry.mask = 0;
1755 entry.trigger = 0;
1756 entry.irr = 0;
1757 entry.polarity = 0;
1758 entry.delivery_status = 0;
1759 entry.dest_mode = 0;
1760 entry.delivery_mode = dest_ExtINT;
1761 entry.vector = 0;
1762 entry.dest.physical.physical_dest =
1763 GET_APIC_ID(apic_read(APIC_ID));
1764
1765
1766
1767
1768 ioapic_write_entry(ioapic_i8259.apic, ioapic_i8259.pin, entry);
1769 }
1770 disconnect_bsp_APIC(ioapic_i8259.pin != -1);
1771}
1772
1773
1774
1775
1776
1777
1778
1779
1780#ifndef CONFIG_X86_NUMAQ
1781static void __init setup_ioapic_ids_from_mpc(void)
1782{
1783 union IO_APIC_reg_00 reg_00;
1784 physid_mask_t phys_id_present_map;
1785 int apic;
1786 int i;
1787 unsigned char old_id;
1788 unsigned long flags;
1789
1790
1791
1792
1793
1794 if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
1795 || APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
1796 return;
1797
1798
1799
1800
1801 phys_id_present_map = ioapic_phys_id_map(phys_cpu_present_map);
1802
1803
1804
1805
1806 for (apic = 0; apic < nr_ioapics; apic++) {
1807
1808
1809 spin_lock_irqsave(&ioapic_lock, flags);
1810 reg_00.raw = io_apic_read(apic, 0);
1811 spin_unlock_irqrestore(&ioapic_lock, flags);
1812
1813 old_id = mp_ioapics[apic].mpc_apicid;
1814
1815 if (mp_ioapics[apic].mpc_apicid >= get_physical_broadcast()) {
1816 printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n",
1817 apic, mp_ioapics[apic].mpc_apicid);
1818 printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
1819 reg_00.bits.ID);
1820 mp_ioapics[apic].mpc_apicid = reg_00.bits.ID;
1821 }
1822
1823
1824
1825
1826
1827
1828 if (check_apicid_used(phys_id_present_map,
1829 mp_ioapics[apic].mpc_apicid)) {
1830 printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
1831 apic, mp_ioapics[apic].mpc_apicid);
1832 for (i = 0; i < get_physical_broadcast(); i++)
1833 if (!physid_isset(i, phys_id_present_map))
1834 break;
1835 if (i >= get_physical_broadcast())
1836 panic("Max APIC ID exceeded!\n");
1837 printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
1838 i);
1839 physid_set(i, phys_id_present_map);
1840 mp_ioapics[apic].mpc_apicid = i;
1841 } else {
1842 physid_mask_t tmp;
1843 tmp = apicid_to_cpu_present(mp_ioapics[apic].mpc_apicid);
1844 apic_printk(APIC_VERBOSE, "Setting %d in the "
1845 "phys_id_present_map\n",
1846 mp_ioapics[apic].mpc_apicid);
1847 physids_or(phys_id_present_map, phys_id_present_map, tmp);
1848 }
1849
1850
1851
1852
1853
1854
1855 if (old_id != mp_ioapics[apic].mpc_apicid)
1856 for (i = 0; i < mp_irq_entries; i++)
1857 if (mp_irqs[i].mpc_dstapic == old_id)
1858 mp_irqs[i].mpc_dstapic
1859 = mp_ioapics[apic].mpc_apicid;
1860
1861
1862
1863
1864
1865 apic_printk(APIC_VERBOSE, KERN_INFO
1866 "...changing IO-APIC physical APIC ID to %d ...",
1867 mp_ioapics[apic].mpc_apicid);
1868
1869 reg_00.bits.ID = mp_ioapics[apic].mpc_apicid;
1870 spin_lock_irqsave(&ioapic_lock, flags);
1871 io_apic_write(apic, 0, reg_00.raw);
1872 spin_unlock_irqrestore(&ioapic_lock, flags);
1873
1874
1875
1876
1877 spin_lock_irqsave(&ioapic_lock, flags);
1878 reg_00.raw = io_apic_read(apic, 0);
1879 spin_unlock_irqrestore(&ioapic_lock, flags);
1880 if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid)
1881 printk("could not set ID!\n");
1882 else
1883 apic_printk(APIC_VERBOSE, " ok.\n");
1884 }
1885}
1886#else
1887static void __init setup_ioapic_ids_from_mpc(void) { }
1888#endif
1889
1890int no_timer_check __initdata;
1891
1892static int __init notimercheck(char *s)
1893{
1894 no_timer_check = 1;
1895 return 1;
1896}
1897__setup("no_timer_check", notimercheck);
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907int __init timer_irq_works(void)
1908{
1909 unsigned long t1 = jiffies;
1910
1911 if (no_timer_check)
1912 return 1;
1913
1914 local_irq_enable();
1915
1916 mdelay((10 * 1000) / HZ);
1917
1918
1919
1920
1921
1922
1923
1924
1925 if (jiffies - t1 > 4)
1926 return 1;
1927
1928 return 0;
1929}
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957static unsigned int startup_ioapic_irq(unsigned int irq)
1958{
1959 int was_pending = 0;
1960 unsigned long flags;
1961
1962 spin_lock_irqsave(&ioapic_lock, flags);
1963 if (irq < 16) {
1964 disable_8259A_irq(irq);
1965 if (i8259A_irq_pending(irq))
1966 was_pending = 1;
1967 }
1968 __unmask_IO_APIC_irq(irq);
1969 spin_unlock_irqrestore(&ioapic_lock, flags);
1970
1971 return was_pending;
1972}
1973
1974static void ack_ioapic_irq(unsigned int irq)
1975{
1976 move_native_irq(irq);
1977 ack_APIC_irq();
1978}
1979
1980static void ack_ioapic_quirk_irq(unsigned int irq)
1981{
1982 unsigned long v;
1983 int i;
1984
1985 move_native_irq(irq);
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005 i = irq_vector[irq];
2006
2007 v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
2008
2009 ack_APIC_irq();
2010
2011 if (!(v & (1 << (i & 0x1f)))) {
2012 atomic_inc(&irq_mis_count);
2013 spin_lock(&ioapic_lock);
2014 __mask_and_edge_IO_APIC_irq(irq);
2015 __unmask_and_level_IO_APIC_irq(irq);
2016 spin_unlock(&ioapic_lock);
2017 }
2018}
2019
2020static int ioapic_retrigger_irq(unsigned int irq)
2021{
2022 send_IPI_self(irq_vector[irq]);
2023
2024 return 1;
2025}
2026
2027static struct irq_chip ioapic_chip __read_mostly = {
2028 .name = "IO-APIC",
2029 .startup = startup_ioapic_irq,
2030 .mask = mask_IO_APIC_irq,
2031 .unmask = unmask_IO_APIC_irq,
2032 .ack = ack_ioapic_irq,
2033 .eoi = ack_ioapic_quirk_irq,
2034#ifdef CONFIG_SMP
2035 .set_affinity = set_ioapic_affinity_irq,
2036#endif
2037 .retrigger = ioapic_retrigger_irq,
2038};
2039
2040
2041static inline void init_IO_APIC_traps(void)
2042{
2043 int irq;
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056 for (irq = 0; irq < NR_IRQS ; irq++) {
2057 int tmp = irq;
2058 if (IO_APIC_IRQ(tmp) && !irq_vector[tmp]) {
2059
2060
2061
2062
2063
2064 if (irq < 16)
2065 make_8259A_irq(irq);
2066 else
2067
2068 irq_desc[irq].chip = &no_irq_chip;
2069 }
2070 }
2071}
2072
2073
2074
2075
2076
2077static void ack_apic(unsigned int irq)
2078{
2079 ack_APIC_irq();
2080}
2081
2082static void mask_lapic_irq (unsigned int irq)
2083{
2084 unsigned long v;
2085
2086 v = apic_read(APIC_LVT0);
2087 apic_write_around(APIC_LVT0, v | APIC_LVT_MASKED);
2088}
2089
2090static void unmask_lapic_irq (unsigned int irq)
2091{
2092 unsigned long v;
2093
2094 v = apic_read(APIC_LVT0);
2095 apic_write_around(APIC_LVT0, v & ~APIC_LVT_MASKED);
2096}
2097
2098static struct irq_chip lapic_chip __read_mostly = {
2099 .name = "local-APIC-edge",
2100 .mask = mask_lapic_irq,
2101 .unmask = unmask_lapic_irq,
2102 .eoi = ack_apic,
2103};
2104
2105static void setup_nmi (void)
2106{
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116 apic_printk(APIC_VERBOSE, KERN_INFO "activating NMI Watchdog ...");
2117
2118 on_each_cpu(enable_NMI_through_LVT0, NULL, 1, 1);
2119
2120 apic_printk(APIC_VERBOSE, " done.\n");
2121}
2122
2123
2124
2125
2126
2127
2128
2129
2130static inline void unlock_ExtINT_logic(void)
2131{
2132 int apic, pin, i;
2133 struct IO_APIC_route_entry entry0, entry1;
2134 unsigned char save_control, save_freq_select;
2135
2136 pin = find_isa_irq_pin(8, mp_INT);
2137 if (pin == -1) {
2138 WARN_ON_ONCE(1);
2139 return;
2140 }
2141 apic = find_isa_irq_apic(8, mp_INT);
2142 if (apic == -1) {
2143 WARN_ON_ONCE(1);
2144 return;
2145 }
2146
2147 entry0 = ioapic_read_entry(apic, pin);
2148 clear_IO_APIC_pin(apic, pin);
2149
2150 memset(&entry1, 0, sizeof(entry1));
2151
2152 entry1.dest_mode = 0;
2153 entry1.mask = 0;
2154 entry1.dest.physical.physical_dest = hard_smp_processor_id();
2155 entry1.delivery_mode = dest_ExtINT;
2156 entry1.polarity = entry0.polarity;
2157 entry1.trigger = 0;
2158 entry1.vector = 0;
2159
2160 ioapic_write_entry(apic, pin, entry1);
2161
2162 save_control = CMOS_READ(RTC_CONTROL);
2163 save_freq_select = CMOS_READ(RTC_FREQ_SELECT);
2164 CMOS_WRITE((save_freq_select & ~RTC_RATE_SELECT) | 0x6,
2165 RTC_FREQ_SELECT);
2166 CMOS_WRITE(save_control | RTC_PIE, RTC_CONTROL);
2167
2168 i = 100;
2169 while (i-- > 0) {
2170 mdelay(10);
2171 if ((CMOS_READ(RTC_INTR_FLAGS) & RTC_PF) == RTC_PF)
2172 i -= 10;
2173 }
2174
2175 CMOS_WRITE(save_control, RTC_CONTROL);
2176 CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
2177 clear_IO_APIC_pin(apic, pin);
2178
2179 ioapic_write_entry(apic, pin, entry0);
2180}
2181
2182int timer_uses_ioapic_pin_0;
2183
2184
2185
2186
2187
2188
2189
2190static inline void __init check_timer(void)
2191{
2192 int apic1, pin1, apic2, pin2;
2193 int vector;
2194
2195
2196
2197
2198 disable_8259A_irq(0);
2199 vector = assign_irq_vector(0);
2200 set_intr_gate(vector, interrupt[0]);
2201
2202
2203
2204
2205
2206
2207
2208
2209 apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
2210 init_8259A(1);
2211 timer_ack = 1;
2212 if (timer_over_8254 > 0)
2213 enable_8259A_irq(0);
2214
2215 pin1 = find_isa_irq_pin(0, mp_INT);
2216 apic1 = find_isa_irq_apic(0, mp_INT);
2217 pin2 = ioapic_i8259.pin;
2218 apic2 = ioapic_i8259.apic;
2219
2220 if (pin1 == 0)
2221 timer_uses_ioapic_pin_0 = 1;
2222
2223 printk(KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n",
2224 vector, apic1, pin1, apic2, pin2);
2225
2226 if (pin1 != -1) {
2227
2228
2229
2230 unmask_IO_APIC_irq(0);
2231 if (timer_irq_works()) {
2232 if (nmi_watchdog == NMI_IO_APIC) {
2233 disable_8259A_irq(0);
2234 setup_nmi();
2235 enable_8259A_irq(0);
2236 }
2237 if (disable_timer_pin_1 > 0)
2238 clear_IO_APIC_pin(0, pin1);
2239 return;
2240 }
2241 clear_IO_APIC_pin(apic1, pin1);
2242 printk(KERN_ERR "..MP-BIOS bug: 8254 timer not connected to "
2243 "IO-APIC\n");
2244 }
2245
2246 printk(KERN_INFO "...trying to set up timer (IRQ0) through the 8259A ... ");
2247 if (pin2 != -1) {
2248 printk("\n..... (found pin %d) ...", pin2);
2249
2250
2251
2252 setup_ExtINT_IRQ0_pin(apic2, pin2, vector);
2253 if (timer_irq_works()) {
2254 printk("works.\n");
2255 if (pin1 != -1)
2256 replace_pin_at_irq(0, apic1, pin1, apic2, pin2);
2257 else
2258 add_pin_to_irq(0, apic2, pin2);
2259 if (nmi_watchdog == NMI_IO_APIC) {
2260 setup_nmi();
2261 }
2262 return;
2263 }
2264
2265
2266
2267 clear_IO_APIC_pin(apic2, pin2);
2268 }
2269 printk(" failed.\n");
2270
2271 if (nmi_watchdog == NMI_IO_APIC) {
2272 printk(KERN_WARNING "timer doesn't work through the IO-APIC - disabling NMI Watchdog!\n");
2273 nmi_watchdog = 0;
2274 }
2275
2276 printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ...");
2277
2278 disable_8259A_irq(0);
2279 set_irq_chip_and_handler_name(0, &lapic_chip, handle_fasteoi_irq,
2280 "fasteoi");
2281 apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector);
2282 enable_8259A_irq(0);
2283
2284 if (timer_irq_works()) {
2285 printk(" works.\n");
2286 return;
2287 }
2288 apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector);
2289 printk(" failed.\n");
2290
2291 printk(KERN_INFO "...trying to set up timer as ExtINT IRQ...");
2292
2293 timer_ack = 0;
2294 init_8259A(0);
2295 make_8259A_irq(0);
2296 apic_write_around(APIC_LVT0, APIC_DM_EXTINT);
2297
2298 unlock_ExtINT_logic();
2299
2300 if (timer_irq_works()) {
2301 printk(" works.\n");
2302 return;
2303 }
2304 printk(" failed :(.\n");
2305 panic("IO-APIC + timer doesn't work! Boot with apic=debug and send a "
2306 "report. Then try booting with the 'noapic' option");
2307}
2308
2309
2310
2311
2312
2313
2314
2315
2316#define PIC_IRQS (1 << PIC_CASCADE_IR)
2317
2318void __init setup_IO_APIC(void)
2319{
2320 enable_IO_APIC();
2321
2322 if (acpi_ioapic)
2323 io_apic_irqs = ~0;
2324 else
2325 io_apic_irqs = ~PIC_IRQS;
2326
2327 printk("ENABLING IO-APIC IRQs\n");
2328
2329
2330
2331
2332 if (!acpi_ioapic)
2333 setup_ioapic_ids_from_mpc();
2334 sync_Arb_IDs();
2335 setup_IO_APIC_irqs();
2336 init_IO_APIC_traps();
2337 check_timer();
2338 if (!acpi_ioapic)
2339 print_IO_APIC();
2340}
2341
2342static int __init setup_disable_8254_timer(char *s)
2343{
2344 timer_over_8254 = -1;
2345 return 1;
2346}
2347static int __init setup_enable_8254_timer(char *s)
2348{
2349 timer_over_8254 = 2;
2350 return 1;
2351}
2352
2353__setup("disable_8254_timer", setup_disable_8254_timer);
2354__setup("enable_8254_timer", setup_enable_8254_timer);
2355
2356
2357
2358
2359
2360
2361static int __init io_apic_bug_finalize(void)
2362{
2363 if(sis_apic_bug == -1)
2364 sis_apic_bug = 0;
2365 return 0;
2366}
2367
2368late_initcall(io_apic_bug_finalize);
2369
2370struct sysfs_ioapic_data {
2371 struct sys_device dev;
2372 struct IO_APIC_route_entry entry[0];
2373};
2374static struct sysfs_ioapic_data * mp_ioapic_data[MAX_IO_APICS];
2375
2376static int ioapic_suspend(struct sys_device *dev, pm_message_t state)
2377{
2378 struct IO_APIC_route_entry *entry;
2379 struct sysfs_ioapic_data *data;
2380 int i;
2381
2382 data = container_of(dev, struct sysfs_ioapic_data, dev);
2383 entry = data->entry;
2384 for (i = 0; i < nr_ioapic_registers[dev->id]; i ++)
2385 entry[i] = ioapic_read_entry(dev->id, i);
2386
2387 return 0;
2388}
2389
2390static int ioapic_resume(struct sys_device *dev)
2391{
2392 struct IO_APIC_route_entry *entry;
2393 struct sysfs_ioapic_data *data;
2394 unsigned long flags;
2395 union IO_APIC_reg_00 reg_00;
2396 int i;
2397
2398 data = container_of(dev, struct sysfs_ioapic_data, dev);
2399 entry = data->entry;
2400
2401 spin_lock_irqsave(&ioapic_lock, flags);
2402 reg_00.raw = io_apic_read(dev->id, 0);
2403 if (reg_00.bits.ID != mp_ioapics[dev->id].mpc_apicid) {
2404 reg_00.bits.ID = mp_ioapics[dev->id].mpc_apicid;
2405 io_apic_write(dev->id, 0, reg_00.raw);
2406 }
2407 spin_unlock_irqrestore(&ioapic_lock, flags);
2408 for (i = 0; i < nr_ioapic_registers[dev->id]; i ++)
2409 ioapic_write_entry(dev->id, i, entry[i]);
2410
2411 return 0;
2412}
2413
2414static struct sysdev_class ioapic_sysdev_class = {
2415 set_kset_name("ioapic"),
2416 .suspend = ioapic_suspend,
2417 .resume = ioapic_resume,
2418};
2419
2420static int __init ioapic_init_sysfs(void)
2421{
2422 struct sys_device * dev;
2423 int i, size, error = 0;
2424
2425 error = sysdev_class_register(&ioapic_sysdev_class);
2426 if (error)
2427 return error;
2428
2429 for (i = 0; i < nr_ioapics; i++ ) {
2430 size = sizeof(struct sys_device) + nr_ioapic_registers[i]
2431 * sizeof(struct IO_APIC_route_entry);
2432 mp_ioapic_data[i] = kmalloc(size, GFP_KERNEL);
2433 if (!mp_ioapic_data[i]) {
2434 printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
2435 continue;
2436 }
2437 memset(mp_ioapic_data[i], 0, size);
2438 dev = &mp_ioapic_data[i]->dev;
2439 dev->id = i;
2440 dev->cls = &ioapic_sysdev_class;
2441 error = sysdev_register(dev);
2442 if (error) {
2443 kfree(mp_ioapic_data[i]);
2444 mp_ioapic_data[i] = NULL;
2445 printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
2446 continue;
2447 }
2448 }
2449
2450 return 0;
2451}
2452
2453device_initcall(ioapic_init_sysfs);
2454
2455
2456
2457
2458int create_irq(void)
2459{
2460
2461 int irq, new, vector = 0;
2462 unsigned long flags;
2463
2464 irq = -ENOSPC;
2465 spin_lock_irqsave(&vector_lock, flags);
2466 for (new = (NR_IRQS - 1); new >= 0; new--) {
2467 if (platform_legacy_irq(new))
2468 continue;
2469 if (irq_vector[new] != 0)
2470 continue;
2471 vector = __assign_irq_vector(new);
2472 if (likely(vector > 0))
2473 irq = new;
2474 break;
2475 }
2476 spin_unlock_irqrestore(&vector_lock, flags);
2477
2478 if (irq >= 0) {
2479 set_intr_gate(vector, interrupt[irq]);
2480 dynamic_irq_init(irq);
2481 }
2482 return irq;
2483}
2484
2485void destroy_irq(unsigned int irq)
2486{
2487 unsigned long flags;
2488
2489 dynamic_irq_cleanup(irq);
2490
2491 spin_lock_irqsave(&vector_lock, flags);
2492 irq_vector[irq] = 0;
2493 spin_unlock_irqrestore(&vector_lock, flags);
2494}
2495
2496
2497
2498
2499#ifdef CONFIG_PCI_MSI
2500static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_msg *msg)
2501{
2502 int vector;
2503 unsigned dest;
2504
2505 vector = assign_irq_vector(irq);
2506 if (vector >= 0) {
2507 dest = cpu_mask_to_apicid(TARGET_CPUS);
2508
2509 msg->address_hi = MSI_ADDR_BASE_HI;
2510 msg->address_lo =
2511 MSI_ADDR_BASE_LO |
2512 ((INT_DEST_MODE == 0) ?
2513 MSI_ADDR_DEST_MODE_PHYSICAL:
2514 MSI_ADDR_DEST_MODE_LOGICAL) |
2515 ((INT_DELIVERY_MODE != dest_LowestPrio) ?
2516 MSI_ADDR_REDIRECTION_CPU:
2517 MSI_ADDR_REDIRECTION_LOWPRI) |
2518 MSI_ADDR_DEST_ID(dest);
2519
2520 msg->data =
2521 MSI_DATA_TRIGGER_EDGE |
2522 MSI_DATA_LEVEL_ASSERT |
2523 ((INT_DELIVERY_MODE != dest_LowestPrio) ?
2524 MSI_DATA_DELIVERY_FIXED:
2525 MSI_DATA_DELIVERY_LOWPRI) |
2526 MSI_DATA_VECTOR(vector);
2527 }
2528 return vector;
2529}
2530
2531#ifdef CONFIG_SMP
2532static void set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
2533{
2534 struct msi_msg msg;
2535 unsigned int dest;
2536 cpumask_t tmp;
2537 int vector;
2538
2539 cpus_and(tmp, mask, cpu_online_map);
2540 if (cpus_empty(tmp))
2541 tmp = TARGET_CPUS;
2542
2543 vector = assign_irq_vector(irq);
2544 if (vector < 0)
2545 return;
2546
2547 dest = cpu_mask_to_apicid(mask);
2548
2549 read_msi_msg(irq, &msg);
2550
2551 msg.data &= ~MSI_DATA_VECTOR_MASK;
2552 msg.data |= MSI_DATA_VECTOR(vector);
2553 msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
2554 msg.address_lo |= MSI_ADDR_DEST_ID(dest);
2555
2556 write_msi_msg(irq, &msg);
2557 irq_desc[irq].affinity = mask;
2558}
2559#endif
2560
2561
2562
2563
2564
2565static struct irq_chip msi_chip = {
2566 .name = "PCI-MSI",
2567 .unmask = unmask_msi_irq,
2568 .mask = mask_msi_irq,
2569 .ack = ack_ioapic_irq,
2570#ifdef CONFIG_SMP
2571 .set_affinity = set_msi_irq_affinity,
2572#endif
2573 .retrigger = ioapic_retrigger_irq,
2574};
2575
2576int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
2577{
2578 struct msi_msg msg;
2579 int irq, ret;
2580 irq = create_irq();
2581 if (irq < 0)
2582 return irq;
2583
2584 ret = msi_compose_msg(dev, irq, &msg);
2585 if (ret < 0) {
2586 destroy_irq(irq);
2587 return ret;
2588 }
2589
2590 set_irq_msi(irq, desc);
2591 write_msi_msg(irq, &msg);
2592
2593 set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq,
2594 "edge");
2595
2596 return 0;
2597}
2598
2599void arch_teardown_msi_irq(unsigned int irq)
2600{
2601 destroy_irq(irq);
2602}
2603
2604#endif
2605
2606
2607
2608
2609#ifdef CONFIG_HT_IRQ
2610
2611#ifdef CONFIG_SMP
2612
2613static void target_ht_irq(unsigned int irq, unsigned int dest)
2614{
2615 struct ht_irq_msg msg;
2616 fetch_ht_irq_msg(irq, &msg);
2617
2618 msg.address_lo &= ~(HT_IRQ_LOW_DEST_ID_MASK);
2619 msg.address_hi &= ~(HT_IRQ_HIGH_DEST_ID_MASK);
2620
2621 msg.address_lo |= HT_IRQ_LOW_DEST_ID(dest);
2622 msg.address_hi |= HT_IRQ_HIGH_DEST_ID(dest);
2623
2624 write_ht_irq_msg(irq, &msg);
2625}
2626
2627static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask)
2628{
2629 unsigned int dest;
2630 cpumask_t tmp;
2631
2632 cpus_and(tmp, mask, cpu_online_map);
2633 if (cpus_empty(tmp))
2634 tmp = TARGET_CPUS;
2635
2636 cpus_and(mask, tmp, CPU_MASK_ALL);
2637
2638 dest = cpu_mask_to_apicid(mask);
2639
2640 target_ht_irq(irq, dest);
2641 irq_desc[irq].affinity = mask;
2642}
2643#endif
2644
2645static struct irq_chip ht_irq_chip = {
2646 .name = "PCI-HT",
2647 .mask = mask_ht_irq,
2648 .unmask = unmask_ht_irq,
2649 .ack = ack_ioapic_irq,
2650#ifdef CONFIG_SMP
2651 .set_affinity = set_ht_irq_affinity,
2652#endif
2653 .retrigger = ioapic_retrigger_irq,
2654};
2655
2656int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
2657{
2658 int vector;
2659
2660 vector = assign_irq_vector(irq);
2661 if (vector >= 0) {
2662 struct ht_irq_msg msg;
2663 unsigned dest;
2664 cpumask_t tmp;
2665
2666 cpus_clear(tmp);
2667 cpu_set(vector >> 8, tmp);
2668 dest = cpu_mask_to_apicid(tmp);
2669
2670 msg.address_hi = HT_IRQ_HIGH_DEST_ID(dest);
2671
2672 msg.address_lo =
2673 HT_IRQ_LOW_BASE |
2674 HT_IRQ_LOW_DEST_ID(dest) |
2675 HT_IRQ_LOW_VECTOR(vector) |
2676 ((INT_DEST_MODE == 0) ?
2677 HT_IRQ_LOW_DM_PHYSICAL :
2678 HT_IRQ_LOW_DM_LOGICAL) |
2679 HT_IRQ_LOW_RQEOI_EDGE |
2680 ((INT_DELIVERY_MODE != dest_LowestPrio) ?
2681 HT_IRQ_LOW_MT_FIXED :
2682 HT_IRQ_LOW_MT_ARBITRATED) |
2683 HT_IRQ_LOW_IRQ_MASKED;
2684
2685 write_ht_irq_msg(irq, &msg);
2686
2687 set_irq_chip_and_handler_name(irq, &ht_irq_chip,
2688 handle_edge_irq, "edge");
2689 }
2690 return vector;
2691}
2692#endif
2693
2694
2695
2696
2697
2698#ifdef CONFIG_ACPI
2699
2700int __init io_apic_get_unique_id (int ioapic, int apic_id)
2701{
2702 union IO_APIC_reg_00 reg_00;
2703 static physid_mask_t apic_id_map = PHYSID_MASK_NONE;
2704 physid_mask_t tmp;
2705 unsigned long flags;
2706 int i = 0;
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717 if (physids_empty(apic_id_map))
2718 apic_id_map = ioapic_phys_id_map(phys_cpu_present_map);
2719
2720 spin_lock_irqsave(&ioapic_lock, flags);
2721 reg_00.raw = io_apic_read(ioapic, 0);
2722 spin_unlock_irqrestore(&ioapic_lock, flags);
2723
2724 if (apic_id >= get_physical_broadcast()) {
2725 printk(KERN_WARNING "IOAPIC[%d]: Invalid apic_id %d, trying "
2726 "%d\n", ioapic, apic_id, reg_00.bits.ID);
2727 apic_id = reg_00.bits.ID;
2728 }
2729
2730
2731
2732
2733
2734 if (check_apicid_used(apic_id_map, apic_id)) {
2735
2736 for (i = 0; i < get_physical_broadcast(); i++) {
2737 if (!check_apicid_used(apic_id_map, i))
2738 break;
2739 }
2740
2741 if (i == get_physical_broadcast())
2742 panic("Max apic_id exceeded!\n");
2743
2744 printk(KERN_WARNING "IOAPIC[%d]: apic_id %d already used, "
2745 "trying %d\n", ioapic, apic_id, i);
2746
2747 apic_id = i;
2748 }
2749
2750 tmp = apicid_to_cpu_present(apic_id);
2751 physids_or(apic_id_map, apic_id_map, tmp);
2752
2753 if (reg_00.bits.ID != apic_id) {
2754 reg_00.bits.ID = apic_id;
2755
2756 spin_lock_irqsave(&ioapic_lock, flags);
2757 io_apic_write(ioapic, 0, reg_00.raw);
2758 reg_00.raw = io_apic_read(ioapic, 0);
2759 spin_unlock_irqrestore(&ioapic_lock, flags);
2760
2761
2762 if (reg_00.bits.ID != apic_id) {
2763 printk("IOAPIC[%d]: Unable to change apic_id!\n", ioapic);
2764 return -1;
2765 }
2766 }
2767
2768 apic_printk(APIC_VERBOSE, KERN_INFO
2769 "IOAPIC[%d]: Assigned apic_id %d\n", ioapic, apic_id);
2770
2771 return apic_id;
2772}
2773
2774
2775int __init io_apic_get_version (int ioapic)
2776{
2777 union IO_APIC_reg_01 reg_01;
2778 unsigned long flags;
2779
2780 spin_lock_irqsave(&ioapic_lock, flags);
2781 reg_01.raw = io_apic_read(ioapic, 1);
2782 spin_unlock_irqrestore(&ioapic_lock, flags);
2783
2784 return reg_01.bits.version;
2785}
2786
2787
2788int __init io_apic_get_redir_entries (int ioapic)
2789{
2790 union IO_APIC_reg_01 reg_01;
2791 unsigned long flags;
2792
2793 spin_lock_irqsave(&ioapic_lock, flags);
2794 reg_01.raw = io_apic_read(ioapic, 1);
2795 spin_unlock_irqrestore(&ioapic_lock, flags);
2796
2797 return reg_01.bits.entries;
2798}
2799
2800
2801int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low)
2802{
2803 struct IO_APIC_route_entry entry;
2804 unsigned long flags;
2805
2806 if (!IO_APIC_IRQ(irq)) {
2807 printk(KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
2808 ioapic);
2809 return -EINVAL;
2810 }
2811
2812
2813
2814
2815
2816
2817
2818 memset(&entry,0,sizeof(entry));
2819
2820 entry.delivery_mode = INT_DELIVERY_MODE;
2821 entry.dest_mode = INT_DEST_MODE;
2822 entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
2823 entry.trigger = edge_level;
2824 entry.polarity = active_high_low;
2825 entry.mask = 1;
2826
2827
2828
2829
2830 if (irq >= 16)
2831 add_pin_to_irq(irq, ioapic, pin);
2832
2833 entry.vector = assign_irq_vector(irq);
2834
2835 apic_printk(APIC_DEBUG, KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry "
2836 "(%d-%d -> 0x%x -> IRQ %d Mode:%i Active:%i)\n", ioapic,
2837 mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
2838 edge_level, active_high_low);
2839
2840 ioapic_register_intr(irq, entry.vector, edge_level);
2841
2842 if (!ioapic && (irq < 16))
2843 disable_8259A_irq(irq);
2844
2845 spin_lock_irqsave(&ioapic_lock, flags);
2846 __ioapic_write_entry(ioapic, pin, entry);
2847 spin_unlock_irqrestore(&ioapic_lock, flags);
2848
2849 return 0;
2850}
2851
2852#endif
2853
2854static int __init parse_disable_timer_pin_1(char *arg)
2855{
2856 disable_timer_pin_1 = 1;
2857 return 0;
2858}
2859early_param("disable_timer_pin_1", parse_disable_timer_pin_1);
2860
2861static int __init parse_enable_timer_pin_1(char *arg)
2862{
2863 disable_timer_pin_1 = -1;
2864 return 0;
2865}
2866early_param("enable_timer_pin_1", parse_enable_timer_pin_1);
2867
2868static int __init parse_noapic(char *arg)
2869{
2870
2871 disable_ioapic_setup();
2872 return 0;
2873}
2874early_param("noapic", parse_noapic);
2875