diff options
Diffstat (limited to 'dev')
-rw-r--r-- | dev/interrupt/arm_gic/arm_gic.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/dev/interrupt/arm_gic/arm_gic.c b/dev/interrupt/arm_gic/arm_gic.c index b6dae376..0e0c4f20 100644 --- a/dev/interrupt/arm_gic/arm_gic.c +++ b/dev/interrupt/arm_gic/arm_gic.c @@ -53,6 +53,7 @@ #define IFRAME_PC(frame) ((frame)->elr) #endif +void platform_fiq(struct iframe *frame); static status_t arm_gic_set_secure_locked(u_int irq, bool secure); static spin_lock_t gicd_lock; @@ -413,6 +414,17 @@ enum handler_return platform_irq(struct iframe *frame) struct int_handler_struct *h; uint cpu = arch_curr_cpu_num(); +#if ARM_MERGE_FIQ_IRQ + { + uint32_t hppir = GICREG(0, GICC_HPPIR); + uint32_t pending_fiq = hppir & 0x3ff; + if (pending_fiq < MAX_INT) { + platform_fiq(frame); + return INT_NO_RESCHEDULE; + } + } +#endif + LTRACEF("ahppir %d\n", ahppir); if (pending_irq < MAX_INT && get_int_handler(pending_irq, cpu)->handler) { enum handler_return ret = 0; |