• Lukas Wunner's avatar
    irqchip/bcm2835: Quiesce IRQs left enabled by bootloader · bd59b343
    Lukas Wunner authored
    Per the spec, the BCM2835's IRQs are all disabled when coming out of
    power-on reset.  Its IRQ driver assumes that's still the case when the
    kernel boots and does not perform any initialization of the registers.
    However the Raspberry Pi Foundation's bootloader leaves the USB
    interrupt enabled when handing over control to the kernel.
    
    Quiesce IRQs and the FIQ if they were left enabled and log a message to
    let users know that they should update the bootloader once a fixed
    version is released.
    
    If the USB interrupt is not quiesced and the USB driver later on claims
    the FIQ (as it does on the Raspberry Pi Foundation's downstream kernel),
    interrupt latency for all other peripherals increases and occasional
    lockups occur.  That's because both the FIQ and the normal USB interrupt
    fire simultaneously:
    
    On a multicore Raspberry Pi, if normal interrupts are routed to CPU 0
    and the FIQ to CPU 1 (hardcoded in the Foundation's kernel), then a USB
    interrupt causes CPU 0 to spin in bcm2836_chained_handle_irq() until the
    FIQ on CPU 1 has cleared it.  Other peripherals' interrupts are starved
    as long.  I've seen CPU 0 blocked for up to 2.9 msec.  eMMC throughput
    on a Compute Module 3 irregularly dips to 23.0 MB/s without this commit
    but remains relatively constant at 23.5 MB/s with this commit.
    
    The lockups occur when CPU 0 receives a USB interrupt while holding a
    lock which CPU 1 is trying to acquire while the FIQ is temporarily
    disabled on CPU 1.  At best users get RCU CPU stall warnings, but most
    of the time the system just freezes.
    
    Fixes: 89214f00 ("ARM: bcm2835: add interrupt controller driver")
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Reviewed-by: default avatarNicolas Saenz Julienne <nsaenzjulienne@suse.de>
    Link: https://lore.kernel.org/r/f97868ba4e9b86ddad71f44ec9d8b3b7d8daa1ea.1582618537.git.lukas@wunner.de
    bd59b343
irq-bcm2835.c 7.33 KB