void icp_set_cppr(ICPState *icp, uint8_t cppr) { uint8_t old_cppr; uint32_t old_xisr; old_cppr = CPPR(icp); icp->xirr = (icp->xirr & ~CPPR_MASK) | (cppr << 24); if (cppr < old_cppr) { if (XISR(icp) && (cppr <= icp->pending_priority)) { old_xisr = XISR(icp); icp->xirr &= ~XISR_MASK; /* Clear XISR */ icp->pending_priority = 0xff; qemu_irq_lower(icp->output); if (icp->xirr_owner) { ics_reject(icp->xirr_owner, old_xisr); icp->xirr_owner = NULL; } } } else { if (!XISR(icp)) { icp_resend(icp); } } }
static void icp_irq(struct icp_state *icp, int server, int nr, uint8_t priority) { struct icp_server_state *ss = icp->ss + server; if ((priority >= CPPR(ss)) || (XISR(ss) && (ss->pending_priority <= priority))) { ics_reject(icp->ics, nr); } else { if (XISR(ss)) { ics_reject(icp->ics, XISR(ss)); } ss->xirr = (ss->xirr & ~XISR_MASK) | (nr & XISR_MASK); ss->pending_priority = priority; qemu_irq_raise(ss->output); } }
static void icp_irq(XICSState *xics, int server, int nr, uint8_t priority) { ICPState *ss = xics->ss + server; trace_xics_icp_irq(server, nr, priority); if ((priority >= CPPR(ss)) || (XISR(ss) && (ss->pending_priority <= priority))) { ics_reject(xics->ics, nr); } else { if (XISR(ss)) { ics_reject(xics->ics, XISR(ss)); } ss->xirr = (ss->xirr & ~XISR_MASK) | (nr & XISR_MASK); ss->pending_priority = priority; trace_xics_icp_raise(ss->xirr, ss->pending_priority); qemu_irq_raise(ss->output); } }
static void icp_irq(struct icp_state *icp, int server, int nr, uint8_t priority) { struct icp_server_state *ss = icp->ss + server; xics_dprintf("icp_irq(nr %d, server %d, prio 0x%x)\n", nr, server, priority); if ((priority >= CPPR(ss)) || (XISR(ss) && (ss->pending_priority <= priority))) { xics_dprintf("reject %d, CPPR 0x%x, XISR 0x%x, pprio 0x%x, prio 0x%x\n", nr, CPPR(ss), XISR(ss), ss->pending_priority, priority); ics_reject(icp->ics, nr); } else { if (XISR(ss)) { xics_dprintf("reject %d, CPPR 0x%x, XISR 0x%x, pprio 0x%x, prio 0x%x\n", nr, CPPR(ss), XISR(ss), ss->pending_priority, priority); ics_reject(icp->ics, XISR(ss)); } ss->xirr = (ss->xirr & ~XISR_MASK) | (nr & XISR_MASK); ss->pending_priority = priority; cpu_irq_raise(ss->cpu); } }
static void icp_irq(ICSState *ics, int server, int nr, uint8_t priority) { ICPState *icp = xics_icp_get(ics->xics, server); trace_xics_icp_irq(server, nr, priority); if ((priority >= CPPR(icp)) || (XISR(icp) && (icp->pending_priority <= priority))) { ics_reject(ics, nr); } else { if (XISR(icp) && icp->xirr_owner) { ics_reject(icp->xirr_owner, XISR(icp)); icp->xirr_owner = NULL; } icp->xirr = (icp->xirr & ~XISR_MASK) | (nr & XISR_MASK); icp->xirr_owner = ics; icp->pending_priority = priority; trace_xics_icp_raise(icp->xirr, icp->pending_priority); qemu_irq_raise(icp->output); } }
static void icp_check_ipi(struct icp_state *icp, int server) { struct icp_server_state *ss = icp->ss + server; if (XISR(ss) && (ss->pending_priority <= ss->mfrr)) { return; } if (XISR(ss)) { ics_reject(icp->ics, XISR(ss)); } ss->xirr = (ss->xirr & ~XISR_MASK) | XICS_IPI; ss->pending_priority = ss->mfrr; cpu_irq_raise(ss->cpu); }
static void icp_check_ipi(ICPState *icp) { if (XISR(icp) && (icp->pending_priority <= icp->mfrr)) { return; } trace_xics_icp_check_ipi(icp->cs->cpu_index, icp->mfrr); if (XISR(icp) && icp->xirr_owner) { ics_reject(icp->xirr_owner, XISR(icp)); } icp->xirr = (icp->xirr & ~XISR_MASK) | XICS_IPI; icp->pending_priority = icp->mfrr; icp->xirr_owner = NULL; qemu_irq_raise(icp->output); }
static void icp_check_ipi(XICSState *icp, int server) { ICPState *ss = icp->ss + server; if (XISR(ss) && (ss->pending_priority <= ss->mfrr)) { return; } trace_xics_icp_check_ipi(server, ss->mfrr); if (XISR(ss)) { ics_reject(icp->ics, XISR(ss)); } ss->xirr = (ss->xirr & ~XISR_MASK) | XICS_IPI; ss->pending_priority = ss->mfrr; qemu_irq_raise(ss->output); }
static void icp_set_cppr(struct icp_state *icp, int server, uint8_t cppr) { struct icp_server_state *ss = icp->ss + server; uint8_t old_cppr; uint32_t old_xisr; old_cppr = CPPR(ss); ss->xirr = (ss->xirr & ~CPPR_MASK) | (cppr << 24); if (cppr < old_cppr) { if (XISR(ss) && (cppr <= ss->pending_priority)) { old_xisr = XISR(ss); ss->xirr &= ~XISR_MASK; /* Clear XISR */ qemu_irq_lower(ss->output); ics_reject(icp->ics, old_xisr); } } else { if (!XISR(ss)) { icp_resend(icp, server); } } }
void icp_set_cppr(XICSState *xics, int server, uint8_t cppr) { ICPState *ss = xics->ss + server; uint8_t old_cppr; uint32_t old_xisr; old_cppr = CPPR(ss); ss->xirr = (ss->xirr & ~CPPR_MASK) | (cppr << 24); if (cppr < old_cppr) { if (XISR(ss) && (cppr <= ss->pending_priority)) { old_xisr = XISR(ss); ss->xirr &= ~XISR_MASK; /* Clear XISR */ ss->pending_priority = 0xff; qemu_irq_lower(ss->output); ics_reject(xics->ics, old_xisr); } } else { if (!XISR(ss)) { icp_resend(xics, server); } } }