{
int virq, hwirq = 0;
u64 mask = opal_event_irqchip.mask;
- u64 notifier_mask = 0;
if (!in_irq() && (events & mask)) {
last_outstanding_events = events;
return;
}
- while (events) {
+ while (events & mask) {
hwirq = fls64(events) - 1;
- virq = irq_find_mapping(opal_event_irqchip.domain,
- hwirq);
- if (virq) {
- if (BIT_ULL(hwirq) & mask)
+ if (BIT_ULL(hwirq) & mask) {
+ virq = irq_find_mapping(opal_event_irqchip.domain,
+ hwirq);
+ if (virq)
generic_handle_irq(virq);
- } else
- notifier_mask |= BIT_ULL(hwirq);
+ }
events &= ~BIT_ULL(hwirq);
}
-
- opal_do_notifier(notifier_mask);
}
static irqreturn_t opal_interrupt(int irq, void *data)