int request_bridge_irq(struct bridge_controller *bc) { int irq = allocate_irqno(); int swlevel, cpu; nasid_t nasid; if (irq < 0) return irq; /* * "map" irq to a swlevel greater than 6 since the first 6 bits * of INT_PEND0 are taken */ cpu = bc->irq_cpu; swlevel = alloc_level(cpu, irq); if (unlikely(swlevel < 0)) { free_irqno(irq); return -EAGAIN; } /* Make sure it's not already pending when we connect it. */ nasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu)); REMOTE_HUB_CLR_INTR(nasid, swlevel); intr_connect_level(cpu, swlevel); register_bridge_irq(irq); return irq; }
static __init void intr_clear_all(nasid_t nasid) { int i; REMOTE_HUB_S(nasid, PI_INT_MASK0_A, 0); REMOTE_HUB_S(nasid, PI_INT_MASK0_B, 0); REMOTE_HUB_S(nasid, PI_INT_MASK1_A, 0); REMOTE_HUB_S(nasid, PI_INT_MASK1_B, 0); for (i = 0; i < 128; i++) REMOTE_HUB_CLR_INTR(nasid, i); }
static void setup_hub_mask(struct hub_irq_data *hd, const struct cpumask *mask) { nasid_t nasid; int cpu; cpu = cpumask_first_and(mask, cpu_online_mask); nasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu)); hd->cpu = cpu; if (!cputoslice(cpu)) { hd->irq_mask[0] = REMOTE_HUB_PTR(nasid, PI_INT_MASK0_A); hd->irq_mask[1] = REMOTE_HUB_PTR(nasid, PI_INT_MASK1_A); } else { hd->irq_mask[0] = REMOTE_HUB_PTR(nasid, PI_INT_MASK0_B); hd->irq_mask[1] = REMOTE_HUB_PTR(nasid, PI_INT_MASK1_B); } /* Make sure it's not already pending when we connect it. */ REMOTE_HUB_CLR_INTR(nasid, hd->bit); }