Skip to content
  • MaJun's avatar
    irqchip/mbigen: Fix the clear register offset calculation · 9459a04b
    MaJun authored
    The register array offset for clearing an interrupt is calculated by:
    
        offset = (hwirq - RESERVED_IRQ_PER_MBIGEN_CHIP) / 32;
    
    This is wrong because the clear register array includes the reserved
    interrupts. So the clear operation ends up in the wrong register.
    
    This went unnoticed so far, because the hardware clears the real bit
    through a timeout mechanism when the hardware is configured in debug
    mode. That debug mode was enabled on early generations of the hardware, so
    the problem was papered over.
    
    On newer hardware with updated firmware the debug mode was disabled, so the
    bits did not get cleared which causes the system to malfunction.
    
    Remove the subtraction of RESERVED_IRQ_PER_MBIGEN_CHIP, so the correct
    register is accessed.
    
    [ tglx: Rewrote changelog ]
    
    Fixes: a6c2f87b
    
     ("irqchip/mbigen: Implement the mbigen irq chip operation functions")
    Signed-off-by: default avatarMaJun <majun258@huawei.com>
    Signed-off-by: default avatarHanjun Guo <hanjun.guo@linaro.org>
    Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
    Cc: linuxarm@huawei.com
    Cc: Wei Yongjun <weiyongjun1@huawei.com>
    Link: http://lkml.kernel.org/r/1494561328-39514-4-git-send-email-guohanjun@huawei.com
    
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    9459a04b