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()
91 static inline bool icp_rm_try_update(struct kvmppc_icp *icp, in icp_rm_try_update() argument
102 success = cmpxchg64(&icp->state.raw, old.raw, new.raw) == old.raw; in icp_rm_try_update()
122 icp_rm_set_vcpu_irq(icp->vcpu, this_vcpu); in icp_rm_try_update()
125 this_vcpu->arch.icp->rm_dbgstate = new; in icp_rm_try_update()
126 this_vcpu->arch.icp->rm_dbgtgt = icp->vcpu; in icp_rm_try_update()
133 struct kvmppc_icp *icp) in check_too_hard() argument
135 return (xics->real_mode_dbg || icp->rm_action) ? H_TOO_HARD : H_SUCCESS; in check_too_hard()
139 struct kvmppc_icp *icp) in icp_rm_check_resend() argument
145 for_each_set_bit(icsid, icp->resend_map, xics->max_icsid + 1) { in icp_rm_check_resend()
148 if (!test_and_clear_bit(icsid, icp->resend_map)) in icp_rm_check_resend()
152 ics_rm_check_resend(xics, ics, icp); in icp_rm_check_resend()
156 static bool icp_rm_try_to_deliver(struct kvmppc_icp *icp, u32 irq, u8 priority, in icp_rm_try_to_deliver() argument
163 old_state = new_state = READ_ONCE(icp->state); in icp_rm_try_to_deliver()
189 } while (!icp_rm_try_update(icp, old_state, new_state)); in icp_rm_try_to_deliver()
194 static void icp_rm_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp, in icp_rm_deliver_irq() argument
231 if (!icp || state->server != icp->server_num) { in icp_rm_deliver_irq()
232 icp = kvmppc_xics_find_server(xics->kvm, state->server); in icp_rm_deliver_irq()
233 if (!icp) { in icp_rm_deliver_irq()
279 if (icp_rm_try_to_deliver(icp, new_irq, state->priority, &reject)) { in icp_rm_deliver_irq()
293 set_bit(ics->icsid, icp->resend_map); in icp_rm_deliver_irq()
303 if (!icp->state.need_resend) { in icp_rm_deliver_irq()
312 static void icp_rm_down_cppr(struct kvmppc_xics *xics, struct kvmppc_icp *icp, in icp_rm_down_cppr() argument
348 old_state = new_state = READ_ONCE(icp->state); in icp_rm_down_cppr()
372 } while (!icp_rm_try_update(icp, old_state, new_state)); in icp_rm_down_cppr()
380 icp->n_check_resend++; in icp_rm_down_cppr()
381 icp_rm_check_resend(xics, icp); in icp_rm_down_cppr()
390 struct kvmppc_icp *icp = vcpu->arch.icp; in kvmppc_rm_h_xirr() local
397 icp_rm_clr_vcpu_irq(icp->vcpu); in kvmppc_rm_h_xirr()
407 old_state = new_state = READ_ONCE(icp->state); in kvmppc_rm_h_xirr()
416 } while (!icp_rm_try_update(icp, old_state, new_state)); in kvmppc_rm_h_xirr()
421 return check_too_hard(xics, icp); in kvmppc_rm_h_xirr()
429 struct kvmppc_icp *icp, *this_icp = vcpu->arch.icp; in kvmppc_rm_h_ipi() local
439 icp = this_icp; in kvmppc_rm_h_ipi()
441 icp = kvmppc_xics_find_server(vcpu->kvm, server); in kvmppc_rm_h_ipi()
442 if (!icp) in kvmppc_rm_h_ipi()
473 old_state = new_state = READ_ONCE(icp->state); in kvmppc_rm_h_ipi()
494 } while (!icp_rm_try_update(icp, old_state, new_state)); in kvmppc_rm_h_ipi()
499 icp_rm_deliver_irq(xics, icp, reject); in kvmppc_rm_h_ipi()
505 icp_rm_check_resend(xics, icp); in kvmppc_rm_h_ipi()
515 struct kvmppc_icp *icp = vcpu->arch.icp; in kvmppc_rm_h_cppr() local
528 if (cppr > icp->state.cppr) { in kvmppc_rm_h_cppr()
529 icp_rm_down_cppr(xics, icp, cppr); in kvmppc_rm_h_cppr()
531 } else if (cppr == icp->state.cppr) in kvmppc_rm_h_cppr()
545 icp_rm_clr_vcpu_irq(icp->vcpu); in kvmppc_rm_h_cppr()
548 old_state = new_state = READ_ONCE(icp->state); in kvmppc_rm_h_cppr()
559 } while (!icp_rm_try_update(icp, old_state, new_state)); in kvmppc_rm_h_cppr()
566 icp->n_reject++; in kvmppc_rm_h_cppr()
567 icp_rm_deliver_irq(xics, icp, reject); in kvmppc_rm_h_cppr()
570 return check_too_hard(xics, icp); in kvmppc_rm_h_cppr()
576 struct kvmppc_icp *icp = vcpu->arch.icp; in kvmppc_rm_h_eoi() local
599 icp_rm_down_cppr(xics, icp, xirr >> 24); in kvmppc_rm_h_eoi()
617 icp->n_reject++; in kvmppc_rm_h_eoi()
618 icp_rm_deliver_irq(xics, icp, irq); in kvmppc_rm_h_eoi()
622 icp->rm_action |= XICS_RM_NOTIFY_EOI; in kvmppc_rm_h_eoi()
623 icp->rm_eoied_irq = irq; in kvmppc_rm_h_eoi()
626 return check_too_hard(xics, icp); in kvmppc_rm_h_eoi()