mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
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:
@@ -167,7 +167,7 @@ static void bcm2836_arm_irqchip_handle_ipi(struct irq_desc *desc)
|
|||||||
chained_irq_exit(chip, 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();
|
int cpu = smp_processor_id();
|
||||||
|
|
||||||
@@ -195,7 +195,7 @@ static struct irq_chip bcm2836_arm_irqchip_ipi = {
|
|||||||
.name = "IPI",
|
.name = "IPI",
|
||||||
.irq_mask = bcm2836_arm_irqchip_dummy_op,
|
.irq_mask = bcm2836_arm_irqchip_dummy_op,
|
||||||
.irq_unmask = 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,
|
.ipi_send_mask = bcm2836_arm_irqchip_ipi_send_mask,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user