static void ics_rtas_unmask_irq(struct irq_data *d) { unsigned int hw_irq = (unsigned int)irqd_to_hwirq(d); int call_status; int server; pr_devel("xics: unmask virq %d [hw 0x%x]\n", d->irq, hw_irq); if (hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS) return; server = xics_get_irq_server(d->irq, d->affinity, 0); call_status = rtas_call(ibm_set_xive, 3, 1, NULL, hw_irq, server, DEFAULT_PRIORITY); if (call_status != 0) { printk(KERN_ERR "%s: ibm_set_xive irq %u server %x returned %d\n", __func__, hw_irq, server, call_status); return; } /* Now unmask the interrupt (often a no-op) */ call_status = rtas_call(ibm_int_on, 1, 1, NULL, hw_irq); if (call_status != 0) { printk(KERN_ERR "%s: ibm_int_on irq=%u returned %d\n", __func__, hw_irq, call_status); return; } }
static int ics_opal_set_affinity(struct irq_data *d, const struct cpumask *cpumask, bool force) { unsigned int hw_irq = (unsigned int)irqd_to_hwirq(d); int16_t server; int8_t priority; int64_t rc; int wanted_server; if (hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS) return -1; rc = opal_get_xive(hw_irq, &server, &priority); if (rc != OPAL_SUCCESS) { pr_err("%s: opal_set_xive(irq=%d [hw 0x%x] server=%x)" " error %lld\n", __func__, d->irq, hw_irq, server, rc); return -1; } wanted_server = xics_get_irq_server(d->irq, cpumask, 1); if (wanted_server < 0) { char cpulist[128]; cpumask_scnprintf(cpulist, sizeof(cpulist), cpumask); pr_warning("%s: No online cpus in the mask %s for irq %d\n", __func__, cpulist, d->irq); return -1; } server = ics_opal_mangle_server(wanted_server); pr_devel("ics-hal: set-affinity irq %d [hw 0x%x] server: 0x%x/0x%x\n", d->irq, hw_irq, wanted_server, server); rc = opal_set_xive(hw_irq, server, priority); if (rc != OPAL_SUCCESS) { pr_err("%s: opal_set_xive(irq=%d [hw 0x%x] server=%x)" " error %lld\n", __func__, d->irq, hw_irq, server, rc); return -1; } return 0; }
static void ics_opal_unmask_irq(struct irq_data *d) { unsigned int hw_irq = (unsigned int)irqd_to_hwirq(d); int64_t rc; int server; pr_devel("ics-hal: unmask virq %d [hw 0x%x]\n", d->irq, hw_irq); if (hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS) return; server = xics_get_irq_server(d->irq, d->affinity, 0); server = ics_opal_mangle_server(server); rc = opal_set_xive(hw_irq, server, DEFAULT_PRIORITY); if (rc != OPAL_SUCCESS) pr_err("%s: opal_set_xive(irq=%d [hw 0x%x] server=%x)" " error %lld\n", __func__, d->irq, hw_irq, server, rc); }
static int ics_rtas_set_affinity(struct irq_data *d, const struct cpumask *cpumask, bool force) { unsigned int hw_irq = (unsigned int)irqd_to_hwirq(d); int status; int xics_status[2]; int irq_server; if (hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS) return -1; status = rtas_call(ibm_get_xive, 1, 3, xics_status, hw_irq); if (status) { printk(KERN_ERR "%s: ibm,get-xive irq=%u returns %d\n", __func__, hw_irq, status); return -1; } irq_server = xics_get_irq_server(d->irq, cpumask, 1); if (irq_server == -1) { char cpulist[128]; cpumask_scnprintf(cpulist, sizeof(cpulist), cpumask); printk(KERN_WARNING "%s: No online cpus in the mask %s for irq %d\n", __func__, cpulist, d->irq); return -1; } status = rtas_call(ibm_set_xive, 3, 1, NULL, hw_irq, irq_server, xics_status[1]); if (status) { printk(KERN_ERR "%s: ibm,set-xive irq=%u returns %d\n", __func__, hw_irq, status); return -1; } return IRQ_SET_MASK_OK; }