irqchip/bcm2836: Fix IPI acknowledgement after conversion to handle_percpu_devid_irq
It appears that despite its name, the bcm2836_arm_irqchip_ipi_eoi()
callback is an acknowledgement, and not an EOI. This means that
we lose IPIs that are made pending between the handling of the
IPI and the write to LOCAL_MAILBOX0_CLR0. With the right timing,
things fail nicely.
This used to work with handle_percpu_devid_fasteoi_ipi(), which
started by eoi-ing the interrupt. With the standard fasteoi flow,
this doesn't work anymore.
So let's use this callback for what it is, an ack. Your favourite
RPi-2/3 is back up and running.
Fixes: ffdad793d5
("irqchip/bcm2836: Make IPIs use handle_percpu_devid_irq()")
Cc: Valentin Schneider <valentin.schneider@arm.com>
Reported-by: Guenter Roeck <linux@roeck-us.net>
Tested-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/c9fb4ab3-a5cb-648c-6de3-c6a871e60870@roeck-us.net
This commit is contained in:
parent
e90f55e019
commit
d7f39c40eb
@ -167,7 +167,7 @@ static void bcm2836_arm_irqchip_handle_ipi(struct irq_desc *desc)
|
||||
chained_irq_exit(chip, desc);
|
||||
}
|
||||
|
||||
static void bcm2836_arm_irqchip_ipi_eoi(struct irq_data *d)
|
||||
static void bcm2836_arm_irqchip_ipi_ack(struct irq_data *d)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
@ -195,7 +195,7 @@ static struct irq_chip bcm2836_arm_irqchip_ipi = {
|
||||
.name = "IPI",
|
||||
.irq_mask = bcm2836_arm_irqchip_dummy_op,
|
||||
.irq_unmask = bcm2836_arm_irqchip_dummy_op,
|
||||
.irq_eoi = bcm2836_arm_irqchip_ipi_eoi,
|
||||
.irq_ack = bcm2836_arm_irqchip_ipi_ack,
|
||||
.ipi_send_mask = bcm2836_arm_irqchip_ipi_send_mask,
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user