? 2016/7/1 18:32, Marc Zyngier ??: > On 01/07/16 02:24, Shawn Lin wrote: >> This patch adds Rockchip PCIe controller support found >> on RK3399 Soc platform. >> >> Signed-off-by: Shawn Lin <shawn.lin at rock-chips.com> >> >> --- > > [...] > >> +static void rockchip_pcie_legacy_int_handler(struct irq_desc *desc) >> +{ >> + struct irq_chip *chip = irq_desc_get_chip(desc); >> + struct rockchip_pcie_port *port; >> + u32 reg; >> + >> + chained_irq_enter(chip, desc); >> + port = irq_desc_get_handler_data(desc); >> + >> + reg = pcie_read(port, PCIE_CLIENT_INT_STATUS); >> + reg = (reg & ROCKCHIP_PCIE_RPIFR1_INTR_MASK) >> >> + ROCKCHIP_PCIE_RPIFR1_INTR_SHIFT; >> + if (reg) >> + generic_handle_irq(irq_find_mapping(port->irq_domain, >> + ffs(reg))); > > Can't you get multiple pending interrupts at the same time? Here, you > seem to only process one interrupt at a time, which is going to be > pretty inefficient. > Yup, will fix it, thanks. > How about something like: > > while (reg) { > int hwirq = ffs(reg); > int irq; > > reg &= ~BIT(hwirq); > irq = irq_find_mapping(port->irq_domain, hwirq); > if (irq) > generic_handle_irq(irq); > } > >> + chained_irq_exit(chip, desc); >> +} >> + > > Thanks, > > M. > -- Best Regards Shawn Lin