Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | Most (all) Intel-MP compliant SMP boards have the so-called 'IO-APIC', |
| 2 | which is an enhanced interrupt controller, it enables us to route |
| 3 | hardware interrupts to multiple CPUs, or to CPU groups. |
| 4 | |
| 5 | Linux supports all variants of compliant SMP boards, including ones with |
| 6 | multiple IO-APICs. (multiple IO-APICs are used in high-end servers to |
| 7 | distribute IRQ load further). |
| 8 | |
| 9 | There are (a few) known breakages in certain older boards, which bugs are |
| 10 | usually worked around by the kernel. If your MP-compliant SMP board does |
| 11 | not boot Linux, then consult the linux-smp mailing list archives first. |
| 12 | |
| 13 | If your box boots fine with enabled IO-APIC IRQs, then your |
| 14 | /proc/interrupts will look like this one: |
| 15 | |
| 16 | ----------------------------> |
| 17 | hell:~> cat /proc/interrupts |
| 18 | CPU0 |
| 19 | 0: 1360293 IO-APIC-edge timer |
| 20 | 1: 4 IO-APIC-edge keyboard |
| 21 | 2: 0 XT-PIC cascade |
| 22 | 13: 1 XT-PIC fpu |
| 23 | 14: 1448 IO-APIC-edge ide0 |
| 24 | 16: 28232 IO-APIC-level Intel EtherExpress Pro 10/100 Ethernet |
| 25 | 17: 51304 IO-APIC-level eth0 |
| 26 | NMI: 0 |
| 27 | ERR: 0 |
| 28 | hell:~> |
| 29 | <---------------------------- |
| 30 | |
| 31 | some interrupts are still listed as 'XT PIC', but this is not a problem, |
| 32 | none of those IRQ sources is performance-critical. |
| 33 | |
| 34 | |
| 35 | in the unlikely case that your board does not create a working mp-table, |
| 36 | you can use the pirq= boot parameter to 'hand-construct' IRQ entries. This |
| 37 | is nontrivial though and cannot be automated. One sample /etc/lilo.conf |
| 38 | entry: |
| 39 | |
| 40 | append="pirq=15,11,10" |
| 41 | |
| 42 | the actual numbers depend on your system, on your PCI cards and on their |
| 43 | PCI slot position. Usually PCI slots are 'daisy chained' before they are |
| 44 | connected to the PCI chipset IRQ routing facility (the incoming PIRQ1-4 |
| 45 | lines): |
| 46 | |
| 47 | ,-. ,-. ,-. ,-. ,-. |
| 48 | PIRQ4 ----| |-. ,-| |-. ,-| |-. ,-| |--------| | |
| 49 | |S| \ / |S| \ / |S| \ / |S| |S| |
| 50 | PIRQ3 ----|l|-. `/---|l|-. `/---|l|-. `/---|l|--------|l| |
| 51 | |o| \/ |o| \/ |o| \/ |o| |o| |
| 52 | PIRQ2 ----|t|-./`----|t|-./`----|t|-./`----|t|--------|t| |
| 53 | |1| /\ |2| /\ |3| /\ |4| |5| |
| 54 | PIRQ1 ----| |- `----| |- `----| |- `----| |--------| | |
| 55 | `-' `-' `-' `-' `-' |
| 56 | |
| 57 | every PCI card emits a PCI IRQ, which can be INTA,INTB,INTC,INTD: |
| 58 | |
| 59 | ,-. |
| 60 | INTD--| | |
| 61 | |S| |
| 62 | INTC--|l| |
| 63 | |o| |
| 64 | INTB--|t| |
| 65 | |x| |
| 66 | INTA--| | |
| 67 | `-' |
| 68 | |
| 69 | These INTA-D PCI IRQs are always 'local to the card', their real meaning |
| 70 | depends on which slot they are in. If you look at the daisy chaining diagram, |
| 71 | a card in slot4, issuing INTA IRQ, it will end up as a signal on PIRQ2 of |
| 72 | the PCI chipset. Most cards issue INTA, this creates optimal distribution |
| 73 | between the PIRQ lines. (distributing IRQ sources properly is not a |
| 74 | necessity, PCI IRQs can be shared at will, but it's a good for performance |
| 75 | to have non shared interrupts). Slot5 should be used for videocards, they |
| 76 | do not use interrupts normally, thus they are not daisy chained either. |
| 77 | |
| 78 | so if you have your SCSI card (IRQ11) in Slot1, Tulip card (IRQ9) in |
| 79 | Slot2, then you'll have to specify this pirq= line: |
| 80 | |
| 81 | append="pirq=11,9" |
| 82 | |
| 83 | the following script tries to figure out such a default pirq= line from |
| 84 | your PCI configuration: |
| 85 | |
| 86 | echo -n pirq=; echo `scanpci | grep T_L | cut -c56-` | sed 's/ /,/g' |
| 87 | |
| 88 | note that this script wont work if you have skipped a few slots or if your |
| 89 | board does not do default daisy-chaining. (or the IO-APIC has the PIRQ pins |
| 90 | connected in some strange way). E.g. if in the above case you have your SCSI |
| 91 | card (IRQ11) in Slot3, and have Slot1 empty: |
| 92 | |
| 93 | append="pirq=0,9,11" |
| 94 | |
| 95 | [value '0' is a generic 'placeholder', reserved for empty (or non-IRQ emitting) |
| 96 | slots.] |
| 97 | |
| 98 | generally, it's always possible to find out the correct pirq= settings, just |
| 99 | permute all IRQ numbers properly ... it will take some time though. An |
| 100 | 'incorrect' pirq line will cause the booting process to hang, or a device |
| 101 | won't function properly (if it's inserted as eg. a module). |
| 102 | |
| 103 | If you have 2 PCI buses, then you can use up to 8 pirq values. Although such |
| 104 | boards tend to have a good configuration. |
| 105 | |
| 106 | Be prepared that it might happen that you need some strange pirq line: |
| 107 | |
| 108 | append="pirq=0,0,0,0,0,0,9,11" |
| 109 | |
| 110 | use smart try-and-err techniques to find out the correct pirq line ... |
| 111 | |
| 112 | good luck and mail to linux-smp@vger.kernel.org or |
| 113 | linux-kernel@vger.kernel.org if you have any problems that are not covered |
| 114 | by this document. |
| 115 | |
| 116 | -- mingo |
| 117 | |