Skip to content
  • Daniel Kurtz's avatar
    pinctrl/amd: only handle irq if it is pending and unmasked · 0cfe17c2
    Daniel Kurtz authored
    [ Upstream commit 8bbed1ee ]
    
    The AMD pinctrl driver demultiplexes GPIO interrupts and fires off their
    individual handlers.
    
    If one of these GPIO irqs is configured as a level interrupt, and its
    downstream handler is a threaded ONESHOT interrupt, the GPIO interrupt
    source is masked by handle_level_irq() until the eventual return of the
    threaded irq handler.  During this time the level GPIO interrupt status
    will still report as high until the actual gpio source is cleared - both
    in the individual GPIO interrupt status bit (INTERRUPT_STS_OFF) and in
    its corresponding "WAKE_INT_STATUS_REG" bit.
    
    Thus, if another GPIO interrupt occurs during this time,
    amd_gpio_irq_handler() will see that the (masked-and-not-yet-cleared)
    level irq is still pending and incorrectly call its handler again.
    
    To fix this, have amd_gpio_irq_handler() check for both interrupts status
    and mask before calling generic_handle_irq().
    
    Note: Is it possible that this bug was the source of the interrupt storm
    on Ryzen when using chained interrupts before commit ba714a9c
    
    
    ("pinctrl/amd: Use regular interrupt instead of chained")?
    
    Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
    Acked-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    0cfe17c2