Lines Matching refs:icp
26 static void icp_rm_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
31 struct kvmppc_ics *ics, struct kvmppc_icp *icp) in ics_rm_check_resend() argument
44 icp_rm_deliver_irq(xics, icp, state->number); in ics_rm_check_resend()
56 struct kvmppc_icp *this_icp = this_vcpu->arch.icp; in icp_rm_set_vcpu_irq()
89 static inline bool icp_rm_try_update(struct kvmppc_icp *icp, in icp_rm_try_update() argument
100 success = cmpxchg64(&icp->state.raw, old.raw, new.raw) == old.raw; in icp_rm_try_update()
120 icp_rm_set_vcpu_irq(icp->vcpu, this_vcpu); in icp_rm_try_update()
123 this_vcpu->arch.icp->rm_dbgstate = new; in icp_rm_try_update()
124 this_vcpu->arch.icp->rm_dbgtgt = icp->vcpu; in icp_rm_try_update()
131 struct kvmppc_icp *icp) in check_too_hard() argument
133 return (xics->real_mode_dbg || icp->rm_action) ? H_TOO_HARD : H_SUCCESS; in check_too_hard()
137 struct kvmppc_icp *icp) in icp_rm_check_resend() argument
143 for_each_set_bit(icsid, icp->resend_map, xics->max_icsid + 1) { in icp_rm_check_resend()
146 if (!test_and_clear_bit(icsid, icp->resend_map)) in icp_rm_check_resend()
150 ics_rm_check_resend(xics, ics, icp); in icp_rm_check_resend()
154 static bool icp_rm_try_to_deliver(struct kvmppc_icp *icp, u32 irq, u8 priority, in icp_rm_try_to_deliver() argument
161 old_state = new_state = READ_ONCE(icp->state); in icp_rm_try_to_deliver()
187 } while (!icp_rm_try_update(icp, old_state, new_state)); in icp_rm_try_to_deliver()
192 static void icp_rm_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp, in icp_rm_deliver_irq() argument
229 if (!icp || state->server != icp->server_num) { in icp_rm_deliver_irq()
230 icp = kvmppc_xics_find_server(xics->kvm, state->server); in icp_rm_deliver_irq()
231 if (!icp) { in icp_rm_deliver_irq()
277 if (icp_rm_try_to_deliver(icp, new_irq, state->priority, &reject)) { in icp_rm_deliver_irq()
291 set_bit(ics->icsid, icp->resend_map); in icp_rm_deliver_irq()
301 if (!icp->state.need_resend) { in icp_rm_deliver_irq()
310 static void icp_rm_down_cppr(struct kvmppc_xics *xics, struct kvmppc_icp *icp, in icp_rm_down_cppr() argument
346 old_state = new_state = READ_ONCE(icp->state); in icp_rm_down_cppr()
370 } while (!icp_rm_try_update(icp, old_state, new_state)); in icp_rm_down_cppr()
378 icp->n_check_resend++; in icp_rm_down_cppr()
379 icp_rm_check_resend(xics, icp); in icp_rm_down_cppr()
388 struct kvmppc_icp *icp = vcpu->arch.icp; in kvmppc_rm_h_xirr() local
395 icp_rm_clr_vcpu_irq(icp->vcpu); in kvmppc_rm_h_xirr()
405 old_state = new_state = READ_ONCE(icp->state); in kvmppc_rm_h_xirr()
414 } while (!icp_rm_try_update(icp, old_state, new_state)); in kvmppc_rm_h_xirr()
419 return check_too_hard(xics, icp); in kvmppc_rm_h_xirr()
427 struct kvmppc_icp *icp, *this_icp = vcpu->arch.icp; in kvmppc_rm_h_ipi() local
437 icp = this_icp; in kvmppc_rm_h_ipi()
439 icp = kvmppc_xics_find_server(vcpu->kvm, server); in kvmppc_rm_h_ipi()
440 if (!icp) in kvmppc_rm_h_ipi()
471 old_state = new_state = READ_ONCE(icp->state); in kvmppc_rm_h_ipi()
492 } while (!icp_rm_try_update(icp, old_state, new_state)); in kvmppc_rm_h_ipi()
497 icp_rm_deliver_irq(xics, icp, reject); in kvmppc_rm_h_ipi()
503 icp_rm_check_resend(xics, icp); in kvmppc_rm_h_ipi()
513 struct kvmppc_icp *icp = vcpu->arch.icp; in kvmppc_rm_h_cppr() local
526 if (cppr > icp->state.cppr) { in kvmppc_rm_h_cppr()
527 icp_rm_down_cppr(xics, icp, cppr); in kvmppc_rm_h_cppr()
529 } else if (cppr == icp->state.cppr) in kvmppc_rm_h_cppr()
543 icp_rm_clr_vcpu_irq(icp->vcpu); in kvmppc_rm_h_cppr()
546 old_state = new_state = READ_ONCE(icp->state); in kvmppc_rm_h_cppr()
557 } while (!icp_rm_try_update(icp, old_state, new_state)); in kvmppc_rm_h_cppr()
564 icp->n_reject++; in kvmppc_rm_h_cppr()
565 icp_rm_deliver_irq(xics, icp, reject); in kvmppc_rm_h_cppr()
568 return check_too_hard(xics, icp); in kvmppc_rm_h_cppr()
574 struct kvmppc_icp *icp = vcpu->arch.icp; in kvmppc_rm_h_eoi() local
597 icp_rm_down_cppr(xics, icp, xirr >> 24); in kvmppc_rm_h_eoi()
615 icp->n_reject++; in kvmppc_rm_h_eoi()
616 icp_rm_deliver_irq(xics, icp, irq); in kvmppc_rm_h_eoi()
620 icp->rm_action |= XICS_RM_NOTIFY_EOI; in kvmppc_rm_h_eoi()
621 icp->rm_eoied_irq = irq; in kvmppc_rm_h_eoi()
624 return check_too_hard(xics, icp); in kvmppc_rm_h_eoi()