Lines Matching refs:xics
65 static void icp_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
73 static int ics_deliver_irq(struct kvmppc_xics *xics, u32 irq, u32 level) in ics_deliver_irq() argument
81 ics = kvmppc_xics_find_ics(xics, irq, &src); in ics_deliver_irq()
103 icp_deliver_irq(xics, NULL, irq); in ics_deliver_irq()
108 static void ics_check_resend(struct kvmppc_xics *xics, struct kvmppc_ics *ics, in ics_check_resend() argument
129 icp_deliver_irq(xics, icp, state->number); in ics_check_resend()
138 static bool write_xive(struct kvmppc_xics *xics, struct kvmppc_ics *ics, in write_xive() argument
165 struct kvmppc_xics *xics = kvm->arch.xics; in kvmppc_xics_set_xive() local
171 if (!xics) in kvmppc_xics_set_xive()
174 ics = kvmppc_xics_find_ics(xics, irq, &src); in kvmppc_xics_set_xive()
187 if (write_xive(xics, ics, state, server, priority, priority)) in kvmppc_xics_set_xive()
188 icp_deliver_irq(xics, icp, irq); in kvmppc_xics_set_xive()
195 struct kvmppc_xics *xics = kvm->arch.xics; in kvmppc_xics_get_xive() local
201 if (!xics) in kvmppc_xics_get_xive()
204 ics = kvmppc_xics_find_ics(xics, irq, &src); in kvmppc_xics_get_xive()
221 struct kvmppc_xics *xics = kvm->arch.xics; in kvmppc_xics_int_on() local
227 if (!xics) in kvmppc_xics_int_on()
230 ics = kvmppc_xics_find_ics(xics, irq, &src); in kvmppc_xics_int_on()
239 if (write_xive(xics, ics, state, state->server, state->saved_priority, in kvmppc_xics_int_on()
241 icp_deliver_irq(xics, icp, irq); in kvmppc_xics_int_on()
248 struct kvmppc_xics *xics = kvm->arch.xics; in kvmppc_xics_int_off() local
253 if (!xics) in kvmppc_xics_int_off()
256 ics = kvmppc_xics_find_ics(xics, irq, &src); in kvmppc_xics_int_off()
261 write_xive(xics, ics, state, state->server, MASKED, state->priority); in kvmppc_xics_int_off()
315 static void icp_check_resend(struct kvmppc_xics *xics, in icp_check_resend() argument
322 for_each_set_bit(icsid, icp->resend_map, xics->max_icsid + 1) { in icp_check_resend()
323 struct kvmppc_ics *ics = xics->ics[icsid]; in icp_check_resend()
329 ics_check_resend(xics, ics, icp); in icp_check_resend()
374 static void icp_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp, in icp_deliver_irq() argument
400 ics = kvmppc_xics_find_ics(xics, new_irq, &src); in icp_deliver_irq()
413 icp = kvmppc_xics_find_server(xics->kvm, state->server); in icp_deliver_irq()
497 static void icp_down_cppr(struct kvmppc_xics *xics, struct kvmppc_icp *icp, in icp_down_cppr() argument
567 icp_check_resend(xics, icp); in icp_down_cppr()
608 struct kvmppc_xics *xics = vcpu->kvm->arch.xics; in kvmppc_h_ipi() local
680 icp_deliver_irq(xics, icp, reject); in kvmppc_h_ipi()
684 icp_check_resend(xics, icp); in kvmppc_h_ipi()
709 struct kvmppc_xics *xics = vcpu->kvm->arch.xics; in kvmppc_h_cppr() local
723 icp_down_cppr(xics, icp, cppr); in kvmppc_h_cppr()
760 icp_deliver_irq(xics, icp, reject); in kvmppc_h_cppr()
765 struct kvmppc_xics *xics = vcpu->kvm->arch.xics; in kvmppc_h_eoi() local
788 icp_down_cppr(xics, icp, xirr >> 24); in kvmppc_h_eoi()
799 ics = kvmppc_xics_find_ics(xics, irq, &src); in kvmppc_h_eoi()
808 icp_deliver_irq(xics, icp, irq); in kvmppc_h_eoi()
817 struct kvmppc_xics *xics = vcpu->kvm->arch.xics; in kvmppc_xics_rm_complete() local
829 icp_check_resend(xics, icp->rm_resend_icp); in kvmppc_xics_rm_complete()
833 icp_deliver_irq(xics, icp, icp->rm_reject); in kvmppc_xics_rm_complete()
847 struct kvmppc_xics *xics = vcpu->kvm->arch.xics; in kvmppc_xics_hcall() local
852 if (!xics || !vcpu->arch.icp) in kvmppc_xics_hcall()
868 if (xics->real_mode && is_kvmppc_hv_enabled(vcpu->kvm)) in kvmppc_xics_hcall()
897 struct kvmppc_xics *xics = m->private; in xics_debug_show() local
898 struct kvm *kvm = xics->kvm; in xics_debug_show()
944 struct kvmppc_ics *ics = xics->ics[icsid]; in xics_debug_show()
982 static void xics_debugfs_init(struct kvmppc_xics *xics) in xics_debugfs_init() argument
986 name = kasprintf(GFP_KERNEL, "kvm-xics-%p", xics); in xics_debugfs_init()
992 xics->dentry = debugfs_create_file(name, S_IRUGO, powerpc_debugfs_root, in xics_debugfs_init()
993 xics, &xics_debug_fops); in xics_debugfs_init()
1000 struct kvmppc_xics *xics, int irq) in kvmppc_xics_create_ics() argument
1010 if (xics->ics[icsid]) in kvmppc_xics_create_ics()
1026 xics->ics[icsid] = ics; in kvmppc_xics_create_ics()
1028 if (icsid > xics->max_icsid) in kvmppc_xics_create_ics()
1029 xics->max_icsid = icsid; in kvmppc_xics_create_ics()
1033 return xics->ics[icsid]; in kvmppc_xics_create_ics()
1040 if (!vcpu->kvm->arch.xics) in kvmppc_xics_create_icp()
1078 struct kvmppc_xics *xics = vcpu->kvm->arch.xics; in kvmppc_xics_set_icp() local
1086 if (!icp || !xics) in kvmppc_xics_set_icp()
1105 ics = kvmppc_xics_find_ics(xics, xisr, &src); in kvmppc_xics_set_icp()
1146 icp_check_resend(xics, icp); in kvmppc_xics_set_icp()
1151 static int xics_get_source(struct kvmppc_xics *xics, long irq, u64 addr) in xics_get_source() argument
1161 ics = kvmppc_xics_find_ics(xics, irq, &idx); in xics_get_source()
1192 static int xics_set_source(struct kvmppc_xics *xics, long irq, u64 addr) in xics_set_source() argument
1206 ics = kvmppc_xics_find_ics(xics, irq, &idx); in xics_set_source()
1208 ics = kvmppc_xics_create_ics(xics->kvm, xics, irq); in xics_set_source()
1219 kvmppc_xics_find_server(xics->kvm, server) == NULL) in xics_set_source()
1239 icp_deliver_irq(xics, NULL, irqp->number); in xics_set_source()
1247 struct kvmppc_xics *xics = kvm->arch.xics; in kvm_set_irq() local
1249 return ics_deliver_irq(xics, irq, level); in kvm_set_irq()
1263 struct kvmppc_xics *xics = dev->private; in xics_set_attr() local
1267 return xics_set_source(xics, attr->attr, attr->addr); in xics_set_attr()
1274 struct kvmppc_xics *xics = dev->private; in xics_get_attr() local
1278 return xics_get_source(xics, attr->attr, attr->addr); in xics_get_attr()
1297 struct kvmppc_xics *xics = dev->private; in kvmppc_xics_free() local
1299 struct kvm *kvm = xics->kvm; in kvmppc_xics_free()
1301 debugfs_remove(xics->dentry); in kvmppc_xics_free()
1304 kvm->arch.xics = NULL; in kvmppc_xics_free()
1306 for (i = 0; i <= xics->max_icsid; i++) in kvmppc_xics_free()
1307 kfree(xics->ics[i]); in kvmppc_xics_free()
1308 kfree(xics); in kvmppc_xics_free()
1314 struct kvmppc_xics *xics; in kvmppc_xics_create() local
1318 xics = kzalloc(sizeof(*xics), GFP_KERNEL); in kvmppc_xics_create()
1319 if (!xics) in kvmppc_xics_create()
1322 dev->private = xics; in kvmppc_xics_create()
1323 xics->dev = dev; in kvmppc_xics_create()
1324 xics->kvm = kvm; in kvmppc_xics_create()
1328 if (kvm->arch.xics) in kvmppc_xics_create()
1331 kvm->arch.xics = xics; in kvmppc_xics_create()
1335 kfree(xics); in kvmppc_xics_create()
1339 xics_debugfs_init(xics); in kvmppc_xics_create()
1344 xics->real_mode = ENABLE_REALMODE; in kvmppc_xics_create()
1345 xics->real_mode_dbg = DEBUG_REALMODE; in kvmppc_xics_create()
1364 struct kvmppc_xics *xics = dev->private; in kvmppc_xics_connect_vcpu() local
1369 if (xics->kvm != vcpu->kvm) in kvmppc_xics_connect_vcpu()