[BUG] bcm2711: bad_chained_irq in brcmstb_l2_intc_irq_handle
Stefan Wahren
stefan.wahren at i2se.com
Sun Jan 16 09:26:58 PST 2022
Hi,
recently i saw a report [1] about bad chained IRQ with Linux 5.15.13
Aarch64 with Arch Linux. I'm able to reproduce this issue on my
Raspberry Pi 4 B (8 GB RAM, Firmware: 2022-01-06T15:39:30) by turning
the connected HDMI monitor off and on again.
Kernel output is the following:
[15053.285438] irq 10, desc: 00000000acc41fca, depth: 0, count: 0,
unhandled: 0
[15053.295440] ->handle_irq(): 00000000b28cf1d1,
brcmstb_l2_intc_irq_handle+0x0/0x1e0
[15053.306049] ->irq_data.chip(): 000000005f172760, gic_data+0x0/0x768
[15053.315233] ->action(): 00000000236e815e
[15053.322022] ->action->handler(): 0000000013023289,
bad_chained_irq+0x0/0x50
[15053.331909] IRQ_LEVEL set
[15053.337822] IRQ_NOPROBE set
[15053.343715] IRQ_NOREQUEST set
[15053.349585] IRQ_NOTHREAD set
Content of /proc/interrupts after the issue occured:
CPU0 CPU1 CPU2 CPU3
9: 0 0 0 0 GICv2 25 Level
vgic
10: 1 0 0 0 GICv2 128 Level
(null)
12: 130322 26028 27670 135225 GICv2 30 Level
arch_timer
13: 0 0 0 0 GICv2 27 Level
kvm guest vtimer
19: 0 0 0 0 GICv2 107 Level
fe004000.txp
20: 7450 0 0 0 GICv2 65 Level
fe00b880.mailbox
25: 6525 0 0 0 GICv2 153 Level
uart-pl011
26: 0 0 0 0 GICv2 149 Level
fe205000.i2c, fe804000.i2c
27: 9 0 0 0 GICv2 125 Level
ttyS1
28: 36999 0 0 0 GICv2 158 Level
mmc0, mmc1
29: 1 0 0 0 GICv2 129 Level
vc4 hvs
30: 0 0 0 0 GICv2 105 Level
fe980000.usb, fe980000.usb
31: 0 0 0 0 GICv2 112 Level
DMA IRQ
33: 0 0 0 0 GICv2 114 Level
DMA IRQ
40: 0 0 0 0 GICv2 141 Level
vc4 crtc
41: 0 0 0 0 GICv2 142 Level
vc4 crtc, vc4 crtc
42: 10 0 0 0 GICv2 133 Level
vc4 crtc
43: 1 0 0 0
interrupt-controller at 7ef00100 0 Edge vc4 hdmi cec tx
44: 0 0 0 0
interrupt-controller at 7ef00100 1 Edge vc4 hdmi cec rx
47: 0 0 0 0
interrupt-controller at 7ef00100 4 Edge vc4 hdmi hpd connected
48: 1 0 0 0
interrupt-controller at 7ef00100 5 Edge vc4 hdmi hpd disconnected
49: 0 0 0 0
interrupt-controller at 7ef00100 8 Edge vc4 hdmi cec tx
50: 0 0 0 0
interrupt-controller at 7ef00100 7 Edge vc4 hdmi cec rx
53: 0 0 0 0
interrupt-controller at 7ef00100 10 Edge vc4 hdmi hpd connected
54: 0 0 0 0
interrupt-controller at 7ef00100 11 Edge vc4 hdmi hpd disconnected
55: 7 0 0 0 GICv2 66 Level
VCHIQ doorbell
56: 0 0 0 0 GICv2 48 Level
arm-pmu
57: 0 0 0 0 GICv2 49 Level
arm-pmu
58: 0 0 0 0 GICv2 50 Level
arm-pmu
59: 0 0 0 0 GICv2 51 Level
arm-pmu
62: 47599 0 0 0 GICv2 189 Level
eth0
63: 4681 0 0 0 GICv2 190 Level
eth0
64: 0 0 0 0 GICv2 175 Level
PCIe PME, aerdrv
65: 326 0 0 0 BRCM STB PCIe MSI
524288 Edge xhci_hcd
IPI0: 2442 5185 7195 18290 Rescheduling
interrupts
IPI1: 481 383 518 533 Function call
interrupts
IPI2: 0 0 0 0 CPU stop interrupts
IPI3: 0 0 0 0 CPU stop (for
crash dump) interrupts
IPI4: 0 0 0 0 Timer broadcast
interrupts
IPI5: 1 0 0 0 IRQ work interrupts
IPI6: 0 0 0 0 CPU wake-up
interrupts
Err: 1
Comparing the vendor & mainline DTS, i noticed differences at hdmi0/1.
The vendor DTS has an additional register to access the same space as
aon_intr (interrupt parent), which looks ugly [2].
Additionally i noted that bcm2711.dtsi uses the compatible
"brcm,bcm2711-l2-intc" with a level high interrupt, but according to
irq-brcmstb-l2.c [3] the compatible is not defined and would fallback to
"brcm,l2-intc" with brcmstb_l2_edge_intc_of_init. This looks fishy.
I didn't try to reproduce this with Raspberry Pi OS & mainline kernel,
but i hope these are enough information so far.
[1] - https://archlinuxarm.org/forum/viewtopic.php?f=65&t=15791
[2] -
https://github.com/raspberrypi/linux/blob/rpi-5.15.y/arch/arm/boot/dts/bcm2711.dtsi#L339
[3] -
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/irqchip/irq-brcmstb-l2.c?h=v5.15.15#n278
More information about the linux-arm-kernel
mailing list