• James Hogan's avatar
    MIPS: Allow shared IRQ for timer & perf counter · 4a91d8fb
    James Hogan authored
    Before release 2 of the architecture there weren't separate interrupt
    pending bits for the local CPU interrupts (timer & perf counter
    overflow), so when they were connected to the same interrupt line the
    timer handler had to call the performance counter handler before knowing
    whether a timer interrupt was actually pending.
    
    Now another CPU local interrupt, for the Fast Debug Channel (FDC), can
    also be routed to an arbitrary interrupt line. It isn't scalable to keep
    adding cross-calls between handlers for these cases of shared interrupt
    lines, especially since the FDC could in theory share its interrupt line
    with the performance counter, timer, or both.
    
    Fortunately since release 2 of the architecture separate interrupt
    pending bits do exist in the Cause register. This allows local
    interrupts which share an interrupt line to have separate handlers using
    IRQF_SHARED. Unfortunately they can't easily have their own irqchip as
    there is no generic way to individually mask them.
    
    Enable this sharing to happen by removing the special case for when the
    perf count shares an IRQ with the timer. cp0_perfcount_irq and
    cp0_compare_irq can then be set to the same value with shared interrupt
    handlers registered for both of them.
    
    Pre-R2 code should be unaffected. cp0_perfcount_irq will always be -1
    and the timer handler will contnue to call into the perf counter
    handler.
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Cc: linux-mips@linux-mips.org
    Cc: linux-kernel@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/9131/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    4a91d8fb
traps.c 56.1 KB