0001 .. SPDX-License-Identifier: GPL-2.0
0002
0003 =======
0004 IO-APIC
0005 =======
0006
0007 :Author: Ingo Molnar <mingo@kernel.org>
0008
0009 Most (all) Intel-MP compliant SMP boards have the so-called 'IO-APIC',
0010 which is an enhanced interrupt controller. It enables us to route
0011 hardware interrupts to multiple CPUs, or to CPU groups. Without an
0012 IO-APIC, interrupts from hardware will be delivered only to the
0013 CPU which boots the operating system (usually CPU#0).
0014
0015 Linux supports all variants of compliant SMP boards, including ones with
0016 multiple IO-APICs. Multiple IO-APICs are used in high-end servers to
0017 distribute IRQ load further.
0018
0019 There are (a few) known breakages in certain older boards, such bugs are
0020 usually worked around by the kernel. If your MP-compliant SMP board does
0021 not boot Linux, then consult the linux-smp mailing list archives first.
0022
0023 If your box boots fine with enabled IO-APIC IRQs, then your
0024 /proc/interrupts will look like this one::
0025
0026 hell:~> cat /proc/interrupts
0027 CPU0
0028 0: 1360293 IO-APIC-edge timer
0029 1: 4 IO-APIC-edge keyboard
0030 2: 0 XT-PIC cascade
0031 13: 1 XT-PIC fpu
0032 14: 1448 IO-APIC-edge ide0
0033 16: 28232 IO-APIC-level Intel EtherExpress Pro 10/100 Ethernet
0034 17: 51304 IO-APIC-level eth0
0035 NMI: 0
0036 ERR: 0
0037 hell:~>
0038
0039 Some interrupts are still listed as 'XT PIC', but this is not a problem;
0040 none of those IRQ sources is performance-critical.
0041
0042
0043 In the unlikely case that your board does not create a working mp-table,
0044 you can use the pirq= boot parameter to 'hand-construct' IRQ entries. This
0045 is non-trivial though and cannot be automated. One sample /etc/lilo.conf
0046 entry::
0047
0048 append="pirq=15,11,10"
0049
0050 The actual numbers depend on your system, on your PCI cards and on their
0051 PCI slot position. Usually PCI slots are 'daisy chained' before they are
0052 connected to the PCI chipset IRQ routing facility (the incoming PIRQ1-4
0053 lines)::
0054
0055 ,-. ,-. ,-. ,-. ,-.
0056 PIRQ4 ----| |-. ,-| |-. ,-| |-. ,-| |--------| |
0057 |S| \ / |S| \ / |S| \ / |S| |S|
0058 PIRQ3 ----|l|-. `/---|l|-. `/---|l|-. `/---|l|--------|l|
0059 |o| \/ |o| \/ |o| \/ |o| |o|
0060 PIRQ2 ----|t|-./`----|t|-./`----|t|-./`----|t|--------|t|
0061 |1| /\ |2| /\ |3| /\ |4| |5|
0062 PIRQ1 ----| |- `----| |- `----| |- `----| |--------| |
0063 `-' `-' `-' `-' `-'
0064
0065 Every PCI card emits a PCI IRQ, which can be INTA, INTB, INTC or INTD::
0066
0067 ,-.
0068 INTD--| |
0069 |S|
0070 INTC--|l|
0071 |o|
0072 INTB--|t|
0073 |x|
0074 INTA--| |
0075 `-'
0076
0077 These INTA-D PCI IRQs are always 'local to the card', their real meaning
0078 depends on which slot they are in. If you look at the daisy chaining diagram,
0079 a card in slot4, issuing INTA IRQ, it will end up as a signal on PIRQ4 of
0080 the PCI chipset. Most cards issue INTA, this creates optimal distribution
0081 between the PIRQ lines. (distributing IRQ sources properly is not a
0082 necessity, PCI IRQs can be shared at will, but it's a good for performance
0083 to have non shared interrupts). Slot5 should be used for videocards, they
0084 do not use interrupts normally, thus they are not daisy chained either.
0085
0086 so if you have your SCSI card (IRQ11) in Slot1, Tulip card (IRQ9) in
0087 Slot2, then you'll have to specify this pirq= line::
0088
0089 append="pirq=11,9"
0090
0091 the following script tries to figure out such a default pirq= line from
0092 your PCI configuration::
0093
0094 echo -n pirq=; echo `scanpci | grep T_L | cut -c56-` | sed 's/ /,/g'
0095
0096 note that this script won't work if you have skipped a few slots or if your
0097 board does not do default daisy-chaining. (or the IO-APIC has the PIRQ pins
0098 connected in some strange way). E.g. if in the above case you have your SCSI
0099 card (IRQ11) in Slot3, and have Slot1 empty::
0100
0101 append="pirq=0,9,11"
0102
0103 [value '0' is a generic 'placeholder', reserved for empty (or non-IRQ emitting)
0104 slots.]
0105
0106 Generally, it's always possible to find out the correct pirq= settings, just
0107 permute all IRQ numbers properly ... it will take some time though. An
0108 'incorrect' pirq line will cause the booting process to hang, or a device
0109 won't function properly (e.g. if it's inserted as a module).
0110
0111 If you have 2 PCI buses, then you can use up to 8 pirq values, although such
0112 boards tend to have a good configuration.
0113
0114 Be prepared that it might happen that you need some strange pirq line::
0115
0116 append="pirq=0,0,0,0,0,0,9,11"
0117
0118 Use smart trial-and-error techniques to find out the correct pirq line ...
0119
0120 Good luck and mail to linux-smp@vger.kernel.org or
0121 linux-kernel@vger.kernel.org if you have any problems that are not covered
0122 by this document.
0123