|
@@ -671,7 +671,7 @@ static int gic_cpu_startup(unsigned int cpu)
|
|
|
static int __init gic_of_init(struct device_node *node,
|
|
|
struct device_node *parent)
|
|
|
{
|
|
|
- unsigned int cpu_vec, i, gicconfig, v[2];
|
|
|
+ unsigned int cpu_vec, i, gicconfig, v[2], num_ipis;
|
|
|
unsigned long reserved;
|
|
|
phys_addr_t gic_base;
|
|
|
struct resource res;
|
|
@@ -781,10 +781,12 @@ static int __init gic_of_init(struct device_node *node,
|
|
|
!of_property_read_u32_array(node, "mti,reserved-ipi-vectors", v, 2)) {
|
|
|
bitmap_set(ipi_resrv, v[0], v[1]);
|
|
|
} else {
|
|
|
- /* Make the last 2 * gic_vpes available for IPIs */
|
|
|
- bitmap_set(ipi_resrv,
|
|
|
- gic_shared_intrs - 2 * gic_vpes,
|
|
|
- 2 * gic_vpes);
|
|
|
+ /*
|
|
|
+ * Reserve 2 interrupts per possible CPU/VP for use as IPIs,
|
|
|
+ * meeting the requirements of arch/mips SMP.
|
|
|
+ */
|
|
|
+ num_ipis = 2 * num_possible_cpus();
|
|
|
+ bitmap_set(ipi_resrv, gic_shared_intrs - num_ipis, num_ipis);
|
|
|
}
|
|
|
|
|
|
bitmap_copy(ipi_available, ipi_resrv, GIC_MAX_INTRS);
|