[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 03/16] xen/arm: make sgi handling generic
From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> move all the hw specific sgi handling functionality to one function and use it. Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> --- xen/arch/arm/gic.c | 36 +++++++++++++++++++++++++++--------- xen/include/asm-arm/gic.h | 4 ++++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index 7faa0e9..d5cc931 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -480,21 +480,39 @@ void __init gic_init(void) spin_unlock(&gic.lock); } -void send_SGI_mask(const cpumask_t *cpumask, enum gic_sgi sgi) +void send_sgi(const cpumask_t *online_mask, enum gic_sgi sgi, uint8_t irqmode) { unsigned int mask = 0; + + 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: + mask = gic_cpu_mask(online_mask); + GICD[GICD_SGIR] = GICD_SGI_TARGET_LIST | + (mask<<GICD_SGI_TARGET_SHIFT) | sgi; + break; + default: + gdprintk(XENLOG_WARNING, "Wrong sgi irq mode for sgi %x\n", sgi); + } +} + +void send_SGI_mask(const cpumask_t *cpumask, enum gic_sgi sgi) +{ cpumask_t online_mask; ASSERT(sgi < 16); /* There are only 16 SGIs */ cpumask_and(&online_mask, cpumask, &cpu_online_map); - mask = gic_cpu_mask(&online_mask); dsb(); - GICD[GICD_SGIR] = GICD_SGI_TARGET_LIST - | (mask<<GICD_SGI_TARGET_SHIFT) - | sgi; + send_sgi(&online_mask, sgi, SGI_TARGET_LIST); } void send_SGI_one(unsigned int cpu, enum gic_sgi sgi) @@ -509,18 +527,18 @@ void send_SGI_self(enum gic_sgi sgi) dsb(); - GICD[GICD_SGIR] = GICD_SGI_TARGET_SELF - | sgi; + send_sgi(cpumask_of(smp_processor_id()), sgi, SGI_TARGET_SELF); } void send_SGI_allbutself(enum gic_sgi sgi) { + cpumask_t all_others_mask; ASSERT(sgi < 16); /* There are only 16 SGIs */ + cpumask_andnot(&all_others_mask, &cpu_possible_map, cpumask_of(smp_processor_id())); dsb(); - GICD[GICD_SGIR] = GICD_SGI_TARGET_OTHERS - | sgi; + send_sgi(&all_others_mask, sgi, SGI_TARGET_OTHERS); } void smp_send_state_dump(unsigned int cpu) diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h index 5d8f7f1..d03b490 100644 --- a/xen/include/asm-arm/gic.h +++ b/xen/include/asm-arm/gic.h @@ -50,6 +50,10 @@ #define GICD_SPENDSGIRN (0xF2C/4) #define GICD_ICPIDR2 (0xFE8/4) +#define SGI_TARGET_LIST 0 +#define SGI_TARGET_OTHERS 1 +#define SGI_TARGET_SELF 2 + #define GICD_SGI_TARGET_LIST_SHIFT (24) #define GICD_SGI_TARGET_LIST_MASK (0x3UL << GICD_SGI_TARGET_LIST_SHIFT) #define GICD_SGI_TARGET_LIST (0UL<<GICD_SGI_TARGET_LIST_SHIFT) -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |