From aeac0f3d4ce118b3210fdf040d532b6d3d5be472 Mon Sep 17 00:00:00 2001 From: Vijaya Kumar K Date: Tue, 1 Jul 2014 12:11:09 +0530 Subject: [PATCH] xen/arm: make sgi handling generic move all the hw specific sgi handling functionality to one function and use it. Signed-off-by: Vijaya Kumar K Acked-by: Julien Grall Acked-by: Stefano Stabellini Acked-by: Ian Campbell --- xen/arch/arm/gic.c | 40 +++++++++++++++++++++++++-------------- xen/include/asm-arm/gic.h | 8 ++++++++ 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index 0ca02349a7..054e1ca135 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -483,21 +483,37 @@ void __init gic_init(void) spin_unlock(&gic.lock); } -void send_SGI_mask(const cpumask_t *cpumask, enum gic_sgi sgi) +static void send_SGI(enum gic_sgi sgi, enum gic_sgi_mode irqmode, + const cpumask_t *cpu_mask) { unsigned int mask = 0; cpumask_t online_mask; - ASSERT(sgi < 16); /* There are only 16 SGIs */ + switch ( irqmode ) + { + case SGI_TARGET_OTHERS: + GICD[GICD_SGIR] = GICD_SGI_TARGET_OTHERS | sgi; + break; + case SGI_TARGET_SELF: + GICD[GICD_SGIR] = GICD_SGI_TARGET_SELF | sgi; + break; + case SGI_TARGET_LIST: + cpumask_and(&online_mask, cpu_mask, &cpu_online_map); + mask = gic_cpu_mask(&online_mask); + GICD[GICD_SGIR] = GICD_SGI_TARGET_LIST | + (mask << GICD_SGI_TARGET_SHIFT) | sgi; + break; + default: + BUG(); + } +} - cpumask_and(&online_mask, cpumask, &cpu_online_map); - mask = gic_cpu_mask(&online_mask); +void send_SGI_mask(const cpumask_t *cpumask, enum gic_sgi sgi) +{ + ASSERT(sgi < 16); /* There are only 16 SGIs */ dsb(sy); - - GICD[GICD_SGIR] = GICD_SGI_TARGET_LIST - | (mask<