@@ -45,6 +45,8 @@ void gicv2_ipi_send_single(int irq, int cpu)
{
assert(cpu < 8);
assert(irq < 16);
+
+ smp_wmb();
writel(1 << (cpu + 16) | irq, gicv2_dist_base() + GICD_SGIR);
}
@@ -53,5 +55,7 @@ void gicv2_ipi_send_mask(int irq, const cpumask_t *dest)
u8 tlist = (u8)cpumask_bits(dest)[0];
assert(irq < 16);
+
+ smp_wmb();
writel(tlist << 16 | irq, gicv2_dist_base() + GICD_SGIR);
}
@@ -13,6 +13,7 @@
*/
#include <libcflat.h>
#include <errata.h>
+#include <linux/compiler.h>
#include <asm/setup.h>
#include <asm/processor.h>
#include <asm/delay.h>
@@ -260,11 +261,14 @@ static void check_lpi_hits(int *expected, const char *msg)
static void gicv2_ipi_send_self(void)
{
+ /* Prevent the compiler from optimizing memory accesses */
+ barrier();
writel(2 << 24 | IPI_IRQ, gicv2_dist_base() + GICD_SGIR);
}
static void gicv2_ipi_send_broadcast(void)
{
+ smp_wmb();
writel(1 << 24 | IPI_IRQ, gicv2_dist_base() + GICD_SGIR);
}