| 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 |  |