Back to home page

OSCL-LXR

 
 

    


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