Merge branch 'next' into for-linus
[linux-2.6-microblaze.git] / Documentation / PCI / boot-interrupts.rst
1 .. SPDX-License-Identifier: GPL-2.0
2
3 ===============
4 Boot Interrupts
5 ===============
6
7 :Author: - Sean V Kelley <sean.v.kelley@linux.intel.com>
8
9 Overview
10 ========
11
12 On PCI Express, interrupts are represented with either MSI or inbound
13 interrupt messages (Assert_INTx/Deassert_INTx). The integrated IO-APIC in a
14 given Core IO converts the legacy interrupt messages from PCI Express to
15 MSI interrupts.  If the IO-APIC is disabled (via the mask bits in the
16 IO-APIC table entries), the messages are routed to the legacy PCH. This
17 in-band interrupt mechanism was traditionally necessary for systems that
18 did not support the IO-APIC and for boot. Intel in the past has used the
19 term "boot interrupts" to describe this mechanism. Further, the PCI Express
20 protocol describes this in-band legacy wire-interrupt INTx mechanism for
21 I/O devices to signal PCI-style level interrupts. The subsequent paragraphs
22 describe problems with the Core IO handling of INTx message routing to the
23 PCH and mitigation within BIOS and the OS.
24
25
26 Issue
27 =====
28
29 When in-band legacy INTx messages are forwarded to the PCH, they in turn
30 trigger a new interrupt for which the OS likely lacks a handler. When an
31 interrupt goes unhandled over time, they are tracked by the Linux kernel as
32 Spurious Interrupts. The IRQ will be disabled by the Linux kernel after it
33 reaches a specific count with the error "nobody cared". This disabled IRQ
34 now prevents valid usage by an existing interrupt which may happen to share
35 the IRQ line.
36
37   irq 19: nobody cared (try booting with the "irqpoll" option)
38   CPU: 0 PID: 2988 Comm: irq/34-nipalk Tainted: 4.14.87-rt49-02410-g4a640ec-dirty #1
39   Hardware name: National Instruments NI PXIe-8880/NI PXIe-8880, BIOS 2.1.5f1 01/09/2020
40   Call Trace:
41   <IRQ>
42    ? dump_stack+0x46/0x5e
43    ? __report_bad_irq+0x2e/0xb0
44    ? note_interrupt+0x242/0x290
45    ? nNIKAL100_memoryRead16+0x8/0x10 [nikal]
46    ? handle_irq_event_percpu+0x55/0x70
47    ? handle_irq_event+0x4f/0x80
48    ? handle_fasteoi_irq+0x81/0x180
49    ? handle_irq+0x1c/0x30
50    ? do_IRQ+0x41/0xd0
51    ? common_interrupt+0x84/0x84
52   </IRQ>
53
54   handlers:
55   irq_default_primary_handler threaded usb_hcd_irq
56   Disabling IRQ #19
57
58
59 Conditions
60 ==========
61
62 The use of threaded interrupts is the most likely condition to trigger
63 this problem today. Threaded interrupts may not be reenabled after the IRQ
64 handler wakes. These "one shot" conditions mean that the threaded interrupt
65 needs to keep the interrupt line masked until the threaded handler has run.
66 Especially when dealing with high data rate interrupts, the thread needs to
67 run to completion; otherwise some handlers will end up in stack overflows
68 since the interrupt of the issuing device is still active.
69
70 Affected Chipsets
71 =================
72
73 The legacy interrupt forwarding mechanism exists today in a number of
74 devices including but not limited to chipsets from AMD/ATI, Broadcom, and
75 Intel. Changes made through the mitigations below have been applied to
76 drivers/pci/quirks.c
77
78 Starting with ICX there are no longer any IO-APICs in the Core IO's
79 devices.  IO-APIC is only in the PCH.  Devices connected to the Core IO's
80 PCIe Root Ports will use native MSI/MSI-X mechanisms.
81
82 Mitigations
83 ===========
84
85 The mitigations take the form of PCI quirks. The preference has been to
86 first identify and make use of a means to disable the routing to the PCH.
87 In such a case a quirk to disable boot interrupt generation can be
88 added.[1]
89
90   Intel® 6300ESB I/O Controller Hub
91   Alternate Base Address Register:
92    BIE: Boot Interrupt Enable
93           0 = Boot interrupt is enabled.
94           1 = Boot interrupt is disabled.
95
96   Intel® Sandy Bridge through Sky Lake based Xeon servers:
97   Coherent Interface Protocol Interrupt Control
98    dis_intx_route2pch/dis_intx_route2ich/dis_intx_route2dmi2:
99           When this bit is set. Local INTx messages received from the
100           Intel® Quick Data DMA/PCI Express ports are not routed to legacy
101           PCH - they are either converted into MSI via the integrated IO-APIC
102           (if the IO-APIC mask bit is clear in the appropriate entries)
103           or cause no further action (when mask bit is set)
104
105 In the absence of a way to directly disable the routing, another approach
106 has been to make use of PCI Interrupt pin to INTx routing tables for
107 purposes of redirecting the interrupt handler to the rerouted interrupt
108 line by default.  Therefore, on chipsets where this INTx routing cannot be
109 disabled, the Linux kernel will reroute the valid interrupt to its legacy
110 interrupt. This redirection of the handler will prevent the occurrence of
111 the spurious interrupt detection which would ordinarily disable the IRQ
112 line due to excessive unhandled counts.[2]
113
114 The config option X86_REROUTE_FOR_BROKEN_BOOT_IRQS exists to enable (or
115 disable) the redirection of the interrupt handler to the PCH interrupt
116 line. The option can be overridden by either pci=ioapicreroute or
117 pci=noioapicreroute.[3]
118
119
120 More Documentation
121 ==================
122
123 There is an overview of the legacy interrupt handling in several datasheets
124 (6300ESB and 6700PXH below). While largely the same, it provides insight
125 into the evolution of its handling with chipsets.
126
127 Example of disabling of the boot interrupt
128 ------------------------------------------
129
130 Intel® 6300ESB I/O Controller Hub (Document # 300641-004US)
131         5.7.3 Boot Interrupt
132         https://www.intel.com/content/dam/doc/datasheet/6300esb-io-controller-hub-datasheet.pdf
133
134 Intel® Xeon® Processor E5-1600/2400/2600/4600 v3 Product Families
135 Datasheet - Volume 2: Registers (Document # 330784-003)
136         6.6.41 cipintrc Coherent Interface Protocol Interrupt Control
137         https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/xeon-e5-v3-datasheet-vol-2.pdf
138
139 Example of handler rerouting
140 ----------------------------
141
142 Intel® 6700PXH 64-bit PCI Hub (Document # 302628)
143         2.15.2 PCI Express Legacy INTx Support and Boot Interrupt
144         https://www.intel.com/content/dam/doc/datasheet/6700pxh-64-bit-pci-hub-datasheet.pdf
145
146
147 If you have any legacy PCI interrupt questions that aren't answered, email me.
148
149 Cheers,
150     Sean V Kelley
151     sean.v.kelley@linux.intel.com
152
153 [1] https://lore.kernel.org/r/12131949181903-git-send-email-sassmann@suse.de/
154 [2] https://lore.kernel.org/r/12131949182094-git-send-email-sassmann@suse.de/
155 [3] https://lore.kernel.org/r/487C8EA7.6020205@suse.de/