提交 890f6b55 编写于 作者: P Paul Burton 提交者: Marc Zyngier

irqchip: mips-gic: Configure EIC when CPUs come online

Rather than configuring EIC mode for all CPUs during boot, configure it
locally on each when they come online. This will become important with
multi-cluster support, since clusters may be powered on & off (for
example via hotplug) and would lose the EIC configuration when powered
off.
Signed-off-by: NPaul Burton <paul.burton@mips.com>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-mips@linux-mips.org
Signed-off-by: NMarc Zyngier <marc.zyngier@arm.com>
上级 25ac19e1
...@@ -655,6 +655,10 @@ static const struct irq_domain_ops gic_ipi_domain_ops = { ...@@ -655,6 +655,10 @@ static const struct irq_domain_ops gic_ipi_domain_ops = {
static int gic_cpu_startup(unsigned int cpu) static int gic_cpu_startup(unsigned int cpu)
{ {
/* Enable or disable EIC */
change_gic_vl_ctl(GIC_VX_CTL_EIC,
cpu_has_veic ? GIC_VX_CTL_EIC : 0);
/* Clear all local IRQ masks (ie. disable all local interrupts) */ /* Clear all local IRQ masks (ie. disable all local interrupts) */
write_gic_vl_rmask(~0); write_gic_vl_rmask(~0);
...@@ -667,7 +671,7 @@ static int gic_cpu_startup(unsigned int cpu) ...@@ -667,7 +671,7 @@ static int gic_cpu_startup(unsigned int cpu)
static int __init gic_of_init(struct device_node *node, static int __init gic_of_init(struct device_node *node,
struct device_node *parent) struct device_node *parent)
{ {
unsigned int cpu_vec, i, gicconfig, cpu, v[2]; unsigned int cpu_vec, i, gicconfig, v[2];
unsigned long reserved; unsigned long reserved;
phys_addr_t gic_base; phys_addr_t gic_base;
struct resource res; struct resource res;
...@@ -722,12 +726,6 @@ static int __init gic_of_init(struct device_node *node, ...@@ -722,12 +726,6 @@ static int __init gic_of_init(struct device_node *node,
gic_vpes = gic_vpes + 1; gic_vpes = gic_vpes + 1;
if (cpu_has_veic) { if (cpu_has_veic) {
/* Set EIC mode for all VPEs */
for_each_present_cpu(cpu) {
write_gic_vl_other(mips_cm_vp_id(cpu));
write_gic_vo_ctl(GIC_VX_CTL_EIC);
}
/* Always use vector 1 in EIC mode */ /* Always use vector 1 in EIC mode */
gic_cpu_pin = 0; gic_cpu_pin = 0;
timer_cpu_pin = gic_cpu_pin; timer_cpu_pin = gic_cpu_pin;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册