static void set_irq_msi(ICSState *ics, int srcno, int val) { ICSIRQState *irq = ics->irqs + srcno; trace_xics_set_irq_msi(srcno, srcno + ics->offset); if (val) { if (irq->priority == 0xff) { irq->status |= XICS_STATUS_MASKED_PENDING; trace_xics_masked_pending(); } else { icp_irq(ics->icp, irq->server, srcno + ics->offset, irq->priority); } } }
static void ics_write_xive_msi(struct ics_state *ics, int nr, int server, uint8_t priority) { struct ics_irq_state *irq = ics->irqs + nr - ics->offset; irq->server = server; irq->priority = priority; xics_dprintf("ics_write_xive_msi(nr %d, server %d, pri 0x%x)\n", nr, server, priority); if (!irq->masked_pending || (priority == 0xff)) { return; } irq->masked_pending = 0; icp_irq(ics->icp, server, nr, priority); }
static void ics_resend_msi(struct ics_state *ics) { unsigned int i; for (i = 0; i < ics->nr_irqs; i++) { struct ics_irq_state *irq = ics->irqs + i; /* FIXME: filter by server#? */ if (irq->rejected) { irq->rejected = 0; if (irq->priority != 0xff) { icp_irq(ics->icp, irq->server, i + ics->offset, irq->priority); } } } }