mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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 <Vijaya.Kumar@caviumnetworks.com> Acked-by: Julien Grall <julien.grall@linaro.org> Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
eb2952b43a
commit
aeac0f3d4c
2 files changed
+34
-14
No files matched your search
+26
-14
@@ -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;
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
void send_SGI_mask(const cpumask_t *cpumask, enum gic_sgi sgi)
|
||||
{
|
||||
ASSERT(sgi < 16); /* There are only 16 SGIs */
|
||||
|
||||
cpumask_and(&online_mask, cpumask, &cpu_online_map);
|
||||
mask = gic_cpu_mask(&online_mask);
|
||||
|
||||
dsb(sy);
|
||||
|
||||
GICD[GICD_SGIR] = GICD_SGI_TARGET_LIST
|
||||
| (mask<<GICD_SGI_TARGET_SHIFT)
|
||||
| sgi;
|
||||
send_SGI(sgi, SGI_TARGET_LIST, cpumask);
|
||||
}
|
||||
|
||||
void send_SGI_one(unsigned int cpu, enum gic_sgi sgi)
|
||||
@@ -511,9 +527,7 @@ void send_SGI_self(enum gic_sgi sgi)
|
||||
ASSERT(sgi < 16); /* There are only 16 SGIs */
|
||||
|
||||
dsb(sy);
|
||||
|
||||
GICD[GICD_SGIR] = GICD_SGI_TARGET_SELF
|
||||
| sgi;
|
||||
send_SGI(sgi, SGI_TARGET_SELF, NULL);
|
||||
}
|
||||
|
||||
void send_SGI_allbutself(enum gic_sgi sgi)
|
||||
@@ -521,9 +535,7 @@ void send_SGI_allbutself(enum gic_sgi sgi)
|
||||
ASSERT(sgi < 16); /* There are only 16 SGIs */
|
||||
|
||||
dsb(sy);
|
||||
|
||||
GICD[GICD_SGIR] = GICD_SGI_TARGET_OTHERS
|
||||
| sgi;
|
||||
send_SGI(sgi, SGI_TARGET_OTHERS, NULL);
|
||||
}
|
||||
|
||||
void smp_send_state_dump(unsigned int cpu)
|
||||
|
||||
@@ -210,6 +210,14 @@ enum gic_sgi {
|
||||
GIC_SGI_DUMP_STATE = 1,
|
||||
GIC_SGI_CALL_FUNCTION = 2,
|
||||
};
|
||||
|
||||
/* SGI irq mode types */
|
||||
enum gic_sgi_mode {
|
||||
SGI_TARGET_LIST,
|
||||
SGI_TARGET_OTHERS,
|
||||
SGI_TARGET_SELF,
|
||||
};
|
||||
|
||||
extern void send_SGI_mask(const cpumask_t *cpumask, enum gic_sgi sgi);
|
||||
extern void send_SGI_one(unsigned int cpu, enum gic_sgi sgi);
|
||||
extern void send_SGI_self(enum gic_sgi sgi);
|
||||
|
||||